/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 |