Line | Source | Count |
1 | | - |
2 | | - |
3 | | - |
4 | | - |
5 | | - |
6 | | - |
7 | | - |
8 | | - |
9 | | - |
10 | | - |
11 | | - |
12 | | - |
13 | | - |
14 | | - |
15 | | - |
16 | | - |
17 | | - |
18 | | - |
19 | | - |
20 | | - |
21 | | - |
22 | | - |
23 | | - |
24 | | - |
25 | | - |
26 | | - |
27 | | - |
28 | | - |
29 | | - |
30 | | - |
31 | | - |
32 | | - |
33 | | - |
34 | | - |
35 | | - |
36 | | - |
37 | | - |
38 | | - |
39 | | - |
40 | | - |
41 | | - |
42 | | - |
43 | | - |
44 | | - |
45 | | - |
46 | | - |
47 | | - |
48 | | - |
49 | | - |
50 | | - |
51 | | - |
52 | | - |
53 | | - |
54 | | - |
55 | | - |
56 | | - |
57 | | - |
58 | | - |
59 | #include <stdio.h> | - |
60 | | - |
61 | #include <openssl/asn1.h> | - |
62 | #include <openssl/buffer.h> | - |
63 | #include <openssl/objects.h> | - |
64 | | - |
65 | static int asn1_print_info(BIO *bp, int tag, int xclass, int constructed, | - |
66 | int indent); | - |
67 | static int asn1_parse2(BIO *bp, const unsigned char **pp, long length, | - |
68 | int offset, int depth, int indent, int dump); | - |
69 | | - |
70 | static int | - |
71 | asn1_print_info(BIO *bp, int tag, int xclass, int constructed, | - |
72 | int indent) | - |
73 | { | - |
74 | char str[128]; | - |
75 | const char *p; | - |
76 | | - |
77 | if (constructed & V_ASN1_CONSTRUCTED)TRUE | never evaluated | FALSE | never evaluated |
| 0 |
78 | p="cons: "; never executed: p="cons: "; | 0 |
79 | else | - |
80 | p="prim: "; never executed: p="prim: "; | 0 |
81 | if (BIO_write(bp, p, 6) < 6)TRUE | never evaluated | FALSE | never evaluated |
| 0 |
82 | goto err; never executed: goto err; | 0 |
83 | BIO_indent(bp, indent, 128); | - |
84 | | - |
85 | p = str; | - |
86 | if ((xclass & V_ASN1_PRIVATE) == V_ASN1_PRIVATE)TRUE | never evaluated | FALSE | never evaluated |
| 0 |
87 | snprintf(str, sizeof str, "priv [ %d ] ", tag); never executed: snprintf(str, sizeof str, "priv [ %d ] ", tag); | 0 |
88 | else if ((xclass & V_ASN1_CONTEXT_SPECIFIC) == V_ASN1_CONTEXT_SPECIFIC)TRUE | never evaluated | FALSE | never evaluated |
| 0 |
89 | snprintf(str, sizeof str, "cont [ %d ]", tag); never executed: snprintf(str, sizeof str, "cont [ %d ]", tag); | 0 |
90 | else if ((xclass & V_ASN1_APPLICATION) == V_ASN1_APPLICATION)TRUE | never evaluated | FALSE | never evaluated |
| 0 |
91 | snprintf(str, sizeof str, "appl [ %d ]", tag); never executed: snprintf(str, sizeof str, "appl [ %d ]", tag); | 0 |
92 | else if (tag > 30)TRUE | never evaluated | FALSE | never evaluated |
| 0 |
93 | snprintf(str, sizeof str, "<ASN1 %d>", tag); never executed: snprintf(str, sizeof str, "<ASN1 %d>", tag); | 0 |
94 | else | - |
95 | p = ASN1_tag2str(tag); never executed: p = ASN1_tag2str(tag); | 0 |
96 | | - |
97 | if (BIO_printf(bp, "%-18s", p) <= 0)TRUE | never evaluated | FALSE | never evaluated |
| 0 |
98 | goto err; never executed: goto err; | 0 |
99 | return (1); never executed: return (1); | 0 |
100 | err: | - |
101 | return (0); never executed: return (0); | 0 |
102 | } | - |
103 | | - |
104 | int | - |
105 | ASN1_parse(BIO *bp, const unsigned char *pp, long len, int indent) | - |
106 | { | - |
107 | return (asn1_parse2(bp, &pp, len, 0, 0, indent, 0)); never executed: return (asn1_parse2(bp, &pp, len, 0, 0, indent, 0)); | 0 |
108 | } | - |
109 | | - |
110 | int | - |
111 | ASN1_parse_dump(BIO *bp, const unsigned char *pp, long len, int indent, int dump) | - |
112 | { | - |
113 | return (asn1_parse2(bp, &pp, len, 0, 0, indent, dump)); never executed: return (asn1_parse2(bp, &pp, len, 0, 0, indent, dump)); | 0 |
114 | } | - |
115 | | - |
116 | static int | - |
117 | asn1_parse2(BIO *bp, const unsigned char **pp, long length, int offset, | - |
118 | int depth, int indent, int dump) | - |
119 | { | - |
120 | const unsigned char *p, *ep, *tot, *op, *opp; | - |
121 | long len; | - |
122 | int tag, xclass, ret = 0; | - |
123 | int nl, hl, j, r; | - |
124 | ASN1_OBJECT *o = NULL; | - |
125 | ASN1_OCTET_STRING *os = NULL; | - |
126 | | - |
127 | int dump_indent; | - |
128 | | - |
129 | dump_indent = 6; | - |
130 | p = *pp; | - |
131 | tot = p + length; | - |
132 | op = p - 1; | - |
133 | while ((p < tot) && (op < p)) {TRUE | never evaluated | FALSE | never evaluated |
TRUE | never evaluated | FALSE | never evaluated |
| 0 |
134 | op = p; | - |
135 | j = ASN1_get_object(&p, &len, &tag, &xclass, length); | - |
136 | | - |
137 | if (j & 0x80) {TRUE | never evaluated | FALSE | never evaluated |
| 0 |
138 | if (BIO_write(bp, "Error in encoding\n", 18) <= 0)TRUE | never evaluated | FALSE | never evaluated |
| 0 |
139 | goto end; never executed: goto end; | 0 |
140 | ret = 0; | - |
141 | goto end; never executed: goto end; | 0 |
142 | } | - |
143 | hl = (p - op); | - |
144 | length -= hl; | - |
145 | | - |
146 | if (BIO_printf(bp, "%5ld:", (long)offset +TRUE | never evaluated | FALSE | never evaluated |
| 0 |
147 | (long)(op - *pp)) <= 0)TRUE | never evaluated | FALSE | never evaluated |
| 0 |
148 | goto end; never executed: goto end; | 0 |
149 | | - |
150 | if (j != (V_ASN1_CONSTRUCTED | 1)) {TRUE | never evaluated | FALSE | never evaluated |
| 0 |
151 | if (BIO_printf(bp, "d=%-2d hl=%ld l=%4ld ",TRUE | never evaluated | FALSE | never evaluated |
| 0 |
152 | depth, (long)hl, len) <= 0)TRUE | never evaluated | FALSE | never evaluated |
| 0 |
153 | goto end; never executed: goto end; | 0 |
154 | } else { never executed: end of block | 0 |
155 | if (BIO_printf(bp, "d=%-2d hl=%ld l=inf ",TRUE | never evaluated | FALSE | never evaluated |
| 0 |
156 | depth, (long)hl) <= 0)TRUE | never evaluated | FALSE | never evaluated |
| 0 |
157 | goto end; never executed: goto end; | 0 |
158 | } never executed: end of block | 0 |
159 | if (!asn1_print_info(bp, tag, xclass, j, (indent) ? depth : 0))TRUE | never evaluated | FALSE | never evaluated |
| 0 |
160 | goto end; never executed: goto end; | 0 |
161 | if (j & V_ASN1_CONSTRUCTED) {TRUE | never evaluated | FALSE | never evaluated |
| 0 |
162 | ep = p + len; | - |
163 | if (BIO_write(bp, "\n", 1) <= 0)TRUE | never evaluated | FALSE | never evaluated |
| 0 |
164 | goto end; never executed: goto end; | 0 |
165 | if (len > length) {TRUE | never evaluated | FALSE | never evaluated |
| 0 |
166 | BIO_printf(bp, "length is greater than %ld\n", | - |
167 | length); | - |
168 | ret = 0; | - |
169 | goto end; never executed: goto end; | 0 |
170 | } | - |
171 | if ((j == 0x21) && (len == 0)) {TRUE | never evaluated | FALSE | never evaluated |
TRUE | never evaluated | FALSE | never evaluated |
| 0 |
172 | for (;;) { | - |
173 | r = asn1_parse2(bp, &p, (long)(tot - p), | - |
174 | offset + (p - *pp), depth + 1, | - |
175 | indent, dump); | - |
176 | if (r == 0) {TRUE | never evaluated | FALSE | never evaluated |
| 0 |
177 | ret = 0; | - |
178 | goto end; never executed: goto end; | 0 |
179 | } | - |
180 | if ((r == 2) || (p >= tot))TRUE | never evaluated | FALSE | never evaluated |
TRUE | never evaluated | FALSE | never evaluated |
| 0 |
181 | break; never executed: break; | 0 |
182 | } never executed: end of block | 0 |
183 | } else never executed: end of block | 0 |
184 | while (p < ep) {TRUE | never evaluated | FALSE | never evaluated |
| 0 |
185 | r = asn1_parse2(bp, &p, (long)len, | - |
186 | offset + (p - *pp), depth + 1, | - |
187 | indent, dump); | - |
188 | if (r == 0) {TRUE | never evaluated | FALSE | never evaluated |
| 0 |
189 | ret = 0; | - |
190 | goto end; never executed: goto end; | 0 |
191 | } | - |
192 | } never executed: end of block | 0 |
193 | } else if (xclass != 0) { never executed: end of block TRUE | never evaluated | FALSE | never evaluated |
| 0 |
194 | p += len; | - |
195 | if (BIO_write(bp, "\n", 1) <= 0)TRUE | never evaluated | FALSE | never evaluated |
| 0 |
196 | goto end; never executed: goto end; | 0 |
197 | } else { never executed: end of block | 0 |
198 | nl = 0; | - |
199 | if ((tag == V_ASN1_PRINTABLESTRING) ||TRUE | never evaluated | FALSE | never evaluated |
| 0 |
200 | (tag == V_ASN1_T61STRING) ||TRUE | never evaluated | FALSE | never evaluated |
| 0 |
201 | (tag == V_ASN1_IA5STRING) ||TRUE | never evaluated | FALSE | never evaluated |
| 0 |
202 | (tag == V_ASN1_VISIBLESTRING) ||TRUE | never evaluated | FALSE | never evaluated |
| 0 |
203 | (tag == V_ASN1_NUMERICSTRING) ||TRUE | never evaluated | FALSE | never evaluated |
| 0 |
204 | (tag == V_ASN1_UTF8STRING) ||TRUE | never evaluated | FALSE | never evaluated |
| 0 |
205 | (tag == V_ASN1_UTCTIME) ||TRUE | never evaluated | FALSE | never evaluated |
| 0 |
206 | (tag == V_ASN1_GENERALIZEDTIME)) {TRUE | never evaluated | FALSE | never evaluated |
| 0 |
207 | if (BIO_write(bp, ":", 1) <= 0)TRUE | never evaluated | FALSE | never evaluated |
| 0 |
208 | goto end; never executed: goto end; | 0 |
209 | if ((len > 0) &&TRUE | never evaluated | FALSE | never evaluated |
| 0 |
210 | BIO_write(bp, (const char *)p, (int)len) !=TRUE | never evaluated | FALSE | never evaluated |
| 0 |
211 | (int)len)TRUE | never evaluated | FALSE | never evaluated |
| 0 |
212 | goto end; never executed: goto end; | 0 |
213 | } else if (tag == V_ASN1_OBJECT) { never executed: end of block TRUE | never evaluated | FALSE | never evaluated |
| 0 |
214 | opp = op; | - |
215 | if (d2i_ASN1_OBJECT(&o, &opp, len + hl) !=TRUE | never evaluated | FALSE | never evaluated |
| 0 |
216 | NULL) {TRUE | never evaluated | FALSE | never evaluated |
| 0 |
217 | if (BIO_write(bp, ":", 1) <= 0)TRUE | never evaluated | FALSE | never evaluated |
| 0 |
218 | goto end; never executed: goto end; | 0 |
219 | i2a_ASN1_OBJECT(bp, o); | - |
220 | } else { never executed: end of block | 0 |
221 | if (BIO_write(bp, ":BAD OBJECT",TRUE | never evaluated | FALSE | never evaluated |
| 0 |
222 | 11) <= 0)TRUE | never evaluated | FALSE | never evaluated |
| 0 |
223 | goto end; never executed: goto end; | 0 |
224 | } never executed: end of block | 0 |
225 | } else if (tag == V_ASN1_BOOLEAN) {TRUE | never evaluated | FALSE | never evaluated |
| 0 |
226 | int ii; | - |
227 | | - |
228 | opp = op; | - |
229 | ii = d2i_ASN1_BOOLEAN(NULL, &opp, len + hl); | - |
230 | if (ii < 0) {TRUE | never evaluated | FALSE | never evaluated |
| 0 |
231 | if (BIO_write(bp, "Bad boolean\n",TRUE | never evaluated | FALSE | never evaluated |
| 0 |
232 | 12) <= 0)TRUE | never evaluated | FALSE | never evaluated |
| 0 |
233 | goto end; never executed: goto end; | 0 |
234 | } never executed: end of block | 0 |
235 | BIO_printf(bp, ":%d", ii); | - |
236 | } else if (tag == V_ASN1_BMPSTRING) { never executed: end of block TRUE | never evaluated | FALSE | never evaluated |
| 0 |
237 | | - |
238 | } else if (tag == V_ASN1_OCTET_STRING) { never executed: end of block TRUE | never evaluated | FALSE | never evaluated |
| 0 |
239 | int i, printable = 1; | - |
240 | | - |
241 | opp = op; | - |
242 | os = d2i_ASN1_OCTET_STRING(NULL, &opp, len + hl); | - |
243 | if (os != NULL && os->length > 0) {TRUE | never evaluated | FALSE | never evaluated |
TRUE | never evaluated | FALSE | never evaluated |
| 0 |
244 | opp = os->data; | - |
245 | | - |
246 | | - |
247 | for (i = 0; i < os->length; i++) {TRUE | never evaluated | FALSE | never evaluated |
| 0 |
248 | if (((opp[i] < ' ') &&TRUE | never evaluated | FALSE | never evaluated |
| 0 |
249 | (opp[i] != '\n') &&TRUE | never evaluated | FALSE | never evaluated |
| 0 |
250 | (opp[i] != '\r') &&TRUE | never evaluated | FALSE | never evaluated |
| 0 |
251 | (opp[i] != '\t')) ||TRUE | never evaluated | FALSE | never evaluated |
| 0 |
252 | (opp[i] > '~')) {TRUE | never evaluated | FALSE | never evaluated |
| 0 |
253 | printable = 0; | - |
254 | break; never executed: break; | 0 |
255 | } | - |
256 | } never executed: end of block | 0 |
257 | if (printable) {TRUE | never evaluated | FALSE | never evaluated |
| 0 |
258 | | - |
259 | if (BIO_write(bp, ":", 1) <= 0)TRUE | never evaluated | FALSE | never evaluated |
| 0 |
260 | goto end; never executed: goto end; | 0 |
261 | if (BIO_write(bp, (const char *)opp,TRUE | never evaluated | FALSE | never evaluated |
| 0 |
262 | os->length) <= 0)TRUE | never evaluated | FALSE | never evaluated |
| 0 |
263 | goto end; never executed: goto end; | 0 |
264 | } else if (!dump) { never executed: end of block TRUE | never evaluated | FALSE | never evaluated |
| 0 |
265 | | - |
266 | | - |
267 | if (BIO_write(bp, "[HEX DUMP]:", 11) <= 0)TRUE | never evaluated | FALSE | never evaluated |
| 0 |
268 | goto end; never executed: goto end; | 0 |
269 | for (i = 0; i < os->length; i++) {TRUE | never evaluated | FALSE | never evaluated |
| 0 |
270 | if (BIO_printf(bp,TRUE | never evaluated | FALSE | never evaluated |
| 0 |
271 | "%02X", opp[i]) <= 0)TRUE | never evaluated | FALSE | never evaluated |
| 0 |
272 | goto end; never executed: goto end; | 0 |
273 | } never executed: end of block | 0 |
274 | } else { never executed: end of block | 0 |
275 | | - |
276 | if (!nl) {TRUE | never evaluated | FALSE | never evaluated |
| 0 |
277 | if (BIO_write(bp, "\n", 1) <= 0)TRUE | never evaluated | FALSE | never evaluated |
| 0 |
278 | goto end; never executed: goto end; | 0 |
279 | } never executed: end of block | 0 |
280 | if (BIO_dump_indent(bp,TRUE | never evaluated | FALSE | never evaluated |
| 0 |
281 | (const char *)opp,TRUE | never evaluated | FALSE | never evaluated |
| 0 |
282 | ((dump == -1 || dump >TRUE | never evaluated | FALSE | never evaluated |
| 0 |
283 | os->length) ? os->length : dump),TRUE | never evaluated | FALSE | never evaluated |
| 0 |
284 | dump_indent) <= 0)TRUE | never evaluated | FALSE | never evaluated |
| 0 |
285 | goto end; never executed: goto end; | 0 |
286 | nl = 1; | - |
287 | } never executed: end of block | 0 |
288 | } | - |
289 | ASN1_OCTET_STRING_free(os); | - |
290 | os = NULL; | - |
291 | } else if (tag == V_ASN1_INTEGER) { never executed: end of block TRUE | never evaluated | FALSE | never evaluated |
| 0 |
292 | ASN1_INTEGER *bs; | - |
293 | int i; | - |
294 | | - |
295 | opp = op; | - |
296 | bs = d2i_ASN1_INTEGER(NULL, &opp, len + hl); | - |
297 | if (bs != NULL) {TRUE | never evaluated | FALSE | never evaluated |
| 0 |
298 | if (BIO_write(bp, ":", 1) <= 0)TRUE | never evaluated | FALSE | never evaluated |
| 0 |
299 | goto end; never executed: goto end; | 0 |
300 | if (bs->type == V_ASN1_NEG_INTEGER)TRUE | never evaluated | FALSE | never evaluated |
| 0 |
301 | if (BIO_write(bp, "-", 1) <= 0)TRUE | never evaluated | FALSE | never evaluated |
| 0 |
302 | goto end; never executed: goto end; | 0 |
303 | for (i = 0; i < bs->length; i++) {TRUE | never evaluated | FALSE | never evaluated |
| 0 |
304 | if (BIO_printf(bp, "%02X",TRUE | never evaluated | FALSE | never evaluated |
| 0 |
305 | bs->data[i]) <= 0)TRUE | never evaluated | FALSE | never evaluated |
| 0 |
306 | goto end; never executed: goto end; | 0 |
307 | } never executed: end of block | 0 |
308 | if (bs->length == 0) {TRUE | never evaluated | FALSE | never evaluated |
| 0 |
309 | if (BIO_write(bp, "00", 2) <= 0)TRUE | never evaluated | FALSE | never evaluated |
| 0 |
310 | goto end; never executed: goto end; | 0 |
311 | } never executed: end of block | 0 |
312 | } else { never executed: end of block | 0 |
313 | if (BIO_write(bp, "BAD INTEGER", 11) <= 0)TRUE | never evaluated | FALSE | never evaluated |
| 0 |
314 | goto end; never executed: goto end; | 0 |
315 | } never executed: end of block | 0 |
316 | ASN1_INTEGER_free(bs); | - |
317 | } else if (tag == V_ASN1_ENUMERATED) { never executed: end of block TRUE | never evaluated | FALSE | never evaluated |
| 0 |
318 | ASN1_ENUMERATED *bs; | - |
319 | int i; | - |
320 | | - |
321 | opp = op; | - |
322 | bs = d2i_ASN1_ENUMERATED(NULL, &opp, len + hl); | - |
323 | if (bs != NULL) {TRUE | never evaluated | FALSE | never evaluated |
| 0 |
324 | if (BIO_write(bp, ":", 1) <= 0)TRUE | never evaluated | FALSE | never evaluated |
| 0 |
325 | goto end; never executed: goto end; | 0 |
326 | if (bs->type == V_ASN1_NEG_ENUMERATED)TRUE | never evaluated | FALSE | never evaluated |
| 0 |
327 | if (BIO_write(bp, "-", 1) <= 0)TRUE | never evaluated | FALSE | never evaluated |
| 0 |
328 | goto end; never executed: goto end; | 0 |
329 | for (i = 0; i < bs->length; i++) {TRUE | never evaluated | FALSE | never evaluated |
| 0 |
330 | if (BIO_printf(bp, "%02X",TRUE | never evaluated | FALSE | never evaluated |
| 0 |
331 | bs->data[i]) <= 0)TRUE | never evaluated | FALSE | never evaluated |
| 0 |
332 | goto end; never executed: goto end; | 0 |
333 | } never executed: end of block | 0 |
334 | if (bs->length == 0) {TRUE | never evaluated | FALSE | never evaluated |
| 0 |
335 | if (BIO_write(bp, "00", 2) <= 0)TRUE | never evaluated | FALSE | never evaluated |
| 0 |
336 | goto end; never executed: goto end; | 0 |
337 | } never executed: end of block | 0 |
338 | } else { never executed: end of block | 0 |
339 | if (BIO_write(bp, "BAD ENUMERATED", 14) <= 0)TRUE | never evaluated | FALSE | never evaluated |
| 0 |
340 | goto end; never executed: goto end; | 0 |
341 | } never executed: end of block | 0 |
342 | ASN1_ENUMERATED_free(bs); | - |
343 | } else if (len > 0 && dump) { never executed: end of block TRUE | never evaluated | FALSE | never evaluated |
TRUE | never evaluated | FALSE | never evaluated |
| 0 |
344 | if (!nl) {TRUE | never evaluated | FALSE | never evaluated |
| 0 |
345 | if (BIO_write(bp, "\n", 1) <= 0)TRUE | never evaluated | FALSE | never evaluated |
| 0 |
346 | goto end; never executed: goto end; | 0 |
347 | } never executed: end of block | 0 |
348 | if (BIO_dump_indent(bp, (const char *)p,TRUE | never evaluated | FALSE | never evaluated |
| 0 |
349 | ((dump == -1 || dump > len) ? len : dump),TRUE | never evaluated | FALSE | never evaluated |
| 0 |
350 | dump_indent) <= 0)TRUE | never evaluated | FALSE | never evaluated |
| 0 |
351 | goto end; never executed: goto end; | 0 |
352 | nl = 1; | - |
353 | } never executed: end of block | 0 |
354 | | - |
355 | if (!nl) {TRUE | never evaluated | FALSE | never evaluated |
| 0 |
356 | if (BIO_write(bp, "\n", 1) <= 0)TRUE | never evaluated | FALSE | never evaluated |
| 0 |
357 | goto end; never executed: goto end; | 0 |
358 | } never executed: end of block | 0 |
359 | p += len; | - |
360 | if ((tag == V_ASN1_EOC) && (xclass == 0)) {TRUE | never evaluated | FALSE | never evaluated |
TRUE | never evaluated | FALSE | never evaluated |
| 0 |
361 | ret = 2; | - |
362 | goto end; never executed: goto end; | 0 |
363 | } | - |
364 | } never executed: end of block | 0 |
365 | length -= len; | - |
366 | } never executed: end of block | 0 |
367 | ret = 1; | - |
368 | | - |
369 | end: code before this statement never executed: end: | 0 |
370 | if (o != NULL)TRUE | never evaluated | FALSE | never evaluated |
| 0 |
371 | ASN1_OBJECT_free(o); never executed: ASN1_OBJECT_free(o); | 0 |
372 | ASN1_OCTET_STRING_free(os); | - |
373 | *pp = p; | - |
374 | return (ret); never executed: return (ret); | 0 |
375 | } | - |
376 | | - |
377 | const char * | - |
378 | ASN1_tag2str(int tag) | - |
379 | { | - |
380 | static const char * const tag2str[] = { | - |
381 | "EOC", "BOOLEAN", "INTEGER", "BIT STRING", "OCTET STRING", | - |
382 | "NULL", "OBJECT", "OBJECT DESCRIPTOR", "EXTERNAL", "REAL", | - |
383 | "ENUMERATED", "<ASN1 11>", "UTF8STRING", "<ASN1 13>", | - |
384 | "<ASN1 14>", "<ASN1 15>", "SEQUENCE", "SET", | - |
385 | "NUMERICSTRING", "PRINTABLESTRING", "T61STRING", | - |
386 | "VIDEOTEXSTRING", "IA5STRING", "UTCTIME", "GENERALIZEDTIME", | - |
387 | "GRAPHICSTRING", "VISIBLESTRING", "GENERALSTRING", | - |
388 | "UNIVERSALSTRING", "<ASN1 29>", "BMPSTRING" | - |
389 | }; | - |
390 | | - |
391 | if ((tag == V_ASN1_NEG_INTEGER) || (tag == V_ASN1_NEG_ENUMERATED))TRUE | never evaluated | FALSE | never evaluated |
TRUE | never evaluated | FALSE | never evaluated |
| 0 |
392 | tag &= ~0x100; never executed: tag &= ~0x100; | 0 |
393 | | - |
394 | if (tag < 0 || tag > 30)TRUE | never evaluated | FALSE | never evaluated |
TRUE | never evaluated | FALSE | never evaluated |
| 0 |
395 | return "(unknown)"; never executed: return "(unknown)"; | 0 |
396 | return tag2str[tag]; never executed: return tag2str[tag]; | 0 |
397 | } | - |
| | |