Coverage Report

Created: 2026-10-19 07:10

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/boringssl/include/openssl/bytestring.h
Line
Count
Source
1
// Copyright 2014 The BoringSSL Authors
2
//
3
// Licensed under the Apache License, Version 2.0 (the "License");
4
// you may not use this file except in compliance with the License.
5
// You may obtain a copy of the License at
6
//
7
//     https://www.apache.org/licenses/LICENSE-2.0
8
//
9
// Unless required by applicable law or agreed to in writing, software
10
// distributed under the License is distributed on an "AS IS" BASIS,
11
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
// See the License for the specific language governing permissions and
13
// limitations under the License.
14
15
#ifndef OPENSSL_HEADER_BYTESTRING_H
16
#define OPENSSL_HEADER_BYTESTRING_H
17
18
#include <openssl/base.h>   // IWYU pragma: export
19
20
#include <openssl/span.h>
21
#include <time.h>
22
23
#if defined(__cplusplus)
24
extern "C" {
25
#endif
26
27
28
// Bytestrings are used for parsing and building TLS and ASN.1 messages.
29
//
30
// A "CBS" (CRYPTO ByteString) represents a string of bytes in memory and
31
// provides utility functions for safely parsing length-prefixed structures
32
// like TLS and ASN.1 from it.
33
//
34
// A "CBB" (CRYPTO ByteBuilder) is a memory buffer that grows as needed and
35
// provides utility functions for building length-prefixed messages.
36
37
38
// CRYPTO ByteString
39
40
struct cbs_st {
41
  const uint8_t *data;
42
  size_t len;
43
44
#if !defined(BORINGSSL_NO_CXX)
45
  // Allow implicit conversions to and from bssl::Span<const uint8_t>.
46
  cbs_st(bssl::Span<const uint8_t> span)
47
6.25M
      : data(span.data()), len(span.size()) {}
48
5.10M
  operator bssl::Span<const uint8_t>() const { return bssl::Span(data, len); }
49
50
  // Defining any constructors requires we explicitly default the others.
51
  cbs_st() = default;
52
  cbs_st(const cbs_st &) = default;
53
  cbs_st &operator=(const cbs_st &) = default;
54
#endif
55
};
56
57
// CBS_init sets `cbs` to point to `data`. It does not take ownership of
58
// `data`.
59
46.2M
OPENSSL_INLINE void CBS_init(CBS *cbs, const uint8_t *data, size_t len) {
60
46.2M
  cbs->data = data;
61
46.2M
  cbs->len = len;
62
46.2M
}
63
64
// CBS_skip advances `cbs` by `len` bytes. It returns one on success and zero
65
// otherwise.
66
OPENSSL_EXPORT int CBS_skip(CBS *cbs, size_t len);
67
68
// CBS_data returns a pointer to the contents of `cbs`.
69
44.6M
OPENSSL_INLINE const uint8_t *CBS_data(const CBS *cbs) { return cbs->data; }
70
71
// CBS_len returns the number of bytes remaining in `cbs`.
72
983M
OPENSSL_INLINE size_t CBS_len(const CBS *cbs) { return cbs->len; }
73
74
// CBS_stow copies the current contents of `cbs` into `*out_ptr` and
75
// `*out_len`. If `*out_ptr` is not NULL, the contents are freed with
76
// OPENSSL_free. It returns one on success and zero on allocation failure. On
77
// success, `*out_ptr` should be freed with OPENSSL_free. If `cbs` is empty,
78
// `*out_ptr` will be NULL.
79
OPENSSL_EXPORT int CBS_stow(const CBS *cbs, uint8_t **out_ptr, size_t *out_len);
80
81
// CBS_strdup copies the current contents of `cbs` into `*out_ptr` as a
82
// NUL-terminated C string. If `*out_ptr` is not NULL, the contents are freed
83
// with OPENSSL_free. It returns one on success and zero on allocation
84
// failure. On success, `*out_ptr` should be freed with OPENSSL_free.
85
//
86
// NOTE: If `cbs` contains NUL bytes, the string will be truncated. Call
87
// `CBS_contains_zero_byte(cbs)` to check for NUL bytes.
88
OPENSSL_EXPORT int CBS_strdup(const CBS *cbs, char **out_ptr);
89
90
// CBS_contains_zero_byte returns one if the current contents of `cbs` contains
91
// a NUL byte and zero otherwise.
92
OPENSSL_EXPORT int CBS_contains_zero_byte(const CBS *cbs);
93
94
// CBS_mem_equal compares the current contents of `cbs` with the `len` bytes
95
// starting at `data`. If they're equal, it returns one, otherwise zero. If the
96
// lengths match, it uses a constant-time comparison.
97
OPENSSL_EXPORT int CBS_mem_equal(const CBS *cbs, const uint8_t *data,
98
                                 size_t len);
99
100
// CBS_get_u8 sets `*out` to the next uint8_t from `cbs` and advances `cbs`. It
101
// returns one on success and zero on error.
102
OPENSSL_EXPORT int CBS_get_u8(CBS *cbs, uint8_t *out);
103
104
// CBS_get_u16 sets `*out` to the next, big-endian uint16_t from `cbs` and
105
// advances `cbs`. It returns one on success and zero on error.
106
OPENSSL_EXPORT int CBS_get_u16(CBS *cbs, uint16_t *out);
107
108
// CBS_get_u16le sets `*out` to the next, little-endian uint16_t from `cbs` and
109
// advances `cbs`. It returns one on success and zero on error.
110
OPENSSL_EXPORT int CBS_get_u16le(CBS *cbs, uint16_t *out);
111
112
// CBS_get_u24 sets `*out` to the next, big-endian 24-bit value from `cbs` and
113
// advances `cbs`. It returns one on success and zero on error.
114
OPENSSL_EXPORT int CBS_get_u24(CBS *cbs, uint32_t *out);
115
116
// CBS_get_u32 sets `*out` to the next, big-endian uint32_t value from `cbs`
117
// and advances `cbs`. It returns one on success and zero on error.
118
OPENSSL_EXPORT int CBS_get_u32(CBS *cbs, uint32_t *out);
119
120
// CBS_get_u32le sets `*out` to the next, little-endian uint32_t value from
121
// `cbs` and advances `cbs`. It returns one on success and zero on error.
122
OPENSSL_EXPORT int CBS_get_u32le(CBS *cbs, uint32_t *out);
123
124
// CBS_get_u48 sets `*out` to the next, big-endian 48-bit value from `cbs` and
125
// advances `cbs`. It returns one on success and zero on error.
126
OPENSSL_EXPORT int CBS_get_u48(CBS *cbs, uint64_t *out);
127
128
// CBS_get_u64 sets `*out` to the next, big-endian uint64_t value from `cbs`
129
// and advances `cbs`. It returns one on success and zero on error.
130
OPENSSL_EXPORT int CBS_get_u64(CBS *cbs, uint64_t *out);
131
132
// CBS_get_u64le sets `*out` to the next, little-endian uint64_t value from
133
// `cbs` and advances `cbs`. It returns one on success and zero on error.
134
OPENSSL_EXPORT int CBS_get_u64le(CBS *cbs, uint64_t *out);
135
136
// CBS_get_last_u8 sets `*out` to the last uint8_t from `cbs` and shortens
137
// `cbs`. It returns one on success and zero on error.
138
OPENSSL_EXPORT int CBS_get_last_u8(CBS *cbs, uint8_t *out);
139
140
// CBS_get_bytes sets `*out` to the next `len` bytes from `cbs` and advances
141
// `cbs`. It returns one on success and zero on error.
142
OPENSSL_EXPORT int CBS_get_bytes(CBS *cbs, CBS *out, size_t len);
143
144
// CBS_copy_bytes copies the next `len` bytes from `cbs` to `out` and advances
145
// `cbs`. It returns one on success and zero on error.
146
OPENSSL_EXPORT int CBS_copy_bytes(CBS *cbs, uint8_t *out, size_t len);
147
148
// CBS_get_u8_length_prefixed sets `*out` to the contents of an 8-bit,
149
// length-prefixed value from `cbs` and advances `cbs` over it. It returns one
150
// on success and zero on error.
151
OPENSSL_EXPORT int CBS_get_u8_length_prefixed(CBS *cbs, CBS *out);
152
153
// CBS_get_u16_length_prefixed sets `*out` to the contents of a 16-bit,
154
// big-endian, length-prefixed value from `cbs` and advances `cbs` over it. It
155
// returns one on success and zero on error.
156
OPENSSL_EXPORT int CBS_get_u16_length_prefixed(CBS *cbs, CBS *out);
157
158
// CBS_get_u24_length_prefixed sets `*out` to the contents of a 24-bit,
159
// big-endian, length-prefixed value from `cbs` and advances `cbs` over it. It
160
// returns one on success and zero on error.
161
OPENSSL_EXPORT int CBS_get_u24_length_prefixed(CBS *cbs, CBS *out);
162
163
// CBS_get_until_first finds the first instance of `c` in `cbs`. If found, it
164
// sets `*out` to the text before the match, advances `cbs` over it, and returns
165
// one. Otherwise, it returns zero and leaves `cbs` unmodified.
166
OPENSSL_EXPORT int CBS_get_until_first(CBS *cbs, CBS *out, uint8_t c);
167
168
// CBS_get_until_first_of finds the first byte in `cbs` matching one of the
169
// characters in `chars`, which is a NUL-terminated C string. If found, it sets
170
// `*out` to the text before the match, advances `cbs` over it, and returns one.
171
// Otherwise, it returns zero and leaves `cbs` unmodified.
172
OPENSSL_EXPORT int CBS_get_until_first_of(CBS *cbs, CBS *out,
173
                                          const char *chars);
174
175
// CBS_get_until_first_not_of finds the first byte in `cbs` that does not match
176
// any of the characters in `chars`, which is a NUL-terminated C string. If
177
// found, it sets `*out` to the text before the match, advances `cbs` over it,
178
// and returns one. Otherwise, it returns zero and leaves `cbs` unmodified.
179
OPENSSL_EXPORT int CBS_get_until_first_not_of(CBS *cbs, CBS *out,
180
                                              const char *chars);
181
182
// CBS_get_u64_decimal reads a decimal integer from `cbs` and writes it to
183
// `*out`. It stops reading at the end of the string, or the first non-digit
184
// character. It returns one on success and zero on error. This function behaves
185
// analogously to `strtoul` except it does not accept empty inputs, leading
186
// zeros, or negative values.
187
OPENSSL_EXPORT int CBS_get_u64_decimal(CBS *cbs, uint64_t *out);
188
189
190
// Parsing ASN.1
191
//
192
// `CBS` may be used to parse DER structures. Rather than using a schema
193
// compiler, the following functions act on tag-length-value elements in the
194
// serialization itself. Thus the caller is responsible for looping over a
195
// SEQUENCE, branching on CHOICEs or OPTIONAL fields, checking for trailing
196
// data, and handling explicit vs. implicit tagging.
197
//
198
// Tags are represented as `CBS_ASN1_TAG` values in memory. The upper few bits
199
// store the class and constructed bit, and the remaining bits store the tag
200
// number. Note this differs from the DER serialization, to support tag numbers
201
// beyond 31. Consumers must use the constants defined below to decompose or
202
// assemble tags.
203
//
204
// This library treats an element's constructed bit as part of its tag. In DER,
205
// the constructed bit is computable from the type. The constants for universal
206
// types have the bit set. Callers must set it correctly for tagged types.
207
// Explicitly-tagged types are always constructed, and implicitly-tagged types
208
// inherit the underlying type's bit.
209
210
// CBS_ASN1_TAG_SHIFT is how much the in-memory representation shifts the class
211
// and constructed bits from the DER serialization.
212
126M
#define CBS_ASN1_TAG_SHIFT 24
213
214
// CBS_ASN1_CONSTRUCTED may be ORed into a tag to set the constructed bit.
215
57.0M
#define CBS_ASN1_CONSTRUCTED (0x20u << CBS_ASN1_TAG_SHIFT)
216
217
// The following values specify the tag class and may be ORed into a tag number
218
// to produce the final tag. If none is used, the tag will be UNIVERSAL.
219
4.59M
#define CBS_ASN1_UNIVERSAL (0u << CBS_ASN1_TAG_SHIFT)
220
273
#define CBS_ASN1_APPLICATION (0x40u << CBS_ASN1_TAG_SHIFT)
221
386k
#define CBS_ASN1_CONTEXT_SPECIFIC (0x80u << CBS_ASN1_TAG_SHIFT)
222
473
#define CBS_ASN1_PRIVATE (0xc0u << CBS_ASN1_TAG_SHIFT)
223
224
// CBS_ASN1_CLASS_MASK may be ANDed with a tag to query its class. This will
225
// give one of the four values above.
226
1.14M
#define CBS_ASN1_CLASS_MASK (0xc0u << CBS_ASN1_TAG_SHIFT)
227
228
// CBS_ASN1_TAG_NUMBER_MASK may be ANDed with a tag to query its number.
229
18.5M
#define CBS_ASN1_TAG_NUMBER_MASK ((1u << (5 + CBS_ASN1_TAG_SHIFT)) - 1)
230
231
// The following values are constants for UNIVERSAL tags. Note these constants
232
// include the constructed bit.
233
2.49M
#define CBS_ASN1_BOOLEAN 0x1u
234
3.78M
#define CBS_ASN1_INTEGER 0x2u
235
3.15M
#define CBS_ASN1_BITSTRING 0x3u
236
3.01M
#define CBS_ASN1_OCTETSTRING 0x4u
237
1.75M
#define CBS_ASN1_NULL 0x5u
238
8.36M
#define CBS_ASN1_OBJECT 0x6u
239
2.18M
#define CBS_ASN1_ENUMERATED 0xau
240
4.69M
#define CBS_ASN1_UTF8STRING 0xcu
241
2.25k
#define CBS_ASN1_RELATIVE_OID 0xdu
242
12.3M
#define CBS_ASN1_SEQUENCE (0x10u | CBS_ASN1_CONSTRUCTED)
243
5.12M
#define CBS_ASN1_SET (0x11u | CBS_ASN1_CONSTRUCTED)
244
57.2k
#define CBS_ASN1_NUMERICSTRING 0x12u
245
2.94M
#define CBS_ASN1_PRINTABLESTRING 0x13u
246
3.51M
#define CBS_ASN1_T61STRING 0x14u
247
420k
#define CBS_ASN1_VIDEOTEXSTRING 0x15u
248
2.69M
#define CBS_ASN1_IA5STRING 0x16u
249
2.81M
#define CBS_ASN1_UTCTIME 0x17u
250
1.99M
#define CBS_ASN1_GENERALIZEDTIME 0x18u
251
425k
#define CBS_ASN1_GRAPHICSTRING 0x19u
252
432k
#define CBS_ASN1_VISIBLESTRING 0x1au
253
437k
#define CBS_ASN1_GENERALSTRING 0x1bu
254
3.00M
#define CBS_ASN1_UNIVERSALSTRING 0x1cu
255
3.28M
#define CBS_ASN1_BMPSTRING 0x1eu
256
257
// CBS_get_asn1 sets `*out` to the contents of DER-encoded, ASN.1 element (not
258
// including tag and length bytes) and advances `cbs` over it. The ASN.1
259
// element must match `tag_value`. It returns one on success and zero
260
// on error.
261
OPENSSL_EXPORT int CBS_get_asn1(CBS *cbs, CBS *out, CBS_ASN1_TAG tag_value);
262
263
// CBS_get_asn1_element acts like `CBS_get_asn1` but `out` will include the
264
// ASN.1 header bytes too.
265
OPENSSL_EXPORT int CBS_get_asn1_element(CBS *cbs, CBS *out,
266
                                        CBS_ASN1_TAG tag_value);
267
268
// CBS_peek_any_asn1_tag looks ahead at the next ASN.1 tag and returns it. If a
269
// tag could not be parsed, it returns zero, which is never a valid tag. Note:
270
// if it returns non-zero, `CBS_get_asn1` may still fail if the rest of the
271
// element is malformed.
272
OPENSSL_EXPORT CBS_ASN1_TAG CBS_peek_any_asn1_tag(const CBS *cbs);
273
274
// CBS_peek_asn1_tag looks ahead at the next ASN.1 tag and returns one if the
275
// next ASN.1 element on `cbs` would have tag `tag_value`. If `cbs` is empty or
276
// the tag does not match, it returns zero. Note: if it returns one,
277
// `CBS_get_asn1` may still fail if the rest of the element is malformed.
278
OPENSSL_EXPORT int CBS_peek_asn1_tag(const CBS *cbs, CBS_ASN1_TAG tag_value);
279
280
// CBS_get_any_asn1 sets `*out` to contain the next ASN.1 element from `*cbs`
281
// (not including tag and length bytes), sets `*out_tag` to the tag number, and
282
// advances `*cbs`. It returns one on success and zero on error. Either of `out`
283
// and `out_tag` may be NULL to ignore the value.
284
OPENSSL_EXPORT int CBS_get_any_asn1(CBS *cbs, CBS *out,
285
                                    CBS_ASN1_TAG *out_tag);
286
287
// CBS_get_any_asn1_element sets `*out` to contain the next ASN.1 element from
288
// `*cbs` (including header bytes) and advances `*cbs`. It sets `*out_tag` to
289
// the tag number and `*out_header_len` to the length of the ASN.1 header. Each
290
// of `out`, `out_tag`, and `out_header_len` may be NULL to ignore the value.
291
OPENSSL_EXPORT int CBS_get_any_asn1_element(CBS *cbs, CBS *out,
292
                                            CBS_ASN1_TAG *out_tag,
293
                                            size_t *out_header_len);
294
295
// CBS_get_any_ber_asn1_element acts the same as `CBS_get_any_asn1_element` but
296
// also allows indefinite-length elements to be returned and does not enforce
297
// that lengths are minimal. It sets `*out_indefinite` to one if the length was
298
// indefinite and zero otherwise. If indefinite, `*out_header_len` and
299
// `CBS_len(out)` will be equal as only the header is returned (although this is
300
// also true for empty elements so `*out_indefinite` should be checked). If
301
// `out_ber_found` is not NULL then it is set to one if any case of invalid DER
302
// but valid BER is found, and to zero otherwise.
303
//
304
// This function will not successfully parse an end-of-contents (EOC) as an
305
// element. Callers parsing indefinite-length encoding must check for EOC
306
// separately.
307
OPENSSL_EXPORT int CBS_get_any_ber_asn1_element(CBS *cbs, CBS *out,
308
                                                CBS_ASN1_TAG *out_tag,
309
                                                size_t *out_header_len,
310
                                                int *out_ber_found,
311
                                                int *out_indefinite);
312
313
// CBS_get_asn1_uint64 gets an ASN.1 INTEGER from `cbs` using `CBS_get_asn1`
314
// and sets `*out` to its value. It returns one on success and zero on error,
315
// where error includes the integer being negative, or too large to represent
316
// in 64 bits.
317
OPENSSL_EXPORT int CBS_get_asn1_uint64(CBS *cbs, uint64_t *out);
318
319
// CBS_get_asn1_uint64_with_tag gets an ASN.1 INTEGER from `cbs` using
320
// `CBS_get_asn1` and sets `*out` to its value. `tag` is used to handle to
321
// handle implicitly tagged INTEGER fields. It returns one on success and zero
322
// on error, where error includes the integer being negative, or too large to
323
// represent in 64 bits.
324
OPENSSL_EXPORT int CBS_get_asn1_uint64_with_tag(CBS *cbs, uint64_t *out,
325
                                                CBS_ASN1_TAG tag);
326
327
328
// CBS_get_asn1_int64 gets an ASN.1 INTEGER from `cbs` using `CBS_get_asn1`
329
// and sets `*out` to its value. It returns one on success and zero on error,
330
// where error includes the integer being too large to represent in 64 bits.
331
OPENSSL_EXPORT int CBS_get_asn1_int64(CBS *cbs, int64_t *out);
332
333
// CBS_get_asn1_int64_with_tag gets an ASN.1 INTEGER from `cbs` using
334
// `CBS_get_asn1` and sets `*out` to its value. `tag` is used to handle to
335
// handle implicitly tagged INTEGER fields. It returns one on success and zero
336
// on error, where error includes the integer being too large to represent in 64
337
// bits.
338
OPENSSL_EXPORT int CBS_get_asn1_int64_with_tag(CBS *cbs, int64_t *out,
339
                                               CBS_ASN1_TAG tag);
340
341
// CBS_get_asn1_bool gets an ASN.1 BOOLEAN from `cbs` and sets `*out` to zero
342
// or one based on its value. It returns one on success or zero on error.
343
OPENSSL_EXPORT int CBS_get_asn1_bool(CBS *cbs, int *out);
344
345
// CBS_get_optional_asn1 gets an optional explicitly-tagged element from `cbs`
346
// tagged with `tag` and sets `*out` to its contents, or ignores it if `out` is
347
// NULL. If present and if `out_present` is not NULL, it sets `*out_present` to
348
// one, otherwise zero. It returns one on success, whether or not the element
349
// was present, and zero on decode failure.
350
OPENSSL_EXPORT int CBS_get_optional_asn1(CBS *cbs, CBS *out, int *out_present,
351
                                         CBS_ASN1_TAG tag);
352
353
// CBS_get_optional_asn1_octet_string gets an optional
354
// explicitly-tagged OCTET STRING from `cbs`. If present, it sets
355
// `*out` to the string and `*out_present` to one. Otherwise, it sets
356
// `*out` to empty and `*out_present` to zero. `out_present` may be
357
// NULL. It returns one on success, whether or not the element was
358
// present, and zero on decode failure.
359
OPENSSL_EXPORT int CBS_get_optional_asn1_octet_string(CBS *cbs, CBS *out,
360
                                                      int *out_present,
361
                                                      CBS_ASN1_TAG tag);
362
363
// CBS_get_optional_asn1_uint64 gets an optional explicitly-tagged
364
// INTEGER from `cbs`. If present, it sets `*out` to the
365
// value. Otherwise, it sets `*out` to `default_value`. It returns one
366
// on success, whether or not the element was present, and zero on
367
// decode failure.
368
OPENSSL_EXPORT int CBS_get_optional_asn1_uint64(CBS *cbs, uint64_t *out,
369
                                                CBS_ASN1_TAG tag,
370
                                                uint64_t default_value);
371
372
// CBS_get_optional_asn1_bool gets an optional, explicitly-tagged BOOLEAN from
373
// `cbs`. If present, it sets `*out` to either zero or one, based on the
374
// boolean. Otherwise, it sets `*out` to `default_value`. It returns one on
375
// success, whether or not the element was present, and zero on decode
376
// failure.
377
OPENSSL_EXPORT int CBS_get_optional_asn1_bool(CBS *cbs, int *out,
378
                                              CBS_ASN1_TAG tag,
379
                                              int default_value);
380
381
// CBS_is_valid_asn1_bitstring returns one if `cbs` is a valid ASN.1 BIT STRING
382
// body and zero otherwise.
383
OPENSSL_EXPORT int CBS_is_valid_asn1_bitstring(const CBS *cbs);
384
385
// CBS_asn1_bitstring_has_bit returns one if `cbs` is a valid ASN.1 BIT STRING
386
// body and the specified bit is present and set. Otherwise, it returns zero.
387
// `bit` is indexed starting from zero.
388
OPENSSL_EXPORT int CBS_asn1_bitstring_has_bit(const CBS *cbs, unsigned bit);
389
390
// CBS_is_valid_asn1_integer returns one if `cbs` is a valid ASN.1 INTEGER,
391
// body and zero otherwise. On success, if `out_is_negative` is non-NULL,
392
// `*out_is_negative` will be set to one if `cbs` is negative and zero
393
// otherwise.
394
OPENSSL_EXPORT int CBS_is_valid_asn1_integer(const CBS *cbs,
395
                                             int *out_is_negative);
396
397
// CBS_is_unsigned_asn1_integer returns one if `cbs` is a valid non-negative
398
// ASN.1 INTEGER body and zero otherwise.
399
OPENSSL_EXPORT int CBS_is_unsigned_asn1_integer(const CBS *cbs);
400
401
// CBS_is_valid_asn1_oid returns one if `cbs` is a valid DER-encoded ASN.1
402
// OBJECT IDENTIFIER contents (not including the element framing) and zero
403
// otherwise. This function tolerates arbitrarily large OID components.
404
OPENSSL_EXPORT int CBS_is_valid_asn1_oid(const CBS *cbs);
405
406
// CBS_asn1_oid_to_text interprets `cbs` as DER-encoded ASN.1 OBJECT IDENTIFIER
407
// contents (not including the element framing) and returns the ASCII
408
// representation (e.g., "1.2.840.113554.4.1.72585") in a newly-allocated
409
// string, or NULL on failure. The caller must release the result with
410
// `OPENSSL_free`.
411
//
412
// This function may fail if `cbs` is an invalid OBJECT IDENTIFIER, or if any
413
// OID components are too large.
414
OPENSSL_EXPORT char *CBS_asn1_oid_to_text(const CBS *cbs);
415
416
// CBS_is_valid_asn1_relative_oid returns one if `cbs` is a valid DER-encoded
417
// ASN.1 RELATIVE-OID contents (not including the element framing) and zero
418
// otherwise. This function tolerates arbitrarily large OID components.
419
//
420
// (This is actually the same as `CBS_is_valid_asn1_oid`, but is also exposed
421
// under the relative_oid name for API symmetry.)
422
OPENSSL_EXPORT int CBS_is_valid_asn1_relative_oid(const CBS *cbs);
423
424
// CBS_asn1_relative_oid_to_text interprets `cbs` as DER-encoded ASN.1
425
// RELATIVE-OID contents (not including the element framing) and returns the
426
// ASCII representation (e.g., "32473.1") in a newly-allocated string, or NULL
427
// on failure. The caller must release the result with `OPENSSL_free`.
428
//
429
// This function may fail if `cbs` is an invalid RELATIVE-OID, or if any
430
// OID components are too large.
431
OPENSSL_EXPORT char *CBS_asn1_relative_oid_to_text(const CBS *cbs);
432
433
// CBS_get_asn1_oid_component gets a single OID component from `cbs`. On
434
// success, it sets `*out` to the value, advances `cbs` past the component, and
435
// returns one. If the input does not contain a valid OID component or if the
436
// OID component is bigger than `uint64_t`, it returns zero.
437
//
438
// Specifically, this decodes a non-empty, minimal-width, base-128, big-endian
439
// integer. The high bit of each byte is set for continuation bytes and unset
440
// for the final byte. This encoding is also used for DER tag numbers 31 and up.
441
OPENSSL_EXPORT int CBS_get_asn1_oid_component(CBS *cbs, uint64_t *out);
442
443
// CBS_parse_generalized_time returns one if `cbs` is a valid DER-encoded, ASN.1
444
// GeneralizedTime body within the limitations imposed by RFC 5280, or zero
445
// otherwise. If `allow_timezone_offset` is non-zero, four-digit timezone
446
// offsets, which would not be allowed by DER, are permitted. On success, if
447
// `out_tm` is non-NULL, `*out_tm` will be zeroed, and then set to the
448
// corresponding time in UTC. This function does not compute `out_tm->tm_wday`
449
// or `out_tm->tm_yday`.
450
OPENSSL_EXPORT int CBS_parse_generalized_time(const CBS *cbs, struct tm *out_tm,
451
                                              int allow_timezone_offset);
452
453
// CBS_parse_utc_time returns one if `cbs` is a valid DER-encoded, ASN.1
454
// UTCTime body within the limitations imposed by RFC 5280, or zero otherwise.
455
// If `allow_timezone_offset` is non-zero, four-digit timezone offsets, which
456
// would not be allowed by DER, are permitted. On success, if `out_tm` is
457
// non-NULL, `*out_tm` will be zeroed, and then set to the corresponding time
458
// in UTC. This function does not compute `out_tm->tm_wday` or
459
// `out_tm->tm_yday`.
460
OPENSSL_EXPORT int CBS_parse_utc_time(const CBS *cbs, struct tm *out_tm,
461
                                      int allow_timezone_offset);
462
463
464
// CRYPTO ByteBuilder.
465
//
466
// `CBB` objects allow one to build length-prefixed serialisations. A `CBB`
467
// object is associated with a buffer and new buffers are created with
468
// `CBB_init`. Several `CBB` objects can point at the same buffer when a
469
// length-prefix is pending, however only a single `CBB` can be 'current' at
470
// any one time. For example, if one calls `CBB_add_u8_length_prefixed` then
471
// the new `CBB` points at the same buffer as the original. But if the original
472
// `CBB` is used then the length prefix is written out and the new `CBB` must
473
// not be used again.
474
//
475
// If one needs to force a length prefix to be written out because a `CBB` is
476
// going out of scope, use `CBB_flush`. If an operation on a `CBB` fails, it is
477
// in an undefined state and must not be used except to call `CBB_cleanup`.
478
479
struct cbb_buffer_st {
480
  uint8_t *buf;
481
  // len is the number of valid bytes in `buf`.
482
  size_t len;
483
  // cap is the size of `buf`.
484
  size_t cap;
485
  // can_resize is one iff `buf` is owned by this object. If not then `buf`
486
  // cannot be resized.
487
  unsigned can_resize : 1;
488
  // error is one if there was an error writing to this CBB. All future
489
  // operations will fail.
490
  unsigned error : 1;
491
};
492
493
struct cbb_child_st {
494
  // base is a pointer to the buffer this `CBB` writes to.
495
  struct cbb_buffer_st *base;
496
  // offset is the number of bytes from the start of `base->buf` to this `CBB`'s
497
  // pending length prefix.
498
  size_t offset;
499
  // pending_len_len contains the number of bytes in this `CBB`'s pending
500
  // length-prefix, or zero if no length-prefix is pending.
501
  uint8_t pending_len_len;
502
  unsigned pending_is_asn1 : 1;
503
};
504
505
struct cbb_st {
506
  // child points to a child CBB if a length-prefix is pending.
507
  CBB *child;
508
  // is_child is one if this is a child `CBB` and zero if it is a top-level
509
  // `CBB`. This determines which arm of the union is valid.
510
  char is_child;
511
  union {
512
    struct cbb_buffer_st base;
513
    struct cbb_child_st child;
514
  } u;
515
};
516
517
// CBB_zero sets an uninitialised `cbb` to the zero state. It must be
518
// initialised with `CBB_init` or `CBB_init_fixed` before use, but it is safe to
519
// call `CBB_cleanup` without a successful `CBB_init`. This may be used for more
520
// uniform cleanup of a `CBB`.
521
OPENSSL_EXPORT void CBB_zero(CBB *cbb);
522
523
// CBB_init initialises `cbb` with `initial_capacity`. Since a `CBB` grows as
524
// needed, the `initial_capacity` is just a hint. It returns one on success or
525
// zero on allocation failure.
526
OPENSSL_EXPORT int CBB_init(CBB *cbb, size_t initial_capacity);
527
528
// CBB_init_fixed initialises `cbb` to write to `len` bytes at `buf`. Since
529
// `buf` cannot grow, trying to write more than `len` bytes will cause CBB
530
// functions to fail. This function is infallible and always returns one. It is
531
// safe, but not necessary, to call `CBB_cleanup` on `cbb`.
532
OPENSSL_EXPORT int CBB_init_fixed(CBB *cbb, uint8_t *buf, size_t len);
533
534
// CBB_cleanup frees all resources owned by `cbb` and other `CBB` objects
535
// writing to the same buffer. This should be used in an error case where a
536
// serialisation is abandoned.
537
//
538
// This function can only be called on a "top level" `CBB`, i.e. one initialised
539
// with `CBB_init` or `CBB_init_fixed`, or a `CBB` set to the zero state with
540
// `CBB_zero`.
541
OPENSSL_EXPORT void CBB_cleanup(CBB *cbb);
542
543
// CBB_finish completes any pending length prefix and sets `*out_data` to a
544
// malloced buffer and `*out_len` to the length of that buffer. The caller
545
// takes ownership of the buffer and, unless the buffer was fixed with
546
// `CBB_init_fixed`, must call `OPENSSL_free` when done.
547
//
548
// It can only be called on a "top level" `CBB`, i.e. one initialised with
549
// `CBB_init` or `CBB_init_fixed`. It returns one on success and zero on
550
// error.
551
OPENSSL_EXPORT int CBB_finish(CBB *cbb, uint8_t **out_data, size_t *out_len);
552
553
// CBB_flush causes any pending length prefixes to be written out and any child
554
// `CBB` objects of `cbb` to be invalidated. This allows `cbb` to continue to be
555
// used after the children go out of scope, e.g. when local `CBB` objects are
556
// added as children to a `CBB` that persists after a function returns. This
557
// function returns one on success or zero on error.
558
OPENSSL_EXPORT int CBB_flush(CBB *cbb);
559
560
// CBB_data returns a pointer to the bytes written to `cbb`. It does not flush
561
// `cbb`. The pointer is valid until the next operation to `cbb`.
562
//
563
// To avoid unfinalized length prefixes, it is a fatal error to call this on a
564
// CBB with any active children.
565
OPENSSL_EXPORT uint8_t *CBB_data(const CBB *cbb);
566
567
// CBB_len returns the number of bytes written to `cbb`. It does not flush
568
// `cbb`.
569
//
570
// To avoid unfinalized length prefixes, it is a fatal error to call this on a
571
// CBB with any active children.
572
OPENSSL_EXPORT size_t CBB_len(const CBB *cbb);
573
574
// CBB_add_u8_length_prefixed sets `*out_contents` to a new child of `cbb`. The
575
// data written to `*out_contents` will be prefixed in `cbb` with an 8-bit
576
// length. It returns one on success or zero on error.
577
OPENSSL_EXPORT int CBB_add_u8_length_prefixed(CBB *cbb, CBB *out_contents);
578
579
// CBB_add_u16_length_prefixed sets `*out_contents` to a new child of `cbb`.
580
// The data written to `*out_contents` will be prefixed in `cbb` with a 16-bit,
581
// big-endian length. It returns one on success or zero on error.
582
OPENSSL_EXPORT int CBB_add_u16_length_prefixed(CBB *cbb, CBB *out_contents);
583
584
// CBB_add_u24_length_prefixed sets `*out_contents` to a new child of `cbb`.
585
// The data written to `*out_contents` will be prefixed in `cbb` with a 24-bit,
586
// big-endian length. It returns one on success or zero on error.
587
OPENSSL_EXPORT int CBB_add_u24_length_prefixed(CBB *cbb, CBB *out_contents);
588
589
// CBB_add_asn1 sets `*out_contents` to a `CBB` into which the contents of an
590
// ASN.1 object can be written. The `tag` argument will be used as the tag for
591
// the object. It returns one on success or zero on error.
592
OPENSSL_EXPORT int CBB_add_asn1(CBB *cbb, CBB *out_contents, CBS_ASN1_TAG tag);
593
594
// CBB_add_bytes appends `len` bytes from `data` to `cbb`. It returns one on
595
// success and zero otherwise.
596
OPENSSL_EXPORT int CBB_add_bytes(CBB *cbb, const uint8_t *data, size_t len);
597
598
// CBB_add_zeros append `len` bytes with value zero to `cbb`. It returns one on
599
// success and zero otherwise.
600
OPENSSL_EXPORT int CBB_add_zeros(CBB *cbb, size_t len);
601
602
// CBB_add_space appends `len` bytes to `cbb` and sets `*out_data` to point to
603
// the beginning of that space. The caller must then write `len` bytes of
604
// actual contents to `*out_data`. It returns one on success and zero
605
// otherwise.
606
OPENSSL_EXPORT int CBB_add_space(CBB *cbb, uint8_t **out_data, size_t len);
607
608
// CBB_reserve ensures `cbb` has room for `len` additional bytes and sets
609
// `*out_data` to point to the beginning of that space. It returns one on
610
// success and zero otherwise. The caller may write up to `len` bytes to
611
// `*out_data` and call `CBB_did_write` to complete the write. `*out_data` is
612
// valid until the next operation on `cbb` or an ancestor `CBB`.
613
OPENSSL_EXPORT int CBB_reserve(CBB *cbb, uint8_t **out_data, size_t len);
614
615
// CBB_did_write advances `cbb` by `len` bytes, assuming the space has been
616
// written to by the caller. It returns one on success and zero on error.
617
OPENSSL_EXPORT int CBB_did_write(CBB *cbb, size_t len);
618
619
// CBB_add_u8 appends an 8-bit number from `value` to `cbb`. It returns one on
620
// success and zero otherwise.
621
OPENSSL_EXPORT int CBB_add_u8(CBB *cbb, uint8_t value);
622
623
// CBB_add_u16 appends a 16-bit, big-endian number from `value` to `cbb`. It
624
// returns one on success and zero otherwise.
625
OPENSSL_EXPORT int CBB_add_u16(CBB *cbb, uint16_t value);
626
627
// CBB_add_u16le appends a 16-bit, little-endian number from `value` to `cbb`.
628
// It returns one on success and zero otherwise.
629
OPENSSL_EXPORT int CBB_add_u16le(CBB *cbb, uint16_t value);
630
631
// CBB_add_u24 appends a 24-bit, big-endian number from `value` to `cbb`. It
632
// returns one on success and zero otherwise.
633
OPENSSL_EXPORT int CBB_add_u24(CBB *cbb, uint32_t value);
634
635
// CBB_add_u32 appends a 32-bit, big-endian number from `value` to `cbb`. It
636
// returns one on success and zero otherwise.
637
OPENSSL_EXPORT int CBB_add_u32(CBB *cbb, uint32_t value);
638
639
// CBB_add_u32le appends a 32-bit, little-endian number from `value` to `cbb`.
640
// It returns one on success and zero otherwise.
641
OPENSSL_EXPORT int CBB_add_u32le(CBB *cbb, uint32_t value);
642
643
// CBB_add_u48 appends a 48-bit, big-endian number from `value` to `cbb`. It
644
// returns one on success and zero otherwise.
645
OPENSSL_EXPORT int CBB_add_u48(CBB *cbb, uint64_t value);
646
647
// CBB_add_u64 appends a 64-bit, big-endian number from `value` to `cbb`. It
648
// returns one on success and zero otherwise.
649
OPENSSL_EXPORT int CBB_add_u64(CBB *cbb, uint64_t value);
650
651
// CBB_add_u64le appends a 64-bit, little-endian number from `value` to `cbb`.
652
// It returns one on success and zero otherwise.
653
OPENSSL_EXPORT int CBB_add_u64le(CBB *cbb, uint64_t value);
654
655
// CBB_discard discards the last `len` bytes written to `cbb`. The process will
656
// abort if `cbb` has an unflushed child, or its length is smaller than `len`.
657
OPENSSL_EXPORT void CBB_discard(CBB *cbb, size_t len);
658
659
// CBB_discard_child discards the current unflushed child of `cbb`. Neither the
660
// child's contents nor the length prefix will be included in the output.
661
OPENSSL_EXPORT void CBB_discard_child(CBB *cbb);
662
663
// CBB_add_asn1_element adds an ASN.1 element with the specified tag and
664
// contents. It returns one on success and zero on error. This is a convenience
665
// function over `CBB_add_asn1` when the data is already available.
666
OPENSSL_EXPORT int CBB_add_asn1_element(CBB *cbb, CBS_ASN1_TAG tag,
667
                                        const uint8_t *data, size_t data_len);
668
669
// CBB_add_asn1_uint64 writes an ASN.1 INTEGER into `cbb` using `CBB_add_asn1`
670
// and writes `value` in its contents. It returns one on success and zero on
671
// error.
672
OPENSSL_EXPORT int CBB_add_asn1_uint64(CBB *cbb, uint64_t value);
673
674
// CBB_add_asn1_uint64_with_tag behaves like `CBB_add_asn1_uint64` but uses
675
// `tag` as the tag instead of INTEGER. This is useful if the INTEGER type uses
676
// implicit tagging.
677
OPENSSL_EXPORT int CBB_add_asn1_uint64_with_tag(CBB *cbb, uint64_t value,
678
                                                CBS_ASN1_TAG tag);
679
680
// CBB_add_asn1_int64 writes an ASN.1 INTEGER into `cbb` using `CBB_add_asn1`
681
// and writes `value` in its contents. It returns one on success and zero on
682
// error.
683
OPENSSL_EXPORT int CBB_add_asn1_int64(CBB *cbb, int64_t value);
684
685
// CBB_add_asn1_int64_with_tag behaves like `CBB_add_asn1_int64` but uses `tag`
686
// as the tag instead of INTEGER. This is useful if the INTEGER type uses
687
// implicit tagging.
688
OPENSSL_EXPORT int CBB_add_asn1_int64_with_tag(CBB *cbb, int64_t value,
689
                                               CBS_ASN1_TAG tag);
690
691
// CBB_add_asn1_octet_string writes an ASN.1 OCTET STRING into `cbb` with the
692
// given contents. It returns one on success and zero on error.
693
OPENSSL_EXPORT int CBB_add_asn1_octet_string(CBB *cbb, const uint8_t *data,
694
                                             size_t data_len);
695
696
// CBB_add_asn1_bool writes an ASN.1 BOOLEAN into `cbb` which is true iff
697
// `value` is non-zero.  It returns one on success and zero on error.
698
OPENSSL_EXPORT int CBB_add_asn1_bool(CBB *cbb, int value);
699
700
// CBB_add_asn1_oid_from_text decodes `len` bytes from `text` as an ASCII OID
701
// representation, e.g. "1.2.840.113554.4.1.72585", and writes the DER-encoded
702
// contents to `cbb`. It returns one on success and zero on malloc failure or if
703
// `text` was invalid. It does not include the OBJECT IDENTIFIER framing, only
704
// the element's contents.
705
//
706
// This function considers OID strings with components which do not fit in a
707
// `uint64_t` to be invalid.
708
OPENSSL_EXPORT int CBB_add_asn1_oid_from_text(CBB *cbb, const char *text,
709
                                              size_t len);
710
711
// CBB_add_asn1_relative_oid_from_text decodes `len` bytes from `text` as an
712
// ASCII RELATIVE-OID representation, e.g. "32473.1", and writes the
713
// DER-encoded contents to `cbb`. It returns one on success and zero on malloc
714
// failure or if `text` was invalid. It does not include any framing, only the
715
// element's contents.
716
//
717
// This function considers OID strings with components which do not fit in a
718
// `uint64_t` to be invalid.
719
OPENSSL_EXPORT int CBB_add_asn1_relative_oid_from_text(CBB *cbb,
720
                                                       const char *text,
721
                                                       size_t len);
722
723
// CBB_add_asn1_relative_oid_from_der_to_text reads `data_len` bytes of
724
// DER-encoded ASN.1 RELATIVE-OID contents (not including the element framing)
725
// from `data` and writes the ASCII representation (e.g., "32473.1") to `cbb`
726
// (without a trailing NUL byte). It returns one on success and zero on
727
// failure.
728
//
729
// This function may fail if `data` is an invalid RELATIVE-OID, or if any OID
730
// components are too large.
731
OPENSSL_EXPORT int CBB_add_asn1_relative_oid_from_der_to_text(
732
    CBB *cbb, const uint8_t *data, size_t data_len);
733
734
// CBB_add_asn1_oid_component appends a single OID component to `cbb`.
735
// It returns one on success and zero on error.
736
//
737
// Specifically, this encodes `value` as a non-empty, minimal-width, base-128,
738
// big-endian integer. The high bit of each byte is set for continuation bytes
739
// and unset for the final byte. This encoding is also used for DER tag numbers
740
// 31 and up.
741
OPENSSL_EXPORT int CBB_add_asn1_oid_component(CBB *cbb, uint64_t value);
742
743
// CBB_flush_asn1_set_of calls `CBB_flush` on `cbb` and then reorders the
744
// contents for a DER-encoded ASN.1 SET OF type. It returns one on success and
745
// zero on failure. DER canonicalizes SET OF contents by sorting
746
// lexicographically by encoding. Call this function when encoding a SET OF
747
// type in an order that is not already known to be canonical.
748
//
749
// Note a SET type has a slightly different ordering than a SET OF.
750
OPENSSL_EXPORT int CBB_flush_asn1_set_of(CBB *cbb);
751
752
753
// Unicode utilities.
754
//
755
// These functions consider noncharacters (see section 23.7 from Unicode 15.0.0)
756
// to be invalid code points and will treat them as an error condition.
757
758
// The following functions read one Unicode code point from `cbs` with the
759
// corresponding encoding and store it in `*out`. They return one on success and
760
// zero on error.
761
OPENSSL_EXPORT int CBS_get_utf8(CBS *cbs, uint32_t *out);
762
OPENSSL_EXPORT int CBS_get_latin1(CBS *cbs, uint32_t *out);
763
OPENSSL_EXPORT int CBS_get_ucs2_be(CBS *cbs, uint32_t *out);
764
OPENSSL_EXPORT int CBS_get_utf32_be(CBS *cbs, uint32_t *out);
765
766
// CBB_get_utf8_len returns the number of bytes needed to represent `u` in
767
// UTF-8.
768
OPENSSL_EXPORT size_t CBB_get_utf8_len(uint32_t u);
769
770
// The following functions encode `u` to `cbb` with the corresponding
771
// encoding. They return one on success and zero on error. Error conditions
772
// include `u` being an invalid code point, or `u` being unencodable in the
773
// specified encoding.
774
OPENSSL_EXPORT int CBB_add_utf8(CBB *cbb, uint32_t u);
775
OPENSSL_EXPORT int CBB_add_latin1(CBB *cbb, uint32_t u);
776
OPENSSL_EXPORT int CBB_add_ucs2_be(CBB *cbb, uint32_t u);
777
OPENSSL_EXPORT int CBB_add_utf32_be(CBB *cbb, uint32_t u);
778
779
780
#if defined(__cplusplus)
781
}  // extern C
782
783
784
#if !defined(BORINGSSL_NO_CXX)
785
extern "C++" {
786
787
BSSL_NAMESPACE_BEGIN
788
789
BORINGSSL_MAKE_STACK_TRAITS(CBB, CBB_zero, CBB_cleanup)
790
using ScopedCBB = internal::StackAllocated<CBB>;
791
792
BSSL_NAMESPACE_END
793
794
}  // extern C++
795
#endif
796
797
#endif
798
799
#endif  // OPENSSL_HEADER_BYTESTRING_H