Absolute File Name: | /home/opencoverage/opencoverage/guest-scripts/openssl/src/crypto/asn1/a_strex.c |
Source code | Switch to Preprocessed file |
Line | Source | Count | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
1 | /* | - | ||||||||||||
2 | * Copyright 2000-2018 The OpenSSL Project Authors. All Rights Reserved. | - | ||||||||||||
3 | * | - | ||||||||||||
4 | * Licensed under the OpenSSL license (the "License"). You may not use | - | ||||||||||||
5 | * this file except in compliance with the License. You can obtain a copy | - | ||||||||||||
6 | * in the file LICENSE in the source distribution or at | - | ||||||||||||
7 | * https://www.openssl.org/source/license.html | - | ||||||||||||
8 | */ | - | ||||||||||||
9 | - | |||||||||||||
10 | #include <stdio.h> | - | ||||||||||||
11 | #include <string.h> | - | ||||||||||||
12 | #include "internal/cryptlib.h" | - | ||||||||||||
13 | #include "internal/asn1_int.h" | - | ||||||||||||
14 | #include <openssl/crypto.h> | - | ||||||||||||
15 | #include <openssl/x509.h> | - | ||||||||||||
16 | #include <openssl/asn1.h> | - | ||||||||||||
17 | - | |||||||||||||
18 | #include "charmap.h" | - | ||||||||||||
19 | - | |||||||||||||
20 | /* | - | ||||||||||||
21 | * ASN1_STRING_print_ex() and X509_NAME_print_ex(). Enhanced string and name | - | ||||||||||||
22 | * printing routines handling multibyte characters, RFC2253 and a host of | - | ||||||||||||
23 | * other options. | - | ||||||||||||
24 | */ | - | ||||||||||||
25 | - | |||||||||||||
26 | #define CHARTYPE_BS_ESC (ASN1_STRFLGS_ESC_2253 | CHARTYPE_FIRST_ESC_2253 | CHARTYPE_LAST_ESC_2253) | - | ||||||||||||
27 | - | |||||||||||||
28 | #define ESC_FLAGS (ASN1_STRFLGS_ESC_2253 | \ | - | ||||||||||||
29 | ASN1_STRFLGS_ESC_2254 | \ | - | ||||||||||||
30 | ASN1_STRFLGS_ESC_QUOTE | \ | - | ||||||||||||
31 | ASN1_STRFLGS_ESC_CTRL | \ | - | ||||||||||||
32 | ASN1_STRFLGS_ESC_MSB) | - | ||||||||||||
33 | - | |||||||||||||
34 | /* | - | ||||||||||||
35 | * Three IO functions for sending data to memory, a BIO and and a FILE | - | ||||||||||||
36 | * pointer. | - | ||||||||||||
37 | */ | - | ||||||||||||
38 | static int send_bio_chars(void *arg, const void *buf, int len) | - | ||||||||||||
39 | { | - | ||||||||||||
40 | if (!arg)
| 139865-235228 | ||||||||||||
41 | return 1; executed 139865 times by 1 test: return 1; Executed by:
| 139865 | ||||||||||||
42 | if (BIO_write(arg, buf, len) != len)
| 0-235228 | ||||||||||||
43 | return 0; never executed: return 0; | 0 | ||||||||||||
44 | return 1; executed 235228 times by 1 test: return 1; Executed by:
| 235228 | ||||||||||||
45 | } | - | ||||||||||||
46 | - | |||||||||||||
47 | #ifndef OPENSSL_NO_STDIO | - | ||||||||||||
48 | static int send_fp_chars(void *arg, const void *buf, int len) | - | ||||||||||||
49 | { | - | ||||||||||||
50 | if (!arg)
| 0 | ||||||||||||
51 | return 1; never executed: return 1; | 0 | ||||||||||||
52 | if (fwrite(buf, 1, len, arg) != (unsigned int)len)
| 0 | ||||||||||||
53 | return 0; never executed: return 0; | 0 | ||||||||||||
54 | return 1; never executed: return 1; | 0 | ||||||||||||
55 | } | - | ||||||||||||
56 | #endif | - | ||||||||||||
57 | - | |||||||||||||
58 | typedef int char_io (void *arg, const void *buf, int len); | - | ||||||||||||
59 | - | |||||||||||||
60 | /* | - | ||||||||||||
61 | * This function handles display of strings, one character at a time. It is | - | ||||||||||||
62 | * passed an unsigned long for each character because it could come from 2 or | - | ||||||||||||
63 | * even 4 byte forms. | - | ||||||||||||
64 | */ | - | ||||||||||||
65 | - | |||||||||||||
66 | static int do_esc_char(unsigned long c, unsigned short flags, char *do_quotes, | - | ||||||||||||
67 | char_io *io_ch, void *arg) | - | ||||||||||||
68 | { | - | ||||||||||||
69 | unsigned short chflgs; | - | ||||||||||||
70 | unsigned char chtmp; | - | ||||||||||||
71 | char tmphex[HEX_SIZE(long) + 3]; | - | ||||||||||||
72 | - | |||||||||||||
73 | if (c > 0xffffffffL)
| 0-274774 | ||||||||||||
74 | return -1; never executed: return -1; | 0 | ||||||||||||
75 | if (c > 0xffff) {
| 209-274565 | ||||||||||||
76 | BIO_snprintf(tmphex, sizeof(tmphex), "\\W%08lX", c); | - | ||||||||||||
77 | if (!io_ch(arg, tmphex, 10))
| 0-209 | ||||||||||||
78 | return -1; never executed: return -1; | 0 | ||||||||||||
79 | return 10; executed 209 times by 1 test: return 10; Executed by:
| 209 | ||||||||||||
80 | } | - | ||||||||||||
81 | if (c > 0xff) {
| 500-274065 | ||||||||||||
82 | BIO_snprintf(tmphex, sizeof(tmphex), "\\U%04lX", c); | - | ||||||||||||
83 | if (!io_ch(arg, tmphex, 6))
| 0-500 | ||||||||||||
84 | return -1; never executed: return -1; | 0 | ||||||||||||
85 | return 6; executed 500 times by 1 test: return 6; Executed by:
| 500 | ||||||||||||
86 | } | - | ||||||||||||
87 | chtmp = (unsigned char)c; | - | ||||||||||||
88 | if (chtmp > 0x7f)
| 122020-152045 | ||||||||||||
89 | chflgs = flags & ASN1_STRFLGS_ESC_MSB; executed 122020 times by 1 test: chflgs = flags & 4; Executed by:
| 122020 | ||||||||||||
90 | else | - | ||||||||||||
91 | chflgs = char_type[chtmp] & flags; executed 152045 times by 1 test: chflgs = char_type[chtmp] & flags; Executed by:
| 152045 | ||||||||||||
92 | if (chflgs & CHARTYPE_BS_ESC) {
| 2120-271945 | ||||||||||||
93 | /* If we don't escape with quotes, signal we need quotes */ | - | ||||||||||||
94 | if (chflgs & ASN1_STRFLGS_ESC_QUOTE) {
| 592-1528 | ||||||||||||
95 | if (do_quotes)
| 764 | ||||||||||||
96 | *do_quotes = 1; executed 764 times by 1 test: *do_quotes = 1; Executed by:
| 764 | ||||||||||||
97 | if (!io_ch(arg, &chtmp, 1))
| 0-1528 | ||||||||||||
98 | return -1; never executed: return -1; | 0 | ||||||||||||
99 | return 1; executed 1528 times by 1 test: return 1; Executed by:
| 1528 | ||||||||||||
100 | } | - | ||||||||||||
101 | if (!io_ch(arg, "\\", 1))
| 0-592 | ||||||||||||
102 | return -1; never executed: return -1; | 0 | ||||||||||||
103 | if (!io_ch(arg, &chtmp, 1))
| 0-592 | ||||||||||||
104 | return -1; never executed: return -1; | 0 | ||||||||||||
105 | return 2; executed 592 times by 1 test: return 2; Executed by:
| 592 | ||||||||||||
106 | } | - | ||||||||||||
107 | if (chflgs & (ASN1_STRFLGS_ESC_CTRL
| 124188-147757 | ||||||||||||
108 | | ASN1_STRFLGS_ESC_MSB
| 124188-147757 | ||||||||||||
109 | | ASN1_STRFLGS_ESC_2254)) {
| 124188-147757 | ||||||||||||
110 | BIO_snprintf(tmphex, 11, "\\%02X", chtmp); | - | ||||||||||||
111 | if (!io_ch(arg, tmphex, 3))
| 0-124188 | ||||||||||||
112 | return -1; never executed: return -1; | 0 | ||||||||||||
113 | return 3; executed 124188 times by 1 test: return 3; Executed by:
| 124188 | ||||||||||||
114 | } | - | ||||||||||||
115 | /* | - | ||||||||||||
116 | * If we get this far and do any escaping at all must escape the escape | - | ||||||||||||
117 | * character itself: backslash. | - | ||||||||||||
118 | */ | - | ||||||||||||
119 | if (chtmp == '\\' && (flags & ESC_FLAGS)) {
| 0-147501 | ||||||||||||
120 | if (!io_ch(arg, "\\\\", 2))
| 0 | ||||||||||||
121 | return -1; never executed: return -1; | 0 | ||||||||||||
122 | return 2; never executed: return 2; | 0 | ||||||||||||
123 | } | - | ||||||||||||
124 | if (!io_ch(arg, &chtmp, 1))
| 0-147757 | ||||||||||||
125 | return -1; never executed: return -1; | 0 | ||||||||||||
126 | return 1; executed 147757 times by 1 test: return 1; Executed by:
| 147757 | ||||||||||||
127 | } | - | ||||||||||||
128 | - | |||||||||||||
129 | #define BUF_TYPE_WIDTH_MASK 0x7 | - | ||||||||||||
130 | #define BUF_TYPE_CONVUTF8 0x8 | - | ||||||||||||
131 | - | |||||||||||||
132 | /* | - | ||||||||||||
133 | * This function sends each character in a buffer to do_esc_char(). It | - | ||||||||||||
134 | * interprets the content formats and converts to or from UTF8 as | - | ||||||||||||
135 | * appropriate. | - | ||||||||||||
136 | */ | - | ||||||||||||
137 | - | |||||||||||||
138 | static int do_buf(unsigned char *buf, int buflen, | - | ||||||||||||
139 | int type, unsigned short flags, char *quotes, char_io *io_ch, | - | ||||||||||||
140 | void *arg) | - | ||||||||||||
141 | { | - | ||||||||||||
142 | int i, outlen, len, charwidth; | - | ||||||||||||
143 | unsigned short orflags; | - | ||||||||||||
144 | unsigned char *p, *q; | - | ||||||||||||
145 | unsigned long c; | - | ||||||||||||
146 | - | |||||||||||||
147 | p = buf; | - | ||||||||||||
148 | q = buf + buflen; | - | ||||||||||||
149 | outlen = 0; | - | ||||||||||||
150 | charwidth = type & BUF_TYPE_WIDTH_MASK; | - | ||||||||||||
151 | - | |||||||||||||
152 | switch (charwidth) { | - | ||||||||||||
153 | case 4: executed 3476 times by 1 test: case 4: Executed by:
| 3476 | ||||||||||||
154 | if (buflen & 3) {
| 0-3476 | ||||||||||||
155 | ASN1err(ASN1_F_DO_BUF, ASN1_R_INVALID_UNIVERSALSTRING_LENGTH); | - | ||||||||||||
156 | return -1; never executed: return -1; | 0 | ||||||||||||
157 | } | - | ||||||||||||
158 | break; executed 3476 times by 1 test: break; Executed by:
| 3476 | ||||||||||||
159 | case 2: executed 6574 times by 1 test: case 2: Executed by:
| 6574 | ||||||||||||
160 | if (buflen & 1) {
| 0-6574 | ||||||||||||
161 | ASN1err(ASN1_F_DO_BUF, ASN1_R_INVALID_BMPSTRING_LENGTH); | - | ||||||||||||
162 | return -1; never executed: return -1; | 0 | ||||||||||||
163 | } | - | ||||||||||||
164 | break; executed 6574 times by 1 test: break; Executed by:
| 6574 | ||||||||||||
165 | default: executed 19623 times by 1 test: default: Executed by:
| 19623 | ||||||||||||
166 | break; executed 19623 times by 1 test: break; Executed by:
| 19623 | ||||||||||||
167 | } | - | ||||||||||||
168 | - | |||||||||||||
169 | while (p != q) {
| 24336-199023 | ||||||||||||
170 | if (p == buf && flags & ASN1_STRFLGS_ESC_2253)
| 6285-176464 | ||||||||||||
171 | orflags = CHARTYPE_FIRST_ESC_2253; executed 16274 times by 1 test: orflags = 0x20; Executed by:
| 16274 | ||||||||||||
172 | else | - | ||||||||||||
173 | orflags = 0; executed 182749 times by 1 test: orflags = 0; Executed by:
| 182749 | ||||||||||||
174 | - | |||||||||||||
175 | switch (charwidth) { | - | ||||||||||||
176 | case 4: executed 1186 times by 1 test: case 4: Executed by:
| 1186 | ||||||||||||
177 | c = ((unsigned long)*p++) << 24; | - | ||||||||||||
178 | c |= ((unsigned long)*p++) << 16; | - | ||||||||||||
179 | c |= ((unsigned long)*p++) << 8; | - | ||||||||||||
180 | c |= *p++; | - | ||||||||||||
181 | break; executed 1186 times by 1 test: break; Executed by:
| 1186 | ||||||||||||
182 | - | |||||||||||||
183 | case 2: executed 38246 times by 1 test: case 2: Executed by:
| 38246 | ||||||||||||
184 | c = ((unsigned long)*p++) << 8; | - | ||||||||||||
185 | c |= *p++; | - | ||||||||||||
186 | break; executed 38246 times by 1 test: break; Executed by:
| 38246 | ||||||||||||
187 | - | |||||||||||||
188 | case 1: executed 147420 times by 1 test: case 1: Executed by:
| 147420 | ||||||||||||
189 | c = *p++; | - | ||||||||||||
190 | break; executed 147420 times by 1 test: break; Executed by:
| 147420 | ||||||||||||
191 | - | |||||||||||||
192 | case 0: executed 12171 times by 1 test: case 0: Executed by:
| 12171 | ||||||||||||
193 | i = UTF8_getc(p, buflen, &c); | - | ||||||||||||
194 | if (i < 0)
| 5337-6834 | ||||||||||||
195 | return -1; /* Invalid UTF8String */ executed 5337 times by 1 test: return -1; Executed by:
| 5337 | ||||||||||||
196 | buflen -= i; | - | ||||||||||||
197 | p += i; | - | ||||||||||||
198 | break; executed 6834 times by 1 test: break; Executed by:
| 6834 | ||||||||||||
199 | default: never executed: default: | 0 | ||||||||||||
200 | return -1; /* invalid width */ never executed: return -1; | 0 | ||||||||||||
201 | } | - | ||||||||||||
202 | if (p == q && flags & ASN1_STRFLGS_ESC_2253)
| 948-176464 | ||||||||||||
203 | orflags = CHARTYPE_LAST_ESC_2253; executed 16274 times by 1 test: orflags = 0x40; Executed by:
| 16274 | ||||||||||||
204 | if (type & BUF_TYPE_CONVUTF8) {
| 80090-113596 | ||||||||||||
205 | unsigned char utfbuf[6]; | - | ||||||||||||
206 | int utflen; | - | ||||||||||||
207 | utflen = UTF8_putc(utfbuf, sizeof(utfbuf), c); | - | ||||||||||||
208 | for (i = 0; i < utflen; i++) {
| 80090-161178 | ||||||||||||
209 | /* | - | ||||||||||||
210 | * We don't need to worry about setting orflags correctly | - | ||||||||||||
211 | * because if utflen==1 its value will be correct anyway | - | ||||||||||||
212 | * otherwise each character will be > 0x7f and so the | - | ||||||||||||
213 | * character will never be escaped on first and last. | - | ||||||||||||
214 | */ | - | ||||||||||||
215 | len = do_esc_char(utfbuf[i], flags | orflags, quotes, | - | ||||||||||||
216 | io_ch, arg); | - | ||||||||||||
217 | if (len < 0)
| 0-161178 | ||||||||||||
218 | return -1; never executed: return -1; | 0 | ||||||||||||
219 | outlen += len; | - | ||||||||||||
220 | } executed 161178 times by 1 test: end of block Executed by:
| 161178 | ||||||||||||
221 | } else { executed 80090 times by 1 test: end of block Executed by:
| 80090 | ||||||||||||
222 | len = do_esc_char(c, flags | orflags, quotes, | - | ||||||||||||
223 | io_ch, arg); | - | ||||||||||||
224 | if (len < 0)
| 0-113596 | ||||||||||||
225 | return -1; never executed: return -1; | 0 | ||||||||||||
226 | outlen += len; | - | ||||||||||||
227 | } executed 113596 times by 1 test: end of block Executed by:
| 113596 | ||||||||||||
228 | } | - | ||||||||||||
229 | return outlen; executed 24336 times by 1 test: return outlen; Executed by:
| 24336 | ||||||||||||
230 | } | - | ||||||||||||
231 | - | |||||||||||||
232 | /* This function hex dumps a buffer of characters */ | - | ||||||||||||
233 | - | |||||||||||||
234 | static int do_hex_dump(char_io *io_ch, void *arg, unsigned char *buf, | - | ||||||||||||
235 | int buflen) | - | ||||||||||||
236 | { | - | ||||||||||||
237 | static const char hexdig[] = "0123456789ABCDEF"; | - | ||||||||||||
238 | unsigned char *p, *q; | - | ||||||||||||
239 | char hextmp[2]; | - | ||||||||||||
240 | if (arg) {
| 0-6930 | ||||||||||||
241 | p = buf; | - | ||||||||||||
242 | q = buf + buflen; | - | ||||||||||||
243 | while (p != q) {
| 6930-44616 | ||||||||||||
244 | hextmp[0] = hexdig[*p >> 4]; | - | ||||||||||||
245 | hextmp[1] = hexdig[*p & 0xf]; | - | ||||||||||||
246 | if (!io_ch(arg, hextmp, 2))
| 0-44616 | ||||||||||||
247 | return -1; never executed: return -1; | 0 | ||||||||||||
248 | p++; | - | ||||||||||||
249 | } executed 44616 times by 1 test: end of block Executed by:
| 44616 | ||||||||||||
250 | } executed 6930 times by 1 test: end of block Executed by:
| 6930 | ||||||||||||
251 | return buflen << 1; executed 6930 times by 1 test: return buflen << 1; Executed by:
| 6930 | ||||||||||||
252 | } | - | ||||||||||||
253 | - | |||||||||||||
254 | /* | - | ||||||||||||
255 | * "dump" a string. This is done when the type is unknown, or the flags | - | ||||||||||||
256 | * request it. We can either dump the content octets or the entire DER | - | ||||||||||||
257 | * encoding. This uses the RFC2253 #01234 format. | - | ||||||||||||
258 | */ | - | ||||||||||||
259 | - | |||||||||||||
260 | static int do_dump(unsigned long lflags, char_io *io_ch, void *arg, | - | ||||||||||||
261 | const ASN1_STRING *str) | - | ||||||||||||
262 | { | - | ||||||||||||
263 | /* | - | ||||||||||||
264 | * Placing the ASN1_STRING in a temp ASN1_TYPE allows the DER encoding to | - | ||||||||||||
265 | * readily obtained | - | ||||||||||||
266 | */ | - | ||||||||||||
267 | ASN1_TYPE t; | - | ||||||||||||
268 | unsigned char *der_buf, *p; | - | ||||||||||||
269 | int outlen, der_len; | - | ||||||||||||
270 | - | |||||||||||||
271 | if (!io_ch(arg, "#", 1))
| 0-6930 | ||||||||||||
272 | return -1; never executed: return -1; | 0 | ||||||||||||
273 | /* If we don't dump DER encoding just dump content octets */ | - | ||||||||||||
274 | if (!(lflags & ASN1_STRFLGS_DUMP_DER)) {
| 3014-3916 | ||||||||||||
275 | outlen = do_hex_dump(io_ch, arg, str->data, str->length); | - | ||||||||||||
276 | if (outlen < 0)
| 0-3014 | ||||||||||||
277 | return -1; never executed: return -1; | 0 | ||||||||||||
278 | return outlen + 1; executed 3014 times by 1 test: return outlen + 1; Executed by:
| 3014 | ||||||||||||
279 | } | - | ||||||||||||
280 | t.type = str->type; | - | ||||||||||||
281 | t.value.ptr = (char *)str; | - | ||||||||||||
282 | der_len = i2d_ASN1_TYPE(&t, NULL); | - | ||||||||||||
283 | if ((der_buf = OPENSSL_malloc(der_len)) == NULL) {
| 0-3916 | ||||||||||||
284 | ASN1err(ASN1_F_DO_DUMP, ERR_R_MALLOC_FAILURE); | - | ||||||||||||
285 | return -1; never executed: return -1; | 0 | ||||||||||||
286 | } | - | ||||||||||||
287 | p = der_buf; | - | ||||||||||||
288 | i2d_ASN1_TYPE(&t, &p); | - | ||||||||||||
289 | outlen = do_hex_dump(io_ch, arg, der_buf, der_len); | - | ||||||||||||
290 | OPENSSL_free(der_buf); | - | ||||||||||||
291 | if (outlen < 0)
| 0-3916 | ||||||||||||
292 | return -1; never executed: return -1; | 0 | ||||||||||||
293 | return outlen + 1; executed 3916 times by 1 test: return outlen + 1; Executed by:
| 3916 | ||||||||||||
294 | } | - | ||||||||||||
295 | - | |||||||||||||
296 | /* | - | ||||||||||||
297 | * Lookup table to convert tags to character widths, 0 = UTF8 encoded, -1 is | - | ||||||||||||
298 | * used for non string types otherwise it is the number of bytes per | - | ||||||||||||
299 | * character | - | ||||||||||||
300 | */ | - | ||||||||||||
301 | - | |||||||||||||
302 | static const signed char tag2nbyte[] = { | - | ||||||||||||
303 | -1, -1, -1, -1, -1, /* 0-4 */ | - | ||||||||||||
304 | -1, -1, -1, -1, -1, /* 5-9 */ | - | ||||||||||||
305 | -1, -1, /* 10-11 */ | - | ||||||||||||
306 | 0, /* 12 V_ASN1_UTF8STRING */ | - | ||||||||||||
307 | -1, -1, -1, -1, -1, /* 13-17 */ | - | ||||||||||||
308 | 1, /* 18 V_ASN1_NUMERICSTRING */ | - | ||||||||||||
309 | 1, /* 19 V_ASN1_PRINTABLESTRING */ | - | ||||||||||||
310 | 1, /* 20 V_ASN1_T61STRING */ | - | ||||||||||||
311 | -1, /* 21 */ | - | ||||||||||||
312 | 1, /* 22 V_ASN1_IA5STRING */ | - | ||||||||||||
313 | 1, /* 23 V_ASN1_UTCTIME */ | - | ||||||||||||
314 | 1, /* 24 V_ASN1_GENERALIZEDTIME */ | - | ||||||||||||
315 | -1, /* 25 */ | - | ||||||||||||
316 | 1, /* 26 V_ASN1_ISO64STRING */ | - | ||||||||||||
317 | -1, /* 27 */ | - | ||||||||||||
318 | 4, /* 28 V_ASN1_UNIVERSALSTRING */ | - | ||||||||||||
319 | -1, /* 29 */ | - | ||||||||||||
320 | 2 /* 30 V_ASN1_BMPSTRING */ | - | ||||||||||||
321 | }; | - | ||||||||||||
322 | - | |||||||||||||
323 | /* | - | ||||||||||||
324 | * This is the main function, print out an ASN1_STRING taking note of various | - | ||||||||||||
325 | * escape and display options. Returns number of characters written or -1 if | - | ||||||||||||
326 | * an error occurred. | - | ||||||||||||
327 | */ | - | ||||||||||||
328 | - | |||||||||||||
329 | static int do_print_ex(char_io *io_ch, void *arg, unsigned long lflags, | - | ||||||||||||
330 | const ASN1_STRING *str) | - | ||||||||||||
331 | { | - | ||||||||||||
332 | int outlen, len; | - | ||||||||||||
333 | int type; | - | ||||||||||||
334 | char quotes; | - | ||||||||||||
335 | unsigned short flags; | - | ||||||||||||
336 | quotes = 0; | - | ||||||||||||
337 | /* Keep a copy of escape flags */ | - | ||||||||||||
338 | flags = (unsigned short)(lflags & ESC_FLAGS); | - | ||||||||||||
339 | - | |||||||||||||
340 | type = str->type; | - | ||||||||||||
341 | - | |||||||||||||
342 | outlen = 0; | - | ||||||||||||
343 | - | |||||||||||||
344 | if (lflags & ASN1_STRFLGS_SHOW_TYPE) {
| 3014-21421 | ||||||||||||
345 | const char *tagname; | - | ||||||||||||
346 | tagname = ASN1_tag2str(type); | - | ||||||||||||
347 | outlen += strlen(tagname); | - | ||||||||||||
348 | if (!io_ch(arg, tagname, outlen) || !io_ch(arg, ":", 1))
| 0-3014 | ||||||||||||
349 | return -1; never executed: return -1; | 0 | ||||||||||||
350 | outlen++; | - | ||||||||||||
351 | } executed 3014 times by 1 test: end of block Executed by:
| 3014 | ||||||||||||
352 | - | |||||||||||||
353 | /* Decide what to do with type, either dump content or display it */ | - | ||||||||||||
354 | - | |||||||||||||
355 | /* Dump everything */ | - | ||||||||||||
356 | if (lflags & ASN1_STRFLGS_DUMP_ALL)
| 3014-21421 | ||||||||||||
357 | type = -1; executed 3014 times by 1 test: type = -1; Executed by:
| 3014 | ||||||||||||
358 | /* Ignore the string type */ | - | ||||||||||||
359 | else if (lflags & ASN1_STRFLGS_IGNORE_TYPE)
| 0-21421 | ||||||||||||
360 | type = 1; never executed: type = 1; | 0 | ||||||||||||
361 | else { | - | ||||||||||||
362 | /* Else determine width based on type */ | - | ||||||||||||
363 | if ((type > 0) && (type < 31))
| 0-21421 | ||||||||||||
364 | type = tag2nbyte[type]; executed 21181 times by 1 test: type = tag2nbyte[type]; Executed by:
| 21181 | ||||||||||||
365 | else | - | ||||||||||||
366 | type = -1; executed 240 times by 1 test: type = -1; Executed by:
| 240 | ||||||||||||
367 | if ((type == -1) && !(lflags & ASN1_STRFLGS_DUMP_UNKNOWN))
| 0-17505 | ||||||||||||
368 | type = 1; never executed: type = 1; | 0 | ||||||||||||
369 | } executed 21421 times by 1 test: end of block Executed by:
| 21421 | ||||||||||||
370 | - | |||||||||||||
371 | if (type == -1) {
| 6930-17505 | ||||||||||||
372 | len = do_dump(lflags, io_ch, arg, str); | - | ||||||||||||
373 | if (len < 0)
| 0-6930 | ||||||||||||
374 | return -1; never executed: return -1; | 0 | ||||||||||||
375 | outlen += len; | - | ||||||||||||
376 | return outlen; executed 6930 times by 1 test: return outlen; Executed by:
| 6930 | ||||||||||||
377 | } | - | ||||||||||||
378 | - | |||||||||||||
379 | if (lflags & ASN1_STRFLGS_UTF8_CONVERT) {
| 6204-11301 | ||||||||||||
380 | /* | - | ||||||||||||
381 | * Note: if string is UTF8 and we want to convert to UTF8 then we | - | ||||||||||||
382 | * just interpret it as 1 byte per character to avoid converting | - | ||||||||||||
383 | * twice. | - | ||||||||||||
384 | */ | - | ||||||||||||
385 | if (!type)
| 3204-8097 | ||||||||||||
386 | type = 1; executed 3204 times by 1 test: type = 1; Executed by:
| 3204 | ||||||||||||
387 | else | - | ||||||||||||
388 | type |= BUF_TYPE_CONVUTF8; executed 8097 times by 1 test: type |= 0x8; Executed by:
| 8097 | ||||||||||||
389 | } | - | ||||||||||||
390 | - | |||||||||||||
391 | len = do_buf(str->data, str->length, type, flags, "es, io_ch, NULL); | - | ||||||||||||
392 | if (len < 0)
| 5337-12168 | ||||||||||||
393 | return -1; executed 5337 times by 1 test: return -1; Executed by:
| 5337 | ||||||||||||
394 | outlen += len; | - | ||||||||||||
395 | if (quotes)
| 578-11590 | ||||||||||||
396 | outlen += 2; executed 578 times by 1 test: outlen += 2; Executed by:
| 578 | ||||||||||||
397 | if (!arg)
| 0-12168 | ||||||||||||
398 | return outlen; never executed: return outlen; | 0 | ||||||||||||
399 | if (quotes && !io_ch(arg, "\"", 1))
| 0-11590 | ||||||||||||
400 | return -1; never executed: return -1; | 0 | ||||||||||||
401 | if (do_buf(str->data, str->length, type, flags, NULL, io_ch, arg) < 0)
| 0-12168 | ||||||||||||
402 | return -1; never executed: return -1; | 0 | ||||||||||||
403 | if (quotes && !io_ch(arg, "\"", 1))
| 0-11590 | ||||||||||||
404 | return -1; never executed: return -1; | 0 | ||||||||||||
405 | return outlen; executed 12168 times by 1 test: return outlen; Executed by:
| 12168 | ||||||||||||
406 | } | - | ||||||||||||
407 | - | |||||||||||||
408 | /* Used for line indenting: print 'indent' spaces */ | - | ||||||||||||
409 | - | |||||||||||||
410 | static int do_indent(char_io *io_ch, void *arg, int indent) | - | ||||||||||||
411 | { | - | ||||||||||||
412 | int i; | - | ||||||||||||
413 | for (i = 0; i < indent; i++)
| 175-12100 | ||||||||||||
414 | if (!io_ch(arg, " ", 1))
| 0-175 | ||||||||||||
415 | return 0; never executed: return 0; | 0 | ||||||||||||
416 | return 1; executed 12100 times by 1 test: return 1; Executed by:
| 12100 | ||||||||||||
417 | } | - | ||||||||||||
418 | - | |||||||||||||
419 | #define FN_WIDTH_LN 25 | - | ||||||||||||
420 | #define FN_WIDTH_SN 10 | - | ||||||||||||
421 | - | |||||||||||||
422 | static int do_name_ex(char_io *io_ch, void *arg, const X509_NAME *n, | - | ||||||||||||
423 | int indent, unsigned long flags) | - | ||||||||||||
424 | { | - | ||||||||||||
425 | int i, prev = -1, orflags, cnt; | - | ||||||||||||
426 | int fn_opt, fn_nid; | - | ||||||||||||
427 | ASN1_OBJECT *fn; | - | ||||||||||||
428 | const ASN1_STRING *val; | - | ||||||||||||
429 | const X509_NAME_ENTRY *ent; | - | ||||||||||||
430 | char objtmp[80]; | - | ||||||||||||
431 | const char *objbuf; | - | ||||||||||||
432 | int outlen, len; | - | ||||||||||||
433 | char *sep_dn, *sep_mv, *sep_eq; | - | ||||||||||||
434 | int sep_dn_len, sep_mv_len, sep_eq_len; | - | ||||||||||||
435 | if (indent < 0)
| 0-7182 | ||||||||||||
436 | indent = 0; never executed: indent = 0; | 0 | ||||||||||||
437 | outlen = indent; | - | ||||||||||||
438 | if (!do_indent(io_ch, arg, indent))
| 0-7182 | ||||||||||||
439 | return -1; never executed: return -1; | 0 | ||||||||||||
440 | switch (flags & XN_FLAG_SEP_MASK) { | - | ||||||||||||
441 | case XN_FLAG_SEP_MULTILINE: executed 2 times by 1 test: case (4 << 16): Executed by:
| 2 | ||||||||||||
442 | sep_dn = "\n"; | - | ||||||||||||
443 | sep_dn_len = 1; | - | ||||||||||||
444 | sep_mv = " + "; | - | ||||||||||||
445 | sep_mv_len = 3; | - | ||||||||||||
446 | break; executed 2 times by 1 test: break; Executed by:
| 2 | ||||||||||||
447 | - | |||||||||||||
448 | case XN_FLAG_SEP_COMMA_PLUS: never executed: case (1 << 16): | 0 | ||||||||||||
449 | sep_dn = ","; | - | ||||||||||||
450 | sep_dn_len = 1; | - | ||||||||||||
451 | sep_mv = "+"; | - | ||||||||||||
452 | sep_mv_len = 1; | - | ||||||||||||
453 | indent = 0; | - | ||||||||||||
454 | break; never executed: break; | 0 | ||||||||||||
455 | - | |||||||||||||
456 | case XN_FLAG_SEP_CPLUS_SPC: executed 7180 times by 1 test: case (2 << 16): Executed by:
| 7180 | ||||||||||||
457 | sep_dn = ", "; | - | ||||||||||||
458 | sep_dn_len = 2; | - | ||||||||||||
459 | sep_mv = " + "; | - | ||||||||||||
460 | sep_mv_len = 3; | - | ||||||||||||
461 | indent = 0; | - | ||||||||||||
462 | break; executed 7180 times by 1 test: break; Executed by:
| 7180 | ||||||||||||
463 | - | |||||||||||||
464 | case XN_FLAG_SEP_SPLUS_SPC: never executed: case (3 << 16): | 0 | ||||||||||||
465 | sep_dn = "; "; | - | ||||||||||||
466 | sep_dn_len = 2; | - | ||||||||||||
467 | sep_mv = " + "; | - | ||||||||||||
468 | sep_mv_len = 3; | - | ||||||||||||
469 | indent = 0; | - | ||||||||||||
470 | break; never executed: break; | 0 | ||||||||||||
471 | - | |||||||||||||
472 | default: never executed: default: | 0 | ||||||||||||
473 | return -1; never executed: return -1; | 0 | ||||||||||||
474 | } | - | ||||||||||||
475 | - | |||||||||||||
476 | if (flags & XN_FLAG_SPC_EQ) {
| 5-7177 | ||||||||||||
477 | sep_eq = " = "; | - | ||||||||||||
478 | sep_eq_len = 3; | - | ||||||||||||
479 | } else { executed 7177 times by 1 test: end of block Executed by:
| 7177 | ||||||||||||
480 | sep_eq = "="; | - | ||||||||||||
481 | sep_eq_len = 1; | - | ||||||||||||
482 | } executed 5 times by 1 test: end of block Executed by:
| 5 | ||||||||||||
483 | - | |||||||||||||
484 | fn_opt = flags & XN_FLAG_FN_MASK; | - | ||||||||||||
485 | - | |||||||||||||
486 | cnt = X509_NAME_entry_count(n); | - | ||||||||||||
487 | for (i = 0; i < cnt; i++) {
| 7182-15238 | ||||||||||||
488 | if (flags & XN_FLAG_DN_REV)
| 0-15238 | ||||||||||||
489 | ent = X509_NAME_get_entry(n, cnt - i - 1); never executed: ent = X509_NAME_get_entry(n, cnt - i - 1); | 0 | ||||||||||||
490 | else | - | ||||||||||||
491 | ent = X509_NAME_get_entry(n, i); executed 15238 times by 1 test: ent = X509_NAME_get_entry(n, i); Executed by:
| 15238 | ||||||||||||
492 | if (prev != -1) {
| 4892-10346 | ||||||||||||
493 | if (prev == X509_NAME_ENTRY_set(ent)) {
| 4911-5435 | ||||||||||||
494 | if (!io_ch(arg, sep_mv, sep_mv_len))
| 0-5435 | ||||||||||||
495 | return -1; never executed: return -1; | 0 | ||||||||||||
496 | outlen += sep_mv_len; | - | ||||||||||||
497 | } else { executed 5435 times by 1 test: end of block Executed by:
| 5435 | ||||||||||||
498 | if (!io_ch(arg, sep_dn, sep_dn_len))
| 0-4911 | ||||||||||||
499 | return -1; never executed: return -1; | 0 | ||||||||||||
500 | outlen += sep_dn_len; | - | ||||||||||||
501 | if (!do_indent(io_ch, arg, indent))
| 0-4911 | ||||||||||||
502 | return -1; never executed: return -1; | 0 | ||||||||||||
503 | outlen += indent; | - | ||||||||||||
504 | } executed 4911 times by 1 test: end of block Executed by:
| 4911 | ||||||||||||
505 | } | - | ||||||||||||
506 | prev = X509_NAME_ENTRY_set(ent); | - | ||||||||||||
507 | fn = X509_NAME_ENTRY_get_object(ent); | - | ||||||||||||
508 | val = X509_NAME_ENTRY_get_data(ent); | - | ||||||||||||
509 | fn_nid = OBJ_obj2nid(fn); | - | ||||||||||||
510 | if (fn_opt != XN_FLAG_FN_NONE) {
| 0-15238 | ||||||||||||
511 | int objlen, fld_len; | - | ||||||||||||
512 | if ((fn_opt == XN_FLAG_FN_OID) || (fn_nid == NID_undef)) {
| 0-15238 | ||||||||||||
513 | OBJ_obj2txt(objtmp, sizeof(objtmp), fn, 1); | - | ||||||||||||
514 | fld_len = 0; /* XXX: what should this be? */ | - | ||||||||||||
515 | objbuf = objtmp; | - | ||||||||||||
516 | } else { executed 8233 times by 1 test: end of block Executed by:
| 8233 | ||||||||||||
517 | if (fn_opt == XN_FLAG_FN_SN) {
| 7-6998 | ||||||||||||
518 | fld_len = FN_WIDTH_SN; | - | ||||||||||||
519 | objbuf = OBJ_nid2sn(fn_nid); | - | ||||||||||||
520 | } else if (fn_opt == XN_FLAG_FN_LN) { executed 6998 times by 1 test: end of block Executed by:
| 0-6998 | ||||||||||||
521 | fld_len = FN_WIDTH_LN; | - | ||||||||||||
522 | objbuf = OBJ_nid2ln(fn_nid); | - | ||||||||||||
523 | } else { executed 7 times by 1 test: end of block Executed by:
| 7 | ||||||||||||
524 | fld_len = 0; /* XXX: what should this be? */ | - | ||||||||||||
525 | objbuf = ""; | - | ||||||||||||
526 | } never executed: end of block | 0 | ||||||||||||
527 | } | - | ||||||||||||
528 | objlen = strlen(objbuf); | - | ||||||||||||
529 | if (!io_ch(arg, objbuf, objlen))
| 0-15238 | ||||||||||||
530 | return -1; never executed: return -1; | 0 | ||||||||||||
531 | if ((objlen < fld_len) && (flags & XN_FLAG_FN_ALIGN)) {
| 7-11148 | ||||||||||||
532 | if (!do_indent(io_ch, arg, fld_len - objlen))
| 0-7 | ||||||||||||
533 | return -1; never executed: return -1; | 0 | ||||||||||||
534 | outlen += fld_len - objlen; | - | ||||||||||||
535 | } executed 7 times by 1 test: end of block Executed by:
| 7 | ||||||||||||
536 | if (!io_ch(arg, sep_eq, sep_eq_len))
| 0-15238 | ||||||||||||
537 | return -1; never executed: return -1; | 0 | ||||||||||||
538 | outlen += objlen + sep_eq_len; | - | ||||||||||||
539 | } executed 15238 times by 1 test: end of block Executed by:
| 15238 | ||||||||||||
540 | /* | - | ||||||||||||
541 | * If the field name is unknown then fix up the DER dump flag. We | - | ||||||||||||
542 | * might want to limit this further so it will DER dump on anything | - | ||||||||||||
543 | * other than a few 'standard' fields. | - | ||||||||||||
544 | */ | - | ||||||||||||
545 | if ((fn_nid == NID_undef) && (flags & XN_FLAG_DUMP_UNKNOWN_FIELDS))
| 0-8233 | ||||||||||||
546 | orflags = ASN1_STRFLGS_DUMP_ALL; never executed: orflags = 0x80; | 0 | ||||||||||||
547 | else | - | ||||||||||||
548 | orflags = 0; executed 15238 times by 1 test: orflags = 0; Executed by:
| 15238 | ||||||||||||
549 | - | |||||||||||||
550 | len = do_print_ex(io_ch, arg, flags | orflags, val); | - | ||||||||||||
551 | if (len < 0)
| 0-15238 | ||||||||||||
552 | return -1; never executed: return -1; | 0 | ||||||||||||
553 | outlen += len; | - | ||||||||||||
554 | } executed 15238 times by 1 test: end of block Executed by:
| 15238 | ||||||||||||
555 | return outlen; executed 7182 times by 1 test: return outlen; Executed by:
| 7182 | ||||||||||||
556 | } | - | ||||||||||||
557 | - | |||||||||||||
558 | /* Wrappers round the main functions */ | - | ||||||||||||
559 | - | |||||||||||||
560 | int X509_NAME_print_ex(BIO *out, const X509_NAME *nm, int indent, | - | ||||||||||||
561 | unsigned long flags) | - | ||||||||||||
562 | { | - | ||||||||||||
563 | if (flags == XN_FLAG_COMPAT)
| 5796-7182 | ||||||||||||
564 | return X509_NAME_print(out, nm, indent); executed 5796 times by 1 test: return X509_NAME_print(out, nm, indent); Executed by:
| 5796 | ||||||||||||
565 | return do_name_ex(send_bio_chars, out, nm, indent, flags); executed 7182 times by 1 test: return do_name_ex(send_bio_chars, out, nm, indent, flags); Executed by:
| 7182 | ||||||||||||
566 | } | - | ||||||||||||
567 | - | |||||||||||||
568 | #ifndef OPENSSL_NO_STDIO | - | ||||||||||||
569 | int X509_NAME_print_ex_fp(FILE *fp, const X509_NAME *nm, int indent, | - | ||||||||||||
570 | unsigned long flags) | - | ||||||||||||
571 | { | - | ||||||||||||
572 | if (flags == XN_FLAG_COMPAT) {
| 0 | ||||||||||||
573 | BIO *btmp; | - | ||||||||||||
574 | int ret; | - | ||||||||||||
575 | btmp = BIO_new_fp(fp, BIO_NOCLOSE); | - | ||||||||||||
576 | if (!btmp)
| 0 | ||||||||||||
577 | return -1; never executed: return -1; | 0 | ||||||||||||
578 | ret = X509_NAME_print(btmp, nm, indent); | - | ||||||||||||
579 | BIO_free(btmp); | - | ||||||||||||
580 | return ret; never executed: return ret; | 0 | ||||||||||||
581 | } | - | ||||||||||||
582 | return do_name_ex(send_fp_chars, fp, nm, indent, flags); never executed: return do_name_ex(send_fp_chars, fp, nm, indent, flags); | 0 | ||||||||||||
583 | } | - | ||||||||||||
584 | #endif | - | ||||||||||||
585 | - | |||||||||||||
586 | int ASN1_STRING_print_ex(BIO *out, const ASN1_STRING *str, unsigned long flags) | - | ||||||||||||
587 | { | - | ||||||||||||
588 | return do_print_ex(send_bio_chars, out, flags, str); executed 9197 times by 1 test: return do_print_ex(send_bio_chars, out, flags, str); Executed by:
| 9197 | ||||||||||||
589 | } | - | ||||||||||||
590 | - | |||||||||||||
591 | #ifndef OPENSSL_NO_STDIO | - | ||||||||||||
592 | int ASN1_STRING_print_ex_fp(FILE *fp, const ASN1_STRING *str, unsigned long flags) | - | ||||||||||||
593 | { | - | ||||||||||||
594 | return do_print_ex(send_fp_chars, fp, flags, str); never executed: return do_print_ex(send_fp_chars, fp, flags, str); | 0 | ||||||||||||
595 | } | - | ||||||||||||
596 | #endif | - | ||||||||||||
597 | - | |||||||||||||
598 | /* | - | ||||||||||||
599 | * Utility function: convert any string type to UTF8, returns number of bytes | - | ||||||||||||
600 | * in output string or a negative error code | - | ||||||||||||
601 | */ | - | ||||||||||||
602 | - | |||||||||||||
603 | int ASN1_STRING_to_UTF8(unsigned char **out, const ASN1_STRING *in) | - | ||||||||||||
604 | { | - | ||||||||||||
605 | ASN1_STRING stmp, *str = &stmp; | - | ||||||||||||
606 | int mbflag, type, ret; | - | ||||||||||||
607 | if (!in)
| 0-154154 | ||||||||||||
608 | return -1; never executed: return -1; | 0 | ||||||||||||
609 | type = in->type; | - | ||||||||||||
610 | if ((type < 0) || (type > 30))
| 0-154154 | ||||||||||||
611 | return -1; never executed: return -1; | 0 | ||||||||||||
612 | mbflag = tag2nbyte[type]; | - | ||||||||||||
613 | if (mbflag == -1)
| 0-154154 | ||||||||||||
614 | return -1; never executed: return -1; | 0 | ||||||||||||
615 | mbflag |= MBSTRING_FLAG; | - | ||||||||||||
616 | stmp.data = NULL; | - | ||||||||||||
617 | stmp.length = 0; | - | ||||||||||||
618 | stmp.flags = 0; | - | ||||||||||||
619 | ret = | - | ||||||||||||
620 | ASN1_mbstring_copy(&str, in->data, in->length, mbflag, | - | ||||||||||||
621 | B_ASN1_UTF8STRING); | - | ||||||||||||
622 | if (ret < 0)
| 4656-149498 | ||||||||||||
623 | return ret; executed 4656 times by 1 test: return ret; Executed by:
| 4656 | ||||||||||||
624 | *out = stmp.data; | - | ||||||||||||
625 | return stmp.length; executed 149498 times by 1 test: return stmp.length; Executed by:
| 149498 | ||||||||||||
626 | } | - | ||||||||||||
Source code | Switch to Preprocessed file |