Absolute File Name: | /home/opencoverage/opencoverage/guest-scripts/libressl/src/crypto/x509/x509_lu.c |
Source code | Switch to Preprocessed file |
Line | Source | Count | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
1 | /* $OpenBSD: x509_lu.c,v 1.30 2018/08/24 19:21:09 tb Exp $ */ | - | ||||||||||||
2 | /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) | - | ||||||||||||
3 | * All rights reserved. | - | ||||||||||||
4 | * | - | ||||||||||||
5 | * This package is an SSL implementation written | - | ||||||||||||
6 | * by Eric Young (eay@cryptsoft.com). | - | ||||||||||||
7 | * The implementation was written so as to conform with Netscapes SSL. | - | ||||||||||||
8 | * | - | ||||||||||||
9 | * This library is free for commercial and non-commercial use as long as | - | ||||||||||||
10 | * the following conditions are aheared to. The following conditions | - | ||||||||||||
11 | * apply to all code found in this distribution, be it the RC4, RSA, | - | ||||||||||||
12 | * lhash, DES, etc., code; not just the SSL code. The SSL documentation | - | ||||||||||||
13 | * included with this distribution is covered by the same copyright terms | - | ||||||||||||
14 | * except that the holder is Tim Hudson (tjh@cryptsoft.com). | - | ||||||||||||
15 | * | - | ||||||||||||
16 | * Copyright remains Eric Young's, and as such any Copyright notices in | - | ||||||||||||
17 | * the code are not to be removed. | - | ||||||||||||
18 | * If this package is used in a product, Eric Young should be given attribution | - | ||||||||||||
19 | * as the author of the parts of the library used. | - | ||||||||||||
20 | * This can be in the form of a textual message at program startup or | - | ||||||||||||
21 | * in documentation (online or textual) provided with the package. | - | ||||||||||||
22 | * | - | ||||||||||||
23 | * Redistribution and use in source and binary forms, with or without | - | ||||||||||||
24 | * modification, are permitted provided that the following conditions | - | ||||||||||||
25 | * are met: | - | ||||||||||||
26 | * 1. Redistributions of source code must retain the copyright | - | ||||||||||||
27 | * notice, this list of conditions and the following disclaimer. | - | ||||||||||||
28 | * 2. Redistributions in binary form must reproduce the above copyright | - | ||||||||||||
29 | * notice, this list of conditions and the following disclaimer in the | - | ||||||||||||
30 | * documentation and/or other materials provided with the distribution. | - | ||||||||||||
31 | * 3. All advertising materials mentioning features or use of this software | - | ||||||||||||
32 | * must display the following acknowledgement: | - | ||||||||||||
33 | * "This product includes cryptographic software written by | - | ||||||||||||
34 | * Eric Young (eay@cryptsoft.com)" | - | ||||||||||||
35 | * The word 'cryptographic' can be left out if the rouines from the library | - | ||||||||||||
36 | * being used are not cryptographic related :-). | - | ||||||||||||
37 | * 4. If you include any Windows specific code (or a derivative thereof) from | - | ||||||||||||
38 | * the apps directory (application code) you must include an acknowledgement: | - | ||||||||||||
39 | * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" | - | ||||||||||||
40 | * | - | ||||||||||||
41 | * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND | - | ||||||||||||
42 | * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | - | ||||||||||||
43 | * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | - | ||||||||||||
44 | * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE | - | ||||||||||||
45 | * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL | - | ||||||||||||
46 | * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS | - | ||||||||||||
47 | * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) | - | ||||||||||||
48 | * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT | - | ||||||||||||
49 | * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY | - | ||||||||||||
50 | * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | - | ||||||||||||
51 | * SUCH DAMAGE. | - | ||||||||||||
52 | * | - | ||||||||||||
53 | * The licence and distribution terms for any publically available version or | - | ||||||||||||
54 | * derivative of this code cannot be changed. i.e. this code cannot simply be | - | ||||||||||||
55 | * copied and put under another distribution licence | - | ||||||||||||
56 | * [including the GNU Public Licence.] | - | ||||||||||||
57 | */ | - | ||||||||||||
58 | - | |||||||||||||
59 | #include <stdio.h> | - | ||||||||||||
60 | - | |||||||||||||
61 | #include <openssl/err.h> | - | ||||||||||||
62 | #include <openssl/lhash.h> | - | ||||||||||||
63 | #include <openssl/x509.h> | - | ||||||||||||
64 | #include <openssl/x509v3.h> | - | ||||||||||||
65 | #include "x509_lcl.h" | - | ||||||||||||
66 | - | |||||||||||||
67 | static void X509_OBJECT_dec_ref_count(X509_OBJECT *a); | - | ||||||||||||
68 | - | |||||||||||||
69 | X509_LOOKUP * | - | ||||||||||||
70 | X509_LOOKUP_new(X509_LOOKUP_METHOD *method) | - | ||||||||||||
71 | { | - | ||||||||||||
72 | X509_LOOKUP *ret; | - | ||||||||||||
73 | - | |||||||||||||
74 | ret = malloc(sizeof(X509_LOOKUP)); | - | ||||||||||||
75 | if (ret == NULL)
| 0-50 | ||||||||||||
76 | return NULL; never executed: return ((void *)0) ; | 0 | ||||||||||||
77 | - | |||||||||||||
78 | ret->init = 0; | - | ||||||||||||
79 | ret->skip = 0; | - | ||||||||||||
80 | ret->method = method; | - | ||||||||||||
81 | ret->method_data = NULL; | - | ||||||||||||
82 | ret->store_ctx = NULL; | - | ||||||||||||
83 | if ((method->new_item != NULL) && !method->new_item(ret)) {
| 0-27 | ||||||||||||
84 | free(ret); | - | ||||||||||||
85 | return NULL; never executed: return ((void *)0) ; | 0 | ||||||||||||
86 | } | - | ||||||||||||
87 | return ret; executed 50 times by 3 tests: return ret; Executed by:
| 50 | ||||||||||||
88 | } | - | ||||||||||||
89 | - | |||||||||||||
90 | void | - | ||||||||||||
91 | X509_LOOKUP_free(X509_LOOKUP *ctx) | - | ||||||||||||
92 | { | - | ||||||||||||
93 | if (ctx == NULL)
| 1-50 | ||||||||||||
94 | return; executed 1 time by 1 test: return; Executed by:
| 1 | ||||||||||||
95 | if ((ctx->method != NULL) && (ctx->method->free != NULL))
| 0-50 | ||||||||||||
96 | (*ctx->method->free)(ctx); executed 23 times by 2 tests: (*ctx->method->free)(ctx); Executed by:
| 23 | ||||||||||||
97 | free(ctx); | - | ||||||||||||
98 | } executed 50 times by 3 tests: end of block Executed by:
| 50 | ||||||||||||
99 | - | |||||||||||||
100 | int | - | ||||||||||||
101 | X509_LOOKUP_init(X509_LOOKUP *ctx) | - | ||||||||||||
102 | { | - | ||||||||||||
103 | if (ctx->method == NULL)
| 0 | ||||||||||||
104 | return 0; never executed: return 0; | 0 | ||||||||||||
105 | if (ctx->method->init != NULL)
| 0 | ||||||||||||
106 | return ctx->method->init(ctx); never executed: return ctx->method->init(ctx); | 0 | ||||||||||||
107 | else | - | ||||||||||||
108 | return 1; never executed: return 1; | 0 | ||||||||||||
109 | } | - | ||||||||||||
110 | - | |||||||||||||
111 | int | - | ||||||||||||
112 | X509_LOOKUP_shutdown(X509_LOOKUP *ctx) | - | ||||||||||||
113 | { | - | ||||||||||||
114 | if (ctx->method == NULL)
| 0-50 | ||||||||||||
115 | return 0; never executed: return 0; | 0 | ||||||||||||
116 | if (ctx->method->shutdown != NULL)
| 0-50 | ||||||||||||
117 | return ctx->method->shutdown(ctx); never executed: return ctx->method->shutdown(ctx); | 0 | ||||||||||||
118 | else | - | ||||||||||||
119 | return 1; executed 50 times by 3 tests: return 1; Executed by:
| 50 | ||||||||||||
120 | } | - | ||||||||||||
121 | - | |||||||||||||
122 | int | - | ||||||||||||
123 | X509_LOOKUP_ctrl(X509_LOOKUP *ctx, int cmd, const char *argc, long argl, | - | ||||||||||||
124 | char **ret) | - | ||||||||||||
125 | { | - | ||||||||||||
126 | if (ctx->method == NULL)
| 0-70 | ||||||||||||
127 | return -1; never executed: return -1; | 0 | ||||||||||||
128 | if (ctx->method->ctrl != NULL)
| 0-70 | ||||||||||||
129 | return ctx->method->ctrl(ctx, cmd, argc, argl, ret); executed 70 times by 3 tests: return ctx->method->ctrl(ctx, cmd, argc, argl, ret); Executed by:
| 70 | ||||||||||||
130 | else | - | ||||||||||||
131 | return 1; never executed: return 1; | 0 | ||||||||||||
132 | } | - | ||||||||||||
133 | - | |||||||||||||
134 | int | - | ||||||||||||
135 | X509_LOOKUP_by_subject(X509_LOOKUP *ctx, int type, X509_NAME *name, | - | ||||||||||||
136 | X509_OBJECT *ret) | - | ||||||||||||
137 | { | - | ||||||||||||
138 | if ((ctx->method == NULL) || (ctx->method->get_by_subject == NULL))
| 0 | ||||||||||||
139 | return X509_LU_FAIL; never executed: return 0; | 0 | ||||||||||||
140 | if (ctx->skip)
| 0 | ||||||||||||
141 | return 0; never executed: return 0; | 0 | ||||||||||||
142 | return ctx->method->get_by_subject(ctx, type, name, ret); never executed: return ctx->method->get_by_subject(ctx, type, name, ret); | 0 | ||||||||||||
143 | } | - | ||||||||||||
144 | - | |||||||||||||
145 | int | - | ||||||||||||
146 | X509_LOOKUP_by_issuer_serial(X509_LOOKUP *ctx, int type, X509_NAME *name, | - | ||||||||||||
147 | ASN1_INTEGER *serial, X509_OBJECT *ret) | - | ||||||||||||
148 | { | - | ||||||||||||
149 | if ((ctx->method == NULL) ||
| 0 | ||||||||||||
150 | (ctx->method->get_by_issuer_serial == NULL))
| 0 | ||||||||||||
151 | return X509_LU_FAIL; never executed: return 0; | 0 | ||||||||||||
152 | return ctx->method->get_by_issuer_serial(ctx, type, name, serial, ret); never executed: return ctx->method->get_by_issuer_serial(ctx, type, name, serial, ret); | 0 | ||||||||||||
153 | } | - | ||||||||||||
154 | - | |||||||||||||
155 | int | - | ||||||||||||
156 | X509_LOOKUP_by_fingerprint(X509_LOOKUP *ctx, int type, | - | ||||||||||||
157 | const unsigned char *bytes, int len, X509_OBJECT *ret) | - | ||||||||||||
158 | { | - | ||||||||||||
159 | if ((ctx->method == NULL) || (ctx->method->get_by_fingerprint == NULL))
| 0 | ||||||||||||
160 | return X509_LU_FAIL; never executed: return 0; | 0 | ||||||||||||
161 | return ctx->method->get_by_fingerprint(ctx, type, bytes, len, ret); never executed: return ctx->method->get_by_fingerprint(ctx, type, bytes, len, ret); | 0 | ||||||||||||
162 | } | - | ||||||||||||
163 | - | |||||||||||||
164 | int | - | ||||||||||||
165 | X509_LOOKUP_by_alias(X509_LOOKUP *ctx, int type, const char *str, int len, | - | ||||||||||||
166 | X509_OBJECT *ret) | - | ||||||||||||
167 | { | - | ||||||||||||
168 | if ((ctx->method == NULL) || (ctx->method->get_by_alias == NULL))
| 0 | ||||||||||||
169 | return X509_LU_FAIL; never executed: return 0; | 0 | ||||||||||||
170 | return ctx->method->get_by_alias(ctx, type, str, len, ret); never executed: return ctx->method->get_by_alias(ctx, type, str, len, ret); | 0 | ||||||||||||
171 | } | - | ||||||||||||
172 | - | |||||||||||||
173 | static int | - | ||||||||||||
174 | x509_object_cmp(const X509_OBJECT * const *a, const X509_OBJECT * const *b) | - | ||||||||||||
175 | { | - | ||||||||||||
176 | int ret; | - | ||||||||||||
177 | - | |||||||||||||
178 | ret = ((*a)->type - (*b)->type); | - | ||||||||||||
179 | if (ret)
| 0-162 | ||||||||||||
180 | return ret; never executed: return ret; | 0 | ||||||||||||
181 | switch ((*a)->type) { | - | ||||||||||||
182 | case X509_LU_X509: executed 162 times by 2 tests: case 1: Executed by:
| 162 | ||||||||||||
183 | ret = X509_subject_name_cmp((*a)->data.x509, (*b)->data.x509); | - | ||||||||||||
184 | break; executed 162 times by 2 tests: break; Executed by:
| 162 | ||||||||||||
185 | case X509_LU_CRL: never executed: case 2: | 0 | ||||||||||||
186 | ret = X509_CRL_cmp((*a)->data.crl, (*b)->data.crl); | - | ||||||||||||
187 | break; never executed: break; | 0 | ||||||||||||
188 | default: never executed: default: | 0 | ||||||||||||
189 | /* abort(); */ | - | ||||||||||||
190 | return 0; never executed: return 0; | 0 | ||||||||||||
191 | } | - | ||||||||||||
192 | return ret; executed 162 times by 2 tests: return ret; Executed by:
| 162 | ||||||||||||
193 | } | - | ||||||||||||
194 | - | |||||||||||||
195 | X509_STORE * | - | ||||||||||||
196 | X509_STORE_new(void) | - | ||||||||||||
197 | { | - | ||||||||||||
198 | X509_STORE *ret; | - | ||||||||||||
199 | - | |||||||||||||
200 | if ((ret = malloc(sizeof(X509_STORE))) == NULL)
| 0-218 | ||||||||||||
201 | return NULL; never executed: return ((void *)0) ; | 0 | ||||||||||||
202 | ret->objs = sk_X509_OBJECT_new(x509_object_cmp); | - | ||||||||||||
203 | ret->cache = 1; | - | ||||||||||||
204 | ret->get_cert_methods = sk_X509_LOOKUP_new_null(); | - | ||||||||||||
205 | ret->verify = 0; | - | ||||||||||||
206 | ret->verify_cb = 0; | - | ||||||||||||
207 | - | |||||||||||||
208 | if ((ret->param = X509_VERIFY_PARAM_new()) == NULL)
| 0-218 | ||||||||||||
209 | goto err; never executed: goto err; | 0 | ||||||||||||
210 | - | |||||||||||||
211 | ret->get_issuer = 0; | - | ||||||||||||
212 | ret->check_issued = 0; | - | ||||||||||||
213 | ret->check_revocation = 0; | - | ||||||||||||
214 | ret->get_crl = 0; | - | ||||||||||||
215 | ret->check_crl = 0; | - | ||||||||||||
216 | ret->cert_crl = 0; | - | ||||||||||||
217 | ret->lookup_certs = 0; | - | ||||||||||||
218 | ret->lookup_crls = 0; | - | ||||||||||||
219 | ret->cleanup = 0; | - | ||||||||||||
220 | - | |||||||||||||
221 | if (!CRYPTO_new_ex_data(CRYPTO_EX_INDEX_X509_STORE, ret, &ret->ex_data))
| 0-218 | ||||||||||||
222 | goto err; never executed: goto err; | 0 | ||||||||||||
223 | - | |||||||||||||
224 | ret->references = 1; | - | ||||||||||||
225 | return ret; executed 218 times by 14 tests: return ret; Executed by:
| 218 | ||||||||||||
226 | - | |||||||||||||
227 | err: | - | ||||||||||||
228 | X509_VERIFY_PARAM_free(ret->param); | - | ||||||||||||
229 | sk_X509_LOOKUP_free(ret->get_cert_methods); | - | ||||||||||||
230 | sk_X509_OBJECT_free(ret->objs); | - | ||||||||||||
231 | free(ret); | - | ||||||||||||
232 | return NULL; never executed: return ((void *)0) ; | 0 | ||||||||||||
233 | } | - | ||||||||||||
234 | - | |||||||||||||
235 | static void | - | ||||||||||||
236 | X509_OBJECT_free(X509_OBJECT *a) | - | ||||||||||||
237 | { | - | ||||||||||||
238 | X509_OBJECT_free_contents(a); | - | ||||||||||||
239 | free(a); | - | ||||||||||||
240 | } executed 48 times by 2 tests: end of block Executed by:
| 48 | ||||||||||||
241 | - | |||||||||||||
242 | void | - | ||||||||||||
243 | X509_STORE_free(X509_STORE *vfy) | - | ||||||||||||
244 | { | - | ||||||||||||
245 | int i; | - | ||||||||||||
246 | STACK_OF(X509_LOOKUP) *sk; | - | ||||||||||||
247 | X509_LOOKUP *lu; | - | ||||||||||||
248 | - | |||||||||||||
249 | if (vfy == NULL)
| 1-210 | ||||||||||||
250 | return; executed 1 time by 1 test: return; Executed by:
| 1 | ||||||||||||
251 | - | |||||||||||||
252 | i = CRYPTO_add(&vfy->references, -1, CRYPTO_LOCK_X509_STORE); | - | ||||||||||||
253 | if (i > 0)
| 0-210 | ||||||||||||
254 | return; never executed: return; | 0 | ||||||||||||
255 | - | |||||||||||||
256 | sk = vfy->get_cert_methods; | - | ||||||||||||
257 | for (i = 0; i < sk_X509_LOOKUP_num(sk); i++) {
| 50-210 | ||||||||||||
258 | lu = sk_X509_LOOKUP_value(sk, i); | - | ||||||||||||
259 | X509_LOOKUP_shutdown(lu); | - | ||||||||||||
260 | X509_LOOKUP_free(lu); | - | ||||||||||||
261 | } executed 50 times by 3 tests: end of block Executed by:
| 50 | ||||||||||||
262 | sk_X509_LOOKUP_free(sk); | - | ||||||||||||
263 | sk_X509_OBJECT_pop_free(vfy->objs, X509_OBJECT_free); | - | ||||||||||||
264 | - | |||||||||||||
265 | CRYPTO_free_ex_data(CRYPTO_EX_INDEX_X509_STORE, vfy, &vfy->ex_data); | - | ||||||||||||
266 | X509_VERIFY_PARAM_free(vfy->param); | - | ||||||||||||
267 | free(vfy); | - | ||||||||||||
268 | } executed 210 times by 13 tests: end of block Executed by:
| 210 | ||||||||||||
269 | - | |||||||||||||
270 | int | - | ||||||||||||
271 | X509_STORE_up_ref(X509_STORE *x) | - | ||||||||||||
272 | { | - | ||||||||||||
273 | int refs = CRYPTO_add(&x->references, 1, CRYPTO_LOCK_X509_STORE); | - | ||||||||||||
274 | return (refs > 1) ? 1 : 0; never executed: return (refs > 1) ? 1 : 0;
| 0 | ||||||||||||
275 | } | - | ||||||||||||
276 | - | |||||||||||||
277 | X509_LOOKUP * | - | ||||||||||||
278 | X509_STORE_add_lookup(X509_STORE *v, X509_LOOKUP_METHOD *m) | - | ||||||||||||
279 | { | - | ||||||||||||
280 | int i; | - | ||||||||||||
281 | STACK_OF(X509_LOOKUP) *sk; | - | ||||||||||||
282 | X509_LOOKUP *lu; | - | ||||||||||||
283 | - | |||||||||||||
284 | sk = v->get_cert_methods; | - | ||||||||||||
285 | for (i = 0; i < sk_X509_LOOKUP_num(sk); i++) {
| 43-50 | ||||||||||||
286 | lu = sk_X509_LOOKUP_value(sk, i); | - | ||||||||||||
287 | if (m == lu->method) {
| 20-23 | ||||||||||||
288 | return lu; executed 20 times by 1 test: return lu; Executed by:
| 20 | ||||||||||||
289 | } | - | ||||||||||||
290 | } executed 23 times by 2 tests: end of block Executed by:
| 23 | ||||||||||||
291 | /* a new one */ | - | ||||||||||||
292 | lu = X509_LOOKUP_new(m); | - | ||||||||||||
293 | if (lu == NULL)
| 0-50 | ||||||||||||
294 | return NULL; never executed: return ((void *)0) ; | 0 | ||||||||||||
295 | else { | - | ||||||||||||
296 | lu->store_ctx = v; | - | ||||||||||||
297 | if (sk_X509_LOOKUP_push(v->get_cert_methods, lu))
| 0-50 | ||||||||||||
298 | return lu; executed 50 times by 3 tests: return lu; Executed by:
| 50 | ||||||||||||
299 | else { | - | ||||||||||||
300 | X509_LOOKUP_free(lu); | - | ||||||||||||
301 | return NULL; never executed: return ((void *)0) ; | 0 | ||||||||||||
302 | } | - | ||||||||||||
303 | } | - | ||||||||||||
304 | } | - | ||||||||||||
305 | - | |||||||||||||
306 | int | - | ||||||||||||
307 | X509_STORE_get_by_subject(X509_STORE_CTX *vs, int type, X509_NAME *name, | - | ||||||||||||
308 | X509_OBJECT *ret) | - | ||||||||||||
309 | { | - | ||||||||||||
310 | X509_STORE *ctx = vs->ctx; | - | ||||||||||||
311 | X509_LOOKUP *lu; | - | ||||||||||||
312 | X509_OBJECT stmp, *tmp; | - | ||||||||||||
313 | int i, j; | - | ||||||||||||
314 | - | |||||||||||||
315 | CRYPTO_w_lock(CRYPTO_LOCK_X509_STORE); | - | ||||||||||||
316 | tmp = X509_OBJECT_retrieve_by_subject(ctx->objs, type, name); | - | ||||||||||||
317 | CRYPTO_w_unlock(CRYPTO_LOCK_X509_STORE); | - | ||||||||||||
318 | - | |||||||||||||
319 | if (tmp == NULL || type == X509_LU_CRL) {
| 0-86 | ||||||||||||
320 | for (i = vs->current_method; | - | ||||||||||||
321 | i < sk_X509_LOOKUP_num(ctx->get_cert_methods); i++) {
| 0-86 | ||||||||||||
322 | lu = sk_X509_LOOKUP_value(ctx->get_cert_methods, i); | - | ||||||||||||
323 | j = X509_LOOKUP_by_subject(lu, type, name, &stmp); | - | ||||||||||||
324 | if (j < 0) {
| 0 | ||||||||||||
325 | vs->current_method = j; | - | ||||||||||||
326 | return j; never executed: return j; | 0 | ||||||||||||
327 | } else if (j) {
| 0 | ||||||||||||
328 | tmp = &stmp; | - | ||||||||||||
329 | break; never executed: break; | 0 | ||||||||||||
330 | } | - | ||||||||||||
331 | } never executed: end of block | 0 | ||||||||||||
332 | vs->current_method = 0; | - | ||||||||||||
333 | if (tmp == NULL)
| 0-86 | ||||||||||||
334 | return 0; executed 86 times by 4 tests: return 0; Executed by:
| 86 | ||||||||||||
335 | } never executed: end of block | 0 | ||||||||||||
336 | - | |||||||||||||
337 | /* if (ret->data.ptr != NULL) | - | ||||||||||||
338 | X509_OBJECT_free_contents(ret); */ | - | ||||||||||||
339 | - | |||||||||||||
340 | ret->type = tmp->type; | - | ||||||||||||
341 | ret->data.ptr = tmp->data.ptr; | - | ||||||||||||
342 | - | |||||||||||||
343 | X509_OBJECT_up_ref_count(ret); | - | ||||||||||||
344 | - | |||||||||||||
345 | return 1; executed 57 times by 2 tests: return 1; Executed by:
| 57 | ||||||||||||
346 | } | - | ||||||||||||
347 | - | |||||||||||||
348 | int | - | ||||||||||||
349 | X509_STORE_add_cert(X509_STORE *ctx, X509 *x) | - | ||||||||||||
350 | { | - | ||||||||||||
351 | X509_OBJECT *obj; | - | ||||||||||||
352 | int ret = 1; | - | ||||||||||||
353 | - | |||||||||||||
354 | if (x == NULL)
| 0-48 | ||||||||||||
355 | return 0; never executed: return 0; | 0 | ||||||||||||
356 | obj = malloc(sizeof(X509_OBJECT)); | - | ||||||||||||
357 | if (obj == NULL) {
| 0-48 | ||||||||||||
358 | X509error(ERR_R_MALLOC_FAILURE); | - | ||||||||||||
359 | return 0; never executed: return 0; | 0 | ||||||||||||
360 | } | - | ||||||||||||
361 | obj->type = X509_LU_X509; | - | ||||||||||||
362 | obj->data.x509 = x; | - | ||||||||||||
363 | - | |||||||||||||
364 | CRYPTO_w_lock(CRYPTO_LOCK_X509_STORE); | - | ||||||||||||
365 | - | |||||||||||||
366 | X509_OBJECT_up_ref_count(obj); | - | ||||||||||||
367 | - | |||||||||||||
368 | if (X509_OBJECT_retrieve_match(ctx->objs, obj)) {
| 0-48 | ||||||||||||
369 | X509error(X509_R_CERT_ALREADY_IN_HASH_TABLE); | - | ||||||||||||
370 | ret = 0; | - | ||||||||||||
371 | } else { never executed: end of block | 0 | ||||||||||||
372 | if (sk_X509_OBJECT_push(ctx->objs, obj) == 0) {
| 0-48 | ||||||||||||
373 | X509error(ERR_R_MALLOC_FAILURE); | - | ||||||||||||
374 | ret = 0; | - | ||||||||||||
375 | } never executed: end of block | 0 | ||||||||||||
376 | } executed 48 times by 2 tests: end of block Executed by:
| 48 | ||||||||||||
377 | - | |||||||||||||
378 | if (ret == 0)
| 0-48 | ||||||||||||
379 | X509_OBJECT_dec_ref_count(obj); never executed: X509_OBJECT_dec_ref_count(obj); | 0 | ||||||||||||
380 | - | |||||||||||||
381 | CRYPTO_w_unlock(CRYPTO_LOCK_X509_STORE); | - | ||||||||||||
382 | - | |||||||||||||
383 | if (ret == 0) {
| 0-48 | ||||||||||||
384 | obj->data.x509 = NULL; /* owned by the caller */ | - | ||||||||||||
385 | X509_OBJECT_free(obj); | - | ||||||||||||
386 | } never executed: end of block | 0 | ||||||||||||
387 | - | |||||||||||||
388 | return ret; executed 48 times by 2 tests: return ret; Executed by:
| 48 | ||||||||||||
389 | } | - | ||||||||||||
390 | - | |||||||||||||
391 | int | - | ||||||||||||
392 | X509_STORE_add_crl(X509_STORE *ctx, X509_CRL *x) | - | ||||||||||||
393 | { | - | ||||||||||||
394 | X509_OBJECT *obj; | - | ||||||||||||
395 | int ret = 1; | - | ||||||||||||
396 | - | |||||||||||||
397 | if (x == NULL)
| 0 | ||||||||||||
398 | return 0; never executed: return 0; | 0 | ||||||||||||
399 | obj = malloc(sizeof(X509_OBJECT)); | - | ||||||||||||
400 | if (obj == NULL) {
| 0 | ||||||||||||
401 | X509error(ERR_R_MALLOC_FAILURE); | - | ||||||||||||
402 | return 0; never executed: return 0; | 0 | ||||||||||||
403 | } | - | ||||||||||||
404 | obj->type = X509_LU_CRL; | - | ||||||||||||
405 | obj->data.crl = x; | - | ||||||||||||
406 | - | |||||||||||||
407 | CRYPTO_w_lock(CRYPTO_LOCK_X509_STORE); | - | ||||||||||||
408 | - | |||||||||||||
409 | X509_OBJECT_up_ref_count(obj); | - | ||||||||||||
410 | - | |||||||||||||
411 | if (X509_OBJECT_retrieve_match(ctx->objs, obj)) {
| 0 | ||||||||||||
412 | X509error(X509_R_CERT_ALREADY_IN_HASH_TABLE); | - | ||||||||||||
413 | ret = 0; | - | ||||||||||||
414 | } else { never executed: end of block | 0 | ||||||||||||
415 | if (sk_X509_OBJECT_push(ctx->objs, obj) == 0) {
| 0 | ||||||||||||
416 | X509error(ERR_R_MALLOC_FAILURE); | - | ||||||||||||
417 | ret = 0; | - | ||||||||||||
418 | } never executed: end of block | 0 | ||||||||||||
419 | } never executed: end of block | 0 | ||||||||||||
420 | - | |||||||||||||
421 | if (ret == 0)
| 0 | ||||||||||||
422 | X509_OBJECT_dec_ref_count(obj); never executed: X509_OBJECT_dec_ref_count(obj); | 0 | ||||||||||||
423 | - | |||||||||||||
424 | CRYPTO_w_unlock(CRYPTO_LOCK_X509_STORE); | - | ||||||||||||
425 | - | |||||||||||||
426 | if (ret == 0) {
| 0 | ||||||||||||
427 | obj->data.crl = NULL; /* owned by the caller */ | - | ||||||||||||
428 | X509_OBJECT_free(obj); | - | ||||||||||||
429 | } never executed: end of block | 0 | ||||||||||||
430 | - | |||||||||||||
431 | return ret; never executed: return ret; | 0 | ||||||||||||
432 | } | - | ||||||||||||
433 | - | |||||||||||||
434 | static void | - | ||||||||||||
435 | X509_OBJECT_dec_ref_count(X509_OBJECT *a) | - | ||||||||||||
436 | { | - | ||||||||||||
437 | switch (a->type) { | - | ||||||||||||
438 | case X509_LU_X509: never executed: case 1: | 0 | ||||||||||||
439 | CRYPTO_add(&a->data.x509->references, -1, CRYPTO_LOCK_X509); | - | ||||||||||||
440 | break; never executed: break; | 0 | ||||||||||||
441 | case X509_LU_CRL: never executed: case 2: | 0 | ||||||||||||
442 | CRYPTO_add(&a->data.crl->references, -1, CRYPTO_LOCK_X509_CRL); | - | ||||||||||||
443 | break; never executed: break; | 0 | ||||||||||||
444 | } | - | ||||||||||||
445 | } never executed: end of block | 0 | ||||||||||||
446 | - | |||||||||||||
447 | int | - | ||||||||||||
448 | X509_OBJECT_up_ref_count(X509_OBJECT *a) | - | ||||||||||||
449 | { | - | ||||||||||||
450 | switch (a->type) { | - | ||||||||||||
451 | case X509_LU_X509: executed 105 times by 2 tests: case 1: Executed by:
| 105 | ||||||||||||
452 | return X509_up_ref(a->data.x509); executed 105 times by 2 tests: return X509_up_ref(a->data.x509); Executed by:
| 105 | ||||||||||||
453 | case X509_LU_CRL: never executed: case 2: | 0 | ||||||||||||
454 | return X509_CRL_up_ref(a->data.crl); never executed: return X509_CRL_up_ref(a->data.crl); | 0 | ||||||||||||
455 | } | - | ||||||||||||
456 | return 1; never executed: return 1; | 0 | ||||||||||||
457 | } | - | ||||||||||||
458 | - | |||||||||||||
459 | int | - | ||||||||||||
460 | X509_OBJECT_get_type(const X509_OBJECT *a) | - | ||||||||||||
461 | { | - | ||||||||||||
462 | return a->type; never executed: return a->type; | 0 | ||||||||||||
463 | } | - | ||||||||||||
464 | - | |||||||||||||
465 | void | - | ||||||||||||
466 | X509_OBJECT_free_contents(X509_OBJECT *a) | - | ||||||||||||
467 | { | - | ||||||||||||
468 | switch (a->type) { | - | ||||||||||||
469 | case X509_LU_X509: executed 48 times by 2 tests: case 1: Executed by:
| 48 | ||||||||||||
470 | X509_free(a->data.x509); | - | ||||||||||||
471 | break; executed 48 times by 2 tests: break; Executed by:
| 48 | ||||||||||||
472 | case X509_LU_CRL: never executed: case 2: | 0 | ||||||||||||
473 | X509_CRL_free(a->data.crl); | - | ||||||||||||
474 | break; never executed: break; | 0 | ||||||||||||
475 | } | - | ||||||||||||
476 | } executed 48 times by 2 tests: end of block Executed by:
| 48 | ||||||||||||
477 | - | |||||||||||||
478 | static int | - | ||||||||||||
479 | x509_object_idx_cnt(STACK_OF(X509_OBJECT) *h, int type, X509_NAME *name, | - | ||||||||||||
480 | int *pnmatch) | - | ||||||||||||
481 | { | - | ||||||||||||
482 | X509_OBJECT stmp; | - | ||||||||||||
483 | X509 x509_s; | - | ||||||||||||
484 | X509_CINF cinf_s; | - | ||||||||||||
485 | X509_CRL crl_s; | - | ||||||||||||
486 | X509_CRL_INFO crl_info_s; | - | ||||||||||||
487 | int idx; | - | ||||||||||||
488 | - | |||||||||||||
489 | stmp.type = type; | - | ||||||||||||
490 | switch (type) { | - | ||||||||||||
491 | case X509_LU_X509: executed 143 times by 4 tests: case 1: Executed by:
| 143 | ||||||||||||
492 | stmp.data.x509 = &x509_s; | - | ||||||||||||
493 | x509_s.cert_info = &cinf_s; | - | ||||||||||||
494 | cinf_s.subject = name; | - | ||||||||||||
495 | break; executed 143 times by 4 tests: break; Executed by:
| 143 | ||||||||||||
496 | case X509_LU_CRL: never executed: case 2: | 0 | ||||||||||||
497 | stmp.data.crl = &crl_s; | - | ||||||||||||
498 | crl_s.crl = &crl_info_s; | - | ||||||||||||
499 | crl_info_s.issuer = name; | - | ||||||||||||
500 | break; never executed: break; | 0 | ||||||||||||
501 | default: never executed: default: | 0 | ||||||||||||
502 | /* abort(); */ | - | ||||||||||||
503 | return -1; never executed: return -1; | 0 | ||||||||||||
504 | } | - | ||||||||||||
505 | - | |||||||||||||
506 | idx = sk_X509_OBJECT_find(h, &stmp); | - | ||||||||||||
507 | if (idx >= 0 && pnmatch) {
| 0-86 | ||||||||||||
508 | int tidx; | - | ||||||||||||
509 | const X509_OBJECT *tobj, *pstmp; | - | ||||||||||||
510 | *pnmatch = 1; | - | ||||||||||||
511 | pstmp = &stmp; | - | ||||||||||||
512 | for (tidx = idx + 1; tidx < sk_X509_OBJECT_num(h); tidx++) {
| 0 | ||||||||||||
513 | tobj = sk_X509_OBJECT_value(h, tidx); | - | ||||||||||||
514 | if (x509_object_cmp(&tobj, &pstmp))
| 0 | ||||||||||||
515 | break; never executed: break; | 0 | ||||||||||||
516 | (*pnmatch)++; | - | ||||||||||||
517 | } never executed: end of block | 0 | ||||||||||||
518 | } never executed: end of block | 0 | ||||||||||||
519 | return idx; executed 143 times by 4 tests: return idx; Executed by:
| 143 | ||||||||||||
520 | } | - | ||||||||||||
521 | - | |||||||||||||
522 | int | - | ||||||||||||
523 | X509_OBJECT_idx_by_subject(STACK_OF(X509_OBJECT) *h, int type, X509_NAME *name) | - | ||||||||||||
524 | { | - | ||||||||||||
525 | return x509_object_idx_cnt(h, type, name, NULL); executed 143 times by 4 tests: return x509_object_idx_cnt(h, type, name, ((void *)0) ); Executed by:
| 143 | ||||||||||||
526 | } | - | ||||||||||||
527 | - | |||||||||||||
528 | X509_OBJECT * | - | ||||||||||||
529 | X509_OBJECT_retrieve_by_subject(STACK_OF(X509_OBJECT) *h, int type, | - | ||||||||||||
530 | X509_NAME *name) | - | ||||||||||||
531 | { | - | ||||||||||||
532 | int idx; | - | ||||||||||||
533 | - | |||||||||||||
534 | idx = X509_OBJECT_idx_by_subject(h, type, name); | - | ||||||||||||
535 | if (idx == -1)
| 57-86 | ||||||||||||
536 | return NULL; executed 86 times by 4 tests: return ((void *)0) ; Executed by:
| 86 | ||||||||||||
537 | return sk_X509_OBJECT_value(h, idx); executed 57 times by 2 tests: return ((X509_OBJECT *)sk_value(((_STACK*) (1 ? (h) : (struct stack_st_X509_OBJECT*)0)), (idx))); Executed by:
| 57 | ||||||||||||
538 | } | - | ||||||||||||
539 | - | |||||||||||||
540 | X509 * | - | ||||||||||||
541 | X509_OBJECT_get0_X509(const X509_OBJECT *xo) | - | ||||||||||||
542 | { | - | ||||||||||||
543 | if (xo != NULL && xo->type == X509_LU_X509)
| 0 | ||||||||||||
544 | return xo->data.x509; never executed: return xo->data.x509; | 0 | ||||||||||||
545 | return NULL; never executed: return ((void *)0) ; | 0 | ||||||||||||
546 | } | - | ||||||||||||
547 | - | |||||||||||||
548 | X509_CRL * | - | ||||||||||||
549 | X509_OBJECT_get0_X509_CRL(X509_OBJECT *xo) | - | ||||||||||||
550 | { | - | ||||||||||||
551 | if (xo != NULL && xo->type == X509_LU_CRL)
| 0 | ||||||||||||
552 | return xo->data.crl; never executed: return xo->data.crl; | 0 | ||||||||||||
553 | return NULL; never executed: return ((void *)0) ; | 0 | ||||||||||||
554 | } | - | ||||||||||||
555 | - | |||||||||||||
556 | STACK_OF(X509) * | - | ||||||||||||
557 | X509_STORE_get1_certs(X509_STORE_CTX *ctx, X509_NAME *nm) | - | ||||||||||||
558 | { | - | ||||||||||||
559 | int i, idx, cnt; | - | ||||||||||||
560 | STACK_OF(X509) *sk; | - | ||||||||||||
561 | X509 *x; | - | ||||||||||||
562 | X509_OBJECT *obj; | - | ||||||||||||
563 | - | |||||||||||||
564 | sk = sk_X509_new_null(); | - | ||||||||||||
565 | if (sk == NULL)
| 0 | ||||||||||||
566 | return NULL; never executed: return ((void *)0) ; | 0 | ||||||||||||
567 | CRYPTO_w_lock(CRYPTO_LOCK_X509_STORE); | - | ||||||||||||
568 | idx = x509_object_idx_cnt(ctx->ctx->objs, X509_LU_X509, nm, &cnt); | - | ||||||||||||
569 | if (idx < 0) {
| 0 | ||||||||||||
570 | /* Nothing found in cache: do lookup to possibly add new | - | ||||||||||||
571 | * objects to cache | - | ||||||||||||
572 | */ | - | ||||||||||||
573 | X509_OBJECT xobj; | - | ||||||||||||
574 | CRYPTO_w_unlock(CRYPTO_LOCK_X509_STORE); | - | ||||||||||||
575 | if (!X509_STORE_get_by_subject(ctx, X509_LU_X509, nm, &xobj)) {
| 0 | ||||||||||||
576 | sk_X509_free(sk); | - | ||||||||||||
577 | return NULL; never executed: return ((void *)0) ; | 0 | ||||||||||||
578 | } | - | ||||||||||||
579 | X509_OBJECT_free_contents(&xobj); | - | ||||||||||||
580 | CRYPTO_w_lock(CRYPTO_LOCK_X509_STORE); | - | ||||||||||||
581 | idx = x509_object_idx_cnt(ctx->ctx->objs, | - | ||||||||||||
582 | X509_LU_X509, nm, &cnt); | - | ||||||||||||
583 | if (idx < 0) {
| 0 | ||||||||||||
584 | CRYPTO_w_unlock(CRYPTO_LOCK_X509_STORE); | - | ||||||||||||
585 | sk_X509_free(sk); | - | ||||||||||||
586 | return NULL; never executed: return ((void *)0) ; | 0 | ||||||||||||
587 | } | - | ||||||||||||
588 | } never executed: end of block | 0 | ||||||||||||
589 | for (i = 0; i < cnt; i++, idx++) {
| 0 | ||||||||||||
590 | obj = sk_X509_OBJECT_value(ctx->ctx->objs, idx); | - | ||||||||||||
591 | x = obj->data.x509; | - | ||||||||||||
592 | CRYPTO_add(&x->references, 1, CRYPTO_LOCK_X509); | - | ||||||||||||
593 | if (!sk_X509_push(sk, x)) {
| 0 | ||||||||||||
594 | CRYPTO_w_unlock(CRYPTO_LOCK_X509_STORE); | - | ||||||||||||
595 | X509_free(x); | - | ||||||||||||
596 | sk_X509_pop_free(sk, X509_free); | - | ||||||||||||
597 | return NULL; never executed: return ((void *)0) ; | 0 | ||||||||||||
598 | } | - | ||||||||||||
599 | } never executed: end of block | 0 | ||||||||||||
600 | CRYPTO_w_unlock(CRYPTO_LOCK_X509_STORE); | - | ||||||||||||
601 | return sk; never executed: return sk; | 0 | ||||||||||||
602 | - | |||||||||||||
603 | } | - | ||||||||||||
604 | - | |||||||||||||
605 | STACK_OF(X509_CRL) * | - | ||||||||||||
606 | X509_STORE_get1_crls(X509_STORE_CTX *ctx, X509_NAME *nm) | - | ||||||||||||
607 | { | - | ||||||||||||
608 | int i, idx, cnt; | - | ||||||||||||
609 | STACK_OF(X509_CRL) *sk; | - | ||||||||||||
610 | X509_CRL *x; | - | ||||||||||||
611 | X509_OBJECT *obj, xobj; | - | ||||||||||||
612 | - | |||||||||||||
613 | sk = sk_X509_CRL_new_null(); | - | ||||||||||||
614 | if (sk == NULL)
| 0 | ||||||||||||
615 | return NULL; never executed: return ((void *)0) ; | 0 | ||||||||||||
616 | CRYPTO_w_lock(CRYPTO_LOCK_X509_STORE); | - | ||||||||||||
617 | /* Check cache first */ | - | ||||||||||||
618 | idx = x509_object_idx_cnt(ctx->ctx->objs, X509_LU_CRL, nm, &cnt); | - | ||||||||||||
619 | - | |||||||||||||
620 | /* Always do lookup to possibly add new CRLs to cache | - | ||||||||||||
621 | */ | - | ||||||||||||
622 | CRYPTO_w_unlock(CRYPTO_LOCK_X509_STORE); | - | ||||||||||||
623 | if (!X509_STORE_get_by_subject(ctx, X509_LU_CRL, nm, &xobj)) {
| 0 | ||||||||||||
624 | sk_X509_CRL_free(sk); | - | ||||||||||||
625 | return NULL; never executed: return ((void *)0) ; | 0 | ||||||||||||
626 | } | - | ||||||||||||
627 | X509_OBJECT_free_contents(&xobj); | - | ||||||||||||
628 | CRYPTO_w_lock(CRYPTO_LOCK_X509_STORE); | - | ||||||||||||
629 | idx = x509_object_idx_cnt(ctx->ctx->objs, X509_LU_CRL, nm, &cnt); | - | ||||||||||||
630 | if (idx < 0) {
| 0 | ||||||||||||
631 | CRYPTO_w_unlock(CRYPTO_LOCK_X509_STORE); | - | ||||||||||||
632 | sk_X509_CRL_free(sk); | - | ||||||||||||
633 | return NULL; never executed: return ((void *)0) ; | 0 | ||||||||||||
634 | } | - | ||||||||||||
635 | - | |||||||||||||
636 | for (i = 0; i < cnt; i++, idx++) {
| 0 | ||||||||||||
637 | obj = sk_X509_OBJECT_value(ctx->ctx->objs, idx); | - | ||||||||||||
638 | x = obj->data.crl; | - | ||||||||||||
639 | CRYPTO_add(&x->references, 1, CRYPTO_LOCK_X509_CRL); | - | ||||||||||||
640 | if (!sk_X509_CRL_push(sk, x)) {
| 0 | ||||||||||||
641 | CRYPTO_w_unlock(CRYPTO_LOCK_X509_STORE); | - | ||||||||||||
642 | X509_CRL_free(x); | - | ||||||||||||
643 | sk_X509_CRL_pop_free(sk, X509_CRL_free); | - | ||||||||||||
644 | return NULL; never executed: return ((void *)0) ; | 0 | ||||||||||||
645 | } | - | ||||||||||||
646 | } never executed: end of block | 0 | ||||||||||||
647 | CRYPTO_w_unlock(CRYPTO_LOCK_X509_STORE); | - | ||||||||||||
648 | return sk; never executed: return sk; | 0 | ||||||||||||
649 | } | - | ||||||||||||
650 | - | |||||||||||||
651 | X509_OBJECT * | - | ||||||||||||
652 | X509_OBJECT_retrieve_match(STACK_OF(X509_OBJECT) *h, X509_OBJECT *x) | - | ||||||||||||
653 | { | - | ||||||||||||
654 | int idx, i; | - | ||||||||||||
655 | X509_OBJECT *obj; | - | ||||||||||||
656 | - | |||||||||||||
657 | idx = sk_X509_OBJECT_find(h, x); | - | ||||||||||||
658 | if (idx == -1)
| 0-48 | ||||||||||||
659 | return NULL; executed 48 times by 2 tests: return ((void *)0) ; Executed by:
| 48 | ||||||||||||
660 | if ((x->type != X509_LU_X509) && (x->type != X509_LU_CRL))
| 0 | ||||||||||||
661 | return sk_X509_OBJECT_value(h, idx); never executed: return ((X509_OBJECT *)sk_value(((_STACK*) (1 ? (h) : (struct stack_st_X509_OBJECT*)0)), (idx))); | 0 | ||||||||||||
662 | for (i = idx; i < sk_X509_OBJECT_num(h); i++) {
| 0 | ||||||||||||
663 | obj = sk_X509_OBJECT_value(h, i); | - | ||||||||||||
664 | if (x509_object_cmp((const X509_OBJECT **)&obj,
| 0 | ||||||||||||
665 | (const X509_OBJECT **)&x))
| 0 | ||||||||||||
666 | return NULL; never executed: return ((void *)0) ; | 0 | ||||||||||||
667 | if (x->type == X509_LU_X509) {
| 0 | ||||||||||||
668 | if (!X509_cmp(obj->data.x509, x->data.x509))
| 0 | ||||||||||||
669 | return obj; never executed: return obj; | 0 | ||||||||||||
670 | } else if (x->type == X509_LU_CRL) { never executed: end of block
| 0 | ||||||||||||
671 | if (!X509_CRL_match(obj->data.crl, x->data.crl))
| 0 | ||||||||||||
672 | return obj; never executed: return obj; | 0 | ||||||||||||
673 | } else never executed: end of block | 0 | ||||||||||||
674 | return obj; never executed: return obj; | 0 | ||||||||||||
675 | } | - | ||||||||||||
676 | return NULL; never executed: return ((void *)0) ; | 0 | ||||||||||||
677 | } | - | ||||||||||||
678 | - | |||||||||||||
679 | /* Try to get issuer certificate from store. Due to limitations | - | ||||||||||||
680 | * of the API this can only retrieve a single certificate matching | - | ||||||||||||
681 | * a given subject name. However it will fill the cache with all | - | ||||||||||||
682 | * matching certificates, so we can examine the cache for all | - | ||||||||||||
683 | * matches. | - | ||||||||||||
684 | * | - | ||||||||||||
685 | * Return values are: | - | ||||||||||||
686 | * 1 lookup successful. | - | ||||||||||||
687 | * 0 certificate not found. | - | ||||||||||||
688 | * -1 some other error. | - | ||||||||||||
689 | */ | - | ||||||||||||
690 | int | - | ||||||||||||
691 | X509_STORE_CTX_get1_issuer(X509 **issuer, X509_STORE_CTX *ctx, X509 *x) | - | ||||||||||||
692 | { | - | ||||||||||||
693 | X509_NAME *xn; | - | ||||||||||||
694 | X509_OBJECT obj, *pobj; | - | ||||||||||||
695 | int i, ok, idx, ret; | - | ||||||||||||
696 | - | |||||||||||||
697 | *issuer = NULL; | - | ||||||||||||
698 | xn = X509_get_issuer_name(x); | - | ||||||||||||
699 | ok = X509_STORE_get_by_subject(ctx, X509_LU_X509, xn, &obj); | - | ||||||||||||
700 | if (ok != X509_LU_X509) {
| 57-86 | ||||||||||||
701 | if (ok == X509_LU_RETRY) {
| 0-86 | ||||||||||||
702 | X509_OBJECT_free_contents(&obj); | - | ||||||||||||
703 | X509error(X509_R_SHOULD_RETRY); | - | ||||||||||||
704 | return -1; never executed: return -1; | 0 | ||||||||||||
705 | } else if (ok != X509_LU_FAIL) {
| 0-86 | ||||||||||||
706 | X509_OBJECT_free_contents(&obj); | - | ||||||||||||
707 | /* not good :-(, break anyway */ | - | ||||||||||||
708 | return -1; never executed: return -1; | 0 | ||||||||||||
709 | } | - | ||||||||||||
710 | return 0; executed 86 times by 4 tests: return 0; Executed by:
| 86 | ||||||||||||
711 | } | - | ||||||||||||
712 | /* If certificate matches all OK */ | - | ||||||||||||
713 | if (ctx->check_issued(ctx, x, obj.data.x509)) {
| 0-57 | ||||||||||||
714 | if (x509_check_cert_time(ctx, obj.data.x509, 1)) {
| 0-57 | ||||||||||||
715 | *issuer = obj.data.x509; | - | ||||||||||||
716 | return 1; executed 57 times by 2 tests: return 1; Executed by:
| 57 | ||||||||||||
717 | } | - | ||||||||||||
718 | } never executed: end of block | 0 | ||||||||||||
719 | X509_OBJECT_free_contents(&obj); | - | ||||||||||||
720 | - | |||||||||||||
721 | /* Else find index of first cert accepted by 'check_issued' */ | - | ||||||||||||
722 | ret = 0; | - | ||||||||||||
723 | CRYPTO_w_lock(CRYPTO_LOCK_X509_STORE); | - | ||||||||||||
724 | idx = X509_OBJECT_idx_by_subject(ctx->ctx->objs, X509_LU_X509, xn); | - | ||||||||||||
725 | if (idx != -1) /* should be true as we've had at least one match */ {
| 0 | ||||||||||||
726 | /* Look through all matching certs for suitable issuer */ | - | ||||||||||||
727 | for (i = idx; i < sk_X509_OBJECT_num(ctx->ctx->objs); i++) {
| 0 | ||||||||||||
728 | pobj = sk_X509_OBJECT_value(ctx->ctx->objs, i); | - | ||||||||||||
729 | /* See if we've run past the matches */ | - | ||||||||||||
730 | if (pobj->type != X509_LU_X509)
| 0 | ||||||||||||
731 | break; never executed: break; | 0 | ||||||||||||
732 | if (X509_NAME_cmp(xn,
| 0 | ||||||||||||
733 | X509_get_subject_name(pobj->data.x509)))
| 0 | ||||||||||||
734 | break; never executed: break; | 0 | ||||||||||||
735 | if (ctx->check_issued(ctx, x, pobj->data.x509)) {
| 0 | ||||||||||||
736 | *issuer = pobj->data.x509; | - | ||||||||||||
737 | ret = 1; | - | ||||||||||||
738 | /* | - | ||||||||||||
739 | * If times check, exit with match, | - | ||||||||||||
740 | * otherwise keep looking. Leave last | - | ||||||||||||
741 | * match in issuer so we return nearest | - | ||||||||||||
742 | * match if no certificate time is OK. | - | ||||||||||||
743 | */ | - | ||||||||||||
744 | if (x509_check_cert_time(ctx, *issuer, 1))
| 0 | ||||||||||||
745 | break; never executed: break; | 0 | ||||||||||||
746 | } never executed: end of block | 0 | ||||||||||||
747 | } never executed: end of block | 0 | ||||||||||||
748 | } never executed: end of block | 0 | ||||||||||||
749 | CRYPTO_w_unlock(CRYPTO_LOCK_X509_STORE); | - | ||||||||||||
750 | if (*issuer)
| 0 | ||||||||||||
751 | CRYPTO_add(&(*issuer)->references, 1, CRYPTO_LOCK_X509); never executed: CRYPTO_add_lock(&(*issuer)->references,1,3,__FILE__,751); | 0 | ||||||||||||
752 | return ret; never executed: return ret; | 0 | ||||||||||||
753 | } | - | ||||||||||||
754 | - | |||||||||||||
755 | STACK_OF(X509_OBJECT) * | - | ||||||||||||
756 | X509_STORE_get0_objects(X509_STORE *xs) | - | ||||||||||||
757 | { | - | ||||||||||||
758 | return xs->objs; never executed: return xs->objs; | 0 | ||||||||||||
759 | } | - | ||||||||||||
760 | - | |||||||||||||
761 | void * | - | ||||||||||||
762 | X509_STORE_get_ex_data(X509_STORE *xs, int idx) | - | ||||||||||||
763 | { | - | ||||||||||||
764 | return CRYPTO_get_ex_data(&xs->ex_data, idx); never executed: return CRYPTO_get_ex_data(&xs->ex_data, idx); | 0 | ||||||||||||
765 | } | - | ||||||||||||
766 | - | |||||||||||||
767 | int | - | ||||||||||||
768 | X509_STORE_set_ex_data(X509_STORE *xs, int idx, void *data) | - | ||||||||||||
769 | { | - | ||||||||||||
770 | return CRYPTO_set_ex_data(&xs->ex_data, idx, data); never executed: return CRYPTO_set_ex_data(&xs->ex_data, idx, data); | 0 | ||||||||||||
771 | } | - | ||||||||||||
772 | - | |||||||||||||
773 | int | - | ||||||||||||
774 | X509_STORE_set_flags(X509_STORE *ctx, unsigned long flags) | - | ||||||||||||
775 | { | - | ||||||||||||
776 | return X509_VERIFY_PARAM_set_flags(ctx->param, flags); never executed: return X509_VERIFY_PARAM_set_flags(ctx->param, flags); | 0 | ||||||||||||
777 | } | - | ||||||||||||
778 | - | |||||||||||||
779 | int | - | ||||||||||||
780 | X509_STORE_set_depth(X509_STORE *ctx, int depth) | - | ||||||||||||
781 | { | - | ||||||||||||
782 | X509_VERIFY_PARAM_set_depth(ctx->param, depth); | - | ||||||||||||
783 | return 1; never executed: return 1; | 0 | ||||||||||||
784 | } | - | ||||||||||||
785 | - | |||||||||||||
786 | int | - | ||||||||||||
787 | X509_STORE_set_purpose(X509_STORE *ctx, int purpose) | - | ||||||||||||
788 | { | - | ||||||||||||
789 | return X509_VERIFY_PARAM_set_purpose(ctx->param, purpose); never executed: return X509_VERIFY_PARAM_set_purpose(ctx->param, purpose); | 0 | ||||||||||||
790 | } | - | ||||||||||||
791 | - | |||||||||||||
792 | int | - | ||||||||||||
793 | X509_STORE_set_trust(X509_STORE *ctx, int trust) | - | ||||||||||||
794 | { | - | ||||||||||||
795 | return X509_VERIFY_PARAM_set_trust(ctx->param, trust); never executed: return X509_VERIFY_PARAM_set_trust(ctx->param, trust); | 0 | ||||||||||||
796 | } | - | ||||||||||||
797 | - | |||||||||||||
798 | int | - | ||||||||||||
799 | X509_STORE_set1_param(X509_STORE *ctx, X509_VERIFY_PARAM *param) | - | ||||||||||||
800 | { | - | ||||||||||||
801 | return X509_VERIFY_PARAM_set1(ctx->param, param); never executed: return X509_VERIFY_PARAM_set1(ctx->param, param); | 0 | ||||||||||||
802 | } | - | ||||||||||||
803 | - | |||||||||||||
804 | X509_VERIFY_PARAM * | - | ||||||||||||
805 | X509_STORE_get0_param(X509_STORE *ctx) | - | ||||||||||||
806 | { | - | ||||||||||||
807 | return ctx->param; never executed: return ctx->param; | 0 | ||||||||||||
808 | } | - | ||||||||||||
809 | - | |||||||||||||
810 | void | - | ||||||||||||
811 | X509_STORE_set_verify_cb(X509_STORE *ctx, | - | ||||||||||||
812 | int (*verify_cb)(int, X509_STORE_CTX *)) | - | ||||||||||||
813 | { | - | ||||||||||||
814 | ctx->verify_cb = verify_cb; | - | ||||||||||||
815 | } executed 4 times by 2 tests: end of block Executed by:
| 4 | ||||||||||||
Source code | Switch to Preprocessed file |