// Copyright 2014 The BoringSSL Authors
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     https://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

#ifndef OPENSSL_HEADER_BYTESTRING_H
#define OPENSSL_HEADER_BYTESTRING_H

#include <openssl/base.h>   // IWYU pragma: export

#include <openssl/span.h>
#include <time.h>

#if defined(__cplusplus)
extern "C" {
#endif


// Bytestrings are used for parsing and building TLS and ASN.1 messages.
//
// A "CBS" (CRYPTO ByteString) represents a string of bytes in memory and
// provides utility functions for safely parsing length-prefixed structures
// like TLS and ASN.1 from it.
//
// A "CBB" (CRYPTO ByteBuilder) is a memory buffer that grows as needed and
// provides utility functions for building length-prefixed messages.


// CRYPTO ByteString

struct cbs_st {
  const uint8_t *data;
  size_t len;

#if !defined(BORINGSSL_NO_CXX)
  // Allow implicit conversions to and from bssl::Span<const uint8_t>.
  cbs_st(bssl::Span<const uint8_t> span)
      : data(span.data()), len(span.size()) {}
  operator bssl::Span<const uint8_t>() const { return bssl::Span(data, len); }

  // Defining any constructors requires we explicitly default the others.
  cbs_st() = default;
  cbs_st(const cbs_st &) = default;
  cbs_st &operator=(const cbs_st &) = default;
#endif
};

// CBS_init sets `cbs` to point to `data`. It does not take ownership of
// `data`.
OPENSSL_INLINE void CBS_init(CBS *cbs, const uint8_t *data, size_t len) {
  cbs->data = data;
  cbs->len = len;
}

// CBS_skip advances `cbs` by `len` bytes. It returns one on success and zero
// otherwise.
OPENSSL_EXPORT int CBS_skip(CBS *cbs, size_t len);

// CBS_data returns a pointer to the contents of `cbs`.
OPENSSL_INLINE const uint8_t *CBS_data(const CBS *cbs) { return cbs->data; }

// CBS_len returns the number of bytes remaining in `cbs`.
OPENSSL_INLINE size_t CBS_len(const CBS *cbs) { return cbs->len; }

// CBS_stow copies the current contents of `cbs` into `*out_ptr` and
// `*out_len`. If `*out_ptr` is not NULL, the contents are freed with
// OPENSSL_free. It returns one on success and zero on allocation failure. On
// success, `*out_ptr` should be freed with OPENSSL_free. If `cbs` is empty,
// `*out_ptr` will be NULL.
OPENSSL_EXPORT int CBS_stow(const CBS *cbs, uint8_t **out_ptr, size_t *out_len);

// CBS_strdup copies the current contents of `cbs` into `*out_ptr` as a
// NUL-terminated C string. If `*out_ptr` is not NULL, the contents are freed
// with OPENSSL_free. It returns one on success and zero on allocation
// failure. On success, `*out_ptr` should be freed with OPENSSL_free.
//
// NOTE: If `cbs` contains NUL bytes, the string will be truncated. Call
// `CBS_contains_zero_byte(cbs)` to check for NUL bytes.
OPENSSL_EXPORT int CBS_strdup(const CBS *cbs, char **out_ptr);

// CBS_contains_zero_byte returns one if the current contents of `cbs` contains
// a NUL byte and zero otherwise.
OPENSSL_EXPORT int CBS_contains_zero_byte(const CBS *cbs);

// CBS_mem_equal compares the current contents of `cbs` with the `len` bytes
// starting at `data`. If they're equal, it returns one, otherwise zero. If the
// lengths match, it uses a constant-time comparison.
OPENSSL_EXPORT int CBS_mem_equal(const CBS *cbs, const uint8_t *data,
                                 size_t len);

// CBS_get_u8 sets `*out` to the next uint8_t from `cbs` and advances `cbs`. It
// returns one on success and zero on error.
OPENSSL_EXPORT int CBS_get_u8(CBS *cbs, uint8_t *out);

// CBS_get_u16 sets `*out` to the next, big-endian uint16_t from `cbs` and
// advances `cbs`. It returns one on success and zero on error.
OPENSSL_EXPORT int CBS_get_u16(CBS *cbs, uint16_t *out);

// CBS_get_u16le sets `*out` to the next, little-endian uint16_t from `cbs` and
// advances `cbs`. It returns one on success and zero on error.
OPENSSL_EXPORT int CBS_get_u16le(CBS *cbs, uint16_t *out);

// CBS_get_u24 sets `*out` to the next, big-endian 24-bit value from `cbs` and
// advances `cbs`. It returns one on success and zero on error.
OPENSSL_EXPORT int CBS_get_u24(CBS *cbs, uint32_t *out);

// CBS_get_u32 sets `*out` to the next, big-endian uint32_t value from `cbs`
// and advances `cbs`. It returns one on success and zero on error.
OPENSSL_EXPORT int CBS_get_u32(CBS *cbs, uint32_t *out);

// CBS_get_u32le sets `*out` to the next, little-endian uint32_t value from
// `cbs` and advances `cbs`. It returns one on success and zero on error.
OPENSSL_EXPORT int CBS_get_u32le(CBS *cbs, uint32_t *out);

// CBS_get_u48 sets `*out` to the next, big-endian 48-bit value from `cbs` and
// advances `cbs`. It returns one on success and zero on error.
OPENSSL_EXPORT int CBS_get_u48(CBS *cbs, uint64_t *out);

// CBS_get_u64 sets `*out` to the next, big-endian uint64_t value from `cbs`
// and advances `cbs`. It returns one on success and zero on error.
OPENSSL_EXPORT int CBS_get_u64(CBS *cbs, uint64_t *out);

// CBS_get_u64le sets `*out` to the next, little-endian uint64_t value from
// `cbs` and advances `cbs`. It returns one on success and zero on error.
OPENSSL_EXPORT int CBS_get_u64le(CBS *cbs, uint64_t *out);

// CBS_get_last_u8 sets `*out` to the last uint8_t from `cbs` and shortens
// `cbs`. It returns one on success and zero on error.
OPENSSL_EXPORT int CBS_get_last_u8(CBS *cbs, uint8_t *out);

// CBS_get_bytes sets `*out` to the next `len` bytes from `cbs` and advances
// `cbs`. It returns one on success and zero on error.
OPENSSL_EXPORT int CBS_get_bytes(CBS *cbs, CBS *out, size_t len);

// CBS_copy_bytes copies the next `len` bytes from `cbs` to `out` and advances
// `cbs`. It returns one on success and zero on error.
OPENSSL_EXPORT int CBS_copy_bytes(CBS *cbs, uint8_t *out, size_t len);

// CBS_get_u8_length_prefixed sets `*out` to the contents of an 8-bit,
// length-prefixed value from `cbs` and advances `cbs` over it. It returns one
// on success and zero on error.
OPENSSL_EXPORT int CBS_get_u8_length_prefixed(CBS *cbs, CBS *out);

// CBS_get_u16_length_prefixed sets `*out` to the contents of a 16-bit,
// big-endian, length-prefixed value from `cbs` and advances `cbs` over it. It
// returns one on success and zero on error.
OPENSSL_EXPORT int CBS_get_u16_length_prefixed(CBS *cbs, CBS *out);

// CBS_get_u24_length_prefixed sets `*out` to the contents of a 24-bit,
// big-endian, length-prefixed value from `cbs` and advances `cbs` over it. It
// returns one on success and zero on error.
OPENSSL_EXPORT int CBS_get_u24_length_prefixed(CBS *cbs, CBS *out);

// CBS_get_until_first finds the first instance of `c` in `cbs`. If found, it
// sets `*out` to the text before the match, advances `cbs` over it, and returns
// one. Otherwise, it returns zero and leaves `cbs` unmodified.
OPENSSL_EXPORT int CBS_get_until_first(CBS *cbs, CBS *out, uint8_t c);

// CBS_get_until_first_of finds the first byte in `cbs` matching one of the
// characters in `chars`, which is a NUL-terminated C string. If found, it sets
// `*out` to the text before the match, advances `cbs` over it, and returns one.
// Otherwise, it returns zero and leaves `cbs` unmodified.
OPENSSL_EXPORT int CBS_get_until_first_of(CBS *cbs, CBS *out,
                                          const char *chars);

// CBS_get_until_first_not_of finds the first byte in `cbs` that does not match
// any of the characters in `chars`, which is a NUL-terminated C string. If
// found, it sets `*out` to the text before the match, advances `cbs` over it,
// and returns one. Otherwise, it returns zero and leaves `cbs` unmodified.
OPENSSL_EXPORT int CBS_get_until_first_not_of(CBS *cbs, CBS *out,
                                              const char *chars);

// CBS_get_u64_decimal reads a decimal integer from `cbs` and writes it to
// `*out`. It stops reading at the end of the string, or the first non-digit
// character. It returns one on success and zero on error. This function behaves
// analogously to `strtoul` except it does not accept empty inputs, leading
// zeros, or negative values.
OPENSSL_EXPORT int CBS_get_u64_decimal(CBS *cbs, uint64_t *out);


// Parsing ASN.1
//
// `CBS` may be used to parse DER structures. Rather than using a schema
// compiler, the following functions act on tag-length-value elements in the
// serialization itself. Thus the caller is responsible for looping over a
// SEQUENCE, branching on CHOICEs or OPTIONAL fields, checking for trailing
// data, and handling explicit vs. implicit tagging.
//
// Tags are represented as `CBS_ASN1_TAG` values in memory. The upper few bits
// store the class and constructed bit, and the remaining bits store the tag
// number. Note this differs from the DER serialization, to support tag numbers
// beyond 31. Consumers must use the constants defined below to decompose or
// assemble tags.
//
// This library treats an element's constructed bit as part of its tag. In DER,
// the constructed bit is computable from the type. The constants for universal
// types have the bit set. Callers must set it correctly for tagged types.
// Explicitly-tagged types are always constructed, and implicitly-tagged types
// inherit the underlying type's bit.

// CBS_ASN1_TAG_SHIFT is how much the in-memory representation shifts the class
// and constructed bits from the DER serialization.
#define CBS_ASN1_TAG_SHIFT 24

// CBS_ASN1_CONSTRUCTED may be ORed into a tag to set the constructed bit.
#define CBS_ASN1_CONSTRUCTED (0x20u << CBS_ASN1_TAG_SHIFT)

// The following values specify the tag class and may be ORed into a tag number
// to produce the final tag. If none is used, the tag will be UNIVERSAL.
#define CBS_ASN1_UNIVERSAL (0u << CBS_ASN1_TAG_SHIFT)
#define CBS_ASN1_APPLICATION (0x40u << CBS_ASN1_TAG_SHIFT)
#define CBS_ASN1_CONTEXT_SPECIFIC (0x80u << CBS_ASN1_TAG_SHIFT)
#define CBS_ASN1_PRIVATE (0xc0u << CBS_ASN1_TAG_SHIFT)

// CBS_ASN1_CLASS_MASK may be ANDed with a tag to query its class. This will
// give one of the four values above.
#define CBS_ASN1_CLASS_MASK (0xc0u << CBS_ASN1_TAG_SHIFT)

// CBS_ASN1_TAG_NUMBER_MASK may be ANDed with a tag to query its number.
#define CBS_ASN1_TAG_NUMBER_MASK ((1u << (5 + CBS_ASN1_TAG_SHIFT)) - 1)

// The following values are constants for UNIVERSAL tags. Note these constants
// include the constructed bit.
#define CBS_ASN1_BOOLEAN 0x1u
#define CBS_ASN1_INTEGER 0x2u
#define CBS_ASN1_BITSTRING 0x3u
#define CBS_ASN1_OCTETSTRING 0x4u
#define CBS_ASN1_NULL 0x5u
#define CBS_ASN1_OBJECT 0x6u
#define CBS_ASN1_ENUMERATED 0xau
#define CBS_ASN1_UTF8STRING 0xcu
#define CBS_ASN1_SEQUENCE (0x10u | CBS_ASN1_CONSTRUCTED)
#define CBS_ASN1_SET (0x11u | CBS_ASN1_CONSTRUCTED)
#define CBS_ASN1_NUMERICSTRING 0x12u
#define CBS_ASN1_PRINTABLESTRING 0x13u
#define CBS_ASN1_T61STRING 0x14u
#define CBS_ASN1_VIDEOTEXSTRING 0x15u
#define CBS_ASN1_IA5STRING 0x16u
#define CBS_ASN1_UTCTIME 0x17u
#define CBS_ASN1_GENERALIZEDTIME 0x18u
#define CBS_ASN1_GRAPHICSTRING 0x19u
#define CBS_ASN1_VISIBLESTRING 0x1au
#define CBS_ASN1_GENERALSTRING 0x1bu
#define CBS_ASN1_UNIVERSALSTRING 0x1cu
#define CBS_ASN1_BMPSTRING 0x1eu

// CBS_get_asn1 sets `*out` to the contents of DER-encoded, ASN.1 element (not
// including tag and length bytes) and advances `cbs` over it. The ASN.1
// element must match `tag_value`. It returns one on success and zero
// on error.
OPENSSL_EXPORT int CBS_get_asn1(CBS *cbs, CBS *out, CBS_ASN1_TAG tag_value);

// CBS_get_asn1_element acts like `CBS_get_asn1` but `out` will include the
// ASN.1 header bytes too.
OPENSSL_EXPORT int CBS_get_asn1_element(CBS *cbs, CBS *out,
                                        CBS_ASN1_TAG tag_value);

// CBS_peek_any_asn1_tag looks ahead at the next ASN.1 tag and returns it. If a
// tag could not be parsed, it returns zero, which is never a valid tag. Note:
// if it returns non-zero, `CBS_get_asn1` may still fail if the rest of the
// element is malformed.
OPENSSL_EXPORT CBS_ASN1_TAG CBS_peek_any_asn1_tag(const CBS *cbs);

// CBS_peek_asn1_tag looks ahead at the next ASN.1 tag and returns one if the
// next ASN.1 element on `cbs` would have tag `tag_value`. If `cbs` is empty or
// the tag does not match, it returns zero. Note: if it returns one,
// `CBS_get_asn1` may still fail if the rest of the element is malformed.
OPENSSL_EXPORT int CBS_peek_asn1_tag(const CBS *cbs, CBS_ASN1_TAG tag_value);

// CBS_get_any_asn1 sets `*out` to contain the next ASN.1 element from `*cbs`
// (not including tag and length bytes), sets `*out_tag` to the tag number, and
// advances `*cbs`. It returns one on success and zero on error. Either of `out`
// and `out_tag` may be NULL to ignore the value.
OPENSSL_EXPORT int CBS_get_any_asn1(CBS *cbs, CBS *out,
                                    CBS_ASN1_TAG *out_tag);

// CBS_get_any_asn1_element sets `*out` to contain the next ASN.1 element from
// `*cbs` (including header bytes) and advances `*cbs`. It sets `*out_tag` to
// the tag number and `*out_header_len` to the length of the ASN.1 header. Each
// of `out`, `out_tag`, and `out_header_len` may be NULL to ignore the value.
OPENSSL_EXPORT int CBS_get_any_asn1_element(CBS *cbs, CBS *out,
                                            CBS_ASN1_TAG *out_tag,
                                            size_t *out_header_len);

// CBS_get_any_ber_asn1_element acts the same as `CBS_get_any_asn1_element` but
// also allows indefinite-length elements to be returned and does not enforce
// that lengths are minimal. It sets `*out_indefinite` to one if the length was
// indefinite and zero otherwise. If indefinite, `*out_header_len` and
// `CBS_len(out)` will be equal as only the header is returned (although this is
// also true for empty elements so `*out_indefinite` should be checked). If
// `out_ber_found` is not NULL then it is set to one if any case of invalid DER
// but valid BER is found, and to zero otherwise.
//
// This function will not successfully parse an end-of-contents (EOC) as an
// element. Callers parsing indefinite-length encoding must check for EOC
// separately.
OPENSSL_EXPORT int CBS_get_any_ber_asn1_element(CBS *cbs, CBS *out,
                                                CBS_ASN1_TAG *out_tag,
                                                size_t *out_header_len,
                                                int *out_ber_found,
                                                int *out_indefinite);

// CBS_get_asn1_uint64 gets an ASN.1 INTEGER from `cbs` using `CBS_get_asn1`
// and sets `*out` to its value. It returns one on success and zero on error,
// where error includes the integer being negative, or too large to represent
// in 64 bits.
OPENSSL_EXPORT int CBS_get_asn1_uint64(CBS *cbs, uint64_t *out);

// CBS_get_asn1_uint64_with_tag gets an ASN.1 INTEGER from `cbs` using
// `CBS_get_asn1` and sets `*out` to its value. `tag` is used to handle to
// handle implicitly tagged INTEGER fields. It returns one on success and zero
// on error, where error includes the integer being negative, or too large to
// represent in 64 bits.
OPENSSL_EXPORT int CBS_get_asn1_uint64_with_tag(CBS *cbs, uint64_t *out,
                                                CBS_ASN1_TAG tag);


// CBS_get_asn1_int64 gets an ASN.1 INTEGER from `cbs` using `CBS_get_asn1`
// and sets `*out` to its value. It returns one on success and zero on error,
// where error includes the integer being too large to represent in 64 bits.
OPENSSL_EXPORT int CBS_get_asn1_int64(CBS *cbs, int64_t *out);

// CBS_get_asn1_int64_with_tag gets an ASN.1 INTEGER from `cbs` using
// `CBS_get_asn1` and sets `*out` to its value. `tag` is used to handle to
// handle implicitly tagged INTEGER fields. It returns one on success and zero
// on error, where error includes the integer being too large to represent in 64
// bits.
OPENSSL_EXPORT int CBS_get_asn1_int64_with_tag(CBS *cbs, int64_t *out,
                                               CBS_ASN1_TAG tag);

// CBS_get_asn1_bool gets an ASN.1 BOOLEAN from `cbs` and sets `*out` to zero
// or one based on its value. It returns one on success or zero on error.
OPENSSL_EXPORT int CBS_get_asn1_bool(CBS *cbs, int *out);

// CBS_get_optional_asn1 gets an optional explicitly-tagged element from `cbs`
// tagged with `tag` and sets `*out` to its contents, or ignores it if `out` is
// NULL. If present and if `out_present` is not NULL, it sets `*out_present` to
// one, otherwise zero. It returns one on success, whether or not the element
// was present, and zero on decode failure.
OPENSSL_EXPORT int CBS_get_optional_asn1(CBS *cbs, CBS *out, int *out_present,
                                         CBS_ASN1_TAG tag);

// CBS_get_optional_asn1_octet_string gets an optional
// explicitly-tagged OCTET STRING from `cbs`. If present, it sets
// `*out` to the string and `*out_present` to one. Otherwise, it sets
// `*out` to empty and `*out_present` to zero. `out_present` may be
// NULL. It returns one on success, whether or not the element was
// present, and zero on decode failure.
OPENSSL_EXPORT int CBS_get_optional_asn1_octet_string(CBS *cbs, CBS *out,
                                                      int *out_present,
                                                      CBS_ASN1_TAG tag);

// CBS_get_optional_asn1_uint64 gets an optional explicitly-tagged
// INTEGER from `cbs`. If present, it sets `*out` to the
// value. Otherwise, it sets `*out` to `default_value`. It returns one
// on success, whether or not the element was present, and zero on
// decode failure.
OPENSSL_EXPORT int CBS_get_optional_asn1_uint64(CBS *cbs, uint64_t *out,
                                                CBS_ASN1_TAG tag,
                                                uint64_t default_value);

// CBS_get_optional_asn1_bool gets an optional, explicitly-tagged BOOLEAN from
// `cbs`. If present, it sets `*out` to either zero or one, based on the
// boolean. Otherwise, it sets `*out` to `default_value`. It returns one on
// success, whether or not the element was present, and zero on decode
// failure.
OPENSSL_EXPORT int CBS_get_optional_asn1_bool(CBS *cbs, int *out,
                                              CBS_ASN1_TAG tag,
                                              int default_value);

// CBS_is_valid_asn1_bitstring returns one if `cbs` is a valid ASN.1 BIT STRING
// body and zero otherwise.
OPENSSL_EXPORT int CBS_is_valid_asn1_bitstring(const CBS *cbs);

// CBS_asn1_bitstring_has_bit returns one if `cbs` is a valid ASN.1 BIT STRING
// body and the specified bit is present and set. Otherwise, it returns zero.
// `bit` is indexed starting from zero.
OPENSSL_EXPORT int CBS_asn1_bitstring_has_bit(const CBS *cbs, unsigned bit);

// CBS_is_valid_asn1_integer returns one if `cbs` is a valid ASN.1 INTEGER,
// body and zero otherwise. On success, if `out_is_negative` is non-NULL,
// `*out_is_negative` will be set to one if `cbs` is negative and zero
// otherwise.
OPENSSL_EXPORT int CBS_is_valid_asn1_integer(const CBS *cbs,
                                             int *out_is_negative);

// CBS_is_unsigned_asn1_integer returns one if `cbs` is a valid non-negative
// ASN.1 INTEGER body and zero otherwise.
OPENSSL_EXPORT int CBS_is_unsigned_asn1_integer(const CBS *cbs);

// CBS_is_valid_asn1_oid returns one if `cbs` is a valid DER-encoded ASN.1
// OBJECT IDENTIFIER contents (not including the element framing) and zero
// otherwise. This function tolerates arbitrarily large OID components.
OPENSSL_EXPORT int CBS_is_valid_asn1_oid(const CBS *cbs);

// CBS_asn1_oid_to_text interprets `cbs` as DER-encoded ASN.1 OBJECT IDENTIFIER
// contents (not including the element framing) and returns the ASCII
// representation (e.g., "1.2.840.113554.4.1.72585") in a newly-allocated
// string, or NULL on failure. The caller must release the result with
// `OPENSSL_free`.
//
// This function may fail if `cbs` is an invalid OBJECT IDENTIFIER, or if any
// OID components are too large.
OPENSSL_EXPORT char *CBS_asn1_oid_to_text(const CBS *cbs);

// CBS_is_valid_asn1_relative_oid returns one if `cbs` is a valid DER-encoded
// ASN.1 RELATIVE-OID contents (not including the element framing) and zero
// otherwise. This function tolerates arbitrarily large OID components.
//
// (This is actually the same as `CBS_is_valid_asn1_oid`, but is also exposed
// under the relative_oid name for API symmetry.)
OPENSSL_EXPORT int CBS_is_valid_asn1_relative_oid(const CBS *cbs);

// CBS_asn1_relative_oid_to_text interprets `cbs` as DER-encoded ASN.1
// RELATIVE-OID contents (not including the element framing) and returns the
// ASCII representation (e.g., "32473.1") in a newly-allocated string, or NULL
// on failure. The caller must release the result with `OPENSSL_free`.
//
// This function may fail if `cbs` is an invalid RELATIVE-OID, or if any
// OID components are too large.
OPENSSL_EXPORT char *CBS_asn1_relative_oid_to_text(const CBS *cbs);

// CBS_get_asn1_oid_component gets a single OID component from `cbs`. On
// success, it sets `*out` to the value, advances `cbs` past the component, and
// returns one. If the input does not contain a valid OID component or if the
// OID component is bigger than `uint64_t`, it returns zero.
//
// Specifically, this decodes a non-empty, minimal-width, base-128, big-endian
// integer. The high bit of each byte is set for continuation bytes and unset
// for the final byte. This encoding is also used for DER tag numbers 31 and up.
OPENSSL_EXPORT int CBS_get_asn1_oid_component(CBS *cbs, uint64_t *out);

// CBS_parse_generalized_time returns one if `cbs` is a valid DER-encoded, ASN.1
// GeneralizedTime body within the limitations imposed by RFC 5280, or zero
// otherwise. If `allow_timezone_offset` is non-zero, four-digit timezone
// offsets, which would not be allowed by DER, are permitted. On success, if
// `out_tm` is non-NULL, `*out_tm` will be zeroed, and then set to the
// corresponding time in UTC. This function does not compute `out_tm->tm_wday`
// or `out_tm->tm_yday`.
OPENSSL_EXPORT int CBS_parse_generalized_time(const CBS *cbs, struct tm *out_tm,
                                              int allow_timezone_offset);

// CBS_parse_utc_time returns one if `cbs` is a valid DER-encoded, ASN.1
// UTCTime body within the limitations imposed by RFC 5280, or zero otherwise.
// If `allow_timezone_offset` is non-zero, four-digit timezone offsets, which
// would not be allowed by DER, are permitted. On success, if `out_tm` is
// non-NULL, `*out_tm` will be zeroed, and then set to the corresponding time
// in UTC. This function does not compute `out_tm->tm_wday` or
// `out_tm->tm_yday`.
OPENSSL_EXPORT int CBS_parse_utc_time(const CBS *cbs, struct tm *out_tm,
                                      int allow_timezone_offset);


// CRYPTO ByteBuilder.
//
// `CBB` objects allow one to build length-prefixed serialisations. A `CBB`
// object is associated with a buffer and new buffers are created with
// `CBB_init`. Several `CBB` objects can point at the same buffer when a
// length-prefix is pending, however only a single `CBB` can be 'current' at
// any one time. For example, if one calls `CBB_add_u8_length_prefixed` then
// the new `CBB` points at the same buffer as the original. But if the original
// `CBB` is used then the length prefix is written out and the new `CBB` must
// not be used again.
//
// If one needs to force a length prefix to be written out because a `CBB` is
// going out of scope, use `CBB_flush`. If an operation on a `CBB` fails, it is
// in an undefined state and must not be used except to call `CBB_cleanup`.

struct cbb_buffer_st {
  uint8_t *buf;
  // len is the number of valid bytes in `buf`.
  size_t len;
  // cap is the size of `buf`.
  size_t cap;
  // can_resize is one iff `buf` is owned by this object. If not then `buf`
  // cannot be resized.
  unsigned can_resize : 1;
  // error is one if there was an error writing to this CBB. All future
  // operations will fail.
  unsigned error : 1;
};

struct cbb_child_st {
  // base is a pointer to the buffer this `CBB` writes to.
  struct cbb_buffer_st *base;
  // offset is the number of bytes from the start of `base->buf` to this `CBB`'s
  // pending length prefix.
  size_t offset;
  // pending_len_len contains the number of bytes in this `CBB`'s pending
  // length-prefix, or zero if no length-prefix is pending.
  uint8_t pending_len_len;
  unsigned pending_is_asn1 : 1;
};

struct cbb_st {
  // child points to a child CBB if a length-prefix is pending.
  CBB *child;
  // is_child is one if this is a child `CBB` and zero if it is a top-level
  // `CBB`. This determines which arm of the union is valid.
  char is_child;
  union {
    struct cbb_buffer_st base;
    struct cbb_child_st child;
  } u;
};

// CBB_zero sets an uninitialised `cbb` to the zero state. It must be
// initialised with `CBB_init` or `CBB_init_fixed` before use, but it is safe to
// call `CBB_cleanup` without a successful `CBB_init`. This may be used for more
// uniform cleanup of a `CBB`.
OPENSSL_EXPORT void CBB_zero(CBB *cbb);

// CBB_init initialises `cbb` with `initial_capacity`. Since a `CBB` grows as
// needed, the `initial_capacity` is just a hint. It returns one on success or
// zero on allocation failure.
OPENSSL_EXPORT int CBB_init(CBB *cbb, size_t initial_capacity);

// CBB_init_fixed initialises `cbb` to write to `len` bytes at `buf`. Since
// `buf` cannot grow, trying to write more than `len` bytes will cause CBB
// functions to fail. This function is infallible and always returns one. It is
// safe, but not necessary, to call `CBB_cleanup` on `cbb`.
OPENSSL_EXPORT int CBB_init_fixed(CBB *cbb, uint8_t *buf, size_t len);

// CBB_cleanup frees all resources owned by `cbb` and other `CBB` objects
// writing to the same buffer. This should be used in an error case where a
// serialisation is abandoned.
//
// This function can only be called on a "top level" `CBB`, i.e. one initialised
// with `CBB_init` or `CBB_init_fixed`, or a `CBB` set to the zero state with
// `CBB_zero`.
OPENSSL_EXPORT void CBB_cleanup(CBB *cbb);

// CBB_finish completes any pending length prefix and sets `*out_data` to a
// malloced buffer and `*out_len` to the length of that buffer. The caller
// takes ownership of the buffer and, unless the buffer was fixed with
// `CBB_init_fixed`, must call `OPENSSL_free` when done.
//
// It can only be called on a "top level" `CBB`, i.e. one initialised with
// `CBB_init` or `CBB_init_fixed`. It returns one on success and zero on
// error.
OPENSSL_EXPORT int CBB_finish(CBB *cbb, uint8_t **out_data, size_t *out_len);

// CBB_flush causes any pending length prefixes to be written out and any child
// `CBB` objects of `cbb` to be invalidated. This allows `cbb` to continue to be
// used after the children go out of scope, e.g. when local `CBB` objects are
// added as children to a `CBB` that persists after a function returns. This
// function returns one on success or zero on error.
OPENSSL_EXPORT int CBB_flush(CBB *cbb);

// CBB_data returns a pointer to the bytes written to `cbb`. It does not flush
// `cbb`. The pointer is valid until the next operation to `cbb`.
//
// To avoid unfinalized length prefixes, it is a fatal error to call this on a
// CBB with any active children.
OPENSSL_EXPORT uint8_t *CBB_data(const CBB *cbb);

// CBB_len returns the number of bytes written to `cbb`. It does not flush
// `cbb`.
//
// To avoid unfinalized length prefixes, it is a fatal error to call this on a
// CBB with any active children.
OPENSSL_EXPORT size_t CBB_len(const CBB *cbb);

// CBB_add_u8_length_prefixed sets `*out_contents` to a new child of `cbb`. The
// data written to `*out_contents` will be prefixed in `cbb` with an 8-bit
// length. It returns one on success or zero on error.
OPENSSL_EXPORT int CBB_add_u8_length_prefixed(CBB *cbb, CBB *out_contents);

// CBB_add_u16_length_prefixed sets `*out_contents` to a new child of `cbb`.
// The data written to `*out_contents` will be prefixed in `cbb` with a 16-bit,
// big-endian length. It returns one on success or zero on error.
OPENSSL_EXPORT int CBB_add_u16_length_prefixed(CBB *cbb, CBB *out_contents);

// CBB_add_u24_length_prefixed sets `*out_contents` to a new child of `cbb`.
// The data written to `*out_contents` will be prefixed in `cbb` with a 24-bit,
// big-endian length. It returns one on success or zero on error.
OPENSSL_EXPORT int CBB_add_u24_length_prefixed(CBB *cbb, CBB *out_contents);

// CBB_add_asn1 sets `*out_contents` to a `CBB` into which the contents of an
// ASN.1 object can be written. The `tag` argument will be used as the tag for
// the object. It returns one on success or zero on error.
OPENSSL_EXPORT int CBB_add_asn1(CBB *cbb, CBB *out_contents, CBS_ASN1_TAG tag);

// CBB_add_bytes appends `len` bytes from `data` to `cbb`. It returns one on
// success and zero otherwise.
OPENSSL_EXPORT int CBB_add_bytes(CBB *cbb, const uint8_t *data, size_t len);

// CBB_add_zeros append `len` bytes with value zero to `cbb`. It returns one on
// success and zero otherwise.
OPENSSL_EXPORT int CBB_add_zeros(CBB *cbb, size_t len);

// CBB_add_space appends `len` bytes to `cbb` and sets `*out_data` to point to
// the beginning of that space. The caller must then write `len` bytes of
// actual contents to `*out_data`. It returns one on success and zero
// otherwise.
OPENSSL_EXPORT int CBB_add_space(CBB *cbb, uint8_t **out_data, size_t len);

// CBB_reserve ensures `cbb` has room for `len` additional bytes and sets
// `*out_data` to point to the beginning of that space. It returns one on
// success and zero otherwise. The caller may write up to `len` bytes to
// `*out_data` and call `CBB_did_write` to complete the write. `*out_data` is
// valid until the next operation on `cbb` or an ancestor `CBB`.
OPENSSL_EXPORT int CBB_reserve(CBB *cbb, uint8_t **out_data, size_t len);

// CBB_did_write advances `cbb` by `len` bytes, assuming the space has been
// written to by the caller. It returns one on success and zero on error.
OPENSSL_EXPORT int CBB_did_write(CBB *cbb, size_t len);

// CBB_add_u8 appends an 8-bit number from `value` to `cbb`. It returns one on
// success and zero otherwise.
OPENSSL_EXPORT int CBB_add_u8(CBB *cbb, uint8_t value);

// CBB_add_u16 appends a 16-bit, big-endian number from `value` to `cbb`. It
// returns one on success and zero otherwise.
OPENSSL_EXPORT int CBB_add_u16(CBB *cbb, uint16_t value);

// CBB_add_u16le appends a 16-bit, little-endian number from `value` to `cbb`.
// It returns one on success and zero otherwise.
OPENSSL_EXPORT int CBB_add_u16le(CBB *cbb, uint16_t value);

// CBB_add_u24 appends a 24-bit, big-endian number from `value` to `cbb`. It
// returns one on success and zero otherwise.
OPENSSL_EXPORT int CBB_add_u24(CBB *cbb, uint32_t value);

// CBB_add_u32 appends a 32-bit, big-endian number from `value` to `cbb`. It
// returns one on success and zero otherwise.
OPENSSL_EXPORT int CBB_add_u32(CBB *cbb, uint32_t value);

// CBB_add_u32le appends a 32-bit, little-endian number from `value` to `cbb`.
// It returns one on success and zero otherwise.
OPENSSL_EXPORT int CBB_add_u32le(CBB *cbb, uint32_t value);

// CBB_add_u48 appends a 48-bit, big-endian number from `value` to `cbb`. It
// returns one on success and zero otherwise.
OPENSSL_EXPORT int CBB_add_u48(CBB *cbb, uint64_t value);

// CBB_add_u64 appends a 64-bit, big-endian number from `value` to `cbb`. It
// returns one on success and zero otherwise.
OPENSSL_EXPORT int CBB_add_u64(CBB *cbb, uint64_t value);

// CBB_add_u64le appends a 64-bit, little-endian number from `value` to `cbb`.
// It returns one on success and zero otherwise.
OPENSSL_EXPORT int CBB_add_u64le(CBB *cbb, uint64_t value);

// CBB_discard discards the last `len` bytes written to `cbb`. The process will
// abort if `cbb` has an unflushed child, or its length is smaller than `len`.
OPENSSL_EXPORT void CBB_discard(CBB *cbb, size_t len);

// CBB_discard_child discards the current unflushed child of `cbb`. Neither the
// child's contents nor the length prefix will be included in the output.
OPENSSL_EXPORT void CBB_discard_child(CBB *cbb);

// CBB_add_asn1_element adds an ASN.1 element with the specified tag and
// contents. It returns one on success and zero on error. This is a convenience
// function over `CBB_add_asn1` when the data is already available.
OPENSSL_EXPORT int CBB_add_asn1_element(CBB *cbb, CBS_ASN1_TAG tag,
                                        const uint8_t *data, size_t data_len);

// CBB_add_asn1_uint64 writes an ASN.1 INTEGER into `cbb` using `CBB_add_asn1`
// and writes `value` in its contents. It returns one on success and zero on
// error.
OPENSSL_EXPORT int CBB_add_asn1_uint64(CBB *cbb, uint64_t value);

// CBB_add_asn1_uint64_with_tag behaves like `CBB_add_asn1_uint64` but uses
// `tag` as the tag instead of INTEGER. This is useful if the INTEGER type uses
// implicit tagging.
OPENSSL_EXPORT int CBB_add_asn1_uint64_with_tag(CBB *cbb, uint64_t value,
                                                CBS_ASN1_TAG tag);

// CBB_add_asn1_int64 writes an ASN.1 INTEGER into `cbb` using `CBB_add_asn1`
// and writes `value` in its contents. It returns one on success and zero on
// error.
OPENSSL_EXPORT int CBB_add_asn1_int64(CBB *cbb, int64_t value);

// CBB_add_asn1_int64_with_tag behaves like `CBB_add_asn1_int64` but uses `tag`
// as the tag instead of INTEGER. This is useful if the INTEGER type uses
// implicit tagging.
OPENSSL_EXPORT int CBB_add_asn1_int64_with_tag(CBB *cbb, int64_t value,
                                               CBS_ASN1_TAG tag);

// CBB_add_asn1_octet_string writes an ASN.1 OCTET STRING into `cbb` with the
// given contents. It returns one on success and zero on error.
OPENSSL_EXPORT int CBB_add_asn1_octet_string(CBB *cbb, const uint8_t *data,
                                             size_t data_len);

// CBB_add_asn1_bool writes an ASN.1 BOOLEAN into `cbb` which is true iff
// `value` is non-zero.  It returns one on success and zero on error.
OPENSSL_EXPORT int CBB_add_asn1_bool(CBB *cbb, int value);

// CBB_add_asn1_oid_from_text decodes `len` bytes from `text` as an ASCII OID
// representation, e.g. "1.2.840.113554.4.1.72585", and writes the DER-encoded
// contents to `cbb`. It returns one on success and zero on malloc failure or if
// `text` was invalid. It does not include the OBJECT IDENTIFIER framing, only
// the element's contents.
//
// This function considers OID strings with components which do not fit in a
// `uint64_t` to be invalid.
OPENSSL_EXPORT int CBB_add_asn1_oid_from_text(CBB *cbb, const char *text,
                                              size_t len);

// CBB_add_asn1_relative_oid_from_text decodes `len` bytes from `text` as an
// ASCII RELATIVE-OID representation, e.g. "32473.1", and writes the
// DER-encoded contents to `cbb`. It returns one on success and zero on malloc
// failure or if `text` was invalid. It does not include any framing, only the
// element's contents.
//
// This function considers OID strings with components which do not fit in a
// `uint64_t` to be invalid.
OPENSSL_EXPORT int CBB_add_asn1_relative_oid_from_text(CBB *cbb,
                                                       const char *text,
                                                       size_t len);

// CBB_add_asn1_oid_component appends a single OID component to `cbb`.
// It returns one on success and zero on error.
//
// Specifically, this encodes `value` as a non-empty, minimal-width, base-128,
// big-endian integer. The high bit of each byte is set for continuation bytes
// and unset for the final byte. This encoding is also used for DER tag numbers
// 31 and up.
OPENSSL_EXPORT int CBB_add_asn1_oid_component(CBB *cbb, uint64_t value);

// CBB_flush_asn1_set_of calls `CBB_flush` on `cbb` and then reorders the
// contents for a DER-encoded ASN.1 SET OF type. It returns one on success and
// zero on failure. DER canonicalizes SET OF contents by sorting
// lexicographically by encoding. Call this function when encoding a SET OF
// type in an order that is not already known to be canonical.
//
// Note a SET type has a slightly different ordering than a SET OF.
OPENSSL_EXPORT int CBB_flush_asn1_set_of(CBB *cbb);


// Unicode utilities.
//
// These functions consider noncharacters (see section 23.7 from Unicode 15.0.0)
// to be invalid code points and will treat them as an error condition.

// The following functions read one Unicode code point from `cbs` with the
// corresponding encoding and store it in `*out`. They return one on success and
// zero on error.
OPENSSL_EXPORT int CBS_get_utf8(CBS *cbs, uint32_t *out);
OPENSSL_EXPORT int CBS_get_latin1(CBS *cbs, uint32_t *out);
OPENSSL_EXPORT int CBS_get_ucs2_be(CBS *cbs, uint32_t *out);
OPENSSL_EXPORT int CBS_get_utf32_be(CBS *cbs, uint32_t *out);

// CBB_get_utf8_len returns the number of bytes needed to represent `u` in
// UTF-8.
OPENSSL_EXPORT size_t CBB_get_utf8_len(uint32_t u);

// The following functions encode `u` to `cbb` with the corresponding
// encoding. They return one on success and zero on error. Error conditions
// include `u` being an invalid code point, or `u` being unencodable in the
// specified encoding.
OPENSSL_EXPORT int CBB_add_utf8(CBB *cbb, uint32_t u);
OPENSSL_EXPORT int CBB_add_latin1(CBB *cbb, uint32_t u);
OPENSSL_EXPORT int CBB_add_ucs2_be(CBB *cbb, uint32_t u);
OPENSSL_EXPORT int CBB_add_utf32_be(CBB *cbb, uint32_t u);


#if defined(__cplusplus)
}  // extern C


#if !defined(BORINGSSL_NO_CXX)
extern "C++" {

BSSL_NAMESPACE_BEGIN

using ScopedCBB = internal::StackAllocated<CBB, void, CBB_zero, CBB_cleanup>;

BSSL_NAMESPACE_END

}  // extern C++
#endif

#endif

#endif  // OPENSSL_HEADER_BYTESTRING_H
