You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

Factor out the buffering and low-level record code. This begins decoupling the transport from the SSL state machine. The buffering logic is hidden behind an opaque API. Fields like ssl->packet and ssl->packet_length are gone. ssl3_get_record and dtls1_get_record now call low-level tls_open_record and dtls_open_record functions that unpack a single record independent of who owns the buffer. Both may be called in-place. This removes ssl->rstate which was redundant with the buffer length. Future work will push the buffer up the stack until it is above the handshake. Then we can expose SSL_open and SSL_seal APIs which act like *_open_record but return a slightly larger enum due to other events being possible. Likewise the handshake state machine will be detached from its buffer. The existing SSL_read, SSL_write, etc., APIs will be implemented on top of SSL_open, etc., combined with ssl_read_buffer_* and ssl_write_buffer_*. (Which is why ssl_read_buffer_extend still tries to abstract between TLS's and DTLS's fairly different needs.) The new buffering logic does not support read-ahead (removed previously) since it lacks a memmove on ssl_read_buffer_discard for TLS, but this could be added if desired. The old buffering logic wasn't quite right anyway; it tried to avoid the memmove in some cases and could get stuck too far into the buffer and not accept records. (The only time the memmove is optional is in DTLS or if enough of the record header is available to know that the entire next record would fit in the buffer.) The new logic also now actually decrypts the ciphertext in-place again, rather than almost in-place when there's an explicit nonce/IV. (That accidentally switched in https://boringssl-review.googlesource.com/#/c/4792/; see 3d59e04bce96474099ba76786a2337e99ae14505.) BUG=468889 Change-Id: I403c1626253c46897f47c7ae93aeab1064b767b2 Reviewed-on: https://boringssl-review.googlesource.com/5715 Reviewed-by: Adam Langley <agl@google.com>
преди 9 години
Make CBB_len relative to its argument. Rather than the length of the top-level CBB, which is kind of odd when ASN.1 length prefixes are not yet determined, return the number of bytes written to the CBB so far. This can be computed without increasing the size of CBB at all. Have offset and pending_*. This means functions which take in a CBB as argument will not be sensitive to whether the CBB is a top-level or child CBB. The extensions logic had to be careful to only ever compare differences of lengths, which was awkward. The reversal will also allow for the following pattern in the future, once CBB_add_space is split into, say, CBB_reserve and CBB_did_write and we add a CBB_data: uint8_t *signature; size_t signature_len = 0; if (!CBB_add_asn1(out, &cert, CBB_ASN1_SEQUENCE) || /* Emit the TBSCertificate. */ !CBB_add_asn1(&cert, &tbs_cert, CBS_ASN1_SEQUENCE) || !CBB_add_tbs_cert_stuff(&tbs_cert, stuff) || !CBB_flush(&cert) || /* Feed it into md_ctx. */ !EVP_DigestSignInit(&md_ctx, NULL, EVP_sha256(), NULL, pkey) || !EVP_DigestSignUpdate(&md_ctx, CBB_data(&cert), CBB_len(&cert)) || /* Emit the signature algorithm. */ !CBB_add_asn1(&cert, &sig_alg, CBS_ASN1_SEQUENCE) || !CBB_add_sigalg_stuff(&sig_alg, other_stuff) || /* Emit the signature. */ !EVP_DigestSignFinal(&md_ctx, NULL, &signature_len) || !CBB_reserve(&cert, &signature, signature_len) || !EVP_DigestSignFinal(&md_ctx, signature, &signature_len) || !CBB_did_write(&cert, signature_len)) { goto err; } (Were TBSCertificate not the first field, we'd still have to sample CBB_len(&cert), but at least that's reasonable straight-forward. The alternative would be if CBB_data and CBB_len somehow worked on recently-invalidated CBBs, but that would go wrong once the invalidated CBB's parent flushed and possibly shifts everything.) And similar for signing ServerKeyExchange. Change-Id: I7761e492ae472d7632875b5666b6088970261b14 Reviewed-on: https://boringssl-review.googlesource.com/6681 Reviewed-by: Adam Langley <agl@google.com>
преди 9 години
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519
  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. #ifndef OPENSSL_HEADER_BYTESTRING_H
  15. #define OPENSSL_HEADER_BYTESTRING_H
  16. #include <openssl/base.h>
  17. #include <openssl/span.h>
  18. #if defined(__cplusplus)
  19. extern "C" {
  20. #endif
  21. // Bytestrings are used for parsing and building TLS and ASN.1 messages.
  22. //
  23. // A "CBS" (CRYPTO ByteString) represents a string of bytes in memory and
  24. // provides utility functions for safely parsing length-prefixed structures
  25. // like TLS and ASN.1 from it.
  26. //
  27. // A "CBB" (CRYPTO ByteBuilder) is a memory buffer that grows as needed and
  28. // provides utility functions for building length-prefixed messages.
  29. // CRYPTO ByteString
  30. struct cbs_st {
  31. const uint8_t *data;
  32. size_t len;
  33. #if !defined(BORINGSSL_NO_CXX)
  34. // Allow implicit conversions to and from bssl::Span<const uint8_t>.
  35. cbs_st(bssl::Span<const uint8_t> span)
  36. : data(span.data()), len(span.size()) {}
  37. operator bssl::Span<const uint8_t>() const {
  38. return bssl::MakeConstSpan(data, len);
  39. }
  40. // Defining any constructors requires we explicitly default the others.
  41. cbs_st() = default;
  42. cbs_st(const cbs_st &) = default;
  43. #endif
  44. };
  45. // CBS_init sets |cbs| to point to |data|. It does not take ownership of
  46. // |data|.
  47. OPENSSL_EXPORT void CBS_init(CBS *cbs, const uint8_t *data, size_t len);
  48. // CBS_skip advances |cbs| by |len| bytes. It returns one on success and zero
  49. // otherwise.
  50. OPENSSL_EXPORT int CBS_skip(CBS *cbs, size_t len);
  51. // CBS_data returns a pointer to the contents of |cbs|.
  52. OPENSSL_EXPORT const uint8_t *CBS_data(const CBS *cbs);
  53. // CBS_len returns the number of bytes remaining in |cbs|.
  54. OPENSSL_EXPORT size_t CBS_len(const CBS *cbs);
  55. // CBS_stow copies the current contents of |cbs| into |*out_ptr| and
  56. // |*out_len|. If |*out_ptr| is not NULL, the contents are freed with
  57. // OPENSSL_free. It returns one on success and zero on allocation failure. On
  58. // success, |*out_ptr| should be freed with OPENSSL_free. If |cbs| is empty,
  59. // |*out_ptr| will be NULL.
  60. OPENSSL_EXPORT int CBS_stow(const CBS *cbs, uint8_t **out_ptr, size_t *out_len);
  61. // CBS_strdup copies the current contents of |cbs| into |*out_ptr| as a
  62. // NUL-terminated C string. If |*out_ptr| is not NULL, the contents are freed
  63. // with OPENSSL_free. It returns one on success and zero on allocation
  64. // failure. On success, |*out_ptr| should be freed with OPENSSL_free.
  65. //
  66. // NOTE: If |cbs| contains NUL bytes, the string will be truncated. Call
  67. // |CBS_contains_zero_byte(cbs)| to check for NUL bytes.
  68. OPENSSL_EXPORT int CBS_strdup(const CBS *cbs, char **out_ptr);
  69. // CBS_contains_zero_byte returns one if the current contents of |cbs| contains
  70. // a NUL byte and zero otherwise.
  71. OPENSSL_EXPORT int CBS_contains_zero_byte(const CBS *cbs);
  72. // CBS_mem_equal compares the current contents of |cbs| with the |len| bytes
  73. // starting at |data|. If they're equal, it returns one, otherwise zero. If the
  74. // lengths match, it uses a constant-time comparison.
  75. OPENSSL_EXPORT int CBS_mem_equal(const CBS *cbs, const uint8_t *data,
  76. size_t len);
  77. // CBS_get_u8 sets |*out| to the next uint8_t from |cbs| and advances |cbs|. It
  78. // returns one on success and zero on error.
  79. OPENSSL_EXPORT int CBS_get_u8(CBS *cbs, uint8_t *out);
  80. // CBS_get_u16 sets |*out| to the next, big-endian uint16_t from |cbs| and
  81. // advances |cbs|. It returns one on success and zero on error.
  82. OPENSSL_EXPORT int CBS_get_u16(CBS *cbs, uint16_t *out);
  83. // CBS_get_u24 sets |*out| to the next, big-endian 24-bit value from |cbs| and
  84. // advances |cbs|. It returns one on success and zero on error.
  85. OPENSSL_EXPORT int CBS_get_u24(CBS *cbs, uint32_t *out);
  86. // CBS_get_u32 sets |*out| to the next, big-endian uint32_t value from |cbs|
  87. // and advances |cbs|. It returns one on success and zero on error.
  88. OPENSSL_EXPORT int CBS_get_u32(CBS *cbs, uint32_t *out);
  89. // CBS_get_last_u8 sets |*out| to the last uint8_t from |cbs| and shortens
  90. // |cbs|. It returns one on success and zero on error.
  91. OPENSSL_EXPORT int CBS_get_last_u8(CBS *cbs, uint8_t *out);
  92. // CBS_get_bytes sets |*out| to the next |len| bytes from |cbs| and advances
  93. // |cbs|. It returns one on success and zero on error.
  94. OPENSSL_EXPORT int CBS_get_bytes(CBS *cbs, CBS *out, size_t len);
  95. // CBS_copy_bytes copies the next |len| bytes from |cbs| to |out| and advances
  96. // |cbs|. It returns one on success and zero on error.
  97. OPENSSL_EXPORT int CBS_copy_bytes(CBS *cbs, uint8_t *out, size_t len);
  98. // CBS_get_u8_length_prefixed sets |*out| to the contents of an 8-bit,
  99. // length-prefixed value from |cbs| and advances |cbs| over it. It returns one
  100. // on success and zero on error.
  101. OPENSSL_EXPORT int CBS_get_u8_length_prefixed(CBS *cbs, CBS *out);
  102. // CBS_get_u16_length_prefixed sets |*out| to the contents of a 16-bit,
  103. // big-endian, length-prefixed value from |cbs| and advances |cbs| over it. It
  104. // returns one on success and zero on error.
  105. OPENSSL_EXPORT int CBS_get_u16_length_prefixed(CBS *cbs, CBS *out);
  106. // CBS_get_u24_length_prefixed sets |*out| to the contents of a 24-bit,
  107. // big-endian, length-prefixed value from |cbs| and advances |cbs| over it. It
  108. // returns one on success and zero on error.
  109. OPENSSL_EXPORT int CBS_get_u24_length_prefixed(CBS *cbs, CBS *out);
  110. // Parsing ASN.1
  111. //
  112. // |CBS| may be used to parse DER structures. Rather than using a schema
  113. // compiler, the following functions act on tag-length-value elements in the
  114. // serialization itself. Thus the caller is responsible for looping over a
  115. // SEQUENCE, branching on CHOICEs or OPTIONAL fields, checking for trailing
  116. // data, and handling explict vs. implicit tagging.
  117. //
  118. // Tags are represented as |unsigned| values in memory. The upper few bits store
  119. // the class and constructed bit, and the remaining bits store the tag
  120. // number. Note this differs from the DER serialization, to support tag numbers
  121. // beyond 31. Consumers must use the constants defined below to decompose or
  122. // assemble tags.
  123. //
  124. // This library treats an element's constructed bit as part of its tag. In DER,
  125. // the constructed bit is computable from the type. The constants for universal
  126. // types have the bit set. Callers must set it correctly for tagged types.
  127. // Explicitly-tagged types are always constructed, and implicitly-tagged types
  128. // inherit the underlying type's bit.
  129. // CBS_ASN1_TAG_SHIFT is how much the in-memory representation shifts the class
  130. // and constructed bits from the DER serialization.
  131. #define CBS_ASN1_TAG_SHIFT 24
  132. // CBS_ASN1_CONSTRUCTED may be ORed into a tag to set the constructed bit.
  133. #define CBS_ASN1_CONSTRUCTED (0x20u << CBS_ASN1_TAG_SHIFT)
  134. // The following values specify the tag class and may be ORed into a tag number
  135. // to produce the final tag. If none is used, the tag will be UNIVERSAL.
  136. #define CBS_ASN1_UNIVERSAL (0u << CBS_ASN1_TAG_SHIFT)
  137. #define CBS_ASN1_APPLICATION (0x40u << CBS_ASN1_TAG_SHIFT)
  138. #define CBS_ASN1_CONTEXT_SPECIFIC (0x80u << CBS_ASN1_TAG_SHIFT)
  139. #define CBS_ASN1_PRIVATE (0xc0u << CBS_ASN1_TAG_SHIFT)
  140. // CBS_ASN1_CLASS_MASK may be ANDed with a tag to query its class. This will
  141. // give one of the four values above.
  142. #define CBS_ASN1_CLASS_MASK (0xc0u << CBS_ASN1_TAG_SHIFT)
  143. // CBS_ASN1_TAG_NUMBER_MASK may be ANDed with a tag to query its number.
  144. #define CBS_ASN1_TAG_NUMBER_MASK ((1u << (5 + CBS_ASN1_TAG_SHIFT)) - 1)
  145. // The following values are constants for UNIVERSAL tags. Note these constants
  146. // include the constructed bit.
  147. #define CBS_ASN1_BOOLEAN 0x1u
  148. #define CBS_ASN1_INTEGER 0x2u
  149. #define CBS_ASN1_BITSTRING 0x3u
  150. #define CBS_ASN1_OCTETSTRING 0x4u
  151. #define CBS_ASN1_NULL 0x5u
  152. #define CBS_ASN1_OBJECT 0x6u
  153. #define CBS_ASN1_ENUMERATED 0xau
  154. #define CBS_ASN1_UTF8STRING 0xcu
  155. #define CBS_ASN1_SEQUENCE (0x10u | CBS_ASN1_CONSTRUCTED)
  156. #define CBS_ASN1_SET (0x11u | CBS_ASN1_CONSTRUCTED)
  157. #define CBS_ASN1_NUMERICSTRING 0x12u
  158. #define CBS_ASN1_PRINTABLESTRING 0x13u
  159. #define CBS_ASN1_T61STRING 0x14u
  160. #define CBS_ASN1_VIDEOTEXSTRING 0x15u
  161. #define CBS_ASN1_IA5STRING 0x16u
  162. #define CBS_ASN1_UTCTIME 0x17u
  163. #define CBS_ASN1_GENERALIZEDTIME 0x18u
  164. #define CBS_ASN1_GRAPHICSTRING 0x19u
  165. #define CBS_ASN1_VISIBLESTRING 0x1au
  166. #define CBS_ASN1_GENERALSTRING 0x1bu
  167. #define CBS_ASN1_UNIVERSALSTRING 0x1cu
  168. #define CBS_ASN1_BMPSTRING 0x1eu
  169. // CBS_get_asn1 sets |*out| to the contents of DER-encoded, ASN.1 element (not
  170. // including tag and length bytes) and advances |cbs| over it. The ASN.1
  171. // element must match |tag_value|. It returns one on success and zero
  172. // on error.
  173. OPENSSL_EXPORT int CBS_get_asn1(CBS *cbs, CBS *out, unsigned tag_value);
  174. // CBS_get_asn1_element acts like |CBS_get_asn1| but |out| will include the
  175. // ASN.1 header bytes too.
  176. OPENSSL_EXPORT int CBS_get_asn1_element(CBS *cbs, CBS *out, unsigned tag_value);
  177. // CBS_peek_asn1_tag looks ahead at the next ASN.1 tag and returns one
  178. // if the next ASN.1 element on |cbs| would have tag |tag_value|. If
  179. // |cbs| is empty or the tag does not match, it returns zero. Note: if
  180. // it returns one, CBS_get_asn1 may still fail if the rest of the
  181. // element is malformed.
  182. OPENSSL_EXPORT int CBS_peek_asn1_tag(const CBS *cbs, unsigned tag_value);
  183. // CBS_get_any_asn1 sets |*out| to contain the next ASN.1 element from |*cbs|
  184. // (not including tag and length bytes), sets |*out_tag| to the tag number, and
  185. // advances |*cbs|. It returns one on success and zero on error. Either of |out|
  186. // and |out_tag| may be NULL to ignore the value.
  187. OPENSSL_EXPORT int CBS_get_any_asn1(CBS *cbs, CBS *out, unsigned *out_tag);
  188. // CBS_get_any_asn1_element sets |*out| to contain the next ASN.1 element from
  189. // |*cbs| (including header bytes) and advances |*cbs|. It sets |*out_tag| to
  190. // the tag number and |*out_header_len| to the length of the ASN.1 header. Each
  191. // of |out|, |out_tag|, and |out_header_len| may be NULL to ignore the value.
  192. OPENSSL_EXPORT int CBS_get_any_asn1_element(CBS *cbs, CBS *out,
  193. unsigned *out_tag,
  194. size_t *out_header_len);
  195. // CBS_get_any_ber_asn1_element acts the same as |CBS_get_any_asn1_element| but
  196. // also allows indefinite-length elements to be returned. In that case,
  197. // |*out_header_len| and |CBS_len(out)| will both be two as only the header is
  198. // returned, otherwise it behaves the same as the previous function.
  199. OPENSSL_EXPORT int CBS_get_any_ber_asn1_element(CBS *cbs, CBS *out,
  200. unsigned *out_tag,
  201. size_t *out_header_len);
  202. // CBS_get_asn1_uint64 gets an ASN.1 INTEGER from |cbs| using |CBS_get_asn1|
  203. // and sets |*out| to its value. It returns one on success and zero on error,
  204. // where error includes the integer being negative, or too large to represent
  205. // in 64 bits.
  206. OPENSSL_EXPORT int CBS_get_asn1_uint64(CBS *cbs, uint64_t *out);
  207. // CBS_get_asn1_bool gets an ASN.1 BOOLEAN from |cbs| and sets |*out| to zero
  208. // or one based on its value. It returns one on success or zero on error.
  209. OPENSSL_EXPORT int CBS_get_asn1_bool(CBS *cbs, int *out);
  210. // CBS_get_optional_asn1 gets an optional explicitly-tagged element from |cbs|
  211. // tagged with |tag| and sets |*out| to its contents, or ignores it if |out| is
  212. // NULL. If present and if |out_present| is not NULL, it sets |*out_present| to
  213. // one, otherwise zero. It returns one on success, whether or not the element
  214. // was present, and zero on decode failure.
  215. OPENSSL_EXPORT int CBS_get_optional_asn1(CBS *cbs, CBS *out, int *out_present,
  216. unsigned tag);
  217. // CBS_get_optional_asn1_octet_string gets an optional
  218. // explicitly-tagged OCTET STRING from |cbs|. If present, it sets
  219. // |*out| to the string and |*out_present| to one. Otherwise, it sets
  220. // |*out| to empty and |*out_present| to zero. |out_present| may be
  221. // NULL. It returns one on success, whether or not the element was
  222. // present, and zero on decode failure.
  223. OPENSSL_EXPORT int CBS_get_optional_asn1_octet_string(CBS *cbs, CBS *out,
  224. int *out_present,
  225. unsigned tag);
  226. // CBS_get_optional_asn1_uint64 gets an optional explicitly-tagged
  227. // INTEGER from |cbs|. If present, it sets |*out| to the
  228. // value. Otherwise, it sets |*out| to |default_value|. It returns one
  229. // on success, whether or not the element was present, and zero on
  230. // decode failure.
  231. OPENSSL_EXPORT int CBS_get_optional_asn1_uint64(CBS *cbs, uint64_t *out,
  232. unsigned tag,
  233. uint64_t default_value);
  234. // CBS_get_optional_asn1_bool gets an optional, explicitly-tagged BOOLEAN from
  235. // |cbs|. If present, it sets |*out| to either zero or one, based on the
  236. // boolean. Otherwise, it sets |*out| to |default_value|. It returns one on
  237. // success, whether or not the element was present, and zero on decode
  238. // failure.
  239. OPENSSL_EXPORT int CBS_get_optional_asn1_bool(CBS *cbs, int *out, unsigned tag,
  240. int default_value);
  241. // CBS_is_valid_asn1_bitstring returns one if |cbs| is a valid ASN.1 BIT STRING
  242. // and zero otherwise.
  243. OPENSSL_EXPORT int CBS_is_valid_asn1_bitstring(const CBS *cbs);
  244. // CBS_asn1_bitstring_has_bit returns one if |cbs| is a valid ASN.1 BIT STRING
  245. // and the specified bit is present and set. Otherwise, it returns zero. |bit|
  246. // is indexed starting from zero.
  247. OPENSSL_EXPORT int CBS_asn1_bitstring_has_bit(const CBS *cbs, unsigned bit);
  248. // CBS_asn1_oid_to_text interprets |cbs| as DER-encoded ASN.1 OBJECT IDENTIFIER
  249. // contents (not including the element framing) and returns the ASCII
  250. // representation (e.g., "1.2.840.113554.4.1.72585") in a newly-allocated
  251. // string, or NULL on failure. The caller must release the result with
  252. // |OPENSSL_free|.
  253. OPENSSL_EXPORT char *CBS_asn1_oid_to_text(const CBS *cbs);
  254. // CRYPTO ByteBuilder.
  255. //
  256. // |CBB| objects allow one to build length-prefixed serialisations. A |CBB|
  257. // object is associated with a buffer and new buffers are created with
  258. // |CBB_init|. Several |CBB| objects can point at the same buffer when a
  259. // length-prefix is pending, however only a single |CBB| can be 'current' at
  260. // any one time. For example, if one calls |CBB_add_u8_length_prefixed| then
  261. // the new |CBB| points at the same buffer as the original. But if the original
  262. // |CBB| is used then the length prefix is written out and the new |CBB| must
  263. // not be used again.
  264. //
  265. // If one needs to force a length prefix to be written out because a |CBB| is
  266. // going out of scope, use |CBB_flush|. If an operation on a |CBB| fails, it is
  267. // in an undefined state and must not be used except to call |CBB_cleanup|.
  268. struct cbb_buffer_st {
  269. uint8_t *buf;
  270. size_t len; // The number of valid bytes.
  271. size_t cap; // The size of buf.
  272. char can_resize; /* One iff |buf| is owned by this object. If not then |buf|
  273. cannot be resized. */
  274. char error; /* One iff there was an error writing to this CBB. All future
  275. operations will fail. */
  276. };
  277. struct cbb_st {
  278. struct cbb_buffer_st *base;
  279. // child points to a child CBB if a length-prefix is pending.
  280. CBB *child;
  281. // offset is the number of bytes from the start of |base->buf| to this |CBB|'s
  282. // pending length prefix.
  283. size_t offset;
  284. // pending_len_len contains the number of bytes in this |CBB|'s pending
  285. // length-prefix, or zero if no length-prefix is pending.
  286. uint8_t pending_len_len;
  287. char pending_is_asn1;
  288. // is_top_level is true iff this is a top-level |CBB| (as opposed to a child
  289. // |CBB|). Top-level objects are valid arguments for |CBB_finish|.
  290. char is_top_level;
  291. };
  292. // CBB_zero sets an uninitialised |cbb| to the zero state. It must be
  293. // initialised with |CBB_init| or |CBB_init_fixed| before use, but it is safe to
  294. // call |CBB_cleanup| without a successful |CBB_init|. This may be used for more
  295. // uniform cleanup of a |CBB|.
  296. OPENSSL_EXPORT void CBB_zero(CBB *cbb);
  297. // CBB_init initialises |cbb| with |initial_capacity|. Since a |CBB| grows as
  298. // needed, the |initial_capacity| is just a hint. It returns one on success or
  299. // zero on allocation failure.
  300. OPENSSL_EXPORT int CBB_init(CBB *cbb, size_t initial_capacity);
  301. // CBB_init_fixed initialises |cbb| to write to |len| bytes at |buf|. Since
  302. // |buf| cannot grow, trying to write more than |len| bytes will cause CBB
  303. // functions to fail. It returns one on success or zero on error.
  304. OPENSSL_EXPORT int CBB_init_fixed(CBB *cbb, uint8_t *buf, size_t len);
  305. // CBB_cleanup frees all resources owned by |cbb| and other |CBB| objects
  306. // writing to the same buffer. This should be used in an error case where a
  307. // serialisation is abandoned.
  308. //
  309. // This function can only be called on a "top level" |CBB|, i.e. one initialised
  310. // with |CBB_init| or |CBB_init_fixed|, or a |CBB| set to the zero state with
  311. // |CBB_zero|.
  312. OPENSSL_EXPORT void CBB_cleanup(CBB *cbb);
  313. // CBB_finish completes any pending length prefix and sets |*out_data| to a
  314. // malloced buffer and |*out_len| to the length of that buffer. The caller
  315. // takes ownership of the buffer and, unless the buffer was fixed with
  316. // |CBB_init_fixed|, must call |OPENSSL_free| when done.
  317. //
  318. // It can only be called on a "top level" |CBB|, i.e. one initialised with
  319. // |CBB_init| or |CBB_init_fixed|. It returns one on success and zero on
  320. // error.
  321. OPENSSL_EXPORT int CBB_finish(CBB *cbb, uint8_t **out_data, size_t *out_len);
  322. // CBB_flush causes any pending length prefixes to be written out and any child
  323. // |CBB| objects of |cbb| to be invalidated. This allows |cbb| to continue to be
  324. // used after the children go out of scope, e.g. when local |CBB| objects are
  325. // added as children to a |CBB| that persists after a function returns. This
  326. // function returns one on success or zero on error.
  327. OPENSSL_EXPORT int CBB_flush(CBB *cbb);
  328. // CBB_data returns a pointer to the bytes written to |cbb|. It does not flush
  329. // |cbb|. The pointer is valid until the next operation to |cbb|.
  330. //
  331. // To avoid unfinalized length prefixes, it is a fatal error to call this on a
  332. // CBB with any active children.
  333. OPENSSL_EXPORT const uint8_t *CBB_data(const CBB *cbb);
  334. // CBB_len returns the number of bytes written to |cbb|. It does not flush
  335. // |cbb|.
  336. //
  337. // To avoid unfinalized length prefixes, it is a fatal error to call this on a
  338. // CBB with any active children.
  339. OPENSSL_EXPORT size_t CBB_len(const CBB *cbb);
  340. // CBB_add_u8_length_prefixed sets |*out_contents| to a new child of |cbb|. The
  341. // data written to |*out_contents| will be prefixed in |cbb| with an 8-bit
  342. // length. It returns one on success or zero on error.
  343. OPENSSL_EXPORT int CBB_add_u8_length_prefixed(CBB *cbb, CBB *out_contents);
  344. // CBB_add_u16_length_prefixed sets |*out_contents| to a new child of |cbb|.
  345. // The data written to |*out_contents| will be prefixed in |cbb| with a 16-bit,
  346. // big-endian length. It returns one on success or zero on error.
  347. OPENSSL_EXPORT int CBB_add_u16_length_prefixed(CBB *cbb, CBB *out_contents);
  348. // CBB_add_u24_length_prefixed sets |*out_contents| to a new child of |cbb|.
  349. // The data written to |*out_contents| will be prefixed in |cbb| with a 24-bit,
  350. // big-endian length. It returns one on success or zero on error.
  351. OPENSSL_EXPORT int CBB_add_u24_length_prefixed(CBB *cbb, CBB *out_contents);
  352. // CBB_add_asn1 sets |*out_contents| to a |CBB| into which the contents of an
  353. // ASN.1 object can be written. The |tag| argument will be used as the tag for
  354. // the object. It returns one on success or zero on error.
  355. OPENSSL_EXPORT int CBB_add_asn1(CBB *cbb, CBB *out_contents, unsigned tag);
  356. // CBB_add_bytes appends |len| bytes from |data| to |cbb|. It returns one on
  357. // success and zero otherwise.
  358. OPENSSL_EXPORT int CBB_add_bytes(CBB *cbb, const uint8_t *data, size_t len);
  359. // CBB_add_space appends |len| bytes to |cbb| and sets |*out_data| to point to
  360. // the beginning of that space. The caller must then write |len| bytes of
  361. // actual contents to |*out_data|. It returns one on success and zero
  362. // otherwise.
  363. OPENSSL_EXPORT int CBB_add_space(CBB *cbb, uint8_t **out_data, size_t len);
  364. // CBB_reserve ensures |cbb| has room for |len| additional bytes and sets
  365. // |*out_data| to point to the beginning of that space. It returns one on
  366. // success and zero otherwise. The caller may write up to |len| bytes to
  367. // |*out_data| and call |CBB_did_write| to complete the write. |*out_data| is
  368. // valid until the next operation on |cbb| or an ancestor |CBB|.
  369. OPENSSL_EXPORT int CBB_reserve(CBB *cbb, uint8_t **out_data, size_t len);
  370. // CBB_did_write advances |cbb| by |len| bytes, assuming the space has been
  371. // written to by the caller. It returns one on success and zero on error.
  372. OPENSSL_EXPORT int CBB_did_write(CBB *cbb, size_t len);
  373. // CBB_add_u8 appends an 8-bit number from |value| to |cbb|. It returns one on
  374. // success and zero otherwise.
  375. OPENSSL_EXPORT int CBB_add_u8(CBB *cbb, uint8_t value);
  376. // CBB_add_u16 appends a 16-bit, big-endian number from |value| to |cbb|. It
  377. // returns one on success and zero otherwise.
  378. OPENSSL_EXPORT int CBB_add_u16(CBB *cbb, uint16_t value);
  379. // CBB_add_u24 appends a 24-bit, big-endian number from |value| to |cbb|. It
  380. // returns one on success and zero otherwise.
  381. OPENSSL_EXPORT int CBB_add_u24(CBB *cbb, uint32_t value);
  382. // CBB_add_u32 appends a 32-bit, big-endian number from |value| to |cbb|. It
  383. // returns one on success and zero otherwise.
  384. OPENSSL_EXPORT int CBB_add_u32(CBB *cbb, uint32_t value);
  385. // CBB_discard_child discards the current unflushed child of |cbb|. Neither the
  386. // child's contents nor the length prefix will be included in the output.
  387. OPENSSL_EXPORT void CBB_discard_child(CBB *cbb);
  388. // CBB_add_asn1_uint64 writes an ASN.1 INTEGER into |cbb| using |CBB_add_asn1|
  389. // and writes |value| in its contents. It returns one on success and zero on
  390. // error.
  391. OPENSSL_EXPORT int CBB_add_asn1_uint64(CBB *cbb, uint64_t value);
  392. // CBB_add_asn1_octet_string writes an ASN.1 OCTET STRING into |cbb| with the
  393. // given contents. It returns one on success and zero on error.
  394. OPENSSL_EXPORT int CBB_add_asn1_octet_string(CBB *cbb, const uint8_t *data,
  395. size_t data_len);
  396. // CBB_add_asn1_bool writes an ASN.1 BOOLEAN into |cbb| which is true iff
  397. // |value| is non-zero. It returns one on success and zero on error.
  398. OPENSSL_EXPORT int CBB_add_asn1_bool(CBB *cbb, int value);
  399. // CBB_add_asn1_oid_from_text decodes |len| bytes from |text| as an ASCII OID
  400. // representation, e.g. "1.2.840.113554.4.1.72585", and writes the DER-encoded
  401. // contents to |cbb|. It returns one on success and zero on malloc failure or if
  402. // |text| was invalid. It does not include the OBJECT IDENTIFER framing, only
  403. // the element's contents.
  404. //
  405. // This function considers OID strings with components which do not fit in a
  406. // |uint64_t| to be invalid.
  407. OPENSSL_EXPORT int CBB_add_asn1_oid_from_text(CBB *cbb, const char *text,
  408. size_t len);
  409. // CBB_flush_asn1_set_of calls |CBB_flush| on |cbb| and then reorders the
  410. // contents for a DER-encoded ASN.1 SET OF type. It returns one on success and
  411. // zero on failure. DER canonicalizes SET OF contents by sorting
  412. // lexicographically by encoding. Call this function when encoding a SET OF
  413. // type in an order that is not already known to be canonical.
  414. //
  415. // Note a SET type has a slightly different ordering than a SET OF.
  416. OPENSSL_EXPORT int CBB_flush_asn1_set_of(CBB *cbb);
  417. #if defined(__cplusplus)
  418. } // extern C
  419. #if !defined(BORINGSSL_NO_CXX)
  420. extern "C++" {
  421. BSSL_NAMESPACE_BEGIN
  422. using ScopedCBB = internal::StackAllocated<CBB, void, CBB_zero, CBB_cleanup>;
  423. BSSL_NAMESPACE_END
  424. } // extern C++
  425. #endif
  426. #endif
  427. #endif // OPENSSL_HEADER_BYTESTRING_H