f40f3fc0810df9d6424b5f550ab3c8a90ce0a098
[openssl.git] / crypto / x509 / x509_lu.c
1 /*
2  * Copyright 1995-2016 The OpenSSL Project Authors. All Rights Reserved.
3  *
4  * Licensed under the OpenSSL license (the "License").  You may not use
5  * this file except in compliance with the License.  You can obtain a copy
6  * in the file LICENSE in the source distribution or at
7  * https://www.openssl.org/source/license.html
8  */
9
10 #include <stdio.h>
11 #include "internal/cryptlib.h"
12 #include <openssl/lhash.h>
13 #include <openssl/x509.h>
14 #include "internal/x509_int.h"
15 #include <openssl/x509v3.h>
16 #include "x509_lcl.h"
17
18 X509_LOOKUP *X509_LOOKUP_new(X509_LOOKUP_METHOD *method)
19 {
20     X509_LOOKUP *ret;
21
22     ret = OPENSSL_zalloc(sizeof(*ret));
23     if (ret == NULL)
24         return NULL;
25
26     ret->method = method;
27     if ((method->new_item != NULL) && !method->new_item(ret)) {
28         OPENSSL_free(ret);
29         return NULL;
30     }
31     return ret;
32 }
33
34 void X509_LOOKUP_free(X509_LOOKUP *ctx)
35 {
36     if (ctx == NULL)
37         return;
38     if ((ctx->method != NULL) && (ctx->method->free != NULL))
39         (*ctx->method->free) (ctx);
40     OPENSSL_free(ctx);
41 }
42
43 int X509_STORE_lock(X509_STORE *s)
44 {
45     return CRYPTO_THREAD_write_lock(s->lock);
46 }
47
48 int X509_STORE_unlock(X509_STORE *s)
49 {
50     return CRYPTO_THREAD_unlock(s->lock);
51 }
52
53 int X509_LOOKUP_init(X509_LOOKUP *ctx)
54 {
55     if (ctx->method == NULL)
56         return 0;
57     if (ctx->method->init != NULL)
58         return ctx->method->init(ctx);
59     else
60         return 1;
61 }
62
63 int X509_LOOKUP_shutdown(X509_LOOKUP *ctx)
64 {
65     if (ctx->method == NULL)
66         return 0;
67     if (ctx->method->shutdown != NULL)
68         return ctx->method->shutdown(ctx);
69     else
70         return 1;
71 }
72
73 int X509_LOOKUP_ctrl(X509_LOOKUP *ctx, int cmd, const char *argc, long argl,
74                      char **ret)
75 {
76     if (ctx->method == NULL)
77         return -1;
78     if (ctx->method->ctrl != NULL)
79         return ctx->method->ctrl(ctx, cmd, argc, argl, ret);
80     else
81         return 1;
82 }
83
84 int X509_LOOKUP_by_subject(X509_LOOKUP *ctx, int type, X509_NAME *name,
85                            X509_OBJECT *ret)
86 {
87     if ((ctx->method == NULL) || (ctx->method->get_by_subject == NULL))
88         return X509_LU_FAIL;
89     if (ctx->skip)
90         return 0;
91     return ctx->method->get_by_subject(ctx, type, name, ret);
92 }
93
94 int X509_LOOKUP_by_issuer_serial(X509_LOOKUP *ctx, int type, X509_NAME *name,
95                                  ASN1_INTEGER *serial, X509_OBJECT *ret)
96 {
97     if ((ctx->method == NULL) || (ctx->method->get_by_issuer_serial == NULL))
98         return X509_LU_FAIL;
99     return ctx->method->get_by_issuer_serial(ctx, type, name, serial, ret);
100 }
101
102 int X509_LOOKUP_by_fingerprint(X509_LOOKUP *ctx, int type,
103                                unsigned char *bytes, int len,
104                                X509_OBJECT *ret)
105 {
106     if ((ctx->method == NULL) || (ctx->method->get_by_fingerprint == NULL))
107         return X509_LU_FAIL;
108     return ctx->method->get_by_fingerprint(ctx, type, bytes, len, ret);
109 }
110
111 int X509_LOOKUP_by_alias(X509_LOOKUP *ctx, int type, char *str, int len,
112                          X509_OBJECT *ret)
113 {
114     if ((ctx->method == NULL) || (ctx->method->get_by_alias == NULL))
115         return X509_LU_FAIL;
116     return ctx->method->get_by_alias(ctx, type, str, len, ret);
117 }
118
119 static int x509_object_cmp(const X509_OBJECT *const *a,
120                            const X509_OBJECT *const *b)
121 {
122     int ret;
123
124     ret = ((*a)->type - (*b)->type);
125     if (ret)
126         return ret;
127     switch ((*a)->type) {
128     case X509_LU_X509:
129         ret = X509_subject_name_cmp((*a)->data.x509, (*b)->data.x509);
130         break;
131     case X509_LU_CRL:
132         ret = X509_CRL_cmp((*a)->data.crl, (*b)->data.crl);
133         break;
134     default:
135         /* abort(); */
136         return 0;
137     }
138     return ret;
139 }
140
141 X509_STORE *X509_STORE_new(void)
142 {
143     X509_STORE *ret;
144
145     if ((ret = OPENSSL_zalloc(sizeof(*ret))) == NULL)
146         return NULL;
147     if ((ret->objs = sk_X509_OBJECT_new(x509_object_cmp)) == NULL)
148         goto err;
149     ret->cache = 1;
150     if ((ret->get_cert_methods = sk_X509_LOOKUP_new_null()) == NULL)
151         goto err;
152
153     if ((ret->param = X509_VERIFY_PARAM_new()) == NULL)
154         goto err;
155
156     if (!CRYPTO_new_ex_data(CRYPTO_EX_INDEX_X509_STORE, ret, &ret->ex_data))
157         goto err;
158
159     ret->lock = CRYPTO_THREAD_lock_new();
160     if (ret->lock == NULL)
161         goto err;
162
163     ret->references = 1;
164     return ret;
165
166 err:
167     X509_VERIFY_PARAM_free(ret->param);
168     sk_X509_OBJECT_free(ret->objs);
169     sk_X509_LOOKUP_free(ret->get_cert_methods);
170     OPENSSL_free(ret);
171     return NULL;
172 }
173
174 static void cleanup(X509_OBJECT *a)
175 {
176     if (!a)
177         return;
178     if (a->type == X509_LU_X509) {
179         X509_free(a->data.x509);
180     } else if (a->type == X509_LU_CRL) {
181         X509_CRL_free(a->data.crl);
182     } else {
183         /* abort(); */
184     }
185
186     OPENSSL_free(a);
187 }
188
189 void X509_STORE_free(X509_STORE *vfy)
190 {
191     int i;
192     STACK_OF(X509_LOOKUP) *sk;
193     X509_LOOKUP *lu;
194
195     if (vfy == NULL)
196         return;
197
198     CRYPTO_atomic_add(&vfy->references, -1, &i, vfy->lock);
199     REF_PRINT_COUNT("X509_STORE", vfy);
200     if (i > 0)
201         return;
202     REF_ASSERT_ISNT(i < 0);
203
204     sk = vfy->get_cert_methods;
205     for (i = 0; i < sk_X509_LOOKUP_num(sk); i++) {
206         lu = sk_X509_LOOKUP_value(sk, i);
207         X509_LOOKUP_shutdown(lu);
208         X509_LOOKUP_free(lu);
209     }
210     sk_X509_LOOKUP_free(sk);
211     sk_X509_OBJECT_pop_free(vfy->objs, cleanup);
212
213     CRYPTO_free_ex_data(CRYPTO_EX_INDEX_X509_STORE, vfy, &vfy->ex_data);
214     X509_VERIFY_PARAM_free(vfy->param);
215     CRYPTO_THREAD_lock_free(vfy->lock);
216     OPENSSL_free(vfy);
217 }
218
219 int X509_STORE_up_ref(X509_STORE *vfy)
220 {
221     int i;
222
223     if (CRYPTO_atomic_add(&vfy->references, 1, &i, vfy->lock) <= 0)
224         return 0;
225
226     REF_PRINT_COUNT("X509_STORE", a);
227     REF_ASSERT_ISNT(i < 2);
228     return ((i > 1) ? 1 : 0);
229 }
230
231 X509_LOOKUP *X509_STORE_add_lookup(X509_STORE *v, X509_LOOKUP_METHOD *m)
232 {
233     int i;
234     STACK_OF(X509_LOOKUP) *sk;
235     X509_LOOKUP *lu;
236
237     sk = v->get_cert_methods;
238     for (i = 0; i < sk_X509_LOOKUP_num(sk); i++) {
239         lu = sk_X509_LOOKUP_value(sk, i);
240         if (m == lu->method) {
241             return lu;
242         }
243     }
244     /* a new one */
245     lu = X509_LOOKUP_new(m);
246     if (lu == NULL)
247         return NULL;
248     else {
249         lu->store_ctx = v;
250         if (sk_X509_LOOKUP_push(v->get_cert_methods, lu))
251             return lu;
252         else {
253             X509_LOOKUP_free(lu);
254             return NULL;
255         }
256     }
257 }
258
259 X509_OBJECT *X509_STORE_CTX_get_obj_by_subject(X509_STORE_CTX *vs, int type,
260                                                X509_NAME *name)
261 {
262     X509_OBJECT *ret = X509_OBJECT_new();
263
264     if (ret == NULL)
265         return NULL;
266     if (!X509_STORE_CTX_get_by_subject(vs, type, name, ret)) {
267         X509_OBJECT_free(ret);
268         return NULL;
269     }
270     return ret;
271 }
272
273 int X509_STORE_CTX_get_by_subject(X509_STORE_CTX *vs, X509_LOOKUP_TYPE type,
274                                   X509_NAME *name, X509_OBJECT *ret)
275 {
276     X509_STORE *ctx = vs->ctx;
277     X509_LOOKUP *lu;
278     X509_OBJECT stmp, *tmp;
279     int i, j;
280
281     CRYPTO_THREAD_write_lock(ctx->lock);
282     tmp = X509_OBJECT_retrieve_by_subject(ctx->objs, type, name);
283     CRYPTO_THREAD_unlock(ctx->lock);
284
285     if (tmp == NULL || type == X509_LU_CRL) {
286         for (i = 0; i < sk_X509_LOOKUP_num(ctx->get_cert_methods); i++) {
287             lu = sk_X509_LOOKUP_value(ctx->get_cert_methods, i);
288             j = X509_LOOKUP_by_subject(lu, type, name, &stmp);
289             if (j) {
290                 tmp = &stmp;
291                 break;
292             }
293         }
294         if (tmp == NULL)
295             return 0;
296     }
297
298     ret->type = tmp->type;
299     ret->data.ptr = tmp->data.ptr;
300
301     X509_OBJECT_up_ref_count(ret);
302
303     return 1;
304 }
305
306 int X509_STORE_add_cert(X509_STORE *ctx, X509 *x)
307 {
308     X509_OBJECT *obj;
309     int ret = 1, added = 1;
310
311     if (x == NULL)
312         return 0;
313     obj = X509_OBJECT_new();
314     if (obj == NULL)
315         return 0;
316     obj->type = X509_LU_X509;
317     obj->data.x509 = x;
318     X509_OBJECT_up_ref_count(obj);
319
320     CRYPTO_THREAD_write_lock(ctx->lock);
321
322     if (X509_OBJECT_retrieve_match(ctx->objs, obj)) {
323         X509err(X509_F_X509_STORE_ADD_CERT,
324                 X509_R_CERT_ALREADY_IN_HASH_TABLE);
325         ret = 0;
326     } else {
327         added = sk_X509_OBJECT_push(ctx->objs, obj);
328         ret = added != 0;
329     }
330
331     CRYPTO_THREAD_unlock(ctx->lock);
332
333     if (!ret)                   /* obj not pushed */
334         X509_OBJECT_free(obj);
335     if (!added)                 /* on push failure */
336         X509err(X509_F_X509_STORE_ADD_CERT, ERR_R_MALLOC_FAILURE);
337
338     return ret;
339 }
340
341 int X509_STORE_add_crl(X509_STORE *ctx, X509_CRL *x)
342 {
343     X509_OBJECT *obj;
344     int ret = 1, added = 1;
345
346     if (x == NULL)
347         return 0;
348     obj = X509_OBJECT_new();
349     if (obj == NULL)
350         return 0;
351     obj->type = X509_LU_CRL;
352     obj->data.crl = x;
353     X509_OBJECT_up_ref_count(obj);
354
355     CRYPTO_THREAD_write_lock(ctx->lock);
356
357     if (X509_OBJECT_retrieve_match(ctx->objs, obj)) {
358         X509err(X509_F_X509_STORE_ADD_CRL, X509_R_CERT_ALREADY_IN_HASH_TABLE);
359         ret = 0;
360     } else {
361         added = sk_X509_OBJECT_push(ctx->objs, obj);
362         ret = added != 0;
363     }
364
365     CRYPTO_THREAD_unlock(ctx->lock);
366
367     if (!ret)                   /* obj not pushed */
368         X509_OBJECT_free(obj);
369     if (!added)                 /* on push failure */
370         X509err(X509_F_X509_STORE_ADD_CRL, ERR_R_MALLOC_FAILURE);
371
372     return ret;
373 }
374
375 int X509_OBJECT_up_ref_count(X509_OBJECT *a)
376 {
377     switch (a->type) {
378     default:
379         break;
380     case X509_LU_X509:
381         return X509_up_ref(a->data.x509);
382     case X509_LU_CRL:
383         return X509_CRL_up_ref(a->data.crl);
384     }
385     return 1;
386 }
387
388 X509 *X509_OBJECT_get0_X509(const X509_OBJECT *a)
389 {
390     if (a == NULL || a->type != X509_LU_X509)
391         return NULL;
392     return a->data.x509;
393 }
394
395 X509_CRL *X509_OBJECT_get0_X509_CRL(X509_OBJECT *a)
396 {
397     if (a == NULL || a->type != X509_LU_CRL)
398         return NULL;
399     return a->data.crl;
400 }
401
402 int X509_OBJECT_get_type(const X509_OBJECT *a)
403 {
404     return a->type;
405 }
406
407 X509_OBJECT *X509_OBJECT_new()
408 {
409     X509_OBJECT *ret = OPENSSL_zalloc(sizeof(*ret));
410
411     if (ret == NULL) {
412         X509err(X509_F_X509_OBJECT_NEW, ERR_R_MALLOC_FAILURE);
413         return NULL;
414     }
415     ret->type = X509_LU_FAIL;
416     return ret;
417 }
418
419
420 void X509_OBJECT_free(X509_OBJECT *a)
421 {
422     if (a == NULL)
423         return;
424     switch (a->type) {
425     default:
426         break;
427     case X509_LU_X509:
428         X509_free(a->data.x509);
429         break;
430     case X509_LU_CRL:
431         X509_CRL_free(a->data.crl);
432         break;
433     }
434     OPENSSL_free(a);
435 }
436
437 static int x509_object_idx_cnt(STACK_OF(X509_OBJECT) *h, int type,
438                                X509_NAME *name, int *pnmatch)
439 {
440     X509_OBJECT stmp;
441     X509 x509_s;
442     X509_CRL crl_s;
443     int idx;
444
445     stmp.type = type;
446     switch (type) {
447     case X509_LU_X509:
448         stmp.data.x509 = &x509_s;
449         x509_s.cert_info.subject = name;
450         break;
451     case X509_LU_CRL:
452         stmp.data.crl = &crl_s;
453         crl_s.crl.issuer = name;
454         break;
455     default:
456         /* abort(); */
457         return -1;
458     }
459
460     idx = sk_X509_OBJECT_find(h, &stmp);
461     if (idx >= 0 && pnmatch) {
462         int tidx;
463         const X509_OBJECT *tobj, *pstmp;
464         *pnmatch = 1;
465         pstmp = &stmp;
466         for (tidx = idx + 1; tidx < sk_X509_OBJECT_num(h); tidx++) {
467             tobj = sk_X509_OBJECT_value(h, tidx);
468             if (x509_object_cmp(&tobj, &pstmp))
469                 break;
470             (*pnmatch)++;
471         }
472     }
473     return idx;
474 }
475
476 int X509_OBJECT_idx_by_subject(STACK_OF(X509_OBJECT) *h, int type,
477                                X509_NAME *name)
478 {
479     return x509_object_idx_cnt(h, type, name, NULL);
480 }
481
482 X509_OBJECT *X509_OBJECT_retrieve_by_subject(STACK_OF(X509_OBJECT) *h,
483                                              int type, X509_NAME *name)
484 {
485     int idx;
486     idx = X509_OBJECT_idx_by_subject(h, type, name);
487     if (idx == -1)
488         return NULL;
489     return sk_X509_OBJECT_value(h, idx);
490 }
491
492 STACK_OF(X509_OBJECT) *X509_STORE_get0_objects(X509_STORE *v)
493 {
494     return v->objs;
495 }
496
497 STACK_OF(X509) *X509_STORE_CTX_get1_certs(X509_STORE_CTX *ctx, X509_NAME *nm)
498 {
499     int i, idx, cnt;
500     STACK_OF(X509) *sk = NULL;
501     X509 *x;
502     X509_OBJECT *obj;
503
504     CRYPTO_THREAD_write_lock(ctx->ctx->lock);
505     idx = x509_object_idx_cnt(ctx->ctx->objs, X509_LU_X509, nm, &cnt);
506     if (idx < 0) {
507         /*
508          * Nothing found in cache: do lookup to possibly add new objects to
509          * cache
510          */
511         X509_OBJECT *xobj = X509_OBJECT_new();
512
513         CRYPTO_THREAD_unlock(ctx->ctx->lock);
514         if (xobj == NULL)
515             return NULL;
516         if (!X509_STORE_CTX_get_by_subject(ctx, X509_LU_X509, nm, xobj)) {
517             X509_OBJECT_free(xobj);
518             return NULL;
519         }
520         X509_OBJECT_free(xobj);
521         CRYPTO_THREAD_write_lock(ctx->ctx->lock);
522         idx = x509_object_idx_cnt(ctx->ctx->objs, X509_LU_X509, nm, &cnt);
523         if (idx < 0) {
524             CRYPTO_THREAD_unlock(ctx->ctx->lock);
525             return NULL;
526         }
527     }
528
529     sk = sk_X509_new_null();
530     for (i = 0; i < cnt; i++, idx++) {
531         obj = sk_X509_OBJECT_value(ctx->ctx->objs, idx);
532         x = obj->data.x509;
533         X509_up_ref(x);
534         if (!sk_X509_push(sk, x)) {
535             CRYPTO_THREAD_unlock(ctx->ctx->lock);
536             X509_free(x);
537             sk_X509_pop_free(sk, X509_free);
538             return NULL;
539         }
540     }
541     CRYPTO_THREAD_unlock(ctx->ctx->lock);
542     return sk;
543 }
544
545 STACK_OF(X509_CRL) *X509_STORE_CTX_get1_crls(X509_STORE_CTX *ctx, X509_NAME *nm)
546 {
547     int i, idx, cnt;
548     STACK_OF(X509_CRL) *sk = sk_X509_CRL_new_null();
549     X509_CRL *x;
550     X509_OBJECT *obj, *xobj = X509_OBJECT_new();
551
552     /* Always do lookup to possibly add new CRLs to cache */
553     if (sk == NULL || xobj == NULL ||
554             !X509_STORE_CTX_get_by_subject(ctx, X509_LU_CRL, nm, xobj)) {
555         X509_OBJECT_free(xobj);
556         sk_X509_CRL_free(sk);
557         return NULL;
558     }
559     X509_OBJECT_free(xobj);
560     CRYPTO_THREAD_write_lock(ctx->ctx->lock);
561     idx = x509_object_idx_cnt(ctx->ctx->objs, X509_LU_CRL, nm, &cnt);
562     if (idx < 0) {
563         CRYPTO_THREAD_unlock(ctx->ctx->lock);
564         sk_X509_CRL_free(sk);
565         return NULL;
566     }
567
568     for (i = 0; i < cnt; i++, idx++) {
569         obj = sk_X509_OBJECT_value(ctx->ctx->objs, idx);
570         x = obj->data.crl;
571         X509_CRL_up_ref(x);
572         if (!sk_X509_CRL_push(sk, x)) {
573             CRYPTO_THREAD_unlock(ctx->ctx->lock);
574             X509_CRL_free(x);
575             sk_X509_CRL_pop_free(sk, X509_CRL_free);
576             return NULL;
577         }
578     }
579     CRYPTO_THREAD_unlock(ctx->ctx->lock);
580     return sk;
581 }
582
583 X509_OBJECT *X509_OBJECT_retrieve_match(STACK_OF(X509_OBJECT) *h,
584                                         X509_OBJECT *x)
585 {
586     int idx, i;
587     X509_OBJECT *obj;
588     idx = sk_X509_OBJECT_find(h, x);
589     if (idx == -1)
590         return NULL;
591     if ((x->type != X509_LU_X509) && (x->type != X509_LU_CRL))
592         return sk_X509_OBJECT_value(h, idx);
593     for (i = idx; i < sk_X509_OBJECT_num(h); i++) {
594         obj = sk_X509_OBJECT_value(h, i);
595         if (x509_object_cmp
596             ((const X509_OBJECT **)&obj, (const X509_OBJECT **)&x))
597             return NULL;
598         if (x->type == X509_LU_X509) {
599             if (!X509_cmp(obj->data.x509, x->data.x509))
600                 return obj;
601         } else if (x->type == X509_LU_CRL) {
602             if (!X509_CRL_match(obj->data.crl, x->data.crl))
603                 return obj;
604         } else
605             return obj;
606     }
607     return NULL;
608 }
609
610 /*-
611  * Try to get issuer certificate from store. Due to limitations
612  * of the API this can only retrieve a single certificate matching
613  * a given subject name. However it will fill the cache with all
614  * matching certificates, so we can examine the cache for all
615  * matches.
616  *
617  * Return values are:
618  *  1 lookup successful.
619  *  0 certificate not found.
620  * -1 some other error.
621  */
622 int X509_STORE_CTX_get1_issuer(X509 **issuer, X509_STORE_CTX *ctx, X509 *x)
623 {
624     X509_NAME *xn;
625     X509_OBJECT *obj = X509_OBJECT_new(), *pobj = NULL;
626     int i, ok, idx, ret;
627
628     if (obj == NULL)
629         return -1;
630     *issuer = NULL;
631     xn = X509_get_issuer_name(x);
632     ok = X509_STORE_CTX_get_by_subject(ctx, X509_LU_X509, xn, obj);
633     if (ok != X509_LU_X509) {
634         X509_OBJECT_free(obj);
635         if (ok == X509_LU_RETRY) {
636             X509err(X509_F_X509_STORE_CTX_GET1_ISSUER, X509_R_SHOULD_RETRY);
637             return -1;
638         }
639         if (ok != X509_LU_FAIL) {
640             /* not good :-(, break anyway */
641             return -1;
642         }
643         return 0;
644     }
645     /* If certificate matches all OK */
646     if (ctx->check_issued(ctx, x, obj->data.x509)) {
647         if (x509_check_cert_time(ctx, obj->data.x509, -1)) {
648             *issuer = obj->data.x509;
649             X509_up_ref(*issuer);
650             X509_OBJECT_free(obj);
651             return 1;
652         }
653     }
654     X509_OBJECT_free(obj);
655
656     /* Else find index of first cert accepted by 'check_issued' */
657     ret = 0;
658     CRYPTO_THREAD_write_lock(ctx->ctx->lock);
659     idx = X509_OBJECT_idx_by_subject(ctx->ctx->objs, X509_LU_X509, xn);
660     if (idx != -1) {            /* should be true as we've had at least one
661                                  * match */
662         /* Look through all matching certs for suitable issuer */
663         for (i = idx; i < sk_X509_OBJECT_num(ctx->ctx->objs); i++) {
664             pobj = sk_X509_OBJECT_value(ctx->ctx->objs, i);
665             /* See if we've run past the matches */
666             if (pobj->type != X509_LU_X509)
667                 break;
668             if (X509_NAME_cmp(xn, X509_get_subject_name(pobj->data.x509)))
669                 break;
670             if (ctx->check_issued(ctx, x, pobj->data.x509)) {
671                 *issuer = pobj->data.x509;
672                 ret = 1;
673                 /*
674                  * If times check, exit with match,
675                  * otherwise keep looking. Leave last
676                  * match in issuer so we return nearest
677                  * match if no certificate time is OK.
678                  */
679
680                 if (x509_check_cert_time(ctx, *issuer, -1))
681                     break;
682             }
683         }
684     }
685     CRYPTO_THREAD_unlock(ctx->ctx->lock);
686     if (*issuer)
687         X509_up_ref(*issuer);
688     return ret;
689 }
690
691 int X509_STORE_set_flags(X509_STORE *ctx, unsigned long flags)
692 {
693     return X509_VERIFY_PARAM_set_flags(ctx->param, flags);
694 }
695
696 int X509_STORE_set_depth(X509_STORE *ctx, int depth)
697 {
698     X509_VERIFY_PARAM_set_depth(ctx->param, depth);
699     return 1;
700 }
701
702 int X509_STORE_set_purpose(X509_STORE *ctx, int purpose)
703 {
704     return X509_VERIFY_PARAM_set_purpose(ctx->param, purpose);
705 }
706
707 int X509_STORE_set_trust(X509_STORE *ctx, int trust)
708 {
709     return X509_VERIFY_PARAM_set_trust(ctx->param, trust);
710 }
711
712 int X509_STORE_set1_param(X509_STORE *ctx, X509_VERIFY_PARAM *param)
713 {
714     return X509_VERIFY_PARAM_set1(ctx->param, param);
715 }
716
717 X509_VERIFY_PARAM *X509_STORE_get0_param(X509_STORE *ctx)
718 {
719     return ctx->param;
720 }
721
722 void X509_STORE_set_verify(X509_STORE *ctx, X509_STORE_CTX_verify_fn verify)
723 {
724     ctx->verify = verify;
725 }
726
727 X509_STORE_CTX_verify_fn X509_STORE_get_verify(X509_STORE *ctx)
728 {
729     return ctx->verify;
730 }
731
732 void X509_STORE_set_verify_cb(X509_STORE *ctx,
733                               X509_STORE_CTX_verify_cb verify_cb)
734 {
735     ctx->verify_cb = verify_cb;
736 }
737
738 X509_STORE_CTX_verify_cb X509_STORE_get_verify_cb(X509_STORE *ctx)
739 {
740     return ctx->verify_cb;
741 }
742
743 void X509_STORE_set_get_issuer(X509_STORE *ctx,
744                                X509_STORE_CTX_get_issuer_fn get_issuer)
745 {
746     ctx->get_issuer = get_issuer;
747 }
748
749 X509_STORE_CTX_get_issuer_fn X509_STORE_get_get_issuer(X509_STORE *ctx)
750 {
751     return ctx->get_issuer;
752 }
753
754 void X509_STORE_set_check_issued(X509_STORE *ctx,
755                                  X509_STORE_CTX_check_issued_fn check_issued)
756 {
757     ctx->check_issued = check_issued;
758 }
759
760 X509_STORE_CTX_check_issued_fn X509_STORE_get_check_issued(X509_STORE *ctx)
761 {
762     return ctx->check_issued;
763 }
764
765 void X509_STORE_set_check_revocation(X509_STORE *ctx,
766                                      X509_STORE_CTX_check_revocation_fn check_revocation)
767 {
768     ctx->check_revocation = check_revocation;
769 }
770
771 X509_STORE_CTX_check_revocation_fn X509_STORE_get_check_revocation(X509_STORE *ctx)
772 {
773     return ctx->check_revocation;
774 }
775
776 void X509_STORE_set_get_crl(X509_STORE *ctx,
777                             X509_STORE_CTX_get_crl_fn get_crl)
778 {
779     ctx->get_crl = get_crl;
780 }
781
782 X509_STORE_CTX_get_crl_fn X509_STORE_get_get_crl(X509_STORE *ctx)
783 {
784     return ctx->get_crl;
785 }
786
787 void X509_STORE_set_check_crl(X509_STORE *ctx,
788                               X509_STORE_CTX_check_crl_fn check_crl)
789 {
790     ctx->check_crl = check_crl;
791 }
792
793 X509_STORE_CTX_check_crl_fn X509_STORE_get_check_crl(X509_STORE *ctx)
794 {
795     return ctx->check_crl;
796 }
797
798 void X509_STORE_set_cert_crl(X509_STORE *ctx,
799                              X509_STORE_CTX_cert_crl_fn cert_crl)
800 {
801     ctx->cert_crl = cert_crl;
802 }
803
804 X509_STORE_CTX_cert_crl_fn X509_STORE_get_cert_crl(X509_STORE *ctx)
805 {
806     return ctx->cert_crl;
807 }
808
809 void X509_STORE_set_check_policy(X509_STORE *ctx,
810                                  X509_STORE_CTX_check_policy_fn check_policy)
811 {
812     ctx->check_policy = check_policy;
813 }
814
815 X509_STORE_CTX_check_policy_fn X509_STORE_get_check_policy(X509_STORE *ctx)
816 {
817     return ctx->check_policy;
818 }
819
820 void X509_STORE_set_lookup_certs(X509_STORE *ctx,
821                                  X509_STORE_CTX_lookup_certs_fn lookup_certs)
822 {
823     ctx->lookup_certs = lookup_certs;
824 }
825
826 X509_STORE_CTX_lookup_certs_fn X509_STORE_get_lookup_certs(X509_STORE *ctx)
827 {
828     return ctx->lookup_certs;
829 }
830
831 void X509_STORE_set_lookup_crls(X509_STORE *ctx,
832                                 X509_STORE_CTX_lookup_crls_fn lookup_crls)
833 {
834     ctx->lookup_crls = lookup_crls;
835 }
836
837 X509_STORE_CTX_lookup_crls_fn X509_STORE_get_lookup_crls(X509_STORE *ctx)
838 {
839     return ctx->lookup_crls;
840 }
841
842 void X509_STORE_set_cleanup(X509_STORE *ctx,
843                             X509_STORE_CTX_cleanup_fn ctx_cleanup)
844 {
845     ctx->cleanup = ctx_cleanup;
846 }
847
848 X509_STORE_CTX_cleanup_fn X509_STORE_get_cleanup(X509_STORE *ctx)
849 {
850     return ctx->cleanup;
851 }
852
853 int X509_STORE_set_ex_data(X509_STORE *ctx, int idx, void *data)
854 {
855     return CRYPTO_set_ex_data(&ctx->ex_data, idx, data);
856 }
857
858 void *X509_STORE_get_ex_data(X509_STORE *ctx, int idx)
859 {
860     return CRYPTO_get_ex_data(&ctx->ex_data, idx);
861 }
862
863 X509_STORE *X509_STORE_CTX_get0_store(X509_STORE_CTX *ctx)
864 {
865     return ctx->ctx;
866 }