Absolute File Name: | /home/opencoverage/opencoverage/guest-scripts/libressl/src/ssl/bs_cbs.c |
Source code | Switch to Preprocessed file |
Line | Source | Count | ||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
1 | /* $OpenBSD: bs_cbs.c,v 1.17 2015/06/24 09:44:18 jsing Exp $ */ | - | ||||||||||||||||||||||||||||||
2 | /* | - | ||||||||||||||||||||||||||||||
3 | * Copyright (c) 2014, Google Inc. | - | ||||||||||||||||||||||||||||||
4 | * | - | ||||||||||||||||||||||||||||||
5 | * Permission to use, copy, modify, and/or distribute this software for any | - | ||||||||||||||||||||||||||||||
6 | * purpose with or without fee is hereby granted, provided that the above | - | ||||||||||||||||||||||||||||||
7 | * copyright notice and this permission notice appear in all copies. | - | ||||||||||||||||||||||||||||||
8 | * | - | ||||||||||||||||||||||||||||||
9 | * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES | - | ||||||||||||||||||||||||||||||
10 | * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF | - | ||||||||||||||||||||||||||||||
11 | * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY | - | ||||||||||||||||||||||||||||||
12 | * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES | - | ||||||||||||||||||||||||||||||
13 | * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION | - | ||||||||||||||||||||||||||||||
14 | * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN | - | ||||||||||||||||||||||||||||||
15 | * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ | - | ||||||||||||||||||||||||||||||
16 | - | |||||||||||||||||||||||||||||||
17 | #include <assert.h> | - | ||||||||||||||||||||||||||||||
18 | #include <stdlib.h> | - | ||||||||||||||||||||||||||||||
19 | #include <string.h> | - | ||||||||||||||||||||||||||||||
20 | - | |||||||||||||||||||||||||||||||
21 | #include <openssl/opensslconf.h> | - | ||||||||||||||||||||||||||||||
22 | #include <openssl/buffer.h> | - | ||||||||||||||||||||||||||||||
23 | #include <openssl/crypto.h> | - | ||||||||||||||||||||||||||||||
24 | - | |||||||||||||||||||||||||||||||
25 | #include "bytestring.h" | - | ||||||||||||||||||||||||||||||
26 | - | |||||||||||||||||||||||||||||||
27 | void | - | ||||||||||||||||||||||||||||||
28 | CBS_init(CBS *cbs, const uint8_t *data, size_t len) | - | ||||||||||||||||||||||||||||||
29 | { | - | ||||||||||||||||||||||||||||||
30 | cbs->data = data; | - | ||||||||||||||||||||||||||||||
31 | cbs->initial_len = len; | - | ||||||||||||||||||||||||||||||
32 | cbs->len = len; | - | ||||||||||||||||||||||||||||||
33 | } executed 5272 times by 10 tests: end of block Executed by:
| 5272 | ||||||||||||||||||||||||||||||
34 | - | |||||||||||||||||||||||||||||||
35 | void | - | ||||||||||||||||||||||||||||||
36 | CBS_dup(const CBS *cbs, CBS *out) | - | ||||||||||||||||||||||||||||||
37 | { | - | ||||||||||||||||||||||||||||||
38 | CBS_init(out, CBS_data(cbs), CBS_len(cbs)); | - | ||||||||||||||||||||||||||||||
39 | out->initial_len = cbs->initial_len; | - | ||||||||||||||||||||||||||||||
40 | } executed 139 times by 6 tests: end of block Executed by:
| 139 | ||||||||||||||||||||||||||||||
41 | - | |||||||||||||||||||||||||||||||
42 | static int | - | ||||||||||||||||||||||||||||||
43 | cbs_get(CBS *cbs, const uint8_t **p, size_t n) | - | ||||||||||||||||||||||||||||||
44 | { | - | ||||||||||||||||||||||||||||||
45 | if (cbs->len < n)
| 41-12534 | ||||||||||||||||||||||||||||||
46 | return 0; executed 41 times by 3 tests: return 0; Executed by:
| 41 | ||||||||||||||||||||||||||||||
47 | - | |||||||||||||||||||||||||||||||
48 | *p = cbs->data; | - | ||||||||||||||||||||||||||||||
49 | cbs->data += n; | - | ||||||||||||||||||||||||||||||
50 | cbs->len -= n; | - | ||||||||||||||||||||||||||||||
51 | return 1; executed 12534 times by 10 tests: return 1; Executed by:
| 12534 | ||||||||||||||||||||||||||||||
52 | } | - | ||||||||||||||||||||||||||||||
53 | - | |||||||||||||||||||||||||||||||
54 | size_t | - | ||||||||||||||||||||||||||||||
55 | CBS_offset(const CBS *cbs) | - | ||||||||||||||||||||||||||||||
56 | { | - | ||||||||||||||||||||||||||||||
57 | return cbs->initial_len - cbs->len; executed 11 times by 1 test: return cbs->initial_len - cbs->len; Executed by:
| 11 | ||||||||||||||||||||||||||||||
58 | } | - | ||||||||||||||||||||||||||||||
59 | - | |||||||||||||||||||||||||||||||
60 | int | - | ||||||||||||||||||||||||||||||
61 | CBS_skip(CBS *cbs, size_t len) | - | ||||||||||||||||||||||||||||||
62 | { | - | ||||||||||||||||||||||||||||||
63 | const uint8_t *dummy; | - | ||||||||||||||||||||||||||||||
64 | return cbs_get(cbs, &dummy, len); executed 148 times by 3 tests: return cbs_get(cbs, &dummy, len); Executed by:
| 148 | ||||||||||||||||||||||||||||||
65 | } | - | ||||||||||||||||||||||||||||||
66 | - | |||||||||||||||||||||||||||||||
67 | const uint8_t * | - | ||||||||||||||||||||||||||||||
68 | CBS_data(const CBS *cbs) | - | ||||||||||||||||||||||||||||||
69 | { | - | ||||||||||||||||||||||||||||||
70 | return cbs->data; executed 959 times by 7 tests: return cbs->data; Executed by:
| 959 | ||||||||||||||||||||||||||||||
71 | } | - | ||||||||||||||||||||||||||||||
72 | - | |||||||||||||||||||||||||||||||
73 | size_t | - | ||||||||||||||||||||||||||||||
74 | CBS_len(const CBS *cbs) | - | ||||||||||||||||||||||||||||||
75 | { | - | ||||||||||||||||||||||||||||||
76 | return cbs->len; executed 5934 times by 8 tests: return cbs->len; Executed by:
| 5934 | ||||||||||||||||||||||||||||||
77 | } | - | ||||||||||||||||||||||||||||||
78 | - | |||||||||||||||||||||||||||||||
79 | int | - | ||||||||||||||||||||||||||||||
80 | CBS_stow(const CBS *cbs, uint8_t **out_ptr, size_t *out_len) | - | ||||||||||||||||||||||||||||||
81 | { | - | ||||||||||||||||||||||||||||||
82 | free(*out_ptr); | - | ||||||||||||||||||||||||||||||
83 | *out_ptr = NULL; | - | ||||||||||||||||||||||||||||||
84 | *out_len = 0; | - | ||||||||||||||||||||||||||||||
85 | - | |||||||||||||||||||||||||||||||
86 | if (cbs->len == 0)
| 0-132 | ||||||||||||||||||||||||||||||
87 | return 1; never executed: return 1; | 0 | ||||||||||||||||||||||||||||||
88 | - | |||||||||||||||||||||||||||||||
89 | if ((*out_ptr = malloc(cbs->len)) == NULL)
| 0-132 | ||||||||||||||||||||||||||||||
90 | return 0; never executed: return 0; | 0 | ||||||||||||||||||||||||||||||
91 | - | |||||||||||||||||||||||||||||||
92 | memcpy(*out_ptr, cbs->data, cbs->len); | - | ||||||||||||||||||||||||||||||
93 | - | |||||||||||||||||||||||||||||||
94 | *out_len = cbs->len; | - | ||||||||||||||||||||||||||||||
95 | return 1; executed 132 times by 5 tests: return 1; Executed by:
| 132 | ||||||||||||||||||||||||||||||
96 | } | - | ||||||||||||||||||||||||||||||
97 | - | |||||||||||||||||||||||||||||||
98 | int | - | ||||||||||||||||||||||||||||||
99 | CBS_strdup(const CBS *cbs, char **out_ptr) | - | ||||||||||||||||||||||||||||||
100 | { | - | ||||||||||||||||||||||||||||||
101 | free(*out_ptr); | - | ||||||||||||||||||||||||||||||
102 | *out_ptr = strndup((const char *)cbs->data, cbs->len); never executed: __len = __n + 1; never executed: end of block
| 0-6 | ||||||||||||||||||||||||||||||
103 | return (*out_ptr != NULL); executed 6 times by 3 tests: return (*out_ptr != ((void *)0) ); Executed by:
| 6 | ||||||||||||||||||||||||||||||
104 | } | - | ||||||||||||||||||||||||||||||
105 | - | |||||||||||||||||||||||||||||||
106 | int | - | ||||||||||||||||||||||||||||||
107 | CBS_write_bytes(const CBS *cbs, uint8_t *dst, size_t dst_len, size_t *copied) | - | ||||||||||||||||||||||||||||||
108 | { | - | ||||||||||||||||||||||||||||||
109 | if (dst_len < cbs->len)
| 0-361 | ||||||||||||||||||||||||||||||
110 | return 0; never executed: return 0; | 0 | ||||||||||||||||||||||||||||||
111 | - | |||||||||||||||||||||||||||||||
112 | memmove(dst, cbs->data, cbs->len); | - | ||||||||||||||||||||||||||||||
113 | - | |||||||||||||||||||||||||||||||
114 | if (copied != NULL)
| 73-288 | ||||||||||||||||||||||||||||||
115 | *copied = cbs->len; executed 73 times by 4 tests: *copied = cbs->len; Executed by:
| 73 | ||||||||||||||||||||||||||||||
116 | - | |||||||||||||||||||||||||||||||
117 | return 1; executed 361 times by 5 tests: return 1; Executed by:
| 361 | ||||||||||||||||||||||||||||||
118 | } | - | ||||||||||||||||||||||||||||||
119 | - | |||||||||||||||||||||||||||||||
120 | int | - | ||||||||||||||||||||||||||||||
121 | CBS_contains_zero_byte(const CBS *cbs) | - | ||||||||||||||||||||||||||||||
122 | { | - | ||||||||||||||||||||||||||||||
123 | return memchr(cbs->data, 0, cbs->len) != NULL; executed 67 times by 4 tests: return memchr(cbs->data, 0, cbs->len) != ((void *)0) ; Executed by:
| 67 | ||||||||||||||||||||||||||||||
124 | } | - | ||||||||||||||||||||||||||||||
125 | - | |||||||||||||||||||||||||||||||
126 | int | - | ||||||||||||||||||||||||||||||
127 | CBS_mem_equal(const CBS *cbs, const uint8_t *data, size_t len) | - | ||||||||||||||||||||||||||||||
128 | { | - | ||||||||||||||||||||||||||||||
129 | if (len != cbs->len)
| 1-270 | ||||||||||||||||||||||||||||||
130 | return 0; executed 1 time by 1 test: return 0; Executed by:
| 1 | ||||||||||||||||||||||||||||||
131 | - | |||||||||||||||||||||||||||||||
132 | return timingsafe_memcmp(cbs->data, data, len) == 0; executed 270 times by 4 tests: return timingsafe_memcmp(cbs->data, data, len) == 0; Executed by:
| 270 | ||||||||||||||||||||||||||||||
133 | } | - | ||||||||||||||||||||||||||||||
134 | - | |||||||||||||||||||||||||||||||
135 | static int | - | ||||||||||||||||||||||||||||||
136 | cbs_get_u(CBS *cbs, uint32_t *out, size_t len) | - | ||||||||||||||||||||||||||||||
137 | { | - | ||||||||||||||||||||||||||||||
138 | uint32_t result = 0; | - | ||||||||||||||||||||||||||||||
139 | size_t i; | - | ||||||||||||||||||||||||||||||
140 | const uint8_t *data; | - | ||||||||||||||||||||||||||||||
141 | - | |||||||||||||||||||||||||||||||
142 | if (len < 1 || len > 4)
| 0-7138 | ||||||||||||||||||||||||||||||
143 | return 0; never executed: return 0; | 0 | ||||||||||||||||||||||||||||||
144 | - | |||||||||||||||||||||||||||||||
145 | if (!cbs_get(cbs, &data, len))
| 6-7132 | ||||||||||||||||||||||||||||||
146 | return 0; executed 6 times by 2 tests: return 0; Executed by:
| 6 | ||||||||||||||||||||||||||||||
147 | - | |||||||||||||||||||||||||||||||
148 | for (i = 0; i < len; i++) {
| 7132-14973 | ||||||||||||||||||||||||||||||
149 | result <<= 8; | - | ||||||||||||||||||||||||||||||
150 | result |= data[i]; | - | ||||||||||||||||||||||||||||||
151 | } executed 14973 times by 9 tests: end of block Executed by:
| 14973 | ||||||||||||||||||||||||||||||
152 | *out = result; | - | ||||||||||||||||||||||||||||||
153 | return 1; executed 7132 times by 9 tests: return 1; Executed by:
| 7132 | ||||||||||||||||||||||||||||||
154 | } | - | ||||||||||||||||||||||||||||||
155 | - | |||||||||||||||||||||||||||||||
156 | int | - | ||||||||||||||||||||||||||||||
157 | CBS_get_u8(CBS *cbs, uint8_t *out) | - | ||||||||||||||||||||||||||||||
158 | { | - | ||||||||||||||||||||||||||||||
159 | const uint8_t *v; | - | ||||||||||||||||||||||||||||||
160 | - | |||||||||||||||||||||||||||||||
161 | if (!cbs_get(cbs, &v, 1))
| 2-3071 | ||||||||||||||||||||||||||||||
162 | return 0; executed 2 times by 1 test: return 0; Executed by:
| 2 | ||||||||||||||||||||||||||||||
163 | - | |||||||||||||||||||||||||||||||
164 | *out = *v; | - | ||||||||||||||||||||||||||||||
165 | return 1; executed 3071 times by 7 tests: return 1; Executed by:
| 3071 | ||||||||||||||||||||||||||||||
166 | } | - | ||||||||||||||||||||||||||||||
167 | - | |||||||||||||||||||||||||||||||
168 | int | - | ||||||||||||||||||||||||||||||
169 | CBS_get_u16(CBS *cbs, uint16_t *out) | - | ||||||||||||||||||||||||||||||
170 | { | - | ||||||||||||||||||||||||||||||
171 | uint32_t v; | - | ||||||||||||||||||||||||||||||
172 | - | |||||||||||||||||||||||||||||||
173 | if (!cbs_get_u(cbs, &v, 2))
| 4-4498 | ||||||||||||||||||||||||||||||
174 | return 0; executed 4 times by 2 tests: return 0; Executed by:
| 4 | ||||||||||||||||||||||||||||||
175 | - | |||||||||||||||||||||||||||||||
176 | *out = v; | - | ||||||||||||||||||||||||||||||
177 | return 1; executed 4498 times by 9 tests: return 1; Executed by:
| 4498 | ||||||||||||||||||||||||||||||
178 | } | - | ||||||||||||||||||||||||||||||
179 | - | |||||||||||||||||||||||||||||||
180 | int | - | ||||||||||||||||||||||||||||||
181 | CBS_get_u24(CBS *cbs, uint32_t *out) | - | ||||||||||||||||||||||||||||||
182 | { | - | ||||||||||||||||||||||||||||||
183 | return cbs_get_u(cbs, out, 3); executed 874 times by 4 tests: return cbs_get_u(cbs, out, 3); Executed by:
| 874 | ||||||||||||||||||||||||||||||
184 | } | - | ||||||||||||||||||||||||||||||
185 | - | |||||||||||||||||||||||||||||||
186 | int | - | ||||||||||||||||||||||||||||||
187 | CBS_get_u32(CBS *cbs, uint32_t *out) | - | ||||||||||||||||||||||||||||||
188 | { | - | ||||||||||||||||||||||||||||||
189 | return cbs_get_u(cbs, out, 4); executed 60 times by 2 tests: return cbs_get_u(cbs, out, 4); Executed by:
| 60 | ||||||||||||||||||||||||||||||
190 | } | - | ||||||||||||||||||||||||||||||
191 | - | |||||||||||||||||||||||||||||||
192 | int | - | ||||||||||||||||||||||||||||||
193 | CBS_get_bytes(CBS *cbs, CBS *out, size_t len) | - | ||||||||||||||||||||||||||||||
194 | { | - | ||||||||||||||||||||||||||||||
195 | const uint8_t *v; | - | ||||||||||||||||||||||||||||||
196 | - | |||||||||||||||||||||||||||||||
197 | if (!cbs_get(cbs, &v, len))
| 30-2186 | ||||||||||||||||||||||||||||||
198 | return 0; executed 30 times by 2 tests: return 0; Executed by:
| 30 | ||||||||||||||||||||||||||||||
199 | - | |||||||||||||||||||||||||||||||
200 | CBS_init(out, v, len); | - | ||||||||||||||||||||||||||||||
201 | return 1; executed 2186 times by 7 tests: return 1; Executed by:
| 2186 | ||||||||||||||||||||||||||||||
202 | } | - | ||||||||||||||||||||||||||||||
203 | - | |||||||||||||||||||||||||||||||
204 | static int | - | ||||||||||||||||||||||||||||||
205 | cbs_get_length_prefixed(CBS *cbs, CBS *out, size_t len_len) | - | ||||||||||||||||||||||||||||||
206 | { | - | ||||||||||||||||||||||||||||||
207 | uint32_t len; | - | ||||||||||||||||||||||||||||||
208 | - | |||||||||||||||||||||||||||||||
209 | if (!cbs_get_u(cbs, &len, len_len))
| 2-1694 | ||||||||||||||||||||||||||||||
210 | return 0; executed 2 times by 1 test: return 0; Executed by:
| 2 | ||||||||||||||||||||||||||||||
211 | - | |||||||||||||||||||||||||||||||
212 | return CBS_get_bytes(cbs, out, len); executed 1694 times by 6 tests: return CBS_get_bytes(cbs, out, len); Executed by:
| 1694 | ||||||||||||||||||||||||||||||
213 | } | - | ||||||||||||||||||||||||||||||
214 | - | |||||||||||||||||||||||||||||||
215 | int | - | ||||||||||||||||||||||||||||||
216 | CBS_get_u8_length_prefixed(CBS *cbs, CBS *out) | - | ||||||||||||||||||||||||||||||
217 | { | - | ||||||||||||||||||||||||||||||
218 | return cbs_get_length_prefixed(cbs, out, 1); executed 438 times by 6 tests: return cbs_get_length_prefixed(cbs, out, 1); Executed by:
| 438 | ||||||||||||||||||||||||||||||
219 | } | - | ||||||||||||||||||||||||||||||
220 | - | |||||||||||||||||||||||||||||||
221 | int | - | ||||||||||||||||||||||||||||||
222 | CBS_get_u16_length_prefixed(CBS *cbs, CBS *out) | - | ||||||||||||||||||||||||||||||
223 | { | - | ||||||||||||||||||||||||||||||
224 | return cbs_get_length_prefixed(cbs, out, 2); executed 1102 times by 6 tests: return cbs_get_length_prefixed(cbs, out, 2); Executed by:
| 1102 | ||||||||||||||||||||||||||||||
225 | } | - | ||||||||||||||||||||||||||||||
226 | - | |||||||||||||||||||||||||||||||
227 | int | - | ||||||||||||||||||||||||||||||
228 | CBS_get_u24_length_prefixed(CBS *cbs, CBS *out) | - | ||||||||||||||||||||||||||||||
229 | { | - | ||||||||||||||||||||||||||||||
230 | return cbs_get_length_prefixed(cbs, out, 3); executed 156 times by 3 tests: return cbs_get_length_prefixed(cbs, out, 3); Executed by:
| 156 | ||||||||||||||||||||||||||||||
231 | } | - | ||||||||||||||||||||||||||||||
232 | - | |||||||||||||||||||||||||||||||
233 | int | - | ||||||||||||||||||||||||||||||
234 | CBS_get_any_asn1_element(CBS *cbs, CBS *out, unsigned int *out_tag, | - | ||||||||||||||||||||||||||||||
235 | size_t *out_header_len) | - | ||||||||||||||||||||||||||||||
236 | { | - | ||||||||||||||||||||||||||||||
237 | return cbs_get_any_asn1_element_internal(cbs, out, out_tag, executed 70 times by 2 tests: return cbs_get_any_asn1_element_internal(cbs, out, out_tag, out_header_len, 1); Executed by:
| 70 | ||||||||||||||||||||||||||||||
238 | out_header_len, 1); executed 70 times by 2 tests: return cbs_get_any_asn1_element_internal(cbs, out, out_tag, out_header_len, 1); Executed by:
| 70 | ||||||||||||||||||||||||||||||
239 | } | - | ||||||||||||||||||||||||||||||
240 | - | |||||||||||||||||||||||||||||||
241 | /* | - | ||||||||||||||||||||||||||||||
242 | * Review X.690 for details on ASN.1 DER encoding. | - | ||||||||||||||||||||||||||||||
243 | * | - | ||||||||||||||||||||||||||||||
244 | * If non-strict mode is enabled, then DER rules are relaxed | - | ||||||||||||||||||||||||||||||
245 | * for indefinite constructs (violates DER but a little closer to BER). | - | ||||||||||||||||||||||||||||||
246 | * Non-strict mode should only be used by bs_ber.c | - | ||||||||||||||||||||||||||||||
247 | * | - | ||||||||||||||||||||||||||||||
248 | * Sections 8, 10 and 11 for DER encoding | - | ||||||||||||||||||||||||||||||
249 | */ | - | ||||||||||||||||||||||||||||||
250 | int | - | ||||||||||||||||||||||||||||||
251 | cbs_get_any_asn1_element_internal(CBS *cbs, CBS *out, unsigned int *out_tag, | - | ||||||||||||||||||||||||||||||
252 | size_t *out_header_len, int strict) | - | ||||||||||||||||||||||||||||||
253 | { | - | ||||||||||||||||||||||||||||||
254 | uint8_t tag, length_byte; | - | ||||||||||||||||||||||||||||||
255 | CBS header = *cbs; | - | ||||||||||||||||||||||||||||||
256 | CBS throwaway; | - | ||||||||||||||||||||||||||||||
257 | size_t len; | - | ||||||||||||||||||||||||||||||
258 | - | |||||||||||||||||||||||||||||||
259 | if (out == NULL)
| 0-101 | ||||||||||||||||||||||||||||||
260 | out = &throwaway; never executed: out = &throwaway; | 0 | ||||||||||||||||||||||||||||||
261 | - | |||||||||||||||||||||||||||||||
262 | /* | - | ||||||||||||||||||||||||||||||
263 | * Get identifier octet and length octet. Only 1 octet for each | - | ||||||||||||||||||||||||||||||
264 | * is a CBS limitation. | - | ||||||||||||||||||||||||||||||
265 | */ | - | ||||||||||||||||||||||||||||||
266 | if (!CBS_get_u8(&header, &tag) || !CBS_get_u8(&header, &length_byte))
| 0-101 | ||||||||||||||||||||||||||||||
267 | return 0; never executed: return 0; | 0 | ||||||||||||||||||||||||||||||
268 | - | |||||||||||||||||||||||||||||||
269 | /* CBS limitation: long form tags are not supported. */ | - | ||||||||||||||||||||||||||||||
270 | if ((tag & 0x1f) == 0x1f)
| 0-101 | ||||||||||||||||||||||||||||||
271 | return 0; never executed: return 0; | 0 | ||||||||||||||||||||||||||||||
272 | - | |||||||||||||||||||||||||||||||
273 | if (out_tag != NULL)
| 0-101 | ||||||||||||||||||||||||||||||
274 | *out_tag = tag; executed 101 times by 2 tests: *out_tag = tag; Executed by:
| 101 | ||||||||||||||||||||||||||||||
275 | - | |||||||||||||||||||||||||||||||
276 | if ((length_byte & 0x80) == 0) {
| 17-84 | ||||||||||||||||||||||||||||||
277 | /* Short form length. */ | - | ||||||||||||||||||||||||||||||
278 | len = ((size_t) length_byte) + 2; | - | ||||||||||||||||||||||||||||||
279 | if (out_header_len != NULL)
| 0-84 | ||||||||||||||||||||||||||||||
280 | *out_header_len = 2; executed 84 times by 2 tests: *out_header_len = 2; Executed by:
| 84 | ||||||||||||||||||||||||||||||
281 | - | |||||||||||||||||||||||||||||||
282 | } else { executed 84 times by 2 tests: end of block Executed by:
| 84 | ||||||||||||||||||||||||||||||
283 | /* Long form length. */ | - | ||||||||||||||||||||||||||||||
284 | const size_t num_bytes = length_byte & 0x7f; | - | ||||||||||||||||||||||||||||||
285 | uint32_t len32; | - | ||||||||||||||||||||||||||||||
286 | - | |||||||||||||||||||||||||||||||
287 | /* ASN.1 reserved value for future extensions */ | - | ||||||||||||||||||||||||||||||
288 | if (num_bytes == 0x7f)
| 0-17 | ||||||||||||||||||||||||||||||
289 | return 0; never executed: return 0; | 0 | ||||||||||||||||||||||||||||||
290 | - | |||||||||||||||||||||||||||||||
291 | /* Handle indefinite form length */ | - | ||||||||||||||||||||||||||||||
292 | if (num_bytes == 0) {
| 6-11 | ||||||||||||||||||||||||||||||
293 | /* DER encoding doesn't allow for indefinite form. */ | - | ||||||||||||||||||||||||||||||
294 | if (strict)
| 1-10 | ||||||||||||||||||||||||||||||
295 | return 0; executed 1 time by 1 test: return 0; Executed by:
| 1 | ||||||||||||||||||||||||||||||
296 | - | |||||||||||||||||||||||||||||||
297 | /* Primitive cannot use indefinite in BER or DER. */ | - | ||||||||||||||||||||||||||||||
298 | if ((tag & CBS_ASN1_CONSTRUCTED) == 0)
| 0-10 | ||||||||||||||||||||||||||||||
299 | return 0; never executed: return 0; | 0 | ||||||||||||||||||||||||||||||
300 | - | |||||||||||||||||||||||||||||||
301 | /* Constructed, indefinite length allowed in BER. */ | - | ||||||||||||||||||||||||||||||
302 | if (out_header_len != NULL)
| 0-10 | ||||||||||||||||||||||||||||||
303 | *out_header_len = 2; executed 10 times by 1 test: *out_header_len = 2; Executed by:
| 10 | ||||||||||||||||||||||||||||||
304 | return CBS_get_bytes(cbs, out, 2); executed 10 times by 1 test: return CBS_get_bytes(cbs, out, 2); Executed by:
| 10 | ||||||||||||||||||||||||||||||
305 | } | - | ||||||||||||||||||||||||||||||
306 | - | |||||||||||||||||||||||||||||||
307 | /* CBS limitation. */ | - | ||||||||||||||||||||||||||||||
308 | if (num_bytes > 4)
| 0-6 | ||||||||||||||||||||||||||||||
309 | return 0; never executed: return 0; | 0 | ||||||||||||||||||||||||||||||
310 | - | |||||||||||||||||||||||||||||||
311 | if (!cbs_get_u(&header, &len32, num_bytes))
| 0-6 | ||||||||||||||||||||||||||||||
312 | return 0; never executed: return 0; | 0 | ||||||||||||||||||||||||||||||
313 | - | |||||||||||||||||||||||||||||||
314 | /* DER has a minimum length octet requirement. */ | - | ||||||||||||||||||||||||||||||
315 | if (len32 < 128)
| 1-5 | ||||||||||||||||||||||||||||||
316 | /* Should have used short form instead */ | - | ||||||||||||||||||||||||||||||
317 | return 0; executed 1 time by 1 test: return 0; Executed by:
| 1 | ||||||||||||||||||||||||||||||
318 | - | |||||||||||||||||||||||||||||||
319 | if ((len32 >> ((num_bytes - 1) * 8)) == 0)
| 1-4 | ||||||||||||||||||||||||||||||
320 | /* Length should have been at least one byte shorter. */ | - | ||||||||||||||||||||||||||||||
321 | return 0; executed 1 time by 1 test: return 0; Executed by:
| 1 | ||||||||||||||||||||||||||||||
322 | - | |||||||||||||||||||||||||||||||
323 | len = len32; | - | ||||||||||||||||||||||||||||||
324 | if (len + 2 + num_bytes < len)
| 0-4 | ||||||||||||||||||||||||||||||
325 | /* Overflow. */ | - | ||||||||||||||||||||||||||||||
326 | return 0; never executed: return 0; | 0 | ||||||||||||||||||||||||||||||
327 | - | |||||||||||||||||||||||||||||||
328 | len += 2 + num_bytes; | - | ||||||||||||||||||||||||||||||
329 | if (out_header_len != NULL)
| 0-4 | ||||||||||||||||||||||||||||||
330 | *out_header_len = 2 + num_bytes; executed 4 times by 1 test: *out_header_len = 2 + num_bytes; Executed by:
| 4 | ||||||||||||||||||||||||||||||
331 | } executed 4 times by 1 test: end of block Executed by:
| 4 | ||||||||||||||||||||||||||||||
332 | - | |||||||||||||||||||||||||||||||
333 | return CBS_get_bytes(cbs, out, len); executed 88 times by 2 tests: return CBS_get_bytes(cbs, out, len); Executed by:
| 88 | ||||||||||||||||||||||||||||||
334 | } | - | ||||||||||||||||||||||||||||||
335 | - | |||||||||||||||||||||||||||||||
336 | static int | - | ||||||||||||||||||||||||||||||
337 | cbs_get_asn1(CBS *cbs, CBS *out, unsigned int tag_value, int skip_header) | - | ||||||||||||||||||||||||||||||
338 | { | - | ||||||||||||||||||||||||||||||
339 | size_t header_len; | - | ||||||||||||||||||||||||||||||
340 | unsigned int tag; | - | ||||||||||||||||||||||||||||||
341 | CBS throwaway; | - | ||||||||||||||||||||||||||||||
342 | - | |||||||||||||||||||||||||||||||
343 | if (out == NULL)
| 0-70 | ||||||||||||||||||||||||||||||
344 | out = &throwaway; never executed: out = &throwaway; | 0 | ||||||||||||||||||||||||||||||
345 | - | |||||||||||||||||||||||||||||||
346 | if (!CBS_get_any_asn1_element(cbs, out, &tag, &header_len) ||
| 5-65 | ||||||||||||||||||||||||||||||
347 | tag != tag_value)
| 2-63 | ||||||||||||||||||||||||||||||
348 | return 0; executed 7 times by 1 test: return 0; Executed by:
| 7 | ||||||||||||||||||||||||||||||
349 | - | |||||||||||||||||||||||||||||||
350 | if (skip_header && !CBS_skip(out, header_len)) {
| 0-63 | ||||||||||||||||||||||||||||||
351 | assert(0); | - | ||||||||||||||||||||||||||||||
352 | return 0; never executed: return 0; | 0 | ||||||||||||||||||||||||||||||
353 | } | - | ||||||||||||||||||||||||||||||
354 | - | |||||||||||||||||||||||||||||||
355 | return 1; executed 63 times by 2 tests: return 1; Executed by:
| 63 | ||||||||||||||||||||||||||||||
356 | } | - | ||||||||||||||||||||||||||||||
357 | - | |||||||||||||||||||||||||||||||
358 | int | - | ||||||||||||||||||||||||||||||
359 | CBS_get_asn1(CBS *cbs, CBS *out, unsigned int tag_value) | - | ||||||||||||||||||||||||||||||
360 | { | - | ||||||||||||||||||||||||||||||
361 | return cbs_get_asn1(cbs, out, tag_value, 1 /* skip header */); executed 70 times by 2 tests: return cbs_get_asn1(cbs, out, tag_value, 1 ); Executed by:
| 70 | ||||||||||||||||||||||||||||||
362 | } | - | ||||||||||||||||||||||||||||||
363 | - | |||||||||||||||||||||||||||||||
364 | int | - | ||||||||||||||||||||||||||||||
365 | CBS_get_asn1_element(CBS *cbs, CBS *out, unsigned int tag_value) | - | ||||||||||||||||||||||||||||||
366 | { | - | ||||||||||||||||||||||||||||||
367 | return cbs_get_asn1(cbs, out, tag_value, 0 /* include header */); never executed: return cbs_get_asn1(cbs, out, tag_value, 0 ); | 0 | ||||||||||||||||||||||||||||||
368 | } | - | ||||||||||||||||||||||||||||||
369 | - | |||||||||||||||||||||||||||||||
370 | int | - | ||||||||||||||||||||||||||||||
371 | CBS_peek_asn1_tag(const CBS *cbs, unsigned int tag_value) | - | ||||||||||||||||||||||||||||||
372 | { | - | ||||||||||||||||||||||||||||||
373 | if (CBS_len(cbs) < 1)
| 14-29 | ||||||||||||||||||||||||||||||
374 | return 0; executed 14 times by 2 tests: return 0; Executed by:
| 14 | ||||||||||||||||||||||||||||||
375 | - | |||||||||||||||||||||||||||||||
376 | /* | - | ||||||||||||||||||||||||||||||
377 | * Tag number 31 indicates the start of a long form number. | - | ||||||||||||||||||||||||||||||
378 | * This is valid in ASN.1, but CBS only supports short form. | - | ||||||||||||||||||||||||||||||
379 | */ | - | ||||||||||||||||||||||||||||||
380 | if ((tag_value & 0x1f) == 0x1f)
| 0-29 | ||||||||||||||||||||||||||||||
381 | return 0; never executed: return 0; | 0 | ||||||||||||||||||||||||||||||
382 | - | |||||||||||||||||||||||||||||||
383 | return CBS_data(cbs)[0] == tag_value; executed 29 times by 2 tests: return CBS_data(cbs)[0] == tag_value; Executed by:
| 29 | ||||||||||||||||||||||||||||||
384 | } | - | ||||||||||||||||||||||||||||||
385 | - | |||||||||||||||||||||||||||||||
386 | /* Encoding details are in ASN.1: X.690 section 8.3 */ | - | ||||||||||||||||||||||||||||||
387 | int | - | ||||||||||||||||||||||||||||||
388 | CBS_get_asn1_uint64(CBS *cbs, uint64_t *out) | - | ||||||||||||||||||||||||||||||
389 | { | - | ||||||||||||||||||||||||||||||
390 | CBS bytes; | - | ||||||||||||||||||||||||||||||
391 | const uint8_t *data; | - | ||||||||||||||||||||||||||||||
392 | size_t i, len; | - | ||||||||||||||||||||||||||||||
393 | - | |||||||||||||||||||||||||||||||
394 | if (!CBS_get_asn1(cbs, &bytes, CBS_ASN1_INTEGER))
| 1-23 | ||||||||||||||||||||||||||||||
395 | return 0; executed 1 time by 1 test: return 0; Executed by:
| 1 | ||||||||||||||||||||||||||||||
396 | - | |||||||||||||||||||||||||||||||
397 | *out = 0; | - | ||||||||||||||||||||||||||||||
398 | data = CBS_data(&bytes); | - | ||||||||||||||||||||||||||||||
399 | len = CBS_len(&bytes); | - | ||||||||||||||||||||||||||||||
400 | - | |||||||||||||||||||||||||||||||
401 | if (len == 0)
| 1-22 | ||||||||||||||||||||||||||||||
402 | /* An INTEGER is encoded with at least one content octet. */ | - | ||||||||||||||||||||||||||||||
403 | return 0; executed 1 time by 1 test: return 0; Executed by:
| 1 | ||||||||||||||||||||||||||||||
404 | - | |||||||||||||||||||||||||||||||
405 | if ((data[0] & 0x80) != 0)
| 2-20 | ||||||||||||||||||||||||||||||
406 | /* Negative number. */ | - | ||||||||||||||||||||||||||||||
407 | return 0; executed 2 times by 1 test: return 0; Executed by:
| 2 | ||||||||||||||||||||||||||||||
408 | - | |||||||||||||||||||||||||||||||
409 | if (data[0] == 0 && len > 1 && (data[1] & 0x80) == 0)
| 1-15 | ||||||||||||||||||||||||||||||
410 | /* Violates smallest encoding rule: excessive leading zeros. */ | - | ||||||||||||||||||||||||||||||
411 | return 0; executed 1 time by 1 test: return 0; Executed by:
| 1 | ||||||||||||||||||||||||||||||
412 | - | |||||||||||||||||||||||||||||||
413 | for (i = 0; i < len; i++) {
| 18-56 | ||||||||||||||||||||||||||||||
414 | if ((*out >> 56) != 0)
| 1-55 | ||||||||||||||||||||||||||||||
415 | /* Too large to represent as a uint64_t. */ | - | ||||||||||||||||||||||||||||||
416 | return 0; executed 1 time by 1 test: return 0; Executed by:
| 1 | ||||||||||||||||||||||||||||||
417 | - | |||||||||||||||||||||||||||||||
418 | *out <<= 8; | - | ||||||||||||||||||||||||||||||
419 | *out |= data[i]; | - | ||||||||||||||||||||||||||||||
420 | } executed 55 times by 2 tests: end of block Executed by:
| 55 | ||||||||||||||||||||||||||||||
421 | - | |||||||||||||||||||||||||||||||
422 | return 1; executed 18 times by 2 tests: return 1; Executed by:
| 18 | ||||||||||||||||||||||||||||||
423 | } | - | ||||||||||||||||||||||||||||||
424 | - | |||||||||||||||||||||||||||||||
425 | int | - | ||||||||||||||||||||||||||||||
426 | CBS_get_optional_asn1(CBS *cbs, CBS *out, int *out_present, unsigned int tag) | - | ||||||||||||||||||||||||||||||
427 | { | - | ||||||||||||||||||||||||||||||
428 | if (CBS_peek_asn1_tag(cbs, tag)) {
| 18-22 | ||||||||||||||||||||||||||||||
429 | if (!CBS_get_asn1(cbs, out, tag))
| 0-18 | ||||||||||||||||||||||||||||||
430 | return 0; never executed: return 0; | 0 | ||||||||||||||||||||||||||||||
431 | - | |||||||||||||||||||||||||||||||
432 | *out_present = 1; | - | ||||||||||||||||||||||||||||||
433 | } else { executed 18 times by 2 tests: end of block Executed by:
| 18 | ||||||||||||||||||||||||||||||
434 | *out_present = 0; | - | ||||||||||||||||||||||||||||||
435 | } executed 22 times by 2 tests: end of block Executed by:
| 22 | ||||||||||||||||||||||||||||||
436 | return 1; executed 40 times by 2 tests: return 1; Executed by:
| 40 | ||||||||||||||||||||||||||||||
437 | } | - | ||||||||||||||||||||||||||||||
438 | - | |||||||||||||||||||||||||||||||
439 | int | - | ||||||||||||||||||||||||||||||
440 | CBS_get_optional_asn1_octet_string(CBS *cbs, CBS *out, int *out_present, | - | ||||||||||||||||||||||||||||||
441 | unsigned int tag) | - | ||||||||||||||||||||||||||||||
442 | { | - | ||||||||||||||||||||||||||||||
443 | CBS child; | - | ||||||||||||||||||||||||||||||
444 | int present; | - | ||||||||||||||||||||||||||||||
445 | - | |||||||||||||||||||||||||||||||
446 | if (!CBS_get_optional_asn1(cbs, &child, &present, tag))
| 0-14 | ||||||||||||||||||||||||||||||
447 | return 0; never executed: return 0; | 0 | ||||||||||||||||||||||||||||||
448 | - | |||||||||||||||||||||||||||||||
449 | if (present) {
| 7 | ||||||||||||||||||||||||||||||
450 | if (!CBS_get_asn1(&child, out, CBS_ASN1_OCTETSTRING) ||
| 1-6 | ||||||||||||||||||||||||||||||
451 | CBS_len(&child) != 0)
| 0-6 | ||||||||||||||||||||||||||||||
452 | return 0; executed 1 time by 1 test: return 0; Executed by:
| 1 | ||||||||||||||||||||||||||||||
453 | } else { executed 6 times by 2 tests: end of block Executed by:
| 6 | ||||||||||||||||||||||||||||||
454 | CBS_init(out, NULL, 0); | - | ||||||||||||||||||||||||||||||
455 | } executed 7 times by 2 tests: end of block Executed by:
| 7 | ||||||||||||||||||||||||||||||
456 | if (out_present)
| 1-12 | ||||||||||||||||||||||||||||||
457 | *out_present = present; executed 12 times by 2 tests: *out_present = present; Executed by:
| 12 | ||||||||||||||||||||||||||||||
458 | - | |||||||||||||||||||||||||||||||
459 | return 1; executed 13 times by 2 tests: return 1; Executed by:
| 13 | ||||||||||||||||||||||||||||||
460 | } | - | ||||||||||||||||||||||||||||||
461 | - | |||||||||||||||||||||||||||||||
462 | int | - | ||||||||||||||||||||||||||||||
463 | CBS_get_optional_asn1_uint64(CBS *cbs, uint64_t *out, unsigned int tag, | - | ||||||||||||||||||||||||||||||
464 | uint64_t default_value) | - | ||||||||||||||||||||||||||||||
465 | { | - | ||||||||||||||||||||||||||||||
466 | CBS child; | - | ||||||||||||||||||||||||||||||
467 | int present; | - | ||||||||||||||||||||||||||||||
468 | - | |||||||||||||||||||||||||||||||
469 | if (!CBS_get_optional_asn1(cbs, &child, &present, tag))
| 0-16 | ||||||||||||||||||||||||||||||
470 | return 0; never executed: return 0; | 0 | ||||||||||||||||||||||||||||||
471 | - | |||||||||||||||||||||||||||||||
472 | if (present) {
| 6-10 | ||||||||||||||||||||||||||||||
473 | if (!CBS_get_asn1_uint64(&child, out) ||
| 1-5 | ||||||||||||||||||||||||||||||
474 | CBS_len(&child) != 0)
| 0-5 | ||||||||||||||||||||||||||||||
475 | return 0; executed 1 time by 1 test: return 0; Executed by:
| 1 | ||||||||||||||||||||||||||||||
476 | } else { executed 5 times by 2 tests: end of block Executed by:
| 5 | ||||||||||||||||||||||||||||||
477 | *out = default_value; | - | ||||||||||||||||||||||||||||||
478 | } executed 10 times by 2 tests: end of block Executed by:
| 10 | ||||||||||||||||||||||||||||||
479 | return 1; executed 15 times by 2 tests: return 1; Executed by:
| 15 | ||||||||||||||||||||||||||||||
480 | } | - | ||||||||||||||||||||||||||||||
481 | - | |||||||||||||||||||||||||||||||
482 | int | - | ||||||||||||||||||||||||||||||
483 | CBS_get_optional_asn1_bool(CBS *cbs, int *out, unsigned int tag, | - | ||||||||||||||||||||||||||||||
484 | int default_value) | - | ||||||||||||||||||||||||||||||
485 | { | - | ||||||||||||||||||||||||||||||
486 | CBS child, child2; | - | ||||||||||||||||||||||||||||||
487 | int present; | - | ||||||||||||||||||||||||||||||
488 | - | |||||||||||||||||||||||||||||||
489 | if (!CBS_get_optional_asn1(cbs, &child, &present, tag))
| 0-4 | ||||||||||||||||||||||||||||||
490 | return 0; never executed: return 0; | 0 | ||||||||||||||||||||||||||||||
491 | - | |||||||||||||||||||||||||||||||
492 | if (present) {
| 1-3 | ||||||||||||||||||||||||||||||
493 | uint8_t boolean; | - | ||||||||||||||||||||||||||||||
494 | - | |||||||||||||||||||||||||||||||
495 | if (!CBS_get_asn1(&child, &child2, CBS_ASN1_BOOLEAN) ||
| 0-3 | ||||||||||||||||||||||||||||||
496 | CBS_len(&child2) != 1 || CBS_len(&child) != 0)
| 0-3 | ||||||||||||||||||||||||||||||
497 | return 0; never executed: return 0; | 0 | ||||||||||||||||||||||||||||||
498 | - | |||||||||||||||||||||||||||||||
499 | boolean = CBS_data(&child2)[0]; | - | ||||||||||||||||||||||||||||||
500 | if (boolean == 0)
| 1-2 | ||||||||||||||||||||||||||||||
501 | *out = 0; executed 1 time by 1 test: *out = 0; Executed by:
| 1 | ||||||||||||||||||||||||||||||
502 | else if (boolean == 0xff)
| 1 | ||||||||||||||||||||||||||||||
503 | *out = 1; executed 1 time by 1 test: *out = 1; Executed by:
| 1 | ||||||||||||||||||||||||||||||
504 | else | - | ||||||||||||||||||||||||||||||
505 | return 0; executed 1 time by 1 test: return 0; Executed by:
| 1 | ||||||||||||||||||||||||||||||
506 | - | |||||||||||||||||||||||||||||||
507 | } else { | - | ||||||||||||||||||||||||||||||
508 | *out = default_value; | - | ||||||||||||||||||||||||||||||
509 | } executed 1 time by 1 test: end of block Executed by:
| 1 | ||||||||||||||||||||||||||||||
510 | return 1; executed 3 times by 1 test: return 1; Executed by:
| 3 | ||||||||||||||||||||||||||||||
511 | } | - | ||||||||||||||||||||||||||||||
Source code | Switch to Preprocessed file |