OpenCoverage

asn1_gen.c

Absolute File Name:/home/opencoverage/opencoverage/guest-scripts/openssl/src/crypto/asn1/asn1_gen.c
Source codeSwitch to Preprocessed file
LineSourceCount
1/*-
2 * Copyright 2002-2016 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 "internal/cryptlib.h"-
11#include <openssl/asn1.h>-
12#include <openssl/x509v3.h>-
13-
14#define ASN1_GEN_FLAG 0x10000-
15#define ASN1_GEN_FLAG_IMP (ASN1_GEN_FLAG|1)-
16#define ASN1_GEN_FLAG_EXP (ASN1_GEN_FLAG|2)-
17#define ASN1_GEN_FLAG_TAG (ASN1_GEN_FLAG|3)-
18#define ASN1_GEN_FLAG_BITWRAP (ASN1_GEN_FLAG|4)-
19#define ASN1_GEN_FLAG_OCTWRAP (ASN1_GEN_FLAG|5)-
20#define ASN1_GEN_FLAG_SEQWRAP (ASN1_GEN_FLAG|6)-
21#define ASN1_GEN_FLAG_SETWRAP (ASN1_GEN_FLAG|7)-
22#define ASN1_GEN_FLAG_FORMAT (ASN1_GEN_FLAG|8)-
23-
24#define ASN1_GEN_STR(str,val) {str, sizeof(str) - 1, val}-
25-
26#define ASN1_FLAG_EXP_MAX 20-
27/* Maximum number of nested sequences */-
28#define ASN1_GEN_SEQ_MAX_DEPTH 50-
29-
30/* Input formats */-
31-
32/* ASCII: default */-
33#define ASN1_GEN_FORMAT_ASCII 1-
34/* UTF8 */-
35#define ASN1_GEN_FORMAT_UTF8 2-
36/* Hex */-
37#define ASN1_GEN_FORMAT_HEX 3-
38/* List of bits */-
39#define ASN1_GEN_FORMAT_BITLIST 4-
40-
41struct tag_name_st {-
42 const char *strnam;-
43 int len;-
44 int tag;-
45};-
46-
47typedef struct {-
48 int exp_tag;-
49 int exp_class;-
50 int exp_constructed;-
51 int exp_pad;-
52 long exp_len;-
53} tag_exp_type;-
54-
55typedef struct {-
56 int imp_tag;-
57 int imp_class;-
58 int utype;-
59 int format;-
60 const char *str;-
61 tag_exp_type exp_list[ASN1_FLAG_EXP_MAX];-
62 int exp_count;-
63} tag_exp_arg;-
64-
65static ASN1_TYPE *generate_v3(const char *str, X509V3_CTX *cnf, int depth,-
66 int *perr);-
67static int bitstr_cb(const char *elem, int len, void *bitstr);-
68static int asn1_cb(const char *elem, int len, void *bitstr);-
69static int append_exp(tag_exp_arg *arg, int exp_tag, int exp_class,-
70 int exp_constructed, int exp_pad, int imp_ok);-
71static int parse_tagging(const char *vstart, int vlen, int *ptag,-
72 int *pclass);-
73static ASN1_TYPE *asn1_multi(int utype, const char *section, X509V3_CTX *cnf,-
74 int depth, int *perr);-
75static ASN1_TYPE *asn1_str2type(const char *str, int format, int utype);-
76static int asn1_str2tag(const char *tagstr, int len);-
77-
78ASN1_TYPE *ASN1_generate_nconf(const char *str, CONF *nconf)-
79{-
80 X509V3_CTX cnf;-
81-
82 if (!nconf)
!nconfDescription
TRUEnever evaluated
FALSEnever evaluated
0
83 return ASN1_generate_v3(str, NULL);
never executed: return ASN1_generate_v3(str, ((void *)0) );
0
84-
85 X509V3_set_nconf(&cnf, nconf);-
86 return ASN1_generate_v3(str, &cnf);
never executed: return ASN1_generate_v3(str, &cnf);
0
87}-
88-
89ASN1_TYPE *ASN1_generate_v3(const char *str, X509V3_CTX *cnf)-
90{-
91 int err = 0;-
92 ASN1_TYPE *ret = generate_v3(str, cnf, 0, &err);-
93 if (err)
errDescription
TRUEnever evaluated
FALSEnever evaluated
0
94 ASN1err(ASN1_F_ASN1_GENERATE_V3, err);
never executed: ERR_put_error(13,(178),(err),__FILE__,94);
0
95 return ret;
never executed: return ret;
0
96}-
97-
98static ASN1_TYPE *generate_v3(const char *str, X509V3_CTX *cnf, int depth,-
99 int *perr)-
100{-
101 ASN1_TYPE *ret;-
102 tag_exp_arg asn1_tags;-
103 tag_exp_type *etmp;-
104-
105 int i, len;-
106-
107 unsigned char *orig_der = NULL, *new_der = NULL;-
108 const unsigned char *cpy_start;-
109 unsigned char *p;-
110 const unsigned char *cp;-
111 int cpy_len;-
112 long hdr_len = 0;-
113 int hdr_constructed = 0, hdr_tag, hdr_class;-
114 int r;-
115-
116 asn1_tags.imp_tag = -1;-
117 asn1_tags.imp_class = -1;-
118 asn1_tags.format = ASN1_GEN_FORMAT_ASCII;-
119 asn1_tags.exp_count = 0;-
120 if (CONF_parse_list(str, ',', 1, asn1_cb, &asn1_tags) != 0) {
CONF_parse_lis...sn1_tags) != 0Description
TRUEnever evaluated
FALSEnever evaluated
0
121 *perr = ASN1_R_UNKNOWN_TAG;-
122 return NULL;
never executed: return ((void *)0) ;
0
123 }-
124-
125 if ((asn1_tags.utype == V_ASN1_SEQUENCE)
(asn1_tags.utype == 16)Description
TRUEnever evaluated
FALSEnever evaluated
0
126 || (asn1_tags.utype == V_ASN1_SET)) {
(asn1_tags.utype == 17)Description
TRUEnever evaluated
FALSEnever evaluated
0
127 if (!cnf) {
!cnfDescription
TRUEnever evaluated
FALSEnever evaluated
0
128 *perr = ASN1_R_SEQUENCE_OR_SET_NEEDS_CONFIG;-
129 return NULL;
never executed: return ((void *)0) ;
0
130 }-
131 if (depth >= ASN1_GEN_SEQ_MAX_DEPTH) {
depth >= 50Description
TRUEnever evaluated
FALSEnever evaluated
0
132 *perr = ASN1_R_ILLEGAL_NESTED_TAGGING;-
133 return NULL;
never executed: return ((void *)0) ;
0
134 }-
135 ret = asn1_multi(asn1_tags.utype, asn1_tags.str, cnf, depth, perr);-
136 } else
never executed: end of block
0
137 ret = asn1_str2type(asn1_tags.str, asn1_tags.format, asn1_tags.utype);
never executed: ret = asn1_str2type(asn1_tags.str, asn1_tags.format, asn1_tags.utype);
0
138-
139 if (!ret)
!retDescription
TRUEnever evaluated
FALSEnever evaluated
0
140 return NULL;
never executed: return ((void *)0) ;
0
141-
142 /* If no tagging return base type */-
143 if ((asn1_tags.imp_tag == -1) && (asn1_tags.exp_count == 0))
(asn1_tags.imp_tag == -1)Description
TRUEnever evaluated
FALSEnever evaluated
(asn1_tags.exp_count == 0)Description
TRUEnever evaluated
FALSEnever evaluated
0
144 return ret;
never executed: return ret;
0
145-
146 /* Generate the encoding */-
147 cpy_len = i2d_ASN1_TYPE(ret, &orig_der);-
148 ASN1_TYPE_free(ret);-
149 ret = NULL;-
150 /* Set point to start copying for modified encoding */-
151 cpy_start = orig_der;-
152-
153 /* Do we need IMPLICIT tagging? */-
154 if (asn1_tags.imp_tag != -1) {
asn1_tags.imp_tag != -1Description
TRUEnever evaluated
FALSEnever evaluated
0
155 /* If IMPLICIT we will replace the underlying tag */-
156 /* Skip existing tag+len */-
157 r = ASN1_get_object(&cpy_start, &hdr_len, &hdr_tag, &hdr_class,-
158 cpy_len);-
159 if (r & 0x80)
r & 0x80Description
TRUEnever evaluated
FALSEnever evaluated
0
160 goto err;
never executed: goto err;
0
161 /* Update copy length */-
162 cpy_len -= cpy_start - orig_der;-
163 /*-
164 * For IMPLICIT tagging the length should match the original length-
165 * and constructed flag should be consistent.-
166 */-
167 if (r & 0x1) {
r & 0x1Description
TRUEnever evaluated
FALSEnever evaluated
0
168 /* Indefinite length constructed */-
169 hdr_constructed = 2;-
170 hdr_len = 0;-
171 } else
never executed: end of block
0
172 /* Just retain constructed flag */-
173 hdr_constructed = r & V_ASN1_CONSTRUCTED;
never executed: hdr_constructed = r & 0x20;
0
174 /*-
175 * Work out new length with IMPLICIT tag: ignore constructed because-
176 * it will mess up if indefinite length-
177 */-
178 len = ASN1_object_size(0, hdr_len, asn1_tags.imp_tag);-
179 } else
never executed: end of block
0
180 len = cpy_len;
never executed: len = cpy_len;
0
181-
182 /* Work out length in any EXPLICIT, starting from end */-
183-
184 for (i = 0, etmp = asn1_tags.exp_list + asn1_tags.exp_count - 1;-
185 i < asn1_tags.exp_count; i++, etmp--) {
i < asn1_tags.exp_countDescription
TRUEnever evaluated
FALSEnever evaluated
0
186 /* Content length: number of content octets + any padding */-
187 len += etmp->exp_pad;-
188 etmp->exp_len = len;-
189 /* Total object length: length including new header */-
190 len = ASN1_object_size(0, len, etmp->exp_tag);-
191 }
never executed: end of block
0
192-
193 /* Allocate buffer for new encoding */-
194-
195 new_der = OPENSSL_malloc(len);-
196 if (new_der == NULL)
new_der == ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
197 goto err;
never executed: goto err;
0
198-
199 /* Generate tagged encoding */-
200-
201 p = new_der;-
202-
203 /* Output explicit tags first */-
204-
205 for (i = 0, etmp = asn1_tags.exp_list; i < asn1_tags.exp_count;
i < asn1_tags.exp_countDescription
TRUEnever evaluated
FALSEnever evaluated
0
206 i++, etmp++) {-
207 ASN1_put_object(&p, etmp->exp_constructed, etmp->exp_len,-
208 etmp->exp_tag, etmp->exp_class);-
209 if (etmp->exp_pad)
etmp->exp_padDescription
TRUEnever evaluated
FALSEnever evaluated
0
210 *p++ = 0;
never executed: *p++ = 0;
0
211 }
never executed: end of block
0
212-
213 /* If IMPLICIT, output tag */-
214-
215 if (asn1_tags.imp_tag != -1) {
asn1_tags.imp_tag != -1Description
TRUEnever evaluated
FALSEnever evaluated
0
216 if (asn1_tags.imp_class == V_ASN1_UNIVERSAL
asn1_tags.imp_class == 0x00Description
TRUEnever evaluated
FALSEnever evaluated
0
217 && (asn1_tags.imp_tag == V_ASN1_SEQUENCE
asn1_tags.imp_tag == 16Description
TRUEnever evaluated
FALSEnever evaluated
0
218 || asn1_tags.imp_tag == V_ASN1_SET))
asn1_tags.imp_tag == 17Description
TRUEnever evaluated
FALSEnever evaluated
0
219 hdr_constructed = V_ASN1_CONSTRUCTED;
never executed: hdr_constructed = 0x20;
0
220 ASN1_put_object(&p, hdr_constructed, hdr_len,-
221 asn1_tags.imp_tag, asn1_tags.imp_class);-
222 }
never executed: end of block
0
223-
224 /* Copy across original encoding */-
225 memcpy(p, cpy_start, cpy_len);-
226-
227 cp = new_der;-
228-
229 /* Obtain new ASN1_TYPE structure */-
230 ret = d2i_ASN1_TYPE(NULL, &cp, len);-
231-
232 err:
code before this statement never executed: err:
0
233 OPENSSL_free(orig_der);-
234 OPENSSL_free(new_der);-
235-
236 return ret;
never executed: return ret;
0
237-
238}-
239-
240static int asn1_cb(const char *elem, int len, void *bitstr)-
241{-
242 tag_exp_arg *arg = bitstr;-
243 int i;-
244 int utype;-
245 int vlen = 0;-
246 const char *p, *vstart = NULL;-
247-
248 int tmp_tag, tmp_class;-
249-
250 if (elem == NULL)
elem == ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
251 return -1;
never executed: return -1;
0
252-
253 for (i = 0, p = elem; i < len; p++, i++) {
i < lenDescription
TRUEnever evaluated
FALSEnever evaluated
0
254 /* Look for the ':' in name value pairs */-
255 if (*p == ':') {
*p == ':'Description
TRUEnever evaluated
FALSEnever evaluated
0
256 vstart = p + 1;-
257 vlen = len - (vstart - elem);-
258 len = p - elem;-
259 break;
never executed: break;
0
260 }-
261 }
never executed: end of block
0
262-
263 utype = asn1_str2tag(elem, len);-
264-
265 if (utype == -1) {
utype == -1Description
TRUEnever evaluated
FALSEnever evaluated
0
266 ASN1err(ASN1_F_ASN1_CB, ASN1_R_UNKNOWN_TAG);-
267 ERR_add_error_data(2, "tag=", elem);-
268 return -1;
never executed: return -1;
0
269 }-
270-
271 /* If this is not a modifier mark end of string and exit */-
272 if (!(utype & ASN1_GEN_FLAG)) {
!(utype & 0x10000)Description
TRUEnever evaluated
FALSEnever evaluated
0
273 arg->utype = utype;-
274 arg->str = vstart;-
275 /* If no value and not end of string, error */-
276 if (!vstart && elem[len]) {
!vstartDescription
TRUEnever evaluated
FALSEnever evaluated
elem[len]Description
TRUEnever evaluated
FALSEnever evaluated
0
277 ASN1err(ASN1_F_ASN1_CB, ASN1_R_MISSING_VALUE);-
278 return -1;
never executed: return -1;
0
279 }-
280 return 0;
never executed: return 0;
0
281 }-
282-
283 switch (utype) {-
284-
285 case ASN1_GEN_FLAG_IMP:
never executed: case (0x10000|1):
0
286 /* Check for illegal multiple IMPLICIT tagging */-
287 if (arg->imp_tag != -1) {
arg->imp_tag != -1Description
TRUEnever evaluated
FALSEnever evaluated
0
288 ASN1err(ASN1_F_ASN1_CB, ASN1_R_ILLEGAL_NESTED_TAGGING);-
289 return -1;
never executed: return -1;
0
290 }-
291 if (!parse_tagging(vstart, vlen, &arg->imp_tag, &arg->imp_class))
!parse_tagging...rg->imp_class)Description
TRUEnever evaluated
FALSEnever evaluated
0
292 return -1;
never executed: return -1;
0
293 break;
never executed: break;
0
294-
295 case ASN1_GEN_FLAG_EXP:
never executed: case (0x10000|2):
0
296-
297 if (!parse_tagging(vstart, vlen, &tmp_tag, &tmp_class))
!parse_tagging...g, &tmp_class)Description
TRUEnever evaluated
FALSEnever evaluated
0
298 return -1;
never executed: return -1;
0
299 if (!append_exp(arg, tmp_tag, tmp_class, 1, 0, 0))
!append_exp(ar...lass, 1, 0, 0)Description
TRUEnever evaluated
FALSEnever evaluated
0
300 return -1;
never executed: return -1;
0
301 break;
never executed: break;
0
302-
303 case ASN1_GEN_FLAG_SEQWRAP:
never executed: case (0x10000|6):
0
304 if (!append_exp(arg, V_ASN1_SEQUENCE, V_ASN1_UNIVERSAL, 1, 0, 1))
!append_exp(ar...0x00, 1, 0, 1)Description
TRUEnever evaluated
FALSEnever evaluated
0
305 return -1;
never executed: return -1;
0
306 break;
never executed: break;
0
307-
308 case ASN1_GEN_FLAG_SETWRAP:
never executed: case (0x10000|7):
0
309 if (!append_exp(arg, V_ASN1_SET, V_ASN1_UNIVERSAL, 1, 0, 1))
!append_exp(ar...0x00, 1, 0, 1)Description
TRUEnever evaluated
FALSEnever evaluated
0
310 return -1;
never executed: return -1;
0
311 break;
never executed: break;
0
312-
313 case ASN1_GEN_FLAG_BITWRAP:
never executed: case (0x10000|4):
0
314 if (!append_exp(arg, V_ASN1_BIT_STRING, V_ASN1_UNIVERSAL, 0, 1, 1))
!append_exp(ar...0x00, 0, 1, 1)Description
TRUEnever evaluated
FALSEnever evaluated
0
315 return -1;
never executed: return -1;
0
316 break;
never executed: break;
0
317-
318 case ASN1_GEN_FLAG_OCTWRAP:
never executed: case (0x10000|5):
0
319 if (!append_exp(arg, V_ASN1_OCTET_STRING, V_ASN1_UNIVERSAL, 0, 0, 1))
!append_exp(ar...0x00, 0, 0, 1)Description
TRUEnever evaluated
FALSEnever evaluated
0
320 return -1;
never executed: return -1;
0
321 break;
never executed: break;
0
322-
323 case ASN1_GEN_FLAG_FORMAT:
never executed: case (0x10000|8):
0
324 if (!vstart) {
!vstartDescription
TRUEnever evaluated
FALSEnever evaluated
0
325 ASN1err(ASN1_F_ASN1_CB, ASN1_R_UNKNOWN_FORMAT);-
326 return -1;
never executed: return -1;
0
327 }-
328 if (strncmp(vstart, "ASCII", 5) == 0)
never executed: __result = (((const unsigned char *) (const char *) ( vstart ))[3] - __s2[3]);
never executed: end of block
never executed: end of block
never executed: __result = (((const unsigned char *) (const char *) ( "ASCII" ))[3] - __s2[3]);
never executed: end of block
never executed: end of block
(__extension__..." , 5 ))) == 0Description
TRUEnever evaluated
FALSEnever evaluated
__builtin_constant_p ( 5 )Description
TRUEnever evaluated
FALSEnever evaluated
__builtin_cons...t_p ( vstart )Description
TRUEnever evaluated
FALSEnever evaluated
strlen ( vstar...size_t) ( 5 ))Description
TRUEnever evaluated
FALSEnever evaluated
__builtin_cons..._p ( "ASCII" )Description
TRUEnever evaluated
FALSEnever evaluated
strlen ( "ASCI...size_t) ( 5 ))Description
TRUEnever evaluated
FALSEnever evaluated
__s1_len > 0Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s1_len > 1Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s1_len > 2Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s2_len > 0Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s2_len > 1Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s2_len > 2Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
329 arg->format = ASN1_GEN_FORMAT_ASCII;
never executed: arg->format = 1;
0
330 else if (strncmp(vstart, "UTF8", 4) == 0)
never executed: __result = (((const unsigned char *) (const char *) ( vstart ))[3] - __s2[3]);
never executed: end of block
never executed: end of block
never executed: __result = (((const unsigned char *) (const char *) ( "UTF8" ))[3] - __s2[3]);
never executed: end of block
never executed: end of block
(__extension__..." , 4 ))) == 0Description
TRUEnever evaluated
FALSEnever evaluated
__builtin_constant_p ( 4 )Description
TRUEnever evaluated
FALSEnever evaluated
__builtin_cons...t_p ( vstart )Description
TRUEnever evaluated
FALSEnever evaluated
strlen ( vstar...size_t) ( 4 ))Description
TRUEnever evaluated
FALSEnever evaluated
__builtin_cons...t_p ( "UTF8" )Description
TRUEnever evaluated
FALSEnever evaluated
strlen ( "UTF8...size_t) ( 4 ))Description
TRUEnever evaluated
FALSEnever evaluated
__s1_len > 0Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s1_len > 1Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s1_len > 2Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s2_len > 0Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s2_len > 1Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s2_len > 2Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
331 arg->format = ASN1_GEN_FORMAT_UTF8;
never executed: arg->format = 2;
0
332 else if (strncmp(vstart, "HEX", 3) == 0)
never executed: __result = (((const unsigned char *) (const char *) ( vstart ))[3] - __s2[3]);
never executed: end of block
never executed: end of block
never executed: __result = (((const unsigned char *) (const char *) ( "HEX" ))[3] - __s2[3]);
never executed: end of block
never executed: end of block
(__extension__..." , 3 ))) == 0Description
TRUEnever evaluated
FALSEnever evaluated
__builtin_constant_p ( 3 )Description
TRUEnever evaluated
FALSEnever evaluated
__builtin_cons...t_p ( vstart )Description
TRUEnever evaluated
FALSEnever evaluated
strlen ( vstar...size_t) ( 3 ))Description
TRUEnever evaluated
FALSEnever evaluated
__builtin_constant_p ( "HEX" )Description
TRUEnever evaluated
FALSEnever evaluated
strlen ( "HEX"...size_t) ( 3 ))Description
TRUEnever evaluated
FALSEnever evaluated
__s1_len > 0Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s1_len > 1Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s1_len > 2Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s2_len > 0Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s2_len > 1Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s2_len > 2Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
333 arg->format = ASN1_GEN_FORMAT_HEX;
never executed: arg->format = 3;
0
334 else if (strncmp(vstart, "BITLIST", 7) == 0)
never executed: __result = (((const unsigned char *) (const char *) ( vstart ))[3] - __s2[3]);
never executed: end of block
never executed: end of block
never executed: __result = (((const unsigned char *) (const char *) ( "BITLIST" ))[3] - __s2[3]);
never executed: end of block
never executed: end of block
(__extension__..." , 7 ))) == 0Description
TRUEnever evaluated
FALSEnever evaluated
__builtin_constant_p ( 7 )Description
TRUEnever evaluated
FALSEnever evaluated
__builtin_cons...t_p ( vstart )Description
TRUEnever evaluated
FALSEnever evaluated
strlen ( vstar...size_t) ( 7 ))Description
TRUEnever evaluated
FALSEnever evaluated
__builtin_cons... ( "BITLIST" )Description
TRUEnever evaluated
FALSEnever evaluated
strlen ( "BITL...size_t) ( 7 ))Description
TRUEnever evaluated
FALSEnever evaluated
__s1_len > 0Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s1_len > 1Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s1_len > 2Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s2_len > 0Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s2_len > 1Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s2_len > 2Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
335 arg->format = ASN1_GEN_FORMAT_BITLIST;
never executed: arg->format = 4;
0
336 else {-
337 ASN1err(ASN1_F_ASN1_CB, ASN1_R_UNKNOWN_FORMAT);-
338 return -1;
never executed: return -1;
0
339 }-
340 break;
never executed: break;
0
341-
342 }-
343-
344 return 1;
never executed: return 1;
0
345-
346}-
347-
348static int parse_tagging(const char *vstart, int vlen, int *ptag, int *pclass)-
349{-
350 char erch[2];-
351 long tag_num;-
352 char *eptr;-
353 if (!vstart)
!vstartDescription
TRUEnever evaluated
FALSEnever evaluated
0
354 return 0;
never executed: return 0;
0
355 tag_num = strtoul(vstart, &eptr, 10);-
356 /* Check we haven't gone past max length: should be impossible */-
357 if (eptr && *eptr && (eptr > vstart + vlen))
eptrDescription
TRUEnever evaluated
FALSEnever evaluated
*eptrDescription
TRUEnever evaluated
FALSEnever evaluated
(eptr > vstart + vlen)Description
TRUEnever evaluated
FALSEnever evaluated
0
358 return 0;
never executed: return 0;
0
359 if (tag_num < 0) {
tag_num < 0Description
TRUEnever evaluated
FALSEnever evaluated
0
360 ASN1err(ASN1_F_PARSE_TAGGING, ASN1_R_INVALID_NUMBER);-
361 return 0;
never executed: return 0;
0
362 }-
363 *ptag = tag_num;-
364 /* If we have non numeric characters, parse them */-
365 if (eptr)
eptrDescription
TRUEnever evaluated
FALSEnever evaluated
0
366 vlen -= eptr - vstart;
never executed: vlen -= eptr - vstart;
0
367 else-
368 vlen = 0;
never executed: vlen = 0;
0
369 if (vlen) {
vlenDescription
TRUEnever evaluated
FALSEnever evaluated
0
370 switch (*eptr) {-
371-
372 case 'U':
never executed: case 'U':
0
373 *pclass = V_ASN1_UNIVERSAL;-
374 break;
never executed: break;
0
375-
376 case 'A':
never executed: case 'A':
0
377 *pclass = V_ASN1_APPLICATION;-
378 break;
never executed: break;
0
379-
380 case 'P':
never executed: case 'P':
0
381 *pclass = V_ASN1_PRIVATE;-
382 break;
never executed: break;
0
383-
384 case 'C':
never executed: case 'C':
0
385 *pclass = V_ASN1_CONTEXT_SPECIFIC;-
386 break;
never executed: break;
0
387-
388 default:
never executed: default:
0
389 erch[0] = *eptr;-
390 erch[1] = 0;-
391 ASN1err(ASN1_F_PARSE_TAGGING, ASN1_R_INVALID_MODIFIER);-
392 ERR_add_error_data(2, "Char=", erch);-
393 return 0;
never executed: return 0;
0
394-
395 }-
396 } else-
397 *pclass = V_ASN1_CONTEXT_SPECIFIC;
never executed: *pclass = 0x80;
0
398-
399 return 1;
never executed: return 1;
0
400-
401}-
402-
403/* Handle multiple types: SET and SEQUENCE */-
404-
405static ASN1_TYPE *asn1_multi(int utype, const char *section, X509V3_CTX *cnf,-
406 int depth, int *perr)-
407{-
408 ASN1_TYPE *ret = NULL;-
409 STACK_OF(ASN1_TYPE) *sk = NULL;-
410 STACK_OF(CONF_VALUE) *sect = NULL;-
411 unsigned char *der = NULL;-
412 int derlen;-
413 int i;-
414 sk = sk_ASN1_TYPE_new_null();-
415 if (!sk)
!skDescription
TRUEnever evaluated
FALSEnever evaluated
0
416 goto bad;
never executed: goto bad;
0
417 if (section) {
sectionDescription
TRUEnever evaluated
FALSEnever evaluated
0
418 if (!cnf)
!cnfDescription
TRUEnever evaluated
FALSEnever evaluated
0
419 goto bad;
never executed: goto bad;
0
420 sect = X509V3_get_section(cnf, (char *)section);-
421 if (!sect)
!sectDescription
TRUEnever evaluated
FALSEnever evaluated
0
422 goto bad;
never executed: goto bad;
0
423 for (i = 0; i < sk_CONF_VALUE_num(sect); i++) {
i < sk_CONF_VALUE_num(sect)Description
TRUEnever evaluated
FALSEnever evaluated
0
424 ASN1_TYPE *typ =-
425 generate_v3(sk_CONF_VALUE_value(sect, i)->value, cnf,-
426 depth + 1, perr);-
427 if (!typ)
!typDescription
TRUEnever evaluated
FALSEnever evaluated
0
428 goto bad;
never executed: goto bad;
0
429 if (!sk_ASN1_TYPE_push(sk, typ))
!sk_ASN1_TYPE_push(sk, typ)Description
TRUEnever evaluated
FALSEnever evaluated
0
430 goto bad;
never executed: goto bad;
0
431 }
never executed: end of block
0
432 }
never executed: end of block
0
433-
434 /*-
435 * Now we has a STACK of the components, convert to the correct form-
436 */-
437-
438 if (utype == V_ASN1_SET)
utype == 17Description
TRUEnever evaluated
FALSEnever evaluated
0
439 derlen = i2d_ASN1_SET_ANY(sk, &der);
never executed: derlen = i2d_ASN1_SET_ANY(sk, &der);
0
440 else-
441 derlen = i2d_ASN1_SEQUENCE_ANY(sk, &der);
never executed: derlen = i2d_ASN1_SEQUENCE_ANY(sk, &der);
0
442-
443 if (derlen < 0)
derlen < 0Description
TRUEnever evaluated
FALSEnever evaluated
0
444 goto bad;
never executed: goto bad;
0
445 if ((ret = ASN1_TYPE_new()) == NULL)
(ret = ASN1_TY...== ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
446 goto bad;
never executed: goto bad;
0
447 if ((ret->value.asn1_string = ASN1_STRING_type_new(utype)) == NULL)
(ret->value.as...== ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
448 goto bad;
never executed: goto bad;
0
449-
450 ret->type = utype;-
451 ret->value.asn1_string->data = der;-
452 ret->value.asn1_string->length = derlen;-
453-
454 der = NULL;-
455-
456 bad:
code before this statement never executed: bad:
0
457-
458 OPENSSL_free(der);-
459-
460 sk_ASN1_TYPE_pop_free(sk, ASN1_TYPE_free);-
461 X509V3_section_free(cnf, sect);-
462-
463 return ret;
never executed: return ret;
0
464}-
465-
466static int append_exp(tag_exp_arg *arg, int exp_tag, int exp_class,-
467 int exp_constructed, int exp_pad, int imp_ok)-
468{-
469 tag_exp_type *exp_tmp;-
470 /* Can only have IMPLICIT if permitted */-
471 if ((arg->imp_tag != -1) && !imp_ok) {
(arg->imp_tag != -1)Description
TRUEnever evaluated
FALSEnever evaluated
!imp_okDescription
TRUEnever evaluated
FALSEnever evaluated
0
472 ASN1err(ASN1_F_APPEND_EXP, ASN1_R_ILLEGAL_IMPLICIT_TAG);-
473 return 0;
never executed: return 0;
0
474 }-
475-
476 if (arg->exp_count == ASN1_FLAG_EXP_MAX) {
arg->exp_count == 20Description
TRUEnever evaluated
FALSEnever evaluated
0
477 ASN1err(ASN1_F_APPEND_EXP, ASN1_R_DEPTH_EXCEEDED);-
478 return 0;
never executed: return 0;
0
479 }-
480-
481 exp_tmp = &arg->exp_list[arg->exp_count++];-
482-
483 /*-
484 * If IMPLICIT set tag to implicit value then reset implicit tag since it-
485 * has been used.-
486 */-
487 if (arg->imp_tag != -1) {
arg->imp_tag != -1Description
TRUEnever evaluated
FALSEnever evaluated
0
488 exp_tmp->exp_tag = arg->imp_tag;-
489 exp_tmp->exp_class = arg->imp_class;-
490 arg->imp_tag = -1;-
491 arg->imp_class = -1;-
492 } else {
never executed: end of block
0
493 exp_tmp->exp_tag = exp_tag;-
494 exp_tmp->exp_class = exp_class;-
495 }
never executed: end of block
0
496 exp_tmp->exp_constructed = exp_constructed;-
497 exp_tmp->exp_pad = exp_pad;-
498-
499 return 1;
never executed: return 1;
0
500}-
501-
502static int asn1_str2tag(const char *tagstr, int len)-
503{-
504 unsigned int i;-
505 static const struct tag_name_st *tntmp, tnst[] = {-
506 ASN1_GEN_STR("BOOL", V_ASN1_BOOLEAN),-
507 ASN1_GEN_STR("BOOLEAN", V_ASN1_BOOLEAN),-
508 ASN1_GEN_STR("NULL", V_ASN1_NULL),-
509 ASN1_GEN_STR("INT", V_ASN1_INTEGER),-
510 ASN1_GEN_STR("INTEGER", V_ASN1_INTEGER),-
511 ASN1_GEN_STR("ENUM", V_ASN1_ENUMERATED),-
512 ASN1_GEN_STR("ENUMERATED", V_ASN1_ENUMERATED),-
513 ASN1_GEN_STR("OID", V_ASN1_OBJECT),-
514 ASN1_GEN_STR("OBJECT", V_ASN1_OBJECT),-
515 ASN1_GEN_STR("UTCTIME", V_ASN1_UTCTIME),-
516 ASN1_GEN_STR("UTC", V_ASN1_UTCTIME),-
517 ASN1_GEN_STR("GENERALIZEDTIME", V_ASN1_GENERALIZEDTIME),-
518 ASN1_GEN_STR("GENTIME", V_ASN1_GENERALIZEDTIME),-
519 ASN1_GEN_STR("OCT", V_ASN1_OCTET_STRING),-
520 ASN1_GEN_STR("OCTETSTRING", V_ASN1_OCTET_STRING),-
521 ASN1_GEN_STR("BITSTR", V_ASN1_BIT_STRING),-
522 ASN1_GEN_STR("BITSTRING", V_ASN1_BIT_STRING),-
523 ASN1_GEN_STR("UNIVERSALSTRING", V_ASN1_UNIVERSALSTRING),-
524 ASN1_GEN_STR("UNIV", V_ASN1_UNIVERSALSTRING),-
525 ASN1_GEN_STR("IA5", V_ASN1_IA5STRING),-
526 ASN1_GEN_STR("IA5STRING", V_ASN1_IA5STRING),-
527 ASN1_GEN_STR("UTF8", V_ASN1_UTF8STRING),-
528 ASN1_GEN_STR("UTF8String", V_ASN1_UTF8STRING),-
529 ASN1_GEN_STR("BMP", V_ASN1_BMPSTRING),-
530 ASN1_GEN_STR("BMPSTRING", V_ASN1_BMPSTRING),-
531 ASN1_GEN_STR("VISIBLESTRING", V_ASN1_VISIBLESTRING),-
532 ASN1_GEN_STR("VISIBLE", V_ASN1_VISIBLESTRING),-
533 ASN1_GEN_STR("PRINTABLESTRING", V_ASN1_PRINTABLESTRING),-
534 ASN1_GEN_STR("PRINTABLE", V_ASN1_PRINTABLESTRING),-
535 ASN1_GEN_STR("T61", V_ASN1_T61STRING),-
536 ASN1_GEN_STR("T61STRING", V_ASN1_T61STRING),-
537 ASN1_GEN_STR("TELETEXSTRING", V_ASN1_T61STRING),-
538 ASN1_GEN_STR("GeneralString", V_ASN1_GENERALSTRING),-
539 ASN1_GEN_STR("GENSTR", V_ASN1_GENERALSTRING),-
540 ASN1_GEN_STR("NUMERIC", V_ASN1_NUMERICSTRING),-
541 ASN1_GEN_STR("NUMERICSTRING", V_ASN1_NUMERICSTRING),-
542-
543 /* Special cases */-
544 ASN1_GEN_STR("SEQUENCE", V_ASN1_SEQUENCE),-
545 ASN1_GEN_STR("SEQ", V_ASN1_SEQUENCE),-
546 ASN1_GEN_STR("SET", V_ASN1_SET),-
547 /* type modifiers */-
548 /* Explicit tag */-
549 ASN1_GEN_STR("EXP", ASN1_GEN_FLAG_EXP),-
550 ASN1_GEN_STR("EXPLICIT", ASN1_GEN_FLAG_EXP),-
551 /* Implicit tag */-
552 ASN1_GEN_STR("IMP", ASN1_GEN_FLAG_IMP),-
553 ASN1_GEN_STR("IMPLICIT", ASN1_GEN_FLAG_IMP),-
554 /* OCTET STRING wrapper */-
555 ASN1_GEN_STR("OCTWRAP", ASN1_GEN_FLAG_OCTWRAP),-
556 /* SEQUENCE wrapper */-
557 ASN1_GEN_STR("SEQWRAP", ASN1_GEN_FLAG_SEQWRAP),-
558 /* SET wrapper */-
559 ASN1_GEN_STR("SETWRAP", ASN1_GEN_FLAG_SETWRAP),-
560 /* BIT STRING wrapper */-
561 ASN1_GEN_STR("BITWRAP", ASN1_GEN_FLAG_BITWRAP),-
562 ASN1_GEN_STR("FORM", ASN1_GEN_FLAG_FORMAT),-
563 ASN1_GEN_STR("FORMAT", ASN1_GEN_FLAG_FORMAT),-
564 };-
565-
566 if (len == -1)
len == -1Description
TRUEnever evaluated
FALSEnever evaluated
0
567 len = strlen(tagstr);
never executed: len = strlen(tagstr);
0
568-
569 tntmp = tnst;-
570 for (i = 0; i < OSSL_NELEM(tnst); i++, tntmp++) {
i < (sizeof(tn...of((tnst)[0]))Description
TRUEnever evaluated
FALSEnever evaluated
0
571 if ((len == tntmp->len) && (strncmp(tntmp->strnam, tagstr, len) == 0))
never executed: __result = (((const unsigned char *) (const char *) ( tntmp->strnam ))[3] - __s2[3]);
never executed: end of block
never executed: end of block
never executed: __result = (((const unsigned char *) (const char *) ( tagstr ))[3] - __s2[3]);
never executed: end of block
never executed: end of block
(len == tntmp->len)Description
TRUEnever evaluated
FALSEnever evaluated
( (__extension... len ))) == 0)Description
TRUEnever evaluated
FALSEnever evaluated
__builtin_constant_p ( len )Description
TRUEnever evaluated
FALSEnever evaluated
__builtin_cons...ntmp->strnam )Description
TRUEnever evaluated
FALSEnever evaluated
strlen ( tntmp...ze_t) ( len ))Description
TRUEnever evaluated
FALSEnever evaluated
__builtin_cons...t_p ( tagstr )Description
TRUEnever evaluated
FALSEnever evaluated
strlen ( tagst...ze_t) ( len ))Description
TRUEnever evaluated
FALSEnever evaluated
__s1_len > 0Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s1_len > 1Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s1_len > 2Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s2_len > 0Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s2_len > 1Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s2_len > 2Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
572 return tntmp->tag;
never executed: return tntmp->tag;
0
573 }
never executed: end of block
0
574-
575 return -1;
never executed: return -1;
0
576}-
577-
578static ASN1_TYPE *asn1_str2type(const char *str, int format, int utype)-
579{-
580 ASN1_TYPE *atmp = NULL;-
581 CONF_VALUE vtmp;-
582 unsigned char *rdata;-
583 long rdlen;-
584 int no_unused = 1;-
585-
586 if ((atmp = ASN1_TYPE_new()) == NULL) {
(atmp = ASN1_T...== ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
587 ASN1err(ASN1_F_ASN1_STR2TYPE, ERR_R_MALLOC_FAILURE);-
588 return NULL;
never executed: return ((void *)0) ;
0
589 }-
590-
591 if (!str)
!strDescription
TRUEnever evaluated
FALSEnever evaluated
0
592 str = "";
never executed: str = "";
0
593-
594 switch (utype) {-
595-
596 case V_ASN1_NULL:
never executed: case 5:
0
597 if (str && *str) {
strDescription
TRUEnever evaluated
FALSEnever evaluated
*strDescription
TRUEnever evaluated
FALSEnever evaluated
0
598 ASN1err(ASN1_F_ASN1_STR2TYPE, ASN1_R_ILLEGAL_NULL_VALUE);-
599 goto bad_form;
never executed: goto bad_form;
0
600 }-
601 break;
never executed: break;
0
602-
603 case V_ASN1_BOOLEAN:
never executed: case 1:
0
604 if (format != ASN1_GEN_FORMAT_ASCII) {
format != 1Description
TRUEnever evaluated
FALSEnever evaluated
0
605 ASN1err(ASN1_F_ASN1_STR2TYPE, ASN1_R_NOT_ASCII_FORMAT);-
606 goto bad_form;
never executed: goto bad_form;
0
607 }-
608 vtmp.name = NULL;-
609 vtmp.section = NULL;-
610 vtmp.value = (char *)str;-
611 if (!X509V3_get_value_bool(&vtmp, &atmp->value.boolean)) {
!X509V3_get_va...value.boolean)Description
TRUEnever evaluated
FALSEnever evaluated
0
612 ASN1err(ASN1_F_ASN1_STR2TYPE, ASN1_R_ILLEGAL_BOOLEAN);-
613 goto bad_str;
never executed: goto bad_str;
0
614 }-
615 break;
never executed: break;
0
616-
617 case V_ASN1_INTEGER:
never executed: case 2:
0
618 case V_ASN1_ENUMERATED:
never executed: case 10:
0
619 if (format != ASN1_GEN_FORMAT_ASCII) {
format != 1Description
TRUEnever evaluated
FALSEnever evaluated
0
620 ASN1err(ASN1_F_ASN1_STR2TYPE, ASN1_R_INTEGER_NOT_ASCII_FORMAT);-
621 goto bad_form;
never executed: goto bad_form;
0
622 }-
623 if ((atmp->value.integer
(atmp->value.i...== ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
624 = s2i_ASN1_INTEGER(NULL, str)) == NULL) {
(atmp->value.i...== ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
625 ASN1err(ASN1_F_ASN1_STR2TYPE, ASN1_R_ILLEGAL_INTEGER);-
626 goto bad_str;
never executed: goto bad_str;
0
627 }-
628 break;
never executed: break;
0
629-
630 case V_ASN1_OBJECT:
never executed: case 6:
0
631 if (format != ASN1_GEN_FORMAT_ASCII) {
format != 1Description
TRUEnever evaluated
FALSEnever evaluated
0
632 ASN1err(ASN1_F_ASN1_STR2TYPE, ASN1_R_OBJECT_NOT_ASCII_FORMAT);-
633 goto bad_form;
never executed: goto bad_form;
0
634 }-
635 if ((atmp->value.object = OBJ_txt2obj(str, 0)) == NULL) {
(atmp->value.o...== ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
636 ASN1err(ASN1_F_ASN1_STR2TYPE, ASN1_R_ILLEGAL_OBJECT);-
637 goto bad_str;
never executed: goto bad_str;
0
638 }-
639 break;
never executed: break;
0
640-
641 case V_ASN1_UTCTIME:
never executed: case 23:
0
642 case V_ASN1_GENERALIZEDTIME:
never executed: case 24:
0
643 if (format != ASN1_GEN_FORMAT_ASCII) {
format != 1Description
TRUEnever evaluated
FALSEnever evaluated
0
644 ASN1err(ASN1_F_ASN1_STR2TYPE, ASN1_R_TIME_NOT_ASCII_FORMAT);-
645 goto bad_form;
never executed: goto bad_form;
0
646 }-
647 if ((atmp->value.asn1_string = ASN1_STRING_new()) == NULL) {
(atmp->value.a...== ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
648 ASN1err(ASN1_F_ASN1_STR2TYPE, ERR_R_MALLOC_FAILURE);-
649 goto bad_str;
never executed: goto bad_str;
0
650 }-
651 if (!ASN1_STRING_set(atmp->value.asn1_string, str, -1)) {
!ASN1_STRING_s...ring, str, -1)Description
TRUEnever evaluated
FALSEnever evaluated
0
652 ASN1err(ASN1_F_ASN1_STR2TYPE, ERR_R_MALLOC_FAILURE);-
653 goto bad_str;
never executed: goto bad_str;
0
654 }-
655 atmp->value.asn1_string->type = utype;-
656 if (!ASN1_TIME_check(atmp->value.asn1_string)) {
!ASN1_TIME_che...e.asn1_string)Description
TRUEnever evaluated
FALSEnever evaluated
0
657 ASN1err(ASN1_F_ASN1_STR2TYPE, ASN1_R_ILLEGAL_TIME_VALUE);-
658 goto bad_str;
never executed: goto bad_str;
0
659 }-
660-
661 break;
never executed: break;
0
662-
663 case V_ASN1_BMPSTRING:
never executed: case 30:
0
664 case V_ASN1_PRINTABLESTRING:
never executed: case 19:
0
665 case V_ASN1_IA5STRING:
never executed: case 22:
0
666 case V_ASN1_T61STRING:
never executed: case 20:
0
667 case V_ASN1_UTF8STRING:
never executed: case 12:
0
668 case V_ASN1_VISIBLESTRING:
never executed: case 26:
0
669 case V_ASN1_UNIVERSALSTRING:
never executed: case 28:
0
670 case V_ASN1_GENERALSTRING:
never executed: case 27:
0
671 case V_ASN1_NUMERICSTRING:
never executed: case 18:
0
672 if (format == ASN1_GEN_FORMAT_ASCII)
format == 1Description
TRUEnever evaluated
FALSEnever evaluated
0
673 format = MBSTRING_ASC;
never executed: format = (0x1000|1);
0
674 else if (format == ASN1_GEN_FORMAT_UTF8)
format == 2Description
TRUEnever evaluated
FALSEnever evaluated
0
675 format = MBSTRING_UTF8;
never executed: format = (0x1000);
0
676 else {-
677 ASN1err(ASN1_F_ASN1_STR2TYPE, ASN1_R_ILLEGAL_FORMAT);-
678 goto bad_form;
never executed: goto bad_form;
0
679 }-
680-
681 if (ASN1_mbstring_copy(&atmp->value.asn1_string, (unsigned char *)str,
ASN1_mbstring_...t(utype)) <= 0Description
TRUEnever evaluated
FALSEnever evaluated
0
682 -1, format, ASN1_tag2bit(utype)) <= 0) {
ASN1_mbstring_...t(utype)) <= 0Description
TRUEnever evaluated
FALSEnever evaluated
0
683 ASN1err(ASN1_F_ASN1_STR2TYPE, ERR_R_MALLOC_FAILURE);-
684 goto bad_str;
never executed: goto bad_str;
0
685 }-
686-
687 break;
never executed: break;
0
688-
689 case V_ASN1_BIT_STRING:
never executed: case 3:
0
690 case V_ASN1_OCTET_STRING:
never executed: case 4:
0
691 if ((atmp->value.asn1_string = ASN1_STRING_new()) == NULL) {
(atmp->value.a...== ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
692 ASN1err(ASN1_F_ASN1_STR2TYPE, ERR_R_MALLOC_FAILURE);-
693 goto bad_form;
never executed: goto bad_form;
0
694 }-
695-
696 if (format == ASN1_GEN_FORMAT_HEX) {
format == 3Description
TRUEnever evaluated
FALSEnever evaluated
0
697 if ((rdata = OPENSSL_hexstr2buf(str, &rdlen)) == NULL) {
(rdata = OPENS...== ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
698 ASN1err(ASN1_F_ASN1_STR2TYPE, ASN1_R_ILLEGAL_HEX);-
699 goto bad_str;
never executed: goto bad_str;
0
700 }-
701 atmp->value.asn1_string->data = rdata;-
702 atmp->value.asn1_string->length = rdlen;-
703 atmp->value.asn1_string->type = utype;-
704 } else if (format == ASN1_GEN_FORMAT_ASCII)
never executed: end of block
format == 1Description
TRUEnever evaluated
FALSEnever evaluated
0
705 ASN1_STRING_set(atmp->value.asn1_string, str, -1);
never executed: ASN1_STRING_set(atmp->value.asn1_string, str, -1);
0
706 else if ((format == ASN1_GEN_FORMAT_BITLIST)
(format == 4)Description
TRUEnever evaluated
FALSEnever evaluated
0
707 && (utype == V_ASN1_BIT_STRING)) {
(utype == 3)Description
TRUEnever evaluated
FALSEnever evaluated
0
708 if (!CONF_parse_list
!CONF_parse_li...ue.bit_string)Description
TRUEnever evaluated
FALSEnever evaluated
0
709 (str, ',', 1, bitstr_cb, atmp->value.bit_string)) {
!CONF_parse_li...ue.bit_string)Description
TRUEnever evaluated
FALSEnever evaluated
0
710 ASN1err(ASN1_F_ASN1_STR2TYPE, ASN1_R_LIST_ERROR);-
711 goto bad_str;
never executed: goto bad_str;
0
712 }-
713 no_unused = 0;-
714-
715 } else {
never executed: end of block
0
716 ASN1err(ASN1_F_ASN1_STR2TYPE, ASN1_R_ILLEGAL_BITSTRING_FORMAT);-
717 goto bad_form;
never executed: goto bad_form;
0
718 }-
719-
720 if ((utype == V_ASN1_BIT_STRING) && no_unused) {
(utype == 3)Description
TRUEnever evaluated
FALSEnever evaluated
no_unusedDescription
TRUEnever evaluated
FALSEnever evaluated
0
721 atmp->value.asn1_string->flags-
722 &= ~(ASN1_STRING_FLAG_BITS_LEFT | 0x07);-
723 atmp->value.asn1_string->flags |= ASN1_STRING_FLAG_BITS_LEFT;-
724 }
never executed: end of block
0
725-
726 break;
never executed: break;
0
727-
728 default:
never executed: default:
0
729 ASN1err(ASN1_F_ASN1_STR2TYPE, ASN1_R_UNSUPPORTED_TYPE);-
730 goto bad_str;
never executed: goto bad_str;
0
731 }-
732-
733 atmp->type = utype;-
734 return atmp;
never executed: return atmp;
0
735-
736 bad_str:-
737 ERR_add_error_data(2, "string=", str);-
738 bad_form:
code before this statement never executed: bad_form:
0
739-
740 ASN1_TYPE_free(atmp);-
741 return NULL;
never executed: return ((void *)0) ;
0
742-
743}-
744-
745static int bitstr_cb(const char *elem, int len, void *bitstr)-
746{-
747 long bitnum;-
748 char *eptr;-
749 if (!elem)
!elemDescription
TRUEnever evaluated
FALSEnever evaluated
0
750 return 0;
never executed: return 0;
0
751 bitnum = strtoul(elem, &eptr, 10);-
752 if (eptr && *eptr && (eptr != elem + len))
eptrDescription
TRUEnever evaluated
FALSEnever evaluated
*eptrDescription
TRUEnever evaluated
FALSEnever evaluated
(eptr != elem + len)Description
TRUEnever evaluated
FALSEnever evaluated
0
753 return 0;
never executed: return 0;
0
754 if (bitnum < 0) {
bitnum < 0Description
TRUEnever evaluated
FALSEnever evaluated
0
755 ASN1err(ASN1_F_BITSTR_CB, ASN1_R_INVALID_NUMBER);-
756 return 0;
never executed: return 0;
0
757 }-
758 if (!ASN1_BIT_STRING_set_bit(bitstr, bitnum, 1)) {
!ASN1_BIT_STRI...tr, bitnum, 1)Description
TRUEnever evaluated
FALSEnever evaluated
0
759 ASN1err(ASN1_F_BITSTR_CB, ERR_R_MALLOC_FAILURE);-
760 return 0;
never executed: return 0;
0
761 }-
762 return 1;
never executed: return 1;
0
763}-
764-
765static int mask_cb(const char *elem, int len, void *arg)-
766{-
767 unsigned long *pmask = arg, tmpmask;-
768 int tag;-
769 if (elem == NULL)
elem == ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
770 return 0;
never executed: return 0;
0
771 if ((len == 3) && (strncmp(elem, "DIR", 3) == 0)) {
never executed: __result = (((const unsigned char *) (const char *) ( elem ))[3] - __s2[3]);
never executed: end of block
never executed: end of block
never executed: __result = (((const unsigned char *) (const char *) ( "DIR" ))[3] - __s2[3]);
never executed: end of block
never executed: end of block
(len == 3)Description
TRUEnever evaluated
FALSEnever evaluated
( (__extension... , 3 ))) == 0)Description
TRUEnever evaluated
FALSEnever evaluated
__builtin_constant_p ( 3 )Description
TRUEnever evaluated
FALSEnever evaluated
__builtin_constant_p ( elem )Description
TRUEnever evaluated
FALSEnever evaluated
strlen ( elem ...size_t) ( 3 ))Description
TRUEnever evaluated
FALSEnever evaluated
__builtin_constant_p ( "DIR" )Description
TRUEnever evaluated
FALSEnever evaluated
strlen ( "DIR"...size_t) ( 3 ))Description
TRUEnever evaluated
FALSEnever evaluated
__s1_len > 0Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s1_len > 1Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s1_len > 2Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s2_len > 0Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s2_len > 1Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s2_len > 2Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
772 *pmask |= B_ASN1_DIRECTORYSTRING;-
773 return 1;
never executed: return 1;
0
774 }-
775 tag = asn1_str2tag(elem, len);-
776 if (!tag || (tag & ASN1_GEN_FLAG))
!tagDescription
TRUEnever evaluated
FALSEnever evaluated
(tag & 0x10000)Description
TRUEnever evaluated
FALSEnever evaluated
0
777 return 0;
never executed: return 0;
0
778 tmpmask = ASN1_tag2bit(tag);-
779 if (!tmpmask)
!tmpmaskDescription
TRUEnever evaluated
FALSEnever evaluated
0
780 return 0;
never executed: return 0;
0
781 *pmask |= tmpmask;-
782 return 1;
never executed: return 1;
0
783}-
784-
785int ASN1_str2mask(const char *str, unsigned long *pmask)-
786{-
787 *pmask = 0;-
788 return CONF_parse_list(str, '|', 1, mask_cb, pmask);
never executed: return CONF_parse_list(str, '|', 1, mask_cb, pmask);
0
789}-
Source codeSwitch to Preprocessed file

Generated by Squish Coco 4.2.2