OpenCoverage

bio_asn1.c

Absolute File Name:/home/opencoverage/opencoverage/guest-scripts/libressl/src/crypto/asn1/bio_asn1.c
Switch to Source codePreprocessed file
LineSourceCount
1-
2-
3-
4-
5-
6typedef enum {-
7 ASN1_STATE_START,-
8 ASN1_STATE_PRE_COPY,-
9 ASN1_STATE_HEADER,-
10 ASN1_STATE_HEADER_COPY,-
11 ASN1_STATE_DATA_COPY,-
12 ASN1_STATE_POST_COPY,-
13 ASN1_STATE_DONE-
14} asn1_bio_state_t;-
15-
16typedef struct BIO_ASN1_EX_FUNCS_st {-
17 asn1_ps_func *ex_func;-
18 asn1_ps_func *ex_free_func;-
19} BIO_ASN1_EX_FUNCS;-
20-
21typedef struct BIO_ASN1_BUF_CTX_t {-
22-
23 asn1_bio_state_t state;-
24-
25 unsigned char *buf;-
26-
27 int bufsize;-
28-
29 int bufpos;-
30-
31 int buflen;-
32-
33 int copylen;-
34-
35 int asn1_class, asn1_tag;-
36 asn1_ps_func *prefix, *prefix_free, *suffix, *suffix_free;-
37-
38 unsigned char *ex_buf;-
39 int ex_len;-
40 int ex_pos;-
41 void *ex_arg;-
42} BIO_ASN1_BUF_CTX;-
43-
44-
45static int asn1_bio_write(BIO *h, const char *buf, int num);-
46static int asn1_bio_read(BIO *h, char *buf, int size);-
47static int asn1_bio_puts(BIO *h, const char *str);-
48static int asn1_bio_gets(BIO *h, char *str, int size);-
49static long asn1_bio_ctrl(BIO *h, int cmd, long arg1, void *arg2);-
50static int asn1_bio_new(BIO *h);-
51static int asn1_bio_free(BIO *data);-
52static long asn1_bio_callback_ctrl(BIO *h, int cmd, bio_info_cb *fp);-
53-
54static int asn1_bio_init(BIO_ASN1_BUF_CTX *ctx, int size);-
55static int asn1_bio_flush_ex(BIO *b, BIO_ASN1_BUF_CTX *ctx,-
56 asn1_ps_func *cleanup, asn1_bio_state_t next);-
57static int asn1_bio_setup_ex(BIO *b, BIO_ASN1_BUF_CTX *ctx,-
58 asn1_ps_func *setup, asn1_bio_state_t ex_state,-
59 asn1_bio_state_t other_state);-
60-
61static const BIO_METHOD methods_asn1 = {-
62 .type = (22|0x0200),-
63 .name = "asn1",-
64 .bwrite = asn1_bio_write,-
65 .bread = asn1_bio_read,-
66 .bputs = asn1_bio_puts,-
67 .bgets = asn1_bio_gets,-
68 .ctrl = asn1_bio_ctrl,-
69 .create = asn1_bio_new,-
70 .destroy = asn1_bio_free,-
71 .callback_ctrl = asn1_bio_callback_ctrl-
72};-
73-
74const BIO_METHOD *-
75BIO_f_asn1(void)-
76{-
77 return
never executed: return (&methods_asn1);
(&methods_asn1);
never executed: return (&methods_asn1);
0
78}-
79-
80static int-
81asn1_bio_new(BIO *b)-
82{-
83 BIO_ASN1_BUF_CTX *ctx;-
84 ctx = malloc(sizeof(BIO_ASN1_BUF_CTX));-
85 if (!ctx
!ctxDescription
TRUEnever evaluated
FALSEnever evaluated
)
0
86 return
never executed: return 0;
0;
never executed: return 0;
0
87 if (!asn1_bio_init(ctx, 20)
!asn1_bio_init(ctx, 20)Description
TRUEnever evaluated
FALSEnever evaluated
) {
0
88 free(ctx);-
89 return
never executed: return 0;
0;
never executed: return 0;
0
90 }-
91 b->init = 1;-
92 b->ptr = (char *)ctx;-
93 b->flags = 0;-
94 return
never executed: return 1;
1;
never executed: return 1;
0
95}-
96-
97static int-
98asn1_bio_init(BIO_ASN1_BUF_CTX *ctx, int size)-
99{-
100 ctx->buf = malloc(size);-
101 if (!ctx->buf
!ctx->bufDescription
TRUEnever evaluated
FALSEnever evaluated
)
0
102 return
never executed: return 0;
0;
never executed: return 0;
0
103 ctx->bufsize = size;-
104 ctx->bufpos = 0;-
105 ctx->buflen = 0;-
106 ctx->copylen = 0;-
107 ctx->asn1_class = 0x00;-
108 ctx->asn1_tag = 4;-
109 ctx->ex_buf = -
110 ((void *)0)-
111 ;-
112 ctx->ex_pos = 0;-
113 ctx->ex_len = 0;-
114 ctx->state = ASN1_STATE_START;-
115 return
never executed: return 1;
1;
never executed: return 1;
0
116}-
117-
118static int-
119asn1_bio_free(BIO *b)-
120{-
121 BIO_ASN1_BUF_CTX *ctx;-
122-
123 ctx = (BIO_ASN1_BUF_CTX *) b->ptr;-
124 if (ctx ==
ctx == ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
125 ((void *)0)
ctx == ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
126 )-
127 return
never executed: return 0;
0;
never executed: return 0;
0
128 free(ctx->buf);-
129 free(ctx);-
130 b->init = 0;-
131 b->ptr = -
132 ((void *)0)-
133 ;-
134 b->flags = 0;-
135 return
never executed: return 1;
1;
never executed: return 1;
0
136}-
137-
138static int-
139asn1_bio_write(BIO *b, const char *in , int inl)-
140{-
141 BIO_ASN1_BUF_CTX *ctx;-
142 int wrmax, wrlen, ret, buflen;-
143 unsigned char *p;-
144-
145 if (!in
!inDescription
TRUEnever evaluated
FALSEnever evaluated
|| (
(inl < 0)Description
TRUEnever evaluated
FALSEnever evaluated
inl < 0)
(inl < 0)Description
TRUEnever evaluated
FALSEnever evaluated
|| (
(b->next_bio == ((void *)0) )Description
TRUEnever evaluated
FALSEnever evaluated
b->next_bio ==
(b->next_bio == ((void *)0) )Description
TRUEnever evaluated
FALSEnever evaluated
0
146 ((void *)0)
(b->next_bio == ((void *)0) )Description
TRUEnever evaluated
FALSEnever evaluated
0
147 )
(b->next_bio == ((void *)0) )Description
TRUEnever evaluated
FALSEnever evaluated
)
0
148 return
never executed: return 0;
0;
never executed: return 0;
0
149 ctx = (BIO_ASN1_BUF_CTX *) b->ptr;-
150 if (ctx ==
ctx == ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
151 ((void *)0)
ctx == ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
152 )-
153 return
never executed: return 0;
0;
never executed: return 0;
0
154-
155 wrlen = 0;-
156 ret = -1;-
157-
158 for (;;) {-
159 switch (ctx->state) {-
160-
161-
162 case
never executed: case ASN1_STATE_START:
ASN1_STATE_START:
never executed: case ASN1_STATE_START:
0
163 if (!asn1_bio_setup_ex(b, ctx, ctx->prefix,
!asn1_bio_setu..._STATE_HEADER)Description
TRUEnever evaluated
FALSEnever evaluated
0
164 ASN1_STATE_PRE_COPY, ASN1_STATE_HEADER)
!asn1_bio_setu..._STATE_HEADER)Description
TRUEnever evaluated
FALSEnever evaluated
)
0
165 return
never executed: return 0;
0;
never executed: return 0;
0
166 break;
never executed: break;
0
167-
168-
169 case
never executed: case ASN1_STATE_PRE_COPY:
ASN1_STATE_PRE_COPY:
never executed: case ASN1_STATE_PRE_COPY:
0
170 ret = asn1_bio_flush_ex(b, ctx, ctx->prefix_free,-
171 ASN1_STATE_HEADER);-
172 if (ret <= 0
ret <= 0Description
TRUEnever evaluated
FALSEnever evaluated
)
0
173 goto
never executed: goto done;
done;
never executed: goto done;
0
174 break;
never executed: break;
0
175-
176 case
never executed: case ASN1_STATE_HEADER:
ASN1_STATE_HEADER:
never executed: case ASN1_STATE_HEADER:
0
177 buflen = ASN1_object_size(0, inl, ctx->asn1_tag) - inl;-
178 if (buflen <= 0
buflen <= 0Description
TRUEnever evaluated
FALSEnever evaluated
|| buflen > ctx->bufsize
buflen > ctx->bufsizeDescription
TRUEnever evaluated
FALSEnever evaluated
)
0
179 return
never executed: return -1;
-1;
never executed: return -1;
0
180 ctx->buflen = buflen;-
181 p = ctx->buf;-
182 ASN1_put_object(&p, 0, inl,-
183 ctx->asn1_tag, ctx->asn1_class);-
184 ctx->copylen = inl;-
185 ctx->state = ASN1_STATE_HEADER_COPY;-
186 break;
never executed: break;
0
187-
188 case
never executed: case ASN1_STATE_HEADER_COPY:
ASN1_STATE_HEADER_COPY:
never executed: case ASN1_STATE_HEADER_COPY:
0
189 ret = BIO_write(b->next_bio,-
190 ctx->buf + ctx->bufpos, ctx->buflen);-
191 if (ret <= 0
ret <= 0Description
TRUEnever evaluated
FALSEnever evaluated
)
0
192 goto
never executed: goto done;
done;
never executed: goto done;
0
193-
194 ctx->buflen -= ret;-
195 if (ctx->buflen
ctx->buflenDescription
TRUEnever evaluated
FALSEnever evaluated
)
0
196 ctx->bufpos += ret;
never executed: ctx->bufpos += ret;
0
197 else {-
198 ctx->bufpos = 0;-
199 ctx->state = ASN1_STATE_DATA_COPY;-
200 }
never executed: end of block
0
201 break;
never executed: break;
0
202-
203 case
never executed: case ASN1_STATE_DATA_COPY:
ASN1_STATE_DATA_COPY:
never executed: case ASN1_STATE_DATA_COPY:
0
204-
205 if (inl > ctx->copylen
inl > ctx->copylenDescription
TRUEnever evaluated
FALSEnever evaluated
)
0
206 wrmax = ctx->copylen;
never executed: wrmax = ctx->copylen;
0
207 else-
208 wrmax = inl;
never executed: wrmax = inl;
0
209 ret = BIO_write(b->next_bio, in, wrmax);-
210 if (ret <= 0
ret <= 0Description
TRUEnever evaluated
FALSEnever evaluated
)
0
211 break;
never executed: break;
0
212 wrlen += ret;-
213 ctx->copylen -= ret;-
214 in += ret;-
215 inl -= ret;-
216-
217 if (ctx->copylen == 0
ctx->copylen == 0Description
TRUEnever evaluated
FALSEnever evaluated
)
0
218 ctx->state = ASN1_STATE_HEADER;
never executed: ctx->state = ASN1_STATE_HEADER;
0
219 if (inl == 0
inl == 0Description
TRUEnever evaluated
FALSEnever evaluated
)
0
220 goto
never executed: goto done;
done;
never executed: goto done;
0
221 break;
never executed: break;
0
222-
223 default
never executed: default:
:
never executed: default:
0
224 BIO_clear_flags(b, ((0x01|0x02|0x04)|0x08));-
225 return
never executed: return 0;
0;
never executed: return 0;
0
226 }-
227-
228 }-
229-
230done:
code before this statement never executed: done:
0
231 BIO_clear_flags(b, ((0x01|0x02|0x04)|0x08));-
232 BIO_copy_next_retry(b);-
233-
234 return
never executed: return (wrlen > 0) ? wrlen : ret;
(
(wrlen > 0)Description
TRUEnever evaluated
FALSEnever evaluated
wrlen > 0)
(wrlen > 0)Description
TRUEnever evaluated
FALSEnever evaluated
? wrlen : ret;
never executed: return (wrlen > 0) ? wrlen : ret;
0
235}-
236-
237static int-
238asn1_bio_flush_ex(BIO *b, BIO_ASN1_BUF_CTX *ctx, asn1_ps_func *cleanup,-
239 asn1_bio_state_t next)-
240{-
241 int ret;-
242-
243 if (ctx->ex_len <= 0
ctx->ex_len <= 0Description
TRUEnever evaluated
FALSEnever evaluated
)
0
244 return
never executed: return 1;
1;
never executed: return 1;
0
245 for (;;) {-
246 ret = BIO_write(b->next_bio, ctx->ex_buf + ctx->ex_pos,-
247 ctx->ex_len);-
248 if (ret <= 0
ret <= 0Description
TRUEnever evaluated
FALSEnever evaluated
)
0
249 break;
never executed: break;
0
250 ctx->ex_len -= ret;-
251 if (ctx->ex_len > 0
ctx->ex_len > 0Description
TRUEnever evaluated
FALSEnever evaluated
)
0
252 ctx->ex_pos += ret;
never executed: ctx->ex_pos += ret;
0
253 else {-
254 if (cleanup
cleanupDescription
TRUEnever evaluated
FALSEnever evaluated
)
0
255 cleanup(b, &ctx->ex_buf, &ctx->ex_len,
never executed: cleanup(b, &ctx->ex_buf, &ctx->ex_len, &ctx->ex_arg);
0
256 &ctx->ex_arg);
never executed: cleanup(b, &ctx->ex_buf, &ctx->ex_len, &ctx->ex_arg);
0
257 ctx->state = next;-
258 ctx->ex_pos = 0;-
259 break;
never executed: break;
0
260 }-
261 }-
262 return
never executed: return ret;
ret;
never executed: return ret;
0
263}-
264-
265static int-
266asn1_bio_setup_ex(BIO *b, BIO_ASN1_BUF_CTX *ctx, asn1_ps_func *setup,-
267 asn1_bio_state_t ex_state, asn1_bio_state_t other_state)-
268{-
269 if (setup
setupDescription
TRUEnever evaluated
FALSEnever evaluated
&& !setup(b, &ctx->ex_buf, &ctx->ex_len, &ctx->ex_arg)
!setup(b, &ctx... &ctx->ex_arg)Description
TRUEnever evaluated
FALSEnever evaluated
) {
0
270 BIO_clear_flags(b, ((0x01|0x02|0x04)|0x08));-
271 return
never executed: return 0;
0;
never executed: return 0;
0
272 }-
273 if (ctx->ex_len > 0
ctx->ex_len > 0Description
TRUEnever evaluated
FALSEnever evaluated
)
0
274 ctx->state = ex_state;
never executed: ctx->state = ex_state;
0
275 else-
276 ctx->state = other_state;
never executed: ctx->state = other_state;
0
277 return
never executed: return 1;
1;
never executed: return 1;
0
278}-
279-
280static int-
281asn1_bio_read(BIO *b, char *in , int inl)-
282{-
283 if (!b->next_bio
!b->next_bioDescription
TRUEnever evaluated
FALSEnever evaluated
)
0
284 return
never executed: return 0;
0;
never executed: return 0;
0
285 return
never executed: return BIO_read(b->next_bio, in , inl);
BIO_read(b->next_bio, in , inl);
never executed: return BIO_read(b->next_bio, in , inl);
0
286}-
287-
288static int-
289asn1_bio_puts(BIO *b, const char *str)-
290{-
291 return
never executed: return asn1_bio_write(b, str, strlen(str));
asn1_bio_write(b, str, strlen(str));
never executed: return asn1_bio_write(b, str, strlen(str));
0
292}-
293-
294static int-
295asn1_bio_gets(BIO *b, char *str, int size)-
296{-
297 if (!b->next_bio
!b->next_bioDescription
TRUEnever evaluated
FALSEnever evaluated
)
0
298 return
never executed: return 0;
0;
never executed: return 0;
0
299 return
never executed: return BIO_gets(b->next_bio, str , size);
BIO_gets(b->next_bio, str , size);
never executed: return BIO_gets(b->next_bio, str , size);
0
300}-
301-
302static long-
303asn1_bio_callback_ctrl(BIO *b, int cmd, bio_info_cb *fp)-
304{-
305 if (b->next_bio ==
b->next_bio == ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
306 ((void *)0)
b->next_bio == ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
307 )-
308 return
never executed: return (0);
(0);
never executed: return (0);
0
309 return
never executed: return BIO_callback_ctrl(b->next_bio, cmd, fp);
BIO_callback_ctrl(b->next_bio, cmd, fp);
never executed: return BIO_callback_ctrl(b->next_bio, cmd, fp);
0
310}-
311-
312static long-
313asn1_bio_ctrl(BIO *b, int cmd, long arg1, void *arg2)-
314{-
315 BIO_ASN1_BUF_CTX *ctx;-
316 BIO_ASN1_EX_FUNCS *ex_func;-
317 long ret = 1;-
318-
319 ctx = (BIO_ASN1_BUF_CTX *) b->ptr;-
320 if (ctx ==
ctx == ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
321 ((void *)0)
ctx == ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
322 )-
323 return
never executed: return 0;
0;
never executed: return 0;
0
324 switch (cmd) {-
325-
326 case
never executed: case 149:
149:
never executed: case 149:
0
327 ex_func = arg2;-
328 ctx->prefix = ex_func->ex_func;-
329 ctx->prefix_free = ex_func->ex_free_func;-
330 break;
never executed: break;
0
331-
332 case
never executed: case 150:
150:
never executed: case 150:
0
333 ex_func = arg2;-
334 ex_func->ex_func = ctx->prefix;-
335 ex_func->ex_free_func = ctx->prefix_free;-
336 break;
never executed: break;
0
337-
338 case
never executed: case 151:
151:
never executed: case 151:
0
339 ex_func = arg2;-
340 ctx->suffix = ex_func->ex_func;-
341 ctx->suffix_free = ex_func->ex_free_func;-
342 break;
never executed: break;
0
343-
344 case
never executed: case 152:
152:
never executed: case 152:
0
345 ex_func = arg2;-
346 ex_func->ex_func = ctx->suffix;-
347 ex_func->ex_free_func = ctx->suffix_free;-
348 break;
never executed: break;
0
349-
350 case
never executed: case 153:
153:
never executed: case 153:
0
351 ctx->ex_arg = arg2;-
352 break;
never executed: break;
0
353-
354 case
never executed: case 154:
154:
never executed: case 154:
0
355 *(void **)arg2 = ctx->ex_arg;-
356 break;
never executed: break;
0
357-
358 case
never executed: case 11:
11:
never executed: case 11:
0
359 if (!b->next_bio
!b->next_bioDescription
TRUEnever evaluated
FALSEnever evaluated
)
0
360 return
never executed: return 0;
0;
never executed: return 0;
0
361-
362-
363 if (ctx->state == ASN1_STATE_HEADER
ctx->state == ...1_STATE_HEADERDescription
TRUEnever evaluated
FALSEnever evaluated
) {
0
364 if (!asn1_bio_setup_ex(b, ctx, ctx->suffix,
!asn1_bio_setu...N1_STATE_DONE)Description
TRUEnever evaluated
FALSEnever evaluated
0
365 ASN1_STATE_POST_COPY, ASN1_STATE_DONE)
!asn1_bio_setu...N1_STATE_DONE)Description
TRUEnever evaluated
FALSEnever evaluated
)
0
366 return
never executed: return 0;
0;
never executed: return 0;
0
367 }
never executed: end of block
0
368-
369 if (ctx->state == ASN1_STATE_POST_COPY
ctx->state == ...TATE_POST_COPYDescription
TRUEnever evaluated
FALSEnever evaluated
) {
0
370 ret = asn1_bio_flush_ex(b, ctx, ctx->suffix_free,-
371 ASN1_STATE_DONE);-
372 if (ret <= 0
ret <= 0Description
TRUEnever evaluated
FALSEnever evaluated
)
0
373 return
never executed: return ret;
ret;
never executed: return ret;
0
374 }
never executed: end of block
0
375-
376 if (ctx->state == ASN1_STATE_DONE
ctx->state == ASN1_STATE_DONEDescription
TRUEnever evaluated
FALSEnever evaluated
)
0
377 return
never executed: return BIO_ctrl(b->next_bio, cmd, arg1, arg2);
BIO_ctrl(b->next_bio, cmd, arg1, arg2);
never executed: return BIO_ctrl(b->next_bio, cmd, arg1, arg2);
0
378 else {-
379 BIO_clear_flags(b, ((0x01|0x02|0x04)|0x08));-
380 return
never executed: return 0;
0;
never executed: return 0;
0
381 }-
382 break;
dead code: break;
-
383-
384-
385 default
never executed: default:
:
never executed: default:
0
386 if (!b->next_bio
!b->next_bioDescription
TRUEnever evaluated
FALSEnever evaluated
)
0
387 return
never executed: return 0;
0;
never executed: return 0;
0
388 return
never executed: return BIO_ctrl(b->next_bio, cmd, arg1, arg2);
BIO_ctrl(b->next_bio, cmd, arg1, arg2);
never executed: return BIO_ctrl(b->next_bio, cmd, arg1, arg2);
0
389-
390 }-
391-
392 return
never executed: return ret;
ret;
never executed: return ret;
0
393}-
394-
395static int-
396asn1_bio_set_ex(BIO *b, int cmd, asn1_ps_func *ex_func, asn1_ps_func-
397 *ex_free_func)-
398{-
399 BIO_ASN1_EX_FUNCS extmp;-
400-
401 extmp.ex_func = ex_func;-
402 extmp.ex_free_func = ex_free_func;-
403 return
never executed: return BIO_ctrl(b, cmd, 0, &extmp);
BIO_ctrl(b, cmd, 0, &extmp);
never executed: return BIO_ctrl(b, cmd, 0, &extmp);
0
404}-
405-
406static int-
407asn1_bio_get_ex(BIO *b, int cmd, asn1_ps_func **ex_func,-
408 asn1_ps_func **ex_free_func)-
409{-
410 BIO_ASN1_EX_FUNCS extmp;-
411 int ret;-
412-
413 ret = BIO_ctrl(b, cmd, 0, &extmp);-
414 if (ret > 0
ret > 0Description
TRUEnever evaluated
FALSEnever evaluated
) {
0
415 *ex_func = extmp.ex_func;-
416 *ex_free_func = extmp.ex_free_func;-
417 }
never executed: end of block
0
418 return
never executed: return ret;
ret;
never executed: return ret;
0
419}-
420-
421int-
422BIO_asn1_set_prefix(BIO *b, asn1_ps_func *prefix, asn1_ps_func *prefix_free)-
423{-
424 return
never executed: return asn1_bio_set_ex(b, 149, prefix, prefix_free);
asn1_bio_set_ex(b, 149, prefix, prefix_free);
never executed: return asn1_bio_set_ex(b, 149, prefix, prefix_free);
0
425}-
426-
427int-
428BIO_asn1_get_prefix(BIO *b, asn1_ps_func **pprefix, asn1_ps_func **pprefix_free)-
429{-
430 return
never executed: return asn1_bio_get_ex(b, 150, pprefix, pprefix_free);
asn1_bio_get_ex(b, 150, pprefix, pprefix_free);
never executed: return asn1_bio_get_ex(b, 150, pprefix, pprefix_free);
0
431}-
432-
433int-
434BIO_asn1_set_suffix(BIO *b, asn1_ps_func *suffix, asn1_ps_func *suffix_free)-
435{-
436 return
never executed: return asn1_bio_set_ex(b, 151, suffix, suffix_free);
asn1_bio_set_ex(b, 151, suffix, suffix_free);
never executed: return asn1_bio_set_ex(b, 151, suffix, suffix_free);
0
437}-
438-
439int-
440BIO_asn1_get_suffix(BIO *b, asn1_ps_func **psuffix, asn1_ps_func **psuffix_free)-
441{-
442 return
never executed: return asn1_bio_get_ex(b, 152, psuffix, psuffix_free);
asn1_bio_get_ex(b, 152, psuffix, psuffix_free);
never executed: return asn1_bio_get_ex(b, 152, psuffix, psuffix_free);
0
443}-
Switch to Source codePreprocessed file

Generated by Squish Coco 4.2.2