diff options
-rw-r--r-- | src/lib/libcrypto/x509v3/v3_ncons.c | 258 | ||||
-rw-r--r-- | src/lib/libcrypto/x509v3/v3_ocsp.c | 230 | ||||
-rw-r--r-- | src/lib/libssl/src/crypto/x509v3/v3_ncons.c | 258 | ||||
-rw-r--r-- | src/lib/libssl/src/crypto/x509v3/v3_ocsp.c | 230 |
4 files changed, 498 insertions, 478 deletions
diff --git a/src/lib/libcrypto/x509v3/v3_ncons.c b/src/lib/libcrypto/x509v3/v3_ncons.c index a01dc64dd2..695176471b 100644 --- a/src/lib/libcrypto/x509v3/v3_ncons.c +++ b/src/lib/libcrypto/x509v3/v3_ncons.c | |||
@@ -10,7 +10,7 @@ | |||
10 | * are met: | 10 | * are met: |
11 | * | 11 | * |
12 | * 1. Redistributions of source code must retain the above copyright | 12 | * 1. Redistributions of source code must retain the above copyright |
13 | * notice, this list of conditions and the following disclaimer. | 13 | * notice, this list of conditions and the following disclaimer. |
14 | * | 14 | * |
15 | * 2. Redistributions in binary form must reproduce the above copyright | 15 | * 2. Redistributions in binary form must reproduce the above copyright |
16 | * notice, this list of conditions and the following disclaimer in | 16 | * notice, this list of conditions and the following disclaimer in |
@@ -64,12 +64,11 @@ | |||
64 | #include <openssl/x509v3.h> | 64 | #include <openssl/x509v3.h> |
65 | 65 | ||
66 | static void *v2i_NAME_CONSTRAINTS(const X509V3_EXT_METHOD *method, | 66 | static void *v2i_NAME_CONSTRAINTS(const X509V3_EXT_METHOD *method, |
67 | X509V3_CTX *ctx, STACK_OF(CONF_VALUE) *nval); | 67 | X509V3_CTX *ctx, STACK_OF(CONF_VALUE) *nval); |
68 | static int i2r_NAME_CONSTRAINTS(const X509V3_EXT_METHOD *method, | 68 | static int i2r_NAME_CONSTRAINTS(const X509V3_EXT_METHOD *method, |
69 | void *a, BIO *bp, int ind); | 69 | void *a, BIO *bp, int ind); |
70 | static int do_i2r_name_constraints(const X509V3_EXT_METHOD *method, | 70 | static int do_i2r_name_constraints(const X509V3_EXT_METHOD *method, |
71 | STACK_OF(GENERAL_SUBTREE) *trees, | 71 | STACK_OF(GENERAL_SUBTREE) *trees, BIO *bp, int ind, char *name); |
72 | BIO *bp, int ind, char *name); | ||
73 | static int print_nc_ipadd(BIO *bp, ASN1_OCTET_STRING *ip); | 72 | static int print_nc_ipadd(BIO *bp, ASN1_OCTET_STRING *ip); |
74 | 73 | ||
75 | static int nc_match(GENERAL_NAME *gen, NAME_CONSTRAINTS *nc); | 74 | static int nc_match(GENERAL_NAME *gen, NAME_CONSTRAINTS *nc); |
@@ -82,10 +81,10 @@ static int nc_uri(ASN1_IA5STRING *uri, ASN1_IA5STRING *base); | |||
82 | const X509V3_EXT_METHOD v3_name_constraints = { | 81 | const X509V3_EXT_METHOD v3_name_constraints = { |
83 | NID_name_constraints, 0, | 82 | NID_name_constraints, 0, |
84 | ASN1_ITEM_ref(NAME_CONSTRAINTS), | 83 | ASN1_ITEM_ref(NAME_CONSTRAINTS), |
85 | 0,0,0,0, | 84 | 0, 0, 0, 0, |
86 | 0,0, | 85 | 0, 0, |
87 | 0, v2i_NAME_CONSTRAINTS, | 86 | 0, v2i_NAME_CONSTRAINTS, |
88 | i2r_NAME_CONSTRAINTS,0, | 87 | i2r_NAME_CONSTRAINTS, 0, |
89 | NULL | 88 | NULL |
90 | }; | 89 | }; |
91 | 90 | ||
@@ -97,44 +96,41 @@ ASN1_SEQUENCE(GENERAL_SUBTREE) = { | |||
97 | 96 | ||
98 | ASN1_SEQUENCE(NAME_CONSTRAINTS) = { | 97 | ASN1_SEQUENCE(NAME_CONSTRAINTS) = { |
99 | ASN1_IMP_SEQUENCE_OF_OPT(NAME_CONSTRAINTS, permittedSubtrees, | 98 | ASN1_IMP_SEQUENCE_OF_OPT(NAME_CONSTRAINTS, permittedSubtrees, |
100 | GENERAL_SUBTREE, 0), | 99 | GENERAL_SUBTREE, 0), |
101 | ASN1_IMP_SEQUENCE_OF_OPT(NAME_CONSTRAINTS, excludedSubtrees, | 100 | ASN1_IMP_SEQUENCE_OF_OPT(NAME_CONSTRAINTS, excludedSubtrees, |
102 | GENERAL_SUBTREE, 1), | 101 | GENERAL_SUBTREE, 1), |
103 | } ASN1_SEQUENCE_END(NAME_CONSTRAINTS) | 102 | } ASN1_SEQUENCE_END(NAME_CONSTRAINTS) |
104 | 103 | ||
105 | 104 | ||
106 | IMPLEMENT_ASN1_ALLOC_FUNCTIONS(GENERAL_SUBTREE) | 105 | IMPLEMENT_ASN1_ALLOC_FUNCTIONS(GENERAL_SUBTREE) |
107 | IMPLEMENT_ASN1_ALLOC_FUNCTIONS(NAME_CONSTRAINTS) | 106 | IMPLEMENT_ASN1_ALLOC_FUNCTIONS(NAME_CONSTRAINTS) |
108 | 107 | ||
109 | static void *v2i_NAME_CONSTRAINTS(const X509V3_EXT_METHOD *method, | 108 | static void * |
110 | X509V3_CTX *ctx, STACK_OF(CONF_VALUE) *nval) | 109 | v2i_NAME_CONSTRAINTS(const X509V3_EXT_METHOD *method, X509V3_CTX *ctx, |
111 | { | 110 | STACK_OF(CONF_VALUE) *nval) |
111 | { | ||
112 | int i; | 112 | int i; |
113 | CONF_VALUE tval, *val; | 113 | CONF_VALUE tval, *val; |
114 | STACK_OF(GENERAL_SUBTREE) **ptree = NULL; | 114 | STACK_OF(GENERAL_SUBTREE) **ptree = NULL; |
115 | NAME_CONSTRAINTS *ncons = NULL; | 115 | NAME_CONSTRAINTS *ncons = NULL; |
116 | GENERAL_SUBTREE *sub = NULL; | 116 | GENERAL_SUBTREE *sub = NULL; |
117 | |||
117 | ncons = NAME_CONSTRAINTS_new(); | 118 | ncons = NAME_CONSTRAINTS_new(); |
118 | if (!ncons) | 119 | if (!ncons) |
119 | goto memerr; | 120 | goto memerr; |
120 | for(i = 0; i < sk_CONF_VALUE_num(nval); i++) | 121 | for (i = 0; i < sk_CONF_VALUE_num(nval); i++) { |
121 | { | ||
122 | val = sk_CONF_VALUE_value(nval, i); | 122 | val = sk_CONF_VALUE_value(nval, i); |
123 | if (!strncmp(val->name, "permitted", 9) && val->name[9]) | 123 | if (!strncmp(val->name, "permitted", 9) && val->name[9]) { |
124 | { | ||
125 | ptree = &ncons->permittedSubtrees; | 124 | ptree = &ncons->permittedSubtrees; |
126 | tval.name = val->name + 10; | 125 | tval.name = val->name + 10; |
127 | } | 126 | } else if (!strncmp(val->name, "excluded", 8) && val->name[8]) { |
128 | else if (!strncmp(val->name, "excluded", 8) && val->name[8]) | ||
129 | { | ||
130 | ptree = &ncons->excludedSubtrees; | 127 | ptree = &ncons->excludedSubtrees; |
131 | tval.name = val->name + 9; | 128 | tval.name = val->name + 9; |
132 | } | 129 | } else { |
133 | else | 130 | X509V3err(X509V3_F_V2I_NAME_CONSTRAINTS, |
134 | { | 131 | X509V3_R_INVALID_SYNTAX); |
135 | X509V3err(X509V3_F_V2I_NAME_CONSTRAINTS, X509V3_R_INVALID_SYNTAX); | ||
136 | goto err; | 132 | goto err; |
137 | } | 133 | } |
138 | tval.value = val->value; | 134 | tval.value = val->value; |
139 | sub = GENERAL_SUBTREE_new(); | 135 | sub = GENERAL_SUBTREE_new(); |
140 | if (!v2i_GENERAL_NAME_ex(sub->base, method, ctx, &tval, 1)) | 136 | if (!v2i_GENERAL_NAME_ex(sub->base, method, ctx, &tval, 1)) |
@@ -144,45 +140,43 @@ static void *v2i_NAME_CONSTRAINTS(const X509V3_EXT_METHOD *method, | |||
144 | if (!*ptree || !sk_GENERAL_SUBTREE_push(*ptree, sub)) | 140 | if (!*ptree || !sk_GENERAL_SUBTREE_push(*ptree, sub)) |
145 | goto memerr; | 141 | goto memerr; |
146 | sub = NULL; | 142 | sub = NULL; |
147 | } | 143 | } |
148 | 144 | ||
149 | return ncons; | 145 | return ncons; |
150 | 146 | ||
151 | memerr: | 147 | memerr: |
152 | X509V3err(X509V3_F_V2I_NAME_CONSTRAINTS, ERR_R_MALLOC_FAILURE); | 148 | X509V3err(X509V3_F_V2I_NAME_CONSTRAINTS, ERR_R_MALLOC_FAILURE); |
153 | err: | 149 | err: |
154 | if (ncons) | 150 | if (ncons) |
155 | NAME_CONSTRAINTS_free(ncons); | 151 | NAME_CONSTRAINTS_free(ncons); |
156 | if (sub) | 152 | if (sub) |
157 | GENERAL_SUBTREE_free(sub); | 153 | GENERAL_SUBTREE_free(sub); |
158 | 154 | ||
159 | return NULL; | 155 | return NULL; |
160 | } | 156 | } |
161 | |||
162 | 157 | ||
163 | 158 | static int | |
164 | 159 | i2r_NAME_CONSTRAINTS(const X509V3_EXT_METHOD *method, void *a, BIO *bp, int ind) | |
165 | static int i2r_NAME_CONSTRAINTS(const X509V3_EXT_METHOD *method, void *a, | 160 | { |
166 | BIO *bp, int ind) | ||
167 | { | ||
168 | NAME_CONSTRAINTS *ncons = a; | 161 | NAME_CONSTRAINTS *ncons = a; |
162 | |||
169 | do_i2r_name_constraints(method, ncons->permittedSubtrees, | 163 | do_i2r_name_constraints(method, ncons->permittedSubtrees, |
170 | bp, ind, "Permitted"); | 164 | bp, ind, "Permitted"); |
171 | do_i2r_name_constraints(method, ncons->excludedSubtrees, | 165 | do_i2r_name_constraints(method, ncons->excludedSubtrees, |
172 | bp, ind, "Excluded"); | 166 | bp, ind, "Excluded"); |
173 | return 1; | 167 | return 1; |
174 | } | 168 | } |
175 | 169 | ||
176 | static int do_i2r_name_constraints(const X509V3_EXT_METHOD *method, | 170 | static int |
177 | STACK_OF(GENERAL_SUBTREE) *trees, | 171 | do_i2r_name_constraints(const X509V3_EXT_METHOD *method, |
178 | BIO *bp, int ind, char *name) | 172 | STACK_OF(GENERAL_SUBTREE) *trees, BIO *bp, int ind, char *name) |
179 | { | 173 | { |
180 | GENERAL_SUBTREE *tree; | 174 | GENERAL_SUBTREE *tree; |
181 | int i; | 175 | int i; |
176 | |||
182 | if (sk_GENERAL_SUBTREE_num(trees) > 0) | 177 | if (sk_GENERAL_SUBTREE_num(trees) > 0) |
183 | BIO_printf(bp, "%*s%s:\n", ind, "", name); | 178 | BIO_printf(bp, "%*s%s:\n", ind, "", name); |
184 | for(i = 0; i < sk_GENERAL_SUBTREE_num(trees); i++) | 179 | for (i = 0; i < sk_GENERAL_SUBTREE_num(trees); i++) { |
185 | { | ||
186 | tree = sk_GENERAL_SUBTREE_value(trees, i); | 180 | tree = sk_GENERAL_SUBTREE_value(trees, i); |
187 | BIO_printf(bp, "%*s", ind + 2, ""); | 181 | BIO_printf(bp, "%*s", ind + 2, ""); |
188 | if (tree->base->type == GEN_IPADD) | 182 | if (tree->base->type == GEN_IPADD) |
@@ -190,39 +184,35 @@ static int do_i2r_name_constraints(const X509V3_EXT_METHOD *method, | |||
190 | else | 184 | else |
191 | GENERAL_NAME_print(bp, tree->base); | 185 | GENERAL_NAME_print(bp, tree->base); |
192 | BIO_puts(bp, "\n"); | 186 | BIO_puts(bp, "\n"); |
193 | } | ||
194 | return 1; | ||
195 | } | 187 | } |
188 | return 1; | ||
189 | } | ||
196 | 190 | ||
197 | static int print_nc_ipadd(BIO *bp, ASN1_OCTET_STRING *ip) | 191 | static int |
198 | { | 192 | print_nc_ipadd(BIO *bp, ASN1_OCTET_STRING *ip) |
193 | { | ||
199 | int i, len; | 194 | int i, len; |
200 | unsigned char *p; | 195 | unsigned char *p; |
196 | |||
201 | p = ip->data; | 197 | p = ip->data; |
202 | len = ip->length; | 198 | len = ip->length; |
203 | BIO_puts(bp, "IP:"); | 199 | BIO_puts(bp, "IP:"); |
204 | if(len == 8) | 200 | if (len == 8) { |
205 | { | ||
206 | BIO_printf(bp, "%d.%d.%d.%d/%d.%d.%d.%d", | 201 | BIO_printf(bp, "%d.%d.%d.%d/%d.%d.%d.%d", |
207 | p[0], p[1], p[2], p[3], | 202 | p[0], p[1], p[2], p[3], p[4], p[5], p[6], p[7]); |
208 | p[4], p[5], p[6], p[7]); | 203 | } else if (len == 32) { |
209 | } | 204 | for (i = 0; i < 16; i++) { |
210 | else if(len == 32) | ||
211 | { | ||
212 | for (i = 0; i < 16; i++) | ||
213 | { | ||
214 | BIO_printf(bp, "%X", p[0] << 8 | p[1]); | 205 | BIO_printf(bp, "%X", p[0] << 8 | p[1]); |
215 | p += 2; | 206 | p += 2; |
216 | if (i == 7) | 207 | if (i == 7) |
217 | BIO_puts(bp, "/"); | 208 | BIO_puts(bp, "/"); |
218 | else if (i != 15) | 209 | else if (i != 15) |
219 | BIO_puts(bp, ":"); | 210 | BIO_puts(bp, ":"); |
220 | } | ||
221 | } | 211 | } |
222 | else | 212 | } else |
223 | BIO_printf(bp, "IP Address:<invalid>"); | 213 | BIO_printf(bp, "IP Address:<invalid>"); |
224 | return 1; | 214 | return 1; |
225 | } | 215 | } |
226 | 216 | ||
227 | /* Check a certificate conforms to a specified set of constraints. | 217 | /* Check a certificate conforms to a specified set of constraints. |
228 | * Return values: | 218 | * Return values: |
@@ -233,18 +223,17 @@ static int print_nc_ipadd(BIO *bp, ASN1_OCTET_STRING *ip) | |||
233 | * X509_V_ERR_UNSUPPORTED_CONSTRAINT_TYPE: Unsupported constraint type. | 223 | * X509_V_ERR_UNSUPPORTED_CONSTRAINT_TYPE: Unsupported constraint type. |
234 | * X509_V_ERR_UNSUPPORTED_CONSTRAINT_SYNTAX: bad unsupported constraint syntax. | 224 | * X509_V_ERR_UNSUPPORTED_CONSTRAINT_SYNTAX: bad unsupported constraint syntax. |
235 | * X509_V_ERR_UNSUPPORTED_NAME_SYNTAX: bad or unsupported syntax of name | 225 | * X509_V_ERR_UNSUPPORTED_NAME_SYNTAX: bad or unsupported syntax of name |
236 | |||
237 | */ | 226 | */ |
238 | 227 | ||
239 | int NAME_CONSTRAINTS_check(X509 *x, NAME_CONSTRAINTS *nc) | 228 | int |
240 | { | 229 | NAME_CONSTRAINTS_check(X509 *x, NAME_CONSTRAINTS *nc) |
230 | { | ||
241 | int r, i; | 231 | int r, i; |
242 | X509_NAME *nm; | 232 | X509_NAME *nm; |
243 | 233 | ||
244 | nm = X509_get_subject_name(x); | 234 | nm = X509_get_subject_name(x); |
245 | 235 | ||
246 | if (X509_NAME_entry_count(nm) > 0) | 236 | if (X509_NAME_entry_count(nm) > 0) { |
247 | { | ||
248 | GENERAL_NAME gntmp; | 237 | GENERAL_NAME gntmp; |
249 | gntmp.type = GEN_DIRNAME; | 238 | gntmp.type = GEN_DIRNAME; |
250 | gntmp.d.directoryName = nm; | 239 | gntmp.d.directoryName = nm; |
@@ -256,15 +245,12 @@ int NAME_CONSTRAINTS_check(X509 *x, NAME_CONSTRAINTS *nc) | |||
256 | 245 | ||
257 | gntmp.type = GEN_EMAIL; | 246 | gntmp.type = GEN_EMAIL; |
258 | 247 | ||
259 | |||
260 | /* Process any email address attributes in subject name */ | 248 | /* Process any email address attributes in subject name */ |
261 | 249 | ||
262 | for (i = -1;;) | 250 | for (i = -1;;) { |
263 | { | ||
264 | X509_NAME_ENTRY *ne; | 251 | X509_NAME_ENTRY *ne; |
265 | i = X509_NAME_get_index_by_NID(nm, | 252 | i = X509_NAME_get_index_by_NID(nm, |
266 | NID_pkcs9_emailAddress, | 253 | NID_pkcs9_emailAddress, i); |
267 | i); | ||
268 | if (i == -1) | 254 | if (i == -1) |
269 | break; | 255 | break; |
270 | ne = X509_NAME_get_entry(nm, i); | 256 | ne = X509_NAME_get_entry(nm, i); |
@@ -276,24 +262,23 @@ int NAME_CONSTRAINTS_check(X509 *x, NAME_CONSTRAINTS *nc) | |||
276 | 262 | ||
277 | if (r != X509_V_OK) | 263 | if (r != X509_V_OK) |
278 | return r; | 264 | return r; |
279 | } | ||
280 | |||
281 | } | 265 | } |
282 | 266 | ||
283 | for (i = 0; i < sk_GENERAL_NAME_num(x->altname); i++) | 267 | } |
284 | { | 268 | |
269 | for (i = 0; i < sk_GENERAL_NAME_num(x->altname); i++) { | ||
285 | GENERAL_NAME *gen = sk_GENERAL_NAME_value(x->altname, i); | 270 | GENERAL_NAME *gen = sk_GENERAL_NAME_value(x->altname, i); |
286 | r = nc_match(gen, nc); | 271 | r = nc_match(gen, nc); |
287 | if (r != X509_V_OK) | 272 | if (r != X509_V_OK) |
288 | return r; | 273 | return r; |
289 | } | 274 | } |
290 | 275 | ||
291 | return X509_V_OK; | 276 | return X509_V_OK; |
277 | } | ||
292 | 278 | ||
293 | } | 279 | static int |
294 | 280 | nc_match(GENERAL_NAME *gen, NAME_CONSTRAINTS *nc) | |
295 | static int nc_match(GENERAL_NAME *gen, NAME_CONSTRAINTS *nc) | 281 | { |
296 | { | ||
297 | GENERAL_SUBTREE *sub; | 282 | GENERAL_SUBTREE *sub; |
298 | int i, r, match = 0; | 283 | int i, r, match = 0; |
299 | 284 | ||
@@ -301,8 +286,7 @@ static int nc_match(GENERAL_NAME *gen, NAME_CONSTRAINTS *nc) | |||
301 | * at least one subtree must match. | 286 | * at least one subtree must match. |
302 | */ | 287 | */ |
303 | 288 | ||
304 | for (i = 0; i < sk_GENERAL_SUBTREE_num(nc->permittedSubtrees); i++) | 289 | for (i = 0; i < sk_GENERAL_SUBTREE_num(nc->permittedSubtrees); i++) { |
305 | { | ||
306 | sub = sk_GENERAL_SUBTREE_value(nc->permittedSubtrees, i); | 290 | sub = sk_GENERAL_SUBTREE_value(nc->permittedSubtrees, i); |
307 | if (gen->type != sub->base->type) | 291 | if (gen->type != sub->base->type) |
308 | continue; | 292 | continue; |
@@ -318,15 +302,14 @@ static int nc_match(GENERAL_NAME *gen, NAME_CONSTRAINTS *nc) | |||
318 | match = 2; | 302 | match = 2; |
319 | else if (r != X509_V_ERR_PERMITTED_VIOLATION) | 303 | else if (r != X509_V_ERR_PERMITTED_VIOLATION) |
320 | return r; | 304 | return r; |
321 | } | 305 | } |
322 | 306 | ||
323 | if (match == 1) | 307 | if (match == 1) |
324 | return X509_V_ERR_PERMITTED_VIOLATION; | 308 | return X509_V_ERR_PERMITTED_VIOLATION; |
325 | 309 | ||
326 | /* Excluded subtrees: must not match any of these */ | 310 | /* Excluded subtrees: must not match any of these */ |
327 | 311 | ||
328 | for (i = 0; i < sk_GENERAL_SUBTREE_num(nc->excludedSubtrees); i++) | 312 | for (i = 0; i < sk_GENERAL_SUBTREE_num(nc->excludedSubtrees); i++) { |
329 | { | ||
330 | sub = sk_GENERAL_SUBTREE_value(nc->excludedSubtrees, i); | 313 | sub = sk_GENERAL_SUBTREE_value(nc->excludedSubtrees, i); |
331 | if (gen->type != sub->base->type) | 314 | if (gen->type != sub->base->type) |
332 | continue; | 315 | continue; |
@@ -339,42 +322,41 @@ static int nc_match(GENERAL_NAME *gen, NAME_CONSTRAINTS *nc) | |||
339 | else if (r != X509_V_ERR_PERMITTED_VIOLATION) | 322 | else if (r != X509_V_ERR_PERMITTED_VIOLATION) |
340 | return r; | 323 | return r; |
341 | 324 | ||
342 | } | 325 | } |
343 | 326 | ||
344 | return X509_V_OK; | 327 | return X509_V_OK; |
328 | } | ||
345 | 329 | ||
346 | } | 330 | static int |
347 | 331 | nc_match_single(GENERAL_NAME *gen, GENERAL_NAME *base) | |
348 | static int nc_match_single(GENERAL_NAME *gen, GENERAL_NAME *base) | 332 | { |
349 | { | 333 | switch (base->type) { |
350 | switch(base->type) | 334 | case GEN_DIRNAME: |
351 | { | ||
352 | case GEN_DIRNAME: | ||
353 | return nc_dn(gen->d.directoryName, base->d.directoryName); | 335 | return nc_dn(gen->d.directoryName, base->d.directoryName); |
354 | 336 | ||
355 | case GEN_DNS: | 337 | case GEN_DNS: |
356 | return nc_dns(gen->d.dNSName, base->d.dNSName); | 338 | return nc_dns(gen->d.dNSName, base->d.dNSName); |
357 | 339 | ||
358 | case GEN_EMAIL: | 340 | case GEN_EMAIL: |
359 | return nc_email(gen->d.rfc822Name, base->d.rfc822Name); | 341 | return nc_email(gen->d.rfc822Name, base->d.rfc822Name); |
360 | 342 | ||
361 | case GEN_URI: | 343 | case GEN_URI: |
362 | return nc_uri(gen->d.uniformResourceIdentifier, | 344 | return nc_uri(gen->d.uniformResourceIdentifier, |
363 | base->d.uniformResourceIdentifier); | 345 | base->d.uniformResourceIdentifier); |
364 | 346 | ||
365 | default: | 347 | default: |
366 | return X509_V_ERR_UNSUPPORTED_CONSTRAINT_TYPE; | 348 | return X509_V_ERR_UNSUPPORTED_CONSTRAINT_TYPE; |
367 | } | ||
368 | |||
369 | } | 349 | } |
350 | } | ||
370 | 351 | ||
371 | /* directoryName name constraint matching. | 352 | /* directoryName name constraint matching. |
372 | * The canonical encoding of X509_NAME makes this comparison easy. It is | 353 | * The canonical encoding of X509_NAME makes this comparison easy. It is |
373 | * matched if the subtree is a subset of the name. | 354 | * matched if the subtree is a subset of the name. |
374 | */ | 355 | */ |
375 | 356 | ||
376 | static int nc_dn(X509_NAME *nm, X509_NAME *base) | 357 | static int |
377 | { | 358 | nc_dn(X509_NAME *nm, X509_NAME *base) |
359 | { | ||
378 | /* Ensure canonical encodings are up to date. */ | 360 | /* Ensure canonical encodings are up to date. */ |
379 | if (nm->modified && i2d_X509_NAME(nm, NULL) < 0) | 361 | if (nm->modified && i2d_X509_NAME(nm, NULL) < 0) |
380 | return X509_V_ERR_OUT_OF_MEM; | 362 | return X509_V_ERR_OUT_OF_MEM; |
@@ -385,12 +367,14 @@ static int nc_dn(X509_NAME *nm, X509_NAME *base) | |||
385 | if (memcmp(base->canon_enc, nm->canon_enc, base->canon_enclen)) | 367 | if (memcmp(base->canon_enc, nm->canon_enc, base->canon_enclen)) |
386 | return X509_V_ERR_PERMITTED_VIOLATION; | 368 | return X509_V_ERR_PERMITTED_VIOLATION; |
387 | return X509_V_OK; | 369 | return X509_V_OK; |
388 | } | 370 | } |
389 | 371 | ||
390 | static int nc_dns(ASN1_IA5STRING *dns, ASN1_IA5STRING *base) | 372 | static int |
391 | { | 373 | nc_dns(ASN1_IA5STRING *dns, ASN1_IA5STRING *base) |
374 | { | ||
392 | char *baseptr = (char *)base->data; | 375 | char *baseptr = (char *)base->data; |
393 | char *dnsptr = (char *)dns->data; | 376 | char *dnsptr = (char *)dns->data; |
377 | |||
394 | /* Empty matches everything */ | 378 | /* Empty matches everything */ |
395 | if (!*baseptr) | 379 | if (!*baseptr) |
396 | return X509_V_OK; | 380 | return X509_V_OK; |
@@ -398,71 +382,67 @@ static int nc_dns(ASN1_IA5STRING *dns, ASN1_IA5STRING *base) | |||
398 | * compare RHS and if dns is longer and expect '.' as preceding | 382 | * compare RHS and if dns is longer and expect '.' as preceding |
399 | * character. | 383 | * character. |
400 | */ | 384 | */ |
401 | if (dns->length > base->length) | 385 | if (dns->length > base->length) { |
402 | { | ||
403 | dnsptr += dns->length - base->length; | 386 | dnsptr += dns->length - base->length; |
404 | if (dnsptr[-1] != '.') | 387 | if (dnsptr[-1] != '.') |
405 | return X509_V_ERR_PERMITTED_VIOLATION; | 388 | return X509_V_ERR_PERMITTED_VIOLATION; |
406 | } | 389 | } |
407 | 390 | ||
408 | if (strcasecmp(baseptr, dnsptr)) | 391 | if (strcasecmp(baseptr, dnsptr)) |
409 | return X509_V_ERR_PERMITTED_VIOLATION; | 392 | return X509_V_ERR_PERMITTED_VIOLATION; |
410 | 393 | ||
411 | return X509_V_OK; | 394 | return X509_V_OK; |
395 | } | ||
412 | 396 | ||
413 | } | 397 | static int |
414 | 398 | nc_email(ASN1_IA5STRING *eml, ASN1_IA5STRING *base) | |
415 | static int nc_email(ASN1_IA5STRING *eml, ASN1_IA5STRING *base) | 399 | { |
416 | { | ||
417 | const char *baseptr = (char *)base->data; | 400 | const char *baseptr = (char *)base->data; |
418 | const char *emlptr = (char *)eml->data; | 401 | const char *emlptr = (char *)eml->data; |
419 | |||
420 | const char *baseat = strchr(baseptr, '@'); | 402 | const char *baseat = strchr(baseptr, '@'); |
421 | const char *emlat = strchr(emlptr, '@'); | 403 | const char *emlat = strchr(emlptr, '@'); |
404 | |||
422 | if (!emlat) | 405 | if (!emlat) |
423 | return X509_V_ERR_UNSUPPORTED_NAME_SYNTAX; | 406 | return X509_V_ERR_UNSUPPORTED_NAME_SYNTAX; |
424 | /* Special case: inital '.' is RHS match */ | 407 | /* Special case: inital '.' is RHS match */ |
425 | if (!baseat && (*baseptr == '.')) | 408 | if (!baseat && (*baseptr == '.')) { |
426 | { | 409 | if (eml->length > base->length) { |
427 | if (eml->length > base->length) | ||
428 | { | ||
429 | emlptr += eml->length - base->length; | 410 | emlptr += eml->length - base->length; |
430 | if (!strcasecmp(baseptr, emlptr)) | 411 | if (!strcasecmp(baseptr, emlptr)) |
431 | return X509_V_OK; | 412 | return X509_V_OK; |
432 | } | ||
433 | return X509_V_ERR_PERMITTED_VIOLATION; | ||
434 | } | 413 | } |
414 | return X509_V_ERR_PERMITTED_VIOLATION; | ||
415 | } | ||
435 | 416 | ||
436 | /* If we have anything before '@' match local part */ | 417 | /* If we have anything before '@' match local part */ |
437 | 418 | ||
438 | if (baseat) | 419 | if (baseat) { |
439 | { | 420 | if (baseat != baseptr) { |
440 | if (baseat != baseptr) | ||
441 | { | ||
442 | if ((baseat - baseptr) != (emlat - emlptr)) | 421 | if ((baseat - baseptr) != (emlat - emlptr)) |
443 | return X509_V_ERR_PERMITTED_VIOLATION; | 422 | return X509_V_ERR_PERMITTED_VIOLATION; |
444 | /* Case sensitive match of local part */ | 423 | /* Case sensitive match of local part */ |
445 | if (strncmp(baseptr, emlptr, emlat - emlptr)) | 424 | if (strncmp(baseptr, emlptr, emlat - emlptr)) |
446 | return X509_V_ERR_PERMITTED_VIOLATION; | 425 | return X509_V_ERR_PERMITTED_VIOLATION; |
447 | } | 426 | } |
448 | /* Position base after '@' */ | 427 | /* Position base after '@' */ |
449 | baseptr = baseat + 1; | 428 | baseptr = baseat + 1; |
450 | } | 429 | } |
451 | emlptr = emlat + 1; | 430 | emlptr = emlat + 1; |
452 | /* Just have hostname left to match: case insensitive */ | 431 | /* Just have hostname left to match: case insensitive */ |
453 | if (strcasecmp(baseptr, emlptr)) | 432 | if (strcasecmp(baseptr, emlptr)) |
454 | return X509_V_ERR_PERMITTED_VIOLATION; | 433 | return X509_V_ERR_PERMITTED_VIOLATION; |
455 | 434 | ||
456 | return X509_V_OK; | 435 | return X509_V_OK; |
436 | } | ||
457 | 437 | ||
458 | } | 438 | static int |
459 | 439 | nc_uri(ASN1_IA5STRING *uri, ASN1_IA5STRING *base) | |
460 | static int nc_uri(ASN1_IA5STRING *uri, ASN1_IA5STRING *base) | 440 | { |
461 | { | ||
462 | const char *baseptr = (char *)base->data; | 441 | const char *baseptr = (char *)base->data; |
463 | const char *hostptr = (char *)uri->data; | 442 | const char *hostptr = (char *)uri->data; |
464 | const char *p = strchr(hostptr, ':'); | 443 | const char *p = strchr(hostptr, ':'); |
465 | int hostlen; | 444 | int hostlen; |
445 | |||
466 | /* Check for foo:// and skip past it */ | 446 | /* Check for foo:// and skip past it */ |
467 | if (!p || (p[1] != '/') || (p[2] != '/')) | 447 | if (!p || (p[1] != '/') || (p[2] != '/')) |
468 | return X509_V_ERR_UNSUPPORTED_NAME_SYNTAX; | 448 | return X509_V_ERR_UNSUPPORTED_NAME_SYNTAX; |
@@ -486,20 +466,18 @@ static int nc_uri(ASN1_IA5STRING *uri, ASN1_IA5STRING *base) | |||
486 | return X509_V_ERR_UNSUPPORTED_NAME_SYNTAX; | 466 | return X509_V_ERR_UNSUPPORTED_NAME_SYNTAX; |
487 | 467 | ||
488 | /* Special case: inital '.' is RHS match */ | 468 | /* Special case: inital '.' is RHS match */ |
489 | if (*baseptr == '.') | 469 | if (*baseptr == '.') { |
490 | { | 470 | if (hostlen > base->length) { |
491 | if (hostlen > base->length) | ||
492 | { | ||
493 | p = hostptr + hostlen - base->length; | 471 | p = hostptr + hostlen - base->length; |
494 | if (!strncasecmp(p, baseptr, base->length)) | 472 | if (!strncasecmp(p, baseptr, base->length)) |
495 | return X509_V_OK; | 473 | return X509_V_OK; |
496 | } | ||
497 | return X509_V_ERR_PERMITTED_VIOLATION; | ||
498 | } | 474 | } |
475 | return X509_V_ERR_PERMITTED_VIOLATION; | ||
476 | } | ||
499 | 477 | ||
500 | if ((base->length != (int)hostlen) || strncasecmp(hostptr, baseptr, hostlen)) | 478 | if ((base->length != (int)hostlen) || |
479 | strncasecmp(hostptr, baseptr, hostlen)) | ||
501 | return X509_V_ERR_PERMITTED_VIOLATION; | 480 | return X509_V_ERR_PERMITTED_VIOLATION; |
502 | 481 | ||
503 | return X509_V_OK; | 482 | return X509_V_OK; |
504 | 483 | } | |
505 | } | ||
diff --git a/src/lib/libcrypto/x509v3/v3_ocsp.c b/src/lib/libcrypto/x509v3/v3_ocsp.c index 0c165af314..2fef484b9a 100644 --- a/src/lib/libcrypto/x509v3/v3_ocsp.c +++ b/src/lib/libcrypto/x509v3/v3_ocsp.c | |||
@@ -10,7 +10,7 @@ | |||
10 | * are met: | 10 | * are met: |
11 | * | 11 | * |
12 | * 1. Redistributions of source code must retain the above copyright | 12 | * 1. Redistributions of source code must retain the above copyright |
13 | * notice, this list of conditions and the following disclaimer. | 13 | * notice, this list of conditions and the following disclaimer. |
14 | * | 14 | * |
15 | * 2. Redistributions in binary form must reproduce the above copyright | 15 | * 2. Redistributions in binary form must reproduce the above copyright |
16 | * notice, this list of conditions and the following disclaimer in | 16 | * notice, this list of conditions and the following disclaimer in |
@@ -69,59 +69,59 @@ | |||
69 | */ | 69 | */ |
70 | 70 | ||
71 | static int i2r_ocsp_crlid(const X509V3_EXT_METHOD *method, void *nonce, | 71 | static int i2r_ocsp_crlid(const X509V3_EXT_METHOD *method, void *nonce, |
72 | BIO *out, int indent); | 72 | BIO *out, int indent); |
73 | static int i2r_ocsp_acutoff(const X509V3_EXT_METHOD *method, void *nonce, | 73 | static int i2r_ocsp_acutoff(const X509V3_EXT_METHOD *method, void *nonce, |
74 | BIO *out, int indent); | 74 | BIO *out, int indent); |
75 | static int i2r_object(const X509V3_EXT_METHOD *method, void *obj, BIO *out, | 75 | static int i2r_object(const X509V3_EXT_METHOD *method, void *obj, BIO *out, |
76 | int indent); | 76 | int indent); |
77 | 77 | ||
78 | static void *ocsp_nonce_new(void); | 78 | static void *ocsp_nonce_new(void); |
79 | static int i2d_ocsp_nonce(void *a, unsigned char **pp); | 79 | static int i2d_ocsp_nonce(void *a, unsigned char **pp); |
80 | static void *d2i_ocsp_nonce(void *a, const unsigned char **pp, long length); | 80 | static void *d2i_ocsp_nonce(void *a, const unsigned char **pp, long length); |
81 | static void ocsp_nonce_free(void *a); | 81 | static void ocsp_nonce_free(void *a); |
82 | static int i2r_ocsp_nonce(const X509V3_EXT_METHOD *method, void *nonce, | 82 | static int i2r_ocsp_nonce(const X509V3_EXT_METHOD *method, void *nonce, |
83 | BIO *out, int indent); | 83 | BIO *out, int indent); |
84 | 84 | ||
85 | static int i2r_ocsp_nocheck(const X509V3_EXT_METHOD *method, | 85 | static int i2r_ocsp_nocheck(const X509V3_EXT_METHOD *method, |
86 | void *nocheck, BIO *out, int indent); | 86 | void *nocheck, BIO *out, int indent); |
87 | static void *s2i_ocsp_nocheck(const X509V3_EXT_METHOD *method, X509V3_CTX *ctx, | 87 | static void *s2i_ocsp_nocheck(const X509V3_EXT_METHOD *method, X509V3_CTX *ctx, |
88 | const char *str); | 88 | const char *str); |
89 | static int i2r_ocsp_serviceloc(const X509V3_EXT_METHOD *method, void *in, | 89 | static int i2r_ocsp_serviceloc(const X509V3_EXT_METHOD *method, void *in, |
90 | BIO *bp, int ind); | 90 | BIO *bp, int ind); |
91 | 91 | ||
92 | const X509V3_EXT_METHOD v3_ocsp_crlid = { | 92 | const X509V3_EXT_METHOD v3_ocsp_crlid = { |
93 | NID_id_pkix_OCSP_CrlID, 0, ASN1_ITEM_ref(OCSP_CRLID), | 93 | NID_id_pkix_OCSP_CrlID, 0, ASN1_ITEM_ref(OCSP_CRLID), |
94 | 0,0,0,0, | 94 | 0, 0, 0, 0, |
95 | 0,0, | 95 | 0, 0, |
96 | 0,0, | 96 | 0, 0, |
97 | i2r_ocsp_crlid,0, | 97 | i2r_ocsp_crlid, 0, |
98 | NULL | 98 | NULL |
99 | }; | 99 | }; |
100 | 100 | ||
101 | const X509V3_EXT_METHOD v3_ocsp_acutoff = { | 101 | const X509V3_EXT_METHOD v3_ocsp_acutoff = { |
102 | NID_id_pkix_OCSP_archiveCutoff, 0, ASN1_ITEM_ref(ASN1_GENERALIZEDTIME), | 102 | NID_id_pkix_OCSP_archiveCutoff, 0, ASN1_ITEM_ref(ASN1_GENERALIZEDTIME), |
103 | 0,0,0,0, | 103 | 0, 0, 0, 0, |
104 | 0,0, | 104 | 0, 0, |
105 | 0,0, | 105 | 0, 0, |
106 | i2r_ocsp_acutoff,0, | 106 | i2r_ocsp_acutoff, 0, |
107 | NULL | 107 | NULL |
108 | }; | 108 | }; |
109 | 109 | ||
110 | const X509V3_EXT_METHOD v3_crl_invdate = { | 110 | const X509V3_EXT_METHOD v3_crl_invdate = { |
111 | NID_invalidity_date, 0, ASN1_ITEM_ref(ASN1_GENERALIZEDTIME), | 111 | NID_invalidity_date, 0, ASN1_ITEM_ref(ASN1_GENERALIZEDTIME), |
112 | 0,0,0,0, | 112 | 0, 0, 0, 0, |
113 | 0,0, | 113 | 0, 0, |
114 | 0,0, | 114 | 0, 0, |
115 | i2r_ocsp_acutoff,0, | 115 | i2r_ocsp_acutoff, 0, |
116 | NULL | 116 | NULL |
117 | }; | 117 | }; |
118 | 118 | ||
119 | const X509V3_EXT_METHOD v3_crl_hold = { | 119 | const X509V3_EXT_METHOD v3_crl_hold = { |
120 | NID_hold_instruction_code, 0, ASN1_ITEM_ref(ASN1_OBJECT), | 120 | NID_hold_instruction_code, 0, ASN1_ITEM_ref(ASN1_OBJECT), |
121 | 0,0,0,0, | 121 | 0, 0, 0, 0, |
122 | 0,0, | 122 | 0, 0, |
123 | 0,0, | 123 | 0, 0, |
124 | i2r_object,0, | 124 | i2r_object, 0, |
125 | NULL | 125 | NULL |
126 | }; | 126 | }; |
127 | 127 | ||
@@ -131,71 +131,82 @@ const X509V3_EXT_METHOD v3_ocsp_nonce = { | |||
131 | ocsp_nonce_free, | 131 | ocsp_nonce_free, |
132 | d2i_ocsp_nonce, | 132 | d2i_ocsp_nonce, |
133 | i2d_ocsp_nonce, | 133 | i2d_ocsp_nonce, |
134 | 0,0, | 134 | 0, 0, |
135 | 0,0, | 135 | 0, 0, |
136 | i2r_ocsp_nonce,0, | 136 | i2r_ocsp_nonce, 0, |
137 | NULL | 137 | NULL |
138 | }; | 138 | }; |
139 | 139 | ||
140 | const X509V3_EXT_METHOD v3_ocsp_nocheck = { | 140 | const X509V3_EXT_METHOD v3_ocsp_nocheck = { |
141 | NID_id_pkix_OCSP_noCheck, 0, ASN1_ITEM_ref(ASN1_NULL), | 141 | NID_id_pkix_OCSP_noCheck, 0, ASN1_ITEM_ref(ASN1_NULL), |
142 | 0,0,0,0, | 142 | 0, 0, 0, 0, |
143 | 0,s2i_ocsp_nocheck, | 143 | 0, s2i_ocsp_nocheck, |
144 | 0,0, | 144 | 0, 0, |
145 | i2r_ocsp_nocheck,0, | 145 | i2r_ocsp_nocheck, 0, |
146 | NULL | 146 | NULL |
147 | }; | 147 | }; |
148 | 148 | ||
149 | const X509V3_EXT_METHOD v3_ocsp_serviceloc = { | 149 | const X509V3_EXT_METHOD v3_ocsp_serviceloc = { |
150 | NID_id_pkix_OCSP_serviceLocator, 0, ASN1_ITEM_ref(OCSP_SERVICELOC), | 150 | NID_id_pkix_OCSP_serviceLocator, 0, ASN1_ITEM_ref(OCSP_SERVICELOC), |
151 | 0,0,0,0, | 151 | 0, 0, 0, 0, |
152 | 0,0, | 152 | 0, 0, |
153 | 0,0, | 153 | 0, 0, |
154 | i2r_ocsp_serviceloc,0, | 154 | i2r_ocsp_serviceloc, 0, |
155 | NULL | 155 | NULL |
156 | }; | 156 | }; |
157 | 157 | ||
158 | static int i2r_ocsp_crlid(const X509V3_EXT_METHOD *method, void *in, BIO *bp, | 158 | static int |
159 | int ind) | 159 | i2r_ocsp_crlid(const X509V3_EXT_METHOD *method, void *in, BIO *bp, int ind) |
160 | { | 160 | { |
161 | OCSP_CRLID *a = in; | 161 | OCSP_CRLID *a = in; |
162 | if (a->crlUrl) | 162 | if (a->crlUrl) { |
163 | { | 163 | if (BIO_printf(bp, "%*scrlUrl: ", ind, "") <= 0) |
164 | if (BIO_printf(bp, "%*scrlUrl: ", ind, "") <= 0) goto err; | 164 | goto err; |
165 | if (!ASN1_STRING_print(bp, (ASN1_STRING*)a->crlUrl)) goto err; | 165 | if (!ASN1_STRING_print(bp, (ASN1_STRING*)a->crlUrl)) |
166 | if (BIO_write(bp, "\n", 1) <= 0) goto err; | 166 | goto err; |
167 | } | 167 | if (BIO_write(bp, "\n", 1) <= 0) |
168 | if (a->crlNum) | 168 | goto err; |
169 | { | 169 | } |
170 | if (BIO_printf(bp, "%*scrlNum: ", ind, "") <= 0) goto err; | 170 | if (a->crlNum) { |
171 | if (i2a_ASN1_INTEGER(bp, a->crlNum) <= 0) goto err; | 171 | if (BIO_printf(bp, "%*scrlNum: ", ind, "") <= 0) |
172 | if (BIO_write(bp, "\n", 1) <= 0) goto err; | 172 | goto err; |
173 | } | 173 | if (i2a_ASN1_INTEGER(bp, a->crlNum) <= 0) |
174 | if (a->crlTime) | 174 | goto err; |
175 | { | 175 | if (BIO_write(bp, "\n", 1) <= 0) |
176 | if (BIO_printf(bp, "%*scrlTime: ", ind, "") <= 0) goto err; | 176 | goto err; |
177 | if (!ASN1_GENERALIZEDTIME_print(bp, a->crlTime)) goto err; | 177 | } |
178 | if (BIO_write(bp, "\n", 1) <= 0) goto err; | 178 | if (a->crlTime) { |
179 | } | 179 | if (BIO_printf(bp, "%*scrlTime: ", ind, "") <= 0) |
180 | goto err; | ||
181 | if (!ASN1_GENERALIZEDTIME_print(bp, a->crlTime)) | ||
182 | goto err; | ||
183 | if (BIO_write(bp, "\n", 1) <= 0) | ||
184 | goto err; | ||
185 | } | ||
180 | return 1; | 186 | return 1; |
181 | err: | 187 | |
188 | err: | ||
182 | return 0; | 189 | return 0; |
183 | } | 190 | } |
184 | 191 | ||
185 | static int i2r_ocsp_acutoff(const X509V3_EXT_METHOD *method, void *cutoff, | 192 | static int |
186 | BIO *bp, int ind) | 193 | i2r_ocsp_acutoff(const X509V3_EXT_METHOD *method, void *cutoff, BIO *bp, |
194 | int ind) | ||
187 | { | 195 | { |
188 | if (BIO_printf(bp, "%*s", ind, "") <= 0) return 0; | 196 | if (BIO_printf(bp, "%*s", ind, "") <= 0) |
189 | if(!ASN1_GENERALIZEDTIME_print(bp, cutoff)) return 0; | 197 | return 0; |
198 | if (!ASN1_GENERALIZEDTIME_print(bp, cutoff)) | ||
199 | return 0; | ||
190 | return 1; | 200 | return 1; |
191 | } | 201 | } |
192 | 202 | ||
193 | 203 | static int | |
194 | static int i2r_object(const X509V3_EXT_METHOD *method, void *oid, BIO *bp, | 204 | i2r_object(const X509V3_EXT_METHOD *method, void *oid, BIO *bp, int ind) |
195 | int ind) | ||
196 | { | 205 | { |
197 | if (BIO_printf(bp, "%*s", ind, "") <= 0) return 0; | 206 | if (BIO_printf(bp, "%*s", ind, "") <= 0) |
198 | if(i2a_ASN1_OBJECT(bp, oid) <= 0) return 0; | 207 | return 0; |
208 | if (i2a_ASN1_OBJECT(bp, oid) <= 0) | ||
209 | return 0; | ||
199 | return 1; | 210 | return 1; |
200 | } | 211 | } |
201 | 212 | ||
@@ -203,87 +214,108 @@ static int i2r_object(const X509V3_EXT_METHOD *method, void *oid, BIO *bp, | |||
203 | * an ASN1 encoding at all: it just contains arbitrary data. | 214 | * an ASN1 encoding at all: it just contains arbitrary data. |
204 | */ | 215 | */ |
205 | 216 | ||
206 | static void *ocsp_nonce_new(void) | 217 | static void * |
218 | ocsp_nonce_new(void) | ||
207 | { | 219 | { |
208 | return ASN1_OCTET_STRING_new(); | 220 | return ASN1_OCTET_STRING_new(); |
209 | } | 221 | } |
210 | 222 | ||
211 | static int i2d_ocsp_nonce(void *a, unsigned char **pp) | 223 | static int |
224 | i2d_ocsp_nonce(void *a, unsigned char **pp) | ||
212 | { | 225 | { |
213 | ASN1_OCTET_STRING *os = a; | 226 | ASN1_OCTET_STRING *os = a; |
214 | if(pp) { | 227 | |
228 | if (pp) { | ||
215 | memcpy(*pp, os->data, os->length); | 229 | memcpy(*pp, os->data, os->length); |
216 | *pp += os->length; | 230 | *pp += os->length; |
217 | } | 231 | } |
218 | return os->length; | 232 | return os->length; |
219 | } | 233 | } |
220 | 234 | ||
221 | static void *d2i_ocsp_nonce(void *a, const unsigned char **pp, long length) | 235 | static void * |
236 | d2i_ocsp_nonce(void *a, const unsigned char **pp, long length) | ||
222 | { | 237 | { |
223 | ASN1_OCTET_STRING *os, **pos; | 238 | ASN1_OCTET_STRING *os, **pos; |
239 | |||
224 | pos = a; | 240 | pos = a; |
225 | if(!pos || !*pos) os = ASN1_OCTET_STRING_new(); | 241 | if (!pos || !*pos) |
226 | else os = *pos; | 242 | os = ASN1_OCTET_STRING_new(); |
227 | if(!ASN1_OCTET_STRING_set(os, *pp, length)) goto err; | 243 | else |
244 | os = *pos; | ||
245 | if (!ASN1_OCTET_STRING_set(os, *pp, length)) | ||
246 | goto err; | ||
228 | 247 | ||
229 | *pp += length; | 248 | *pp += length; |
230 | 249 | ||
231 | if(pos) *pos = os; | 250 | if (pos) |
251 | *pos = os; | ||
232 | return os; | 252 | return os; |
233 | 253 | ||
234 | err: | 254 | err: |
235 | if(os && (!pos || (*pos != os))) M_ASN1_OCTET_STRING_free(os); | 255 | if (os && (!pos || (*pos != os))) |
256 | M_ASN1_OCTET_STRING_free(os); | ||
236 | OCSPerr(OCSP_F_D2I_OCSP_NONCE, ERR_R_MALLOC_FAILURE); | 257 | OCSPerr(OCSP_F_D2I_OCSP_NONCE, ERR_R_MALLOC_FAILURE); |
237 | return NULL; | 258 | return NULL; |
238 | } | 259 | } |
239 | 260 | ||
240 | static void ocsp_nonce_free(void *a) | 261 | static void |
262 | ocsp_nonce_free(void *a) | ||
241 | { | 263 | { |
242 | M_ASN1_OCTET_STRING_free(a); | 264 | M_ASN1_OCTET_STRING_free(a); |
243 | } | 265 | } |
244 | 266 | ||
245 | static int i2r_ocsp_nonce(const X509V3_EXT_METHOD *method, void *nonce, | 267 | static int |
246 | BIO *out, int indent) | 268 | i2r_ocsp_nonce(const X509V3_EXT_METHOD *method, void *nonce, BIO *out, |
269 | int indent) | ||
247 | { | 270 | { |
248 | if(BIO_printf(out, "%*s", indent, "") <= 0) return 0; | 271 | if (BIO_printf(out, "%*s", indent, "") <= 0) |
249 | if(i2a_ASN1_STRING(out, nonce, V_ASN1_OCTET_STRING) <= 0) return 0; | 272 | return 0; |
273 | if (i2a_ASN1_STRING(out, nonce, V_ASN1_OCTET_STRING) <= 0) | ||
274 | return 0; | ||
250 | return 1; | 275 | return 1; |
251 | } | 276 | } |
252 | 277 | ||
253 | /* Nocheck is just a single NULL. Don't print anything and always set it */ | 278 | /* Nocheck is just a single NULL. Don't print anything and always set it */ |
254 | 279 | ||
255 | static int i2r_ocsp_nocheck(const X509V3_EXT_METHOD *method, void *nocheck, | 280 | static int |
256 | BIO *out, int indent) | 281 | i2r_ocsp_nocheck(const X509V3_EXT_METHOD *method, void *nocheck, BIO *out, |
282 | int indent) | ||
257 | { | 283 | { |
258 | return 1; | 284 | return 1; |
259 | } | 285 | } |
260 | 286 | ||
261 | static void *s2i_ocsp_nocheck(const X509V3_EXT_METHOD *method, X509V3_CTX *ctx, | 287 | static void * |
262 | const char *str) | 288 | s2i_ocsp_nocheck(const X509V3_EXT_METHOD *method, X509V3_CTX *ctx, |
289 | const char *str) | ||
263 | { | 290 | { |
264 | return ASN1_NULL_new(); | 291 | return ASN1_NULL_new(); |
265 | } | 292 | } |
266 | 293 | ||
267 | static int i2r_ocsp_serviceloc(const X509V3_EXT_METHOD *method, void *in, | 294 | static int |
268 | BIO *bp, int ind) | 295 | i2r_ocsp_serviceloc(const X509V3_EXT_METHOD *method, void *in, BIO *bp, int ind) |
269 | { | 296 | { |
270 | int i; | 297 | int i; |
271 | OCSP_SERVICELOC *a = in; | 298 | OCSP_SERVICELOC *a = in; |
272 | ACCESS_DESCRIPTION *ad; | 299 | ACCESS_DESCRIPTION *ad; |
273 | 300 | ||
274 | if (BIO_printf(bp, "%*sIssuer: ", ind, "") <= 0) goto err; | 301 | if (BIO_printf(bp, "%*sIssuer: ", ind, "") <= 0) |
275 | if (X509_NAME_print_ex(bp, a->issuer, 0, XN_FLAG_ONELINE) <= 0) goto err; | 302 | goto err; |
276 | for (i = 0; i < sk_ACCESS_DESCRIPTION_num(a->locator); i++) | 303 | if (X509_NAME_print_ex(bp, a->issuer, 0, XN_FLAG_ONELINE) <= 0) |
277 | { | 304 | goto err; |
278 | ad = sk_ACCESS_DESCRIPTION_value(a->locator,i); | 305 | for (i = 0; i < sk_ACCESS_DESCRIPTION_num(a->locator); i++) { |
279 | if (BIO_printf(bp, "\n%*s", (2*ind), "") <= 0) | 306 | ad = sk_ACCESS_DESCRIPTION_value(a->locator, i); |
280 | goto err; | 307 | if (BIO_printf(bp, "\n%*s", (2 * ind), "") <= 0) |
281 | if(i2a_ASN1_OBJECT(bp, ad->method) <= 0) goto err; | 308 | goto err; |
282 | if(BIO_puts(bp, " - ") <= 0) goto err; | 309 | if (i2a_ASN1_OBJECT(bp, ad->method) <= 0) |
283 | if(GENERAL_NAME_print(bp, ad->location) <= 0) goto err; | 310 | goto err; |
284 | } | 311 | if (BIO_puts(bp, " - ") <= 0) |
312 | goto err; | ||
313 | if (GENERAL_NAME_print(bp, ad->location) <= 0) | ||
314 | goto err; | ||
315 | } | ||
285 | return 1; | 316 | return 1; |
317 | |||
286 | err: | 318 | err: |
287 | return 0; | 319 | return 0; |
288 | } | 320 | } |
289 | #endif | 321 | #endif |
diff --git a/src/lib/libssl/src/crypto/x509v3/v3_ncons.c b/src/lib/libssl/src/crypto/x509v3/v3_ncons.c index a01dc64dd2..695176471b 100644 --- a/src/lib/libssl/src/crypto/x509v3/v3_ncons.c +++ b/src/lib/libssl/src/crypto/x509v3/v3_ncons.c | |||
@@ -10,7 +10,7 @@ | |||
10 | * are met: | 10 | * are met: |
11 | * | 11 | * |
12 | * 1. Redistributions of source code must retain the above copyright | 12 | * 1. Redistributions of source code must retain the above copyright |
13 | * notice, this list of conditions and the following disclaimer. | 13 | * notice, this list of conditions and the following disclaimer. |
14 | * | 14 | * |
15 | * 2. Redistributions in binary form must reproduce the above copyright | 15 | * 2. Redistributions in binary form must reproduce the above copyright |
16 | * notice, this list of conditions and the following disclaimer in | 16 | * notice, this list of conditions and the following disclaimer in |
@@ -64,12 +64,11 @@ | |||
64 | #include <openssl/x509v3.h> | 64 | #include <openssl/x509v3.h> |
65 | 65 | ||
66 | static void *v2i_NAME_CONSTRAINTS(const X509V3_EXT_METHOD *method, | 66 | static void *v2i_NAME_CONSTRAINTS(const X509V3_EXT_METHOD *method, |
67 | X509V3_CTX *ctx, STACK_OF(CONF_VALUE) *nval); | 67 | X509V3_CTX *ctx, STACK_OF(CONF_VALUE) *nval); |
68 | static int i2r_NAME_CONSTRAINTS(const X509V3_EXT_METHOD *method, | 68 | static int i2r_NAME_CONSTRAINTS(const X509V3_EXT_METHOD *method, |
69 | void *a, BIO *bp, int ind); | 69 | void *a, BIO *bp, int ind); |
70 | static int do_i2r_name_constraints(const X509V3_EXT_METHOD *method, | 70 | static int do_i2r_name_constraints(const X509V3_EXT_METHOD *method, |
71 | STACK_OF(GENERAL_SUBTREE) *trees, | 71 | STACK_OF(GENERAL_SUBTREE) *trees, BIO *bp, int ind, char *name); |
72 | BIO *bp, int ind, char *name); | ||
73 | static int print_nc_ipadd(BIO *bp, ASN1_OCTET_STRING *ip); | 72 | static int print_nc_ipadd(BIO *bp, ASN1_OCTET_STRING *ip); |
74 | 73 | ||
75 | static int nc_match(GENERAL_NAME *gen, NAME_CONSTRAINTS *nc); | 74 | static int nc_match(GENERAL_NAME *gen, NAME_CONSTRAINTS *nc); |
@@ -82,10 +81,10 @@ static int nc_uri(ASN1_IA5STRING *uri, ASN1_IA5STRING *base); | |||
82 | const X509V3_EXT_METHOD v3_name_constraints = { | 81 | const X509V3_EXT_METHOD v3_name_constraints = { |
83 | NID_name_constraints, 0, | 82 | NID_name_constraints, 0, |
84 | ASN1_ITEM_ref(NAME_CONSTRAINTS), | 83 | ASN1_ITEM_ref(NAME_CONSTRAINTS), |
85 | 0,0,0,0, | 84 | 0, 0, 0, 0, |
86 | 0,0, | 85 | 0, 0, |
87 | 0, v2i_NAME_CONSTRAINTS, | 86 | 0, v2i_NAME_CONSTRAINTS, |
88 | i2r_NAME_CONSTRAINTS,0, | 87 | i2r_NAME_CONSTRAINTS, 0, |
89 | NULL | 88 | NULL |
90 | }; | 89 | }; |
91 | 90 | ||
@@ -97,44 +96,41 @@ ASN1_SEQUENCE(GENERAL_SUBTREE) = { | |||
97 | 96 | ||
98 | ASN1_SEQUENCE(NAME_CONSTRAINTS) = { | 97 | ASN1_SEQUENCE(NAME_CONSTRAINTS) = { |
99 | ASN1_IMP_SEQUENCE_OF_OPT(NAME_CONSTRAINTS, permittedSubtrees, | 98 | ASN1_IMP_SEQUENCE_OF_OPT(NAME_CONSTRAINTS, permittedSubtrees, |
100 | GENERAL_SUBTREE, 0), | 99 | GENERAL_SUBTREE, 0), |
101 | ASN1_IMP_SEQUENCE_OF_OPT(NAME_CONSTRAINTS, excludedSubtrees, | 100 | ASN1_IMP_SEQUENCE_OF_OPT(NAME_CONSTRAINTS, excludedSubtrees, |
102 | GENERAL_SUBTREE, 1), | 101 | GENERAL_SUBTREE, 1), |
103 | } ASN1_SEQUENCE_END(NAME_CONSTRAINTS) | 102 | } ASN1_SEQUENCE_END(NAME_CONSTRAINTS) |
104 | 103 | ||
105 | 104 | ||
106 | IMPLEMENT_ASN1_ALLOC_FUNCTIONS(GENERAL_SUBTREE) | 105 | IMPLEMENT_ASN1_ALLOC_FUNCTIONS(GENERAL_SUBTREE) |
107 | IMPLEMENT_ASN1_ALLOC_FUNCTIONS(NAME_CONSTRAINTS) | 106 | IMPLEMENT_ASN1_ALLOC_FUNCTIONS(NAME_CONSTRAINTS) |
108 | 107 | ||
109 | static void *v2i_NAME_CONSTRAINTS(const X509V3_EXT_METHOD *method, | 108 | static void * |
110 | X509V3_CTX *ctx, STACK_OF(CONF_VALUE) *nval) | 109 | v2i_NAME_CONSTRAINTS(const X509V3_EXT_METHOD *method, X509V3_CTX *ctx, |
111 | { | 110 | STACK_OF(CONF_VALUE) *nval) |
111 | { | ||
112 | int i; | 112 | int i; |
113 | CONF_VALUE tval, *val; | 113 | CONF_VALUE tval, *val; |
114 | STACK_OF(GENERAL_SUBTREE) **ptree = NULL; | 114 | STACK_OF(GENERAL_SUBTREE) **ptree = NULL; |
115 | NAME_CONSTRAINTS *ncons = NULL; | 115 | NAME_CONSTRAINTS *ncons = NULL; |
116 | GENERAL_SUBTREE *sub = NULL; | 116 | GENERAL_SUBTREE *sub = NULL; |
117 | |||
117 | ncons = NAME_CONSTRAINTS_new(); | 118 | ncons = NAME_CONSTRAINTS_new(); |
118 | if (!ncons) | 119 | if (!ncons) |
119 | goto memerr; | 120 | goto memerr; |
120 | for(i = 0; i < sk_CONF_VALUE_num(nval); i++) | 121 | for (i = 0; i < sk_CONF_VALUE_num(nval); i++) { |
121 | { | ||
122 | val = sk_CONF_VALUE_value(nval, i); | 122 | val = sk_CONF_VALUE_value(nval, i); |
123 | if (!strncmp(val->name, "permitted", 9) && val->name[9]) | 123 | if (!strncmp(val->name, "permitted", 9) && val->name[9]) { |
124 | { | ||
125 | ptree = &ncons->permittedSubtrees; | 124 | ptree = &ncons->permittedSubtrees; |
126 | tval.name = val->name + 10; | 125 | tval.name = val->name + 10; |
127 | } | 126 | } else if (!strncmp(val->name, "excluded", 8) && val->name[8]) { |
128 | else if (!strncmp(val->name, "excluded", 8) && val->name[8]) | ||
129 | { | ||
130 | ptree = &ncons->excludedSubtrees; | 127 | ptree = &ncons->excludedSubtrees; |
131 | tval.name = val->name + 9; | 128 | tval.name = val->name + 9; |
132 | } | 129 | } else { |
133 | else | 130 | X509V3err(X509V3_F_V2I_NAME_CONSTRAINTS, |
134 | { | 131 | X509V3_R_INVALID_SYNTAX); |
135 | X509V3err(X509V3_F_V2I_NAME_CONSTRAINTS, X509V3_R_INVALID_SYNTAX); | ||
136 | goto err; | 132 | goto err; |
137 | } | 133 | } |
138 | tval.value = val->value; | 134 | tval.value = val->value; |
139 | sub = GENERAL_SUBTREE_new(); | 135 | sub = GENERAL_SUBTREE_new(); |
140 | if (!v2i_GENERAL_NAME_ex(sub->base, method, ctx, &tval, 1)) | 136 | if (!v2i_GENERAL_NAME_ex(sub->base, method, ctx, &tval, 1)) |
@@ -144,45 +140,43 @@ static void *v2i_NAME_CONSTRAINTS(const X509V3_EXT_METHOD *method, | |||
144 | if (!*ptree || !sk_GENERAL_SUBTREE_push(*ptree, sub)) | 140 | if (!*ptree || !sk_GENERAL_SUBTREE_push(*ptree, sub)) |
145 | goto memerr; | 141 | goto memerr; |
146 | sub = NULL; | 142 | sub = NULL; |
147 | } | 143 | } |
148 | 144 | ||
149 | return ncons; | 145 | return ncons; |
150 | 146 | ||
151 | memerr: | 147 | memerr: |
152 | X509V3err(X509V3_F_V2I_NAME_CONSTRAINTS, ERR_R_MALLOC_FAILURE); | 148 | X509V3err(X509V3_F_V2I_NAME_CONSTRAINTS, ERR_R_MALLOC_FAILURE); |
153 | err: | 149 | err: |
154 | if (ncons) | 150 | if (ncons) |
155 | NAME_CONSTRAINTS_free(ncons); | 151 | NAME_CONSTRAINTS_free(ncons); |
156 | if (sub) | 152 | if (sub) |
157 | GENERAL_SUBTREE_free(sub); | 153 | GENERAL_SUBTREE_free(sub); |
158 | 154 | ||
159 | return NULL; | 155 | return NULL; |
160 | } | 156 | } |
161 | |||
162 | 157 | ||
163 | 158 | static int | |
164 | 159 | i2r_NAME_CONSTRAINTS(const X509V3_EXT_METHOD *method, void *a, BIO *bp, int ind) | |
165 | static int i2r_NAME_CONSTRAINTS(const X509V3_EXT_METHOD *method, void *a, | 160 | { |
166 | BIO *bp, int ind) | ||
167 | { | ||
168 | NAME_CONSTRAINTS *ncons = a; | 161 | NAME_CONSTRAINTS *ncons = a; |
162 | |||
169 | do_i2r_name_constraints(method, ncons->permittedSubtrees, | 163 | do_i2r_name_constraints(method, ncons->permittedSubtrees, |
170 | bp, ind, "Permitted"); | 164 | bp, ind, "Permitted"); |
171 | do_i2r_name_constraints(method, ncons->excludedSubtrees, | 165 | do_i2r_name_constraints(method, ncons->excludedSubtrees, |
172 | bp, ind, "Excluded"); | 166 | bp, ind, "Excluded"); |
173 | return 1; | 167 | return 1; |
174 | } | 168 | } |
175 | 169 | ||
176 | static int do_i2r_name_constraints(const X509V3_EXT_METHOD *method, | 170 | static int |
177 | STACK_OF(GENERAL_SUBTREE) *trees, | 171 | do_i2r_name_constraints(const X509V3_EXT_METHOD *method, |
178 | BIO *bp, int ind, char *name) | 172 | STACK_OF(GENERAL_SUBTREE) *trees, BIO *bp, int ind, char *name) |
179 | { | 173 | { |
180 | GENERAL_SUBTREE *tree; | 174 | GENERAL_SUBTREE *tree; |
181 | int i; | 175 | int i; |
176 | |||
182 | if (sk_GENERAL_SUBTREE_num(trees) > 0) | 177 | if (sk_GENERAL_SUBTREE_num(trees) > 0) |
183 | BIO_printf(bp, "%*s%s:\n", ind, "", name); | 178 | BIO_printf(bp, "%*s%s:\n", ind, "", name); |
184 | for(i = 0; i < sk_GENERAL_SUBTREE_num(trees); i++) | 179 | for (i = 0; i < sk_GENERAL_SUBTREE_num(trees); i++) { |
185 | { | ||
186 | tree = sk_GENERAL_SUBTREE_value(trees, i); | 180 | tree = sk_GENERAL_SUBTREE_value(trees, i); |
187 | BIO_printf(bp, "%*s", ind + 2, ""); | 181 | BIO_printf(bp, "%*s", ind + 2, ""); |
188 | if (tree->base->type == GEN_IPADD) | 182 | if (tree->base->type == GEN_IPADD) |
@@ -190,39 +184,35 @@ static int do_i2r_name_constraints(const X509V3_EXT_METHOD *method, | |||
190 | else | 184 | else |
191 | GENERAL_NAME_print(bp, tree->base); | 185 | GENERAL_NAME_print(bp, tree->base); |
192 | BIO_puts(bp, "\n"); | 186 | BIO_puts(bp, "\n"); |
193 | } | ||
194 | return 1; | ||
195 | } | 187 | } |
188 | return 1; | ||
189 | } | ||
196 | 190 | ||
197 | static int print_nc_ipadd(BIO *bp, ASN1_OCTET_STRING *ip) | 191 | static int |
198 | { | 192 | print_nc_ipadd(BIO *bp, ASN1_OCTET_STRING *ip) |
193 | { | ||
199 | int i, len; | 194 | int i, len; |
200 | unsigned char *p; | 195 | unsigned char *p; |
196 | |||
201 | p = ip->data; | 197 | p = ip->data; |
202 | len = ip->length; | 198 | len = ip->length; |
203 | BIO_puts(bp, "IP:"); | 199 | BIO_puts(bp, "IP:"); |
204 | if(len == 8) | 200 | if (len == 8) { |
205 | { | ||
206 | BIO_printf(bp, "%d.%d.%d.%d/%d.%d.%d.%d", | 201 | BIO_printf(bp, "%d.%d.%d.%d/%d.%d.%d.%d", |
207 | p[0], p[1], p[2], p[3], | 202 | p[0], p[1], p[2], p[3], p[4], p[5], p[6], p[7]); |
208 | p[4], p[5], p[6], p[7]); | 203 | } else if (len == 32) { |
209 | } | 204 | for (i = 0; i < 16; i++) { |
210 | else if(len == 32) | ||
211 | { | ||
212 | for (i = 0; i < 16; i++) | ||
213 | { | ||
214 | BIO_printf(bp, "%X", p[0] << 8 | p[1]); | 205 | BIO_printf(bp, "%X", p[0] << 8 | p[1]); |
215 | p += 2; | 206 | p += 2; |
216 | if (i == 7) | 207 | if (i == 7) |
217 | BIO_puts(bp, "/"); | 208 | BIO_puts(bp, "/"); |
218 | else if (i != 15) | 209 | else if (i != 15) |
219 | BIO_puts(bp, ":"); | 210 | BIO_puts(bp, ":"); |
220 | } | ||
221 | } | 211 | } |
222 | else | 212 | } else |
223 | BIO_printf(bp, "IP Address:<invalid>"); | 213 | BIO_printf(bp, "IP Address:<invalid>"); |
224 | return 1; | 214 | return 1; |
225 | } | 215 | } |
226 | 216 | ||
227 | /* Check a certificate conforms to a specified set of constraints. | 217 | /* Check a certificate conforms to a specified set of constraints. |
228 | * Return values: | 218 | * Return values: |
@@ -233,18 +223,17 @@ static int print_nc_ipadd(BIO *bp, ASN1_OCTET_STRING *ip) | |||
233 | * X509_V_ERR_UNSUPPORTED_CONSTRAINT_TYPE: Unsupported constraint type. | 223 | * X509_V_ERR_UNSUPPORTED_CONSTRAINT_TYPE: Unsupported constraint type. |
234 | * X509_V_ERR_UNSUPPORTED_CONSTRAINT_SYNTAX: bad unsupported constraint syntax. | 224 | * X509_V_ERR_UNSUPPORTED_CONSTRAINT_SYNTAX: bad unsupported constraint syntax. |
235 | * X509_V_ERR_UNSUPPORTED_NAME_SYNTAX: bad or unsupported syntax of name | 225 | * X509_V_ERR_UNSUPPORTED_NAME_SYNTAX: bad or unsupported syntax of name |
236 | |||
237 | */ | 226 | */ |
238 | 227 | ||
239 | int NAME_CONSTRAINTS_check(X509 *x, NAME_CONSTRAINTS *nc) | 228 | int |
240 | { | 229 | NAME_CONSTRAINTS_check(X509 *x, NAME_CONSTRAINTS *nc) |
230 | { | ||
241 | int r, i; | 231 | int r, i; |
242 | X509_NAME *nm; | 232 | X509_NAME *nm; |
243 | 233 | ||
244 | nm = X509_get_subject_name(x); | 234 | nm = X509_get_subject_name(x); |
245 | 235 | ||
246 | if (X509_NAME_entry_count(nm) > 0) | 236 | if (X509_NAME_entry_count(nm) > 0) { |
247 | { | ||
248 | GENERAL_NAME gntmp; | 237 | GENERAL_NAME gntmp; |
249 | gntmp.type = GEN_DIRNAME; | 238 | gntmp.type = GEN_DIRNAME; |
250 | gntmp.d.directoryName = nm; | 239 | gntmp.d.directoryName = nm; |
@@ -256,15 +245,12 @@ int NAME_CONSTRAINTS_check(X509 *x, NAME_CONSTRAINTS *nc) | |||
256 | 245 | ||
257 | gntmp.type = GEN_EMAIL; | 246 | gntmp.type = GEN_EMAIL; |
258 | 247 | ||
259 | |||
260 | /* Process any email address attributes in subject name */ | 248 | /* Process any email address attributes in subject name */ |
261 | 249 | ||
262 | for (i = -1;;) | 250 | for (i = -1;;) { |
263 | { | ||
264 | X509_NAME_ENTRY *ne; | 251 | X509_NAME_ENTRY *ne; |
265 | i = X509_NAME_get_index_by_NID(nm, | 252 | i = X509_NAME_get_index_by_NID(nm, |
266 | NID_pkcs9_emailAddress, | 253 | NID_pkcs9_emailAddress, i); |
267 | i); | ||
268 | if (i == -1) | 254 | if (i == -1) |
269 | break; | 255 | break; |
270 | ne = X509_NAME_get_entry(nm, i); | 256 | ne = X509_NAME_get_entry(nm, i); |
@@ -276,24 +262,23 @@ int NAME_CONSTRAINTS_check(X509 *x, NAME_CONSTRAINTS *nc) | |||
276 | 262 | ||
277 | if (r != X509_V_OK) | 263 | if (r != X509_V_OK) |
278 | return r; | 264 | return r; |
279 | } | ||
280 | |||
281 | } | 265 | } |
282 | 266 | ||
283 | for (i = 0; i < sk_GENERAL_NAME_num(x->altname); i++) | 267 | } |
284 | { | 268 | |
269 | for (i = 0; i < sk_GENERAL_NAME_num(x->altname); i++) { | ||
285 | GENERAL_NAME *gen = sk_GENERAL_NAME_value(x->altname, i); | 270 | GENERAL_NAME *gen = sk_GENERAL_NAME_value(x->altname, i); |
286 | r = nc_match(gen, nc); | 271 | r = nc_match(gen, nc); |
287 | if (r != X509_V_OK) | 272 | if (r != X509_V_OK) |
288 | return r; | 273 | return r; |
289 | } | 274 | } |
290 | 275 | ||
291 | return X509_V_OK; | 276 | return X509_V_OK; |
277 | } | ||
292 | 278 | ||
293 | } | 279 | static int |
294 | 280 | nc_match(GENERAL_NAME *gen, NAME_CONSTRAINTS *nc) | |
295 | static int nc_match(GENERAL_NAME *gen, NAME_CONSTRAINTS *nc) | 281 | { |
296 | { | ||
297 | GENERAL_SUBTREE *sub; | 282 | GENERAL_SUBTREE *sub; |
298 | int i, r, match = 0; | 283 | int i, r, match = 0; |
299 | 284 | ||
@@ -301,8 +286,7 @@ static int nc_match(GENERAL_NAME *gen, NAME_CONSTRAINTS *nc) | |||
301 | * at least one subtree must match. | 286 | * at least one subtree must match. |
302 | */ | 287 | */ |
303 | 288 | ||
304 | for (i = 0; i < sk_GENERAL_SUBTREE_num(nc->permittedSubtrees); i++) | 289 | for (i = 0; i < sk_GENERAL_SUBTREE_num(nc->permittedSubtrees); i++) { |
305 | { | ||
306 | sub = sk_GENERAL_SUBTREE_value(nc->permittedSubtrees, i); | 290 | sub = sk_GENERAL_SUBTREE_value(nc->permittedSubtrees, i); |
307 | if (gen->type != sub->base->type) | 291 | if (gen->type != sub->base->type) |
308 | continue; | 292 | continue; |
@@ -318,15 +302,14 @@ static int nc_match(GENERAL_NAME *gen, NAME_CONSTRAINTS *nc) | |||
318 | match = 2; | 302 | match = 2; |
319 | else if (r != X509_V_ERR_PERMITTED_VIOLATION) | 303 | else if (r != X509_V_ERR_PERMITTED_VIOLATION) |
320 | return r; | 304 | return r; |
321 | } | 305 | } |
322 | 306 | ||
323 | if (match == 1) | 307 | if (match == 1) |
324 | return X509_V_ERR_PERMITTED_VIOLATION; | 308 | return X509_V_ERR_PERMITTED_VIOLATION; |
325 | 309 | ||
326 | /* Excluded subtrees: must not match any of these */ | 310 | /* Excluded subtrees: must not match any of these */ |
327 | 311 | ||
328 | for (i = 0; i < sk_GENERAL_SUBTREE_num(nc->excludedSubtrees); i++) | 312 | for (i = 0; i < sk_GENERAL_SUBTREE_num(nc->excludedSubtrees); i++) { |
329 | { | ||
330 | sub = sk_GENERAL_SUBTREE_value(nc->excludedSubtrees, i); | 313 | sub = sk_GENERAL_SUBTREE_value(nc->excludedSubtrees, i); |
331 | if (gen->type != sub->base->type) | 314 | if (gen->type != sub->base->type) |
332 | continue; | 315 | continue; |
@@ -339,42 +322,41 @@ static int nc_match(GENERAL_NAME *gen, NAME_CONSTRAINTS *nc) | |||
339 | else if (r != X509_V_ERR_PERMITTED_VIOLATION) | 322 | else if (r != X509_V_ERR_PERMITTED_VIOLATION) |
340 | return r; | 323 | return r; |
341 | 324 | ||
342 | } | 325 | } |
343 | 326 | ||
344 | return X509_V_OK; | 327 | return X509_V_OK; |
328 | } | ||
345 | 329 | ||
346 | } | 330 | static int |
347 | 331 | nc_match_single(GENERAL_NAME *gen, GENERAL_NAME *base) | |
348 | static int nc_match_single(GENERAL_NAME *gen, GENERAL_NAME *base) | 332 | { |
349 | { | 333 | switch (base->type) { |
350 | switch(base->type) | 334 | case GEN_DIRNAME: |
351 | { | ||
352 | case GEN_DIRNAME: | ||
353 | return nc_dn(gen->d.directoryName, base->d.directoryName); | 335 | return nc_dn(gen->d.directoryName, base->d.directoryName); |
354 | 336 | ||
355 | case GEN_DNS: | 337 | case GEN_DNS: |
356 | return nc_dns(gen->d.dNSName, base->d.dNSName); | 338 | return nc_dns(gen->d.dNSName, base->d.dNSName); |
357 | 339 | ||
358 | case GEN_EMAIL: | 340 | case GEN_EMAIL: |
359 | return nc_email(gen->d.rfc822Name, base->d.rfc822Name); | 341 | return nc_email(gen->d.rfc822Name, base->d.rfc822Name); |
360 | 342 | ||
361 | case GEN_URI: | 343 | case GEN_URI: |
362 | return nc_uri(gen->d.uniformResourceIdentifier, | 344 | return nc_uri(gen->d.uniformResourceIdentifier, |
363 | base->d.uniformResourceIdentifier); | 345 | base->d.uniformResourceIdentifier); |
364 | 346 | ||
365 | default: | 347 | default: |
366 | return X509_V_ERR_UNSUPPORTED_CONSTRAINT_TYPE; | 348 | return X509_V_ERR_UNSUPPORTED_CONSTRAINT_TYPE; |
367 | } | ||
368 | |||
369 | } | 349 | } |
350 | } | ||
370 | 351 | ||
371 | /* directoryName name constraint matching. | 352 | /* directoryName name constraint matching. |
372 | * The canonical encoding of X509_NAME makes this comparison easy. It is | 353 | * The canonical encoding of X509_NAME makes this comparison easy. It is |
373 | * matched if the subtree is a subset of the name. | 354 | * matched if the subtree is a subset of the name. |
374 | */ | 355 | */ |
375 | 356 | ||
376 | static int nc_dn(X509_NAME *nm, X509_NAME *base) | 357 | static int |
377 | { | 358 | nc_dn(X509_NAME *nm, X509_NAME *base) |
359 | { | ||
378 | /* Ensure canonical encodings are up to date. */ | 360 | /* Ensure canonical encodings are up to date. */ |
379 | if (nm->modified && i2d_X509_NAME(nm, NULL) < 0) | 361 | if (nm->modified && i2d_X509_NAME(nm, NULL) < 0) |
380 | return X509_V_ERR_OUT_OF_MEM; | 362 | return X509_V_ERR_OUT_OF_MEM; |
@@ -385,12 +367,14 @@ static int nc_dn(X509_NAME *nm, X509_NAME *base) | |||
385 | if (memcmp(base->canon_enc, nm->canon_enc, base->canon_enclen)) | 367 | if (memcmp(base->canon_enc, nm->canon_enc, base->canon_enclen)) |
386 | return X509_V_ERR_PERMITTED_VIOLATION; | 368 | return X509_V_ERR_PERMITTED_VIOLATION; |
387 | return X509_V_OK; | 369 | return X509_V_OK; |
388 | } | 370 | } |
389 | 371 | ||
390 | static int nc_dns(ASN1_IA5STRING *dns, ASN1_IA5STRING *base) | 372 | static int |
391 | { | 373 | nc_dns(ASN1_IA5STRING *dns, ASN1_IA5STRING *base) |
374 | { | ||
392 | char *baseptr = (char *)base->data; | 375 | char *baseptr = (char *)base->data; |
393 | char *dnsptr = (char *)dns->data; | 376 | char *dnsptr = (char *)dns->data; |
377 | |||
394 | /* Empty matches everything */ | 378 | /* Empty matches everything */ |
395 | if (!*baseptr) | 379 | if (!*baseptr) |
396 | return X509_V_OK; | 380 | return X509_V_OK; |
@@ -398,71 +382,67 @@ static int nc_dns(ASN1_IA5STRING *dns, ASN1_IA5STRING *base) | |||
398 | * compare RHS and if dns is longer and expect '.' as preceding | 382 | * compare RHS and if dns is longer and expect '.' as preceding |
399 | * character. | 383 | * character. |
400 | */ | 384 | */ |
401 | if (dns->length > base->length) | 385 | if (dns->length > base->length) { |
402 | { | ||
403 | dnsptr += dns->length - base->length; | 386 | dnsptr += dns->length - base->length; |
404 | if (dnsptr[-1] != '.') | 387 | if (dnsptr[-1] != '.') |
405 | return X509_V_ERR_PERMITTED_VIOLATION; | 388 | return X509_V_ERR_PERMITTED_VIOLATION; |
406 | } | 389 | } |
407 | 390 | ||
408 | if (strcasecmp(baseptr, dnsptr)) | 391 | if (strcasecmp(baseptr, dnsptr)) |
409 | return X509_V_ERR_PERMITTED_VIOLATION; | 392 | return X509_V_ERR_PERMITTED_VIOLATION; |
410 | 393 | ||
411 | return X509_V_OK; | 394 | return X509_V_OK; |
395 | } | ||
412 | 396 | ||
413 | } | 397 | static int |
414 | 398 | nc_email(ASN1_IA5STRING *eml, ASN1_IA5STRING *base) | |
415 | static int nc_email(ASN1_IA5STRING *eml, ASN1_IA5STRING *base) | 399 | { |
416 | { | ||
417 | const char *baseptr = (char *)base->data; | 400 | const char *baseptr = (char *)base->data; |
418 | const char *emlptr = (char *)eml->data; | 401 | const char *emlptr = (char *)eml->data; |
419 | |||
420 | const char *baseat = strchr(baseptr, '@'); | 402 | const char *baseat = strchr(baseptr, '@'); |
421 | const char *emlat = strchr(emlptr, '@'); | 403 | const char *emlat = strchr(emlptr, '@'); |
404 | |||
422 | if (!emlat) | 405 | if (!emlat) |
423 | return X509_V_ERR_UNSUPPORTED_NAME_SYNTAX; | 406 | return X509_V_ERR_UNSUPPORTED_NAME_SYNTAX; |
424 | /* Special case: inital '.' is RHS match */ | 407 | /* Special case: inital '.' is RHS match */ |
425 | if (!baseat && (*baseptr == '.')) | 408 | if (!baseat && (*baseptr == '.')) { |
426 | { | 409 | if (eml->length > base->length) { |
427 | if (eml->length > base->length) | ||
428 | { | ||
429 | emlptr += eml->length - base->length; | 410 | emlptr += eml->length - base->length; |
430 | if (!strcasecmp(baseptr, emlptr)) | 411 | if (!strcasecmp(baseptr, emlptr)) |
431 | return X509_V_OK; | 412 | return X509_V_OK; |
432 | } | ||
433 | return X509_V_ERR_PERMITTED_VIOLATION; | ||
434 | } | 413 | } |
414 | return X509_V_ERR_PERMITTED_VIOLATION; | ||
415 | } | ||
435 | 416 | ||
436 | /* If we have anything before '@' match local part */ | 417 | /* If we have anything before '@' match local part */ |
437 | 418 | ||
438 | if (baseat) | 419 | if (baseat) { |
439 | { | 420 | if (baseat != baseptr) { |
440 | if (baseat != baseptr) | ||
441 | { | ||
442 | if ((baseat - baseptr) != (emlat - emlptr)) | 421 | if ((baseat - baseptr) != (emlat - emlptr)) |
443 | return X509_V_ERR_PERMITTED_VIOLATION; | 422 | return X509_V_ERR_PERMITTED_VIOLATION; |
444 | /* Case sensitive match of local part */ | 423 | /* Case sensitive match of local part */ |
445 | if (strncmp(baseptr, emlptr, emlat - emlptr)) | 424 | if (strncmp(baseptr, emlptr, emlat - emlptr)) |
446 | return X509_V_ERR_PERMITTED_VIOLATION; | 425 | return X509_V_ERR_PERMITTED_VIOLATION; |
447 | } | 426 | } |
448 | /* Position base after '@' */ | 427 | /* Position base after '@' */ |
449 | baseptr = baseat + 1; | 428 | baseptr = baseat + 1; |
450 | } | 429 | } |
451 | emlptr = emlat + 1; | 430 | emlptr = emlat + 1; |
452 | /* Just have hostname left to match: case insensitive */ | 431 | /* Just have hostname left to match: case insensitive */ |
453 | if (strcasecmp(baseptr, emlptr)) | 432 | if (strcasecmp(baseptr, emlptr)) |
454 | return X509_V_ERR_PERMITTED_VIOLATION; | 433 | return X509_V_ERR_PERMITTED_VIOLATION; |
455 | 434 | ||
456 | return X509_V_OK; | 435 | return X509_V_OK; |
436 | } | ||
457 | 437 | ||
458 | } | 438 | static int |
459 | 439 | nc_uri(ASN1_IA5STRING *uri, ASN1_IA5STRING *base) | |
460 | static int nc_uri(ASN1_IA5STRING *uri, ASN1_IA5STRING *base) | 440 | { |
461 | { | ||
462 | const char *baseptr = (char *)base->data; | 441 | const char *baseptr = (char *)base->data; |
463 | const char *hostptr = (char *)uri->data; | 442 | const char *hostptr = (char *)uri->data; |
464 | const char *p = strchr(hostptr, ':'); | 443 | const char *p = strchr(hostptr, ':'); |
465 | int hostlen; | 444 | int hostlen; |
445 | |||
466 | /* Check for foo:// and skip past it */ | 446 | /* Check for foo:// and skip past it */ |
467 | if (!p || (p[1] != '/') || (p[2] != '/')) | 447 | if (!p || (p[1] != '/') || (p[2] != '/')) |
468 | return X509_V_ERR_UNSUPPORTED_NAME_SYNTAX; | 448 | return X509_V_ERR_UNSUPPORTED_NAME_SYNTAX; |
@@ -486,20 +466,18 @@ static int nc_uri(ASN1_IA5STRING *uri, ASN1_IA5STRING *base) | |||
486 | return X509_V_ERR_UNSUPPORTED_NAME_SYNTAX; | 466 | return X509_V_ERR_UNSUPPORTED_NAME_SYNTAX; |
487 | 467 | ||
488 | /* Special case: inital '.' is RHS match */ | 468 | /* Special case: inital '.' is RHS match */ |
489 | if (*baseptr == '.') | 469 | if (*baseptr == '.') { |
490 | { | 470 | if (hostlen > base->length) { |
491 | if (hostlen > base->length) | ||
492 | { | ||
493 | p = hostptr + hostlen - base->length; | 471 | p = hostptr + hostlen - base->length; |
494 | if (!strncasecmp(p, baseptr, base->length)) | 472 | if (!strncasecmp(p, baseptr, base->length)) |
495 | return X509_V_OK; | 473 | return X509_V_OK; |
496 | } | ||
497 | return X509_V_ERR_PERMITTED_VIOLATION; | ||
498 | } | 474 | } |
475 | return X509_V_ERR_PERMITTED_VIOLATION; | ||
476 | } | ||
499 | 477 | ||
500 | if ((base->length != (int)hostlen) || strncasecmp(hostptr, baseptr, hostlen)) | 478 | if ((base->length != (int)hostlen) || |
479 | strncasecmp(hostptr, baseptr, hostlen)) | ||
501 | return X509_V_ERR_PERMITTED_VIOLATION; | 480 | return X509_V_ERR_PERMITTED_VIOLATION; |
502 | 481 | ||
503 | return X509_V_OK; | 482 | return X509_V_OK; |
504 | 483 | } | |
505 | } | ||
diff --git a/src/lib/libssl/src/crypto/x509v3/v3_ocsp.c b/src/lib/libssl/src/crypto/x509v3/v3_ocsp.c index 0c165af314..2fef484b9a 100644 --- a/src/lib/libssl/src/crypto/x509v3/v3_ocsp.c +++ b/src/lib/libssl/src/crypto/x509v3/v3_ocsp.c | |||
@@ -10,7 +10,7 @@ | |||
10 | * are met: | 10 | * are met: |
11 | * | 11 | * |
12 | * 1. Redistributions of source code must retain the above copyright | 12 | * 1. Redistributions of source code must retain the above copyright |
13 | * notice, this list of conditions and the following disclaimer. | 13 | * notice, this list of conditions and the following disclaimer. |
14 | * | 14 | * |
15 | * 2. Redistributions in binary form must reproduce the above copyright | 15 | * 2. Redistributions in binary form must reproduce the above copyright |
16 | * notice, this list of conditions and the following disclaimer in | 16 | * notice, this list of conditions and the following disclaimer in |
@@ -69,59 +69,59 @@ | |||
69 | */ | 69 | */ |
70 | 70 | ||
71 | static int i2r_ocsp_crlid(const X509V3_EXT_METHOD *method, void *nonce, | 71 | static int i2r_ocsp_crlid(const X509V3_EXT_METHOD *method, void *nonce, |
72 | BIO *out, int indent); | 72 | BIO *out, int indent); |
73 | static int i2r_ocsp_acutoff(const X509V3_EXT_METHOD *method, void *nonce, | 73 | static int i2r_ocsp_acutoff(const X509V3_EXT_METHOD *method, void *nonce, |
74 | BIO *out, int indent); | 74 | BIO *out, int indent); |
75 | static int i2r_object(const X509V3_EXT_METHOD *method, void *obj, BIO *out, | 75 | static int i2r_object(const X509V3_EXT_METHOD *method, void *obj, BIO *out, |
76 | int indent); | 76 | int indent); |
77 | 77 | ||
78 | static void *ocsp_nonce_new(void); | 78 | static void *ocsp_nonce_new(void); |
79 | static int i2d_ocsp_nonce(void *a, unsigned char **pp); | 79 | static int i2d_ocsp_nonce(void *a, unsigned char **pp); |
80 | static void *d2i_ocsp_nonce(void *a, const unsigned char **pp, long length); | 80 | static void *d2i_ocsp_nonce(void *a, const unsigned char **pp, long length); |
81 | static void ocsp_nonce_free(void *a); | 81 | static void ocsp_nonce_free(void *a); |
82 | static int i2r_ocsp_nonce(const X509V3_EXT_METHOD *method, void *nonce, | 82 | static int i2r_ocsp_nonce(const X509V3_EXT_METHOD *method, void *nonce, |
83 | BIO *out, int indent); | 83 | BIO *out, int indent); |
84 | 84 | ||
85 | static int i2r_ocsp_nocheck(const X509V3_EXT_METHOD *method, | 85 | static int i2r_ocsp_nocheck(const X509V3_EXT_METHOD *method, |
86 | void *nocheck, BIO *out, int indent); | 86 | void *nocheck, BIO *out, int indent); |
87 | static void *s2i_ocsp_nocheck(const X509V3_EXT_METHOD *method, X509V3_CTX *ctx, | 87 | static void *s2i_ocsp_nocheck(const X509V3_EXT_METHOD *method, X509V3_CTX *ctx, |
88 | const char *str); | 88 | const char *str); |
89 | static int i2r_ocsp_serviceloc(const X509V3_EXT_METHOD *method, void *in, | 89 | static int i2r_ocsp_serviceloc(const X509V3_EXT_METHOD *method, void *in, |
90 | BIO *bp, int ind); | 90 | BIO *bp, int ind); |
91 | 91 | ||
92 | const X509V3_EXT_METHOD v3_ocsp_crlid = { | 92 | const X509V3_EXT_METHOD v3_ocsp_crlid = { |
93 | NID_id_pkix_OCSP_CrlID, 0, ASN1_ITEM_ref(OCSP_CRLID), | 93 | NID_id_pkix_OCSP_CrlID, 0, ASN1_ITEM_ref(OCSP_CRLID), |
94 | 0,0,0,0, | 94 | 0, 0, 0, 0, |
95 | 0,0, | 95 | 0, 0, |
96 | 0,0, | 96 | 0, 0, |
97 | i2r_ocsp_crlid,0, | 97 | i2r_ocsp_crlid, 0, |
98 | NULL | 98 | NULL |
99 | }; | 99 | }; |
100 | 100 | ||
101 | const X509V3_EXT_METHOD v3_ocsp_acutoff = { | 101 | const X509V3_EXT_METHOD v3_ocsp_acutoff = { |
102 | NID_id_pkix_OCSP_archiveCutoff, 0, ASN1_ITEM_ref(ASN1_GENERALIZEDTIME), | 102 | NID_id_pkix_OCSP_archiveCutoff, 0, ASN1_ITEM_ref(ASN1_GENERALIZEDTIME), |
103 | 0,0,0,0, | 103 | 0, 0, 0, 0, |
104 | 0,0, | 104 | 0, 0, |
105 | 0,0, | 105 | 0, 0, |
106 | i2r_ocsp_acutoff,0, | 106 | i2r_ocsp_acutoff, 0, |
107 | NULL | 107 | NULL |
108 | }; | 108 | }; |
109 | 109 | ||
110 | const X509V3_EXT_METHOD v3_crl_invdate = { | 110 | const X509V3_EXT_METHOD v3_crl_invdate = { |
111 | NID_invalidity_date, 0, ASN1_ITEM_ref(ASN1_GENERALIZEDTIME), | 111 | NID_invalidity_date, 0, ASN1_ITEM_ref(ASN1_GENERALIZEDTIME), |
112 | 0,0,0,0, | 112 | 0, 0, 0, 0, |
113 | 0,0, | 113 | 0, 0, |
114 | 0,0, | 114 | 0, 0, |
115 | i2r_ocsp_acutoff,0, | 115 | i2r_ocsp_acutoff, 0, |
116 | NULL | 116 | NULL |
117 | }; | 117 | }; |
118 | 118 | ||
119 | const X509V3_EXT_METHOD v3_crl_hold = { | 119 | const X509V3_EXT_METHOD v3_crl_hold = { |
120 | NID_hold_instruction_code, 0, ASN1_ITEM_ref(ASN1_OBJECT), | 120 | NID_hold_instruction_code, 0, ASN1_ITEM_ref(ASN1_OBJECT), |
121 | 0,0,0,0, | 121 | 0, 0, 0, 0, |
122 | 0,0, | 122 | 0, 0, |
123 | 0,0, | 123 | 0, 0, |
124 | i2r_object,0, | 124 | i2r_object, 0, |
125 | NULL | 125 | NULL |
126 | }; | 126 | }; |
127 | 127 | ||
@@ -131,71 +131,82 @@ const X509V3_EXT_METHOD v3_ocsp_nonce = { | |||
131 | ocsp_nonce_free, | 131 | ocsp_nonce_free, |
132 | d2i_ocsp_nonce, | 132 | d2i_ocsp_nonce, |
133 | i2d_ocsp_nonce, | 133 | i2d_ocsp_nonce, |
134 | 0,0, | 134 | 0, 0, |
135 | 0,0, | 135 | 0, 0, |
136 | i2r_ocsp_nonce,0, | 136 | i2r_ocsp_nonce, 0, |
137 | NULL | 137 | NULL |
138 | }; | 138 | }; |
139 | 139 | ||
140 | const X509V3_EXT_METHOD v3_ocsp_nocheck = { | 140 | const X509V3_EXT_METHOD v3_ocsp_nocheck = { |
141 | NID_id_pkix_OCSP_noCheck, 0, ASN1_ITEM_ref(ASN1_NULL), | 141 | NID_id_pkix_OCSP_noCheck, 0, ASN1_ITEM_ref(ASN1_NULL), |
142 | 0,0,0,0, | 142 | 0, 0, 0, 0, |
143 | 0,s2i_ocsp_nocheck, | 143 | 0, s2i_ocsp_nocheck, |
144 | 0,0, | 144 | 0, 0, |
145 | i2r_ocsp_nocheck,0, | 145 | i2r_ocsp_nocheck, 0, |
146 | NULL | 146 | NULL |
147 | }; | 147 | }; |
148 | 148 | ||
149 | const X509V3_EXT_METHOD v3_ocsp_serviceloc = { | 149 | const X509V3_EXT_METHOD v3_ocsp_serviceloc = { |
150 | NID_id_pkix_OCSP_serviceLocator, 0, ASN1_ITEM_ref(OCSP_SERVICELOC), | 150 | NID_id_pkix_OCSP_serviceLocator, 0, ASN1_ITEM_ref(OCSP_SERVICELOC), |
151 | 0,0,0,0, | 151 | 0, 0, 0, 0, |
152 | 0,0, | 152 | 0, 0, |
153 | 0,0, | 153 | 0, 0, |
154 | i2r_ocsp_serviceloc,0, | 154 | i2r_ocsp_serviceloc, 0, |
155 | NULL | 155 | NULL |
156 | }; | 156 | }; |
157 | 157 | ||
158 | static int i2r_ocsp_crlid(const X509V3_EXT_METHOD *method, void *in, BIO *bp, | 158 | static int |
159 | int ind) | 159 | i2r_ocsp_crlid(const X509V3_EXT_METHOD *method, void *in, BIO *bp, int ind) |
160 | { | 160 | { |
161 | OCSP_CRLID *a = in; | 161 | OCSP_CRLID *a = in; |
162 | if (a->crlUrl) | 162 | if (a->crlUrl) { |
163 | { | 163 | if (BIO_printf(bp, "%*scrlUrl: ", ind, "") <= 0) |
164 | if (BIO_printf(bp, "%*scrlUrl: ", ind, "") <= 0) goto err; | 164 | goto err; |
165 | if (!ASN1_STRING_print(bp, (ASN1_STRING*)a->crlUrl)) goto err; | 165 | if (!ASN1_STRING_print(bp, (ASN1_STRING*)a->crlUrl)) |
166 | if (BIO_write(bp, "\n", 1) <= 0) goto err; | 166 | goto err; |
167 | } | 167 | if (BIO_write(bp, "\n", 1) <= 0) |
168 | if (a->crlNum) | 168 | goto err; |
169 | { | 169 | } |
170 | if (BIO_printf(bp, "%*scrlNum: ", ind, "") <= 0) goto err; | 170 | if (a->crlNum) { |
171 | if (i2a_ASN1_INTEGER(bp, a->crlNum) <= 0) goto err; | 171 | if (BIO_printf(bp, "%*scrlNum: ", ind, "") <= 0) |
172 | if (BIO_write(bp, "\n", 1) <= 0) goto err; | 172 | goto err; |
173 | } | 173 | if (i2a_ASN1_INTEGER(bp, a->crlNum) <= 0) |
174 | if (a->crlTime) | 174 | goto err; |
175 | { | 175 | if (BIO_write(bp, "\n", 1) <= 0) |
176 | if (BIO_printf(bp, "%*scrlTime: ", ind, "") <= 0) goto err; | 176 | goto err; |
177 | if (!ASN1_GENERALIZEDTIME_print(bp, a->crlTime)) goto err; | 177 | } |
178 | if (BIO_write(bp, "\n", 1) <= 0) goto err; | 178 | if (a->crlTime) { |
179 | } | 179 | if (BIO_printf(bp, "%*scrlTime: ", ind, "") <= 0) |
180 | goto err; | ||
181 | if (!ASN1_GENERALIZEDTIME_print(bp, a->crlTime)) | ||
182 | goto err; | ||
183 | if (BIO_write(bp, "\n", 1) <= 0) | ||
184 | goto err; | ||
185 | } | ||
180 | return 1; | 186 | return 1; |
181 | err: | 187 | |
188 | err: | ||
182 | return 0; | 189 | return 0; |
183 | } | 190 | } |
184 | 191 | ||
185 | static int i2r_ocsp_acutoff(const X509V3_EXT_METHOD *method, void *cutoff, | 192 | static int |
186 | BIO *bp, int ind) | 193 | i2r_ocsp_acutoff(const X509V3_EXT_METHOD *method, void *cutoff, BIO *bp, |
194 | int ind) | ||
187 | { | 195 | { |
188 | if (BIO_printf(bp, "%*s", ind, "") <= 0) return 0; | 196 | if (BIO_printf(bp, "%*s", ind, "") <= 0) |
189 | if(!ASN1_GENERALIZEDTIME_print(bp, cutoff)) return 0; | 197 | return 0; |
198 | if (!ASN1_GENERALIZEDTIME_print(bp, cutoff)) | ||
199 | return 0; | ||
190 | return 1; | 200 | return 1; |
191 | } | 201 | } |
192 | 202 | ||
193 | 203 | static int | |
194 | static int i2r_object(const X509V3_EXT_METHOD *method, void *oid, BIO *bp, | 204 | i2r_object(const X509V3_EXT_METHOD *method, void *oid, BIO *bp, int ind) |
195 | int ind) | ||
196 | { | 205 | { |
197 | if (BIO_printf(bp, "%*s", ind, "") <= 0) return 0; | 206 | if (BIO_printf(bp, "%*s", ind, "") <= 0) |
198 | if(i2a_ASN1_OBJECT(bp, oid) <= 0) return 0; | 207 | return 0; |
208 | if (i2a_ASN1_OBJECT(bp, oid) <= 0) | ||
209 | return 0; | ||
199 | return 1; | 210 | return 1; |
200 | } | 211 | } |
201 | 212 | ||
@@ -203,87 +214,108 @@ static int i2r_object(const X509V3_EXT_METHOD *method, void *oid, BIO *bp, | |||
203 | * an ASN1 encoding at all: it just contains arbitrary data. | 214 | * an ASN1 encoding at all: it just contains arbitrary data. |
204 | */ | 215 | */ |
205 | 216 | ||
206 | static void *ocsp_nonce_new(void) | 217 | static void * |
218 | ocsp_nonce_new(void) | ||
207 | { | 219 | { |
208 | return ASN1_OCTET_STRING_new(); | 220 | return ASN1_OCTET_STRING_new(); |
209 | } | 221 | } |
210 | 222 | ||
211 | static int i2d_ocsp_nonce(void *a, unsigned char **pp) | 223 | static int |
224 | i2d_ocsp_nonce(void *a, unsigned char **pp) | ||
212 | { | 225 | { |
213 | ASN1_OCTET_STRING *os = a; | 226 | ASN1_OCTET_STRING *os = a; |
214 | if(pp) { | 227 | |
228 | if (pp) { | ||
215 | memcpy(*pp, os->data, os->length); | 229 | memcpy(*pp, os->data, os->length); |
216 | *pp += os->length; | 230 | *pp += os->length; |
217 | } | 231 | } |
218 | return os->length; | 232 | return os->length; |
219 | } | 233 | } |
220 | 234 | ||
221 | static void *d2i_ocsp_nonce(void *a, const unsigned char **pp, long length) | 235 | static void * |
236 | d2i_ocsp_nonce(void *a, const unsigned char **pp, long length) | ||
222 | { | 237 | { |
223 | ASN1_OCTET_STRING *os, **pos; | 238 | ASN1_OCTET_STRING *os, **pos; |
239 | |||
224 | pos = a; | 240 | pos = a; |
225 | if(!pos || !*pos) os = ASN1_OCTET_STRING_new(); | 241 | if (!pos || !*pos) |
226 | else os = *pos; | 242 | os = ASN1_OCTET_STRING_new(); |
227 | if(!ASN1_OCTET_STRING_set(os, *pp, length)) goto err; | 243 | else |
244 | os = *pos; | ||
245 | if (!ASN1_OCTET_STRING_set(os, *pp, length)) | ||
246 | goto err; | ||
228 | 247 | ||
229 | *pp += length; | 248 | *pp += length; |
230 | 249 | ||
231 | if(pos) *pos = os; | 250 | if (pos) |
251 | *pos = os; | ||
232 | return os; | 252 | return os; |
233 | 253 | ||
234 | err: | 254 | err: |
235 | if(os && (!pos || (*pos != os))) M_ASN1_OCTET_STRING_free(os); | 255 | if (os && (!pos || (*pos != os))) |
256 | M_ASN1_OCTET_STRING_free(os); | ||
236 | OCSPerr(OCSP_F_D2I_OCSP_NONCE, ERR_R_MALLOC_FAILURE); | 257 | OCSPerr(OCSP_F_D2I_OCSP_NONCE, ERR_R_MALLOC_FAILURE); |
237 | return NULL; | 258 | return NULL; |
238 | } | 259 | } |
239 | 260 | ||
240 | static void ocsp_nonce_free(void *a) | 261 | static void |
262 | ocsp_nonce_free(void *a) | ||
241 | { | 263 | { |
242 | M_ASN1_OCTET_STRING_free(a); | 264 | M_ASN1_OCTET_STRING_free(a); |
243 | } | 265 | } |
244 | 266 | ||
245 | static int i2r_ocsp_nonce(const X509V3_EXT_METHOD *method, void *nonce, | 267 | static int |
246 | BIO *out, int indent) | 268 | i2r_ocsp_nonce(const X509V3_EXT_METHOD *method, void *nonce, BIO *out, |
269 | int indent) | ||
247 | { | 270 | { |
248 | if(BIO_printf(out, "%*s", indent, "") <= 0) return 0; | 271 | if (BIO_printf(out, "%*s", indent, "") <= 0) |
249 | if(i2a_ASN1_STRING(out, nonce, V_ASN1_OCTET_STRING) <= 0) return 0; | 272 | return 0; |
273 | if (i2a_ASN1_STRING(out, nonce, V_ASN1_OCTET_STRING) <= 0) | ||
274 | return 0; | ||
250 | return 1; | 275 | return 1; |
251 | } | 276 | } |
252 | 277 | ||
253 | /* Nocheck is just a single NULL. Don't print anything and always set it */ | 278 | /* Nocheck is just a single NULL. Don't print anything and always set it */ |
254 | 279 | ||
255 | static int i2r_ocsp_nocheck(const X509V3_EXT_METHOD *method, void *nocheck, | 280 | static int |
256 | BIO *out, int indent) | 281 | i2r_ocsp_nocheck(const X509V3_EXT_METHOD *method, void *nocheck, BIO *out, |
282 | int indent) | ||
257 | { | 283 | { |
258 | return 1; | 284 | return 1; |
259 | } | 285 | } |
260 | 286 | ||
261 | static void *s2i_ocsp_nocheck(const X509V3_EXT_METHOD *method, X509V3_CTX *ctx, | 287 | static void * |
262 | const char *str) | 288 | s2i_ocsp_nocheck(const X509V3_EXT_METHOD *method, X509V3_CTX *ctx, |
289 | const char *str) | ||
263 | { | 290 | { |
264 | return ASN1_NULL_new(); | 291 | return ASN1_NULL_new(); |
265 | } | 292 | } |
266 | 293 | ||
267 | static int i2r_ocsp_serviceloc(const X509V3_EXT_METHOD *method, void *in, | 294 | static int |
268 | BIO *bp, int ind) | 295 | i2r_ocsp_serviceloc(const X509V3_EXT_METHOD *method, void *in, BIO *bp, int ind) |
269 | { | 296 | { |
270 | int i; | 297 | int i; |
271 | OCSP_SERVICELOC *a = in; | 298 | OCSP_SERVICELOC *a = in; |
272 | ACCESS_DESCRIPTION *ad; | 299 | ACCESS_DESCRIPTION *ad; |
273 | 300 | ||
274 | if (BIO_printf(bp, "%*sIssuer: ", ind, "") <= 0) goto err; | 301 | if (BIO_printf(bp, "%*sIssuer: ", ind, "") <= 0) |
275 | if (X509_NAME_print_ex(bp, a->issuer, 0, XN_FLAG_ONELINE) <= 0) goto err; | 302 | goto err; |
276 | for (i = 0; i < sk_ACCESS_DESCRIPTION_num(a->locator); i++) | 303 | if (X509_NAME_print_ex(bp, a->issuer, 0, XN_FLAG_ONELINE) <= 0) |
277 | { | 304 | goto err; |
278 | ad = sk_ACCESS_DESCRIPTION_value(a->locator,i); | 305 | for (i = 0; i < sk_ACCESS_DESCRIPTION_num(a->locator); i++) { |
279 | if (BIO_printf(bp, "\n%*s", (2*ind), "") <= 0) | 306 | ad = sk_ACCESS_DESCRIPTION_value(a->locator, i); |
280 | goto err; | 307 | if (BIO_printf(bp, "\n%*s", (2 * ind), "") <= 0) |
281 | if(i2a_ASN1_OBJECT(bp, ad->method) <= 0) goto err; | 308 | goto err; |
282 | if(BIO_puts(bp, " - ") <= 0) goto err; | 309 | if (i2a_ASN1_OBJECT(bp, ad->method) <= 0) |
283 | if(GENERAL_NAME_print(bp, ad->location) <= 0) goto err; | 310 | goto err; |
284 | } | 311 | if (BIO_puts(bp, " - ") <= 0) |
312 | goto err; | ||
313 | if (GENERAL_NAME_print(bp, ad->location) <= 0) | ||
314 | goto err; | ||
315 | } | ||
285 | return 1; | 316 | return 1; |
317 | |||
286 | err: | 318 | err: |
287 | return 0; | 319 | return 0; |
288 | } | 320 | } |
289 | #endif | 321 | #endif |