// 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_RELATIVE_OID 0xdu
#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_relative_oid_from_der_to_text reads `data_len` bytes of
// DER-encoded ASN.1 RELATIVE-OID contents (not including the element framing)
// from `data` and writes the ASCII representation (e.g., "32473.1") to `cbb`
// (without a trailing NUL byte). It returns one on success and zero on
// failure.
//
// This function may fail if `data` is an invalid RELATIVE-OID, or if any OID
// components are too large.
OPENSSL_EXPORT int CBB_add_asn1_relative_oid_from_der_to_text(
    CBB *cbb, const uint8_t *data, size_t data_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

BORINGSSL_MAKE_STACK_TRAITS(CBB, CBB_zero, CBB_cleanup)
using ScopedCBB = internal::StackAllocated<CBB>;

BSSL_NAMESPACE_END

}  // extern C++
#endif

#endif

#endif  // OPENSSL_HEADER_BYTESTRING_H
