x509_lu.c revision 98d58bb80c64b02a33662f0ea80351d4a1535267
1656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* crypto/x509/x509_lu.c */ 2656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) 3656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * All rights reserved. 4656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 5656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * This package is an SSL implementation written 6656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * by Eric Young (eay@cryptsoft.com). 7656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * The implementation was written so as to conform with Netscapes SSL. 8656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 9656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * This library is free for commercial and non-commercial use as long as 10656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * the following conditions are aheared to. The following conditions 11656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * apply to all code found in this distribution, be it the RC4, RSA, 12656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * lhash, DES, etc., code; not just the SSL code. The SSL documentation 13656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * included with this distribution is covered by the same copyright terms 14656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * except that the holder is Tim Hudson (tjh@cryptsoft.com). 15656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 16656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * Copyright remains Eric Young's, and as such any Copyright notices in 17656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * the code are not to be removed. 18656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * If this package is used in a product, Eric Young should be given attribution 19656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * as the author of the parts of the library used. 20656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * This can be in the form of a textual message at program startup or 21656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * in documentation (online or textual) provided with the package. 22656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 23656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * Redistribution and use in source and binary forms, with or without 24656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * modification, are permitted provided that the following conditions 25656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * are met: 26656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 1. Redistributions of source code must retain the copyright 27656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * notice, this list of conditions and the following disclaimer. 28656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 2. Redistributions in binary form must reproduce the above copyright 29656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * notice, this list of conditions and the following disclaimer in the 30656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * documentation and/or other materials provided with the distribution. 31656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 3. All advertising materials mentioning features or use of this software 32656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * must display the following acknowledgement: 33656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * "This product includes cryptographic software written by 34656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * Eric Young (eay@cryptsoft.com)" 35656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * The word 'cryptographic' can be left out if the rouines from the library 36656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * being used are not cryptographic related :-). 37656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 4. If you include any Windows specific code (or a derivative thereof) from 38656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * the apps directory (application code) you must include an acknowledgement: 39656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" 40656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 41656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND 42656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 43656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 44656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 45656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 46656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 47656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 48656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 49656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 50656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 51656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * SUCH DAMAGE. 52656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 53656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * The licence and distribution terms for any publically available version or 54656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * derivative of this code cannot be changed. i.e. this code cannot simply be 55656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * copied and put under another distribution licence 56656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * [including the GNU Public Licence.] 57656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project */ 58656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 59656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <stdio.h> 60656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include "cryptlib.h" 61656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <openssl/lhash.h> 62656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <openssl/x509.h> 63656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <openssl/x509v3.h> 64656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 65656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectX509_LOOKUP *X509_LOOKUP_new(X509_LOOKUP_METHOD *method) 66656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 67656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project X509_LOOKUP *ret; 68656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 69656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ret=(X509_LOOKUP *)OPENSSL_malloc(sizeof(X509_LOOKUP)); 70656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (ret == NULL) return NULL; 71656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 72656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ret->init=0; 73656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ret->skip=0; 74656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ret->method=method; 75656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ret->method_data=NULL; 76656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ret->store_ctx=NULL; 77656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if ((method->new_item != NULL) && !method->new_item(ret)) 78656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 79656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project OPENSSL_free(ret); 80656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return NULL; 81656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 82656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return ret; 83656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 84656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 85656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectvoid X509_LOOKUP_free(X509_LOOKUP *ctx) 86656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 87656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (ctx == NULL) return; 88656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if ( (ctx->method != NULL) && 89656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project (ctx->method->free != NULL)) 90656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ctx->method->free(ctx); 91656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project OPENSSL_free(ctx); 92656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 93656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 94656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint X509_LOOKUP_init(X509_LOOKUP *ctx) 95656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 96656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (ctx->method == NULL) return 0; 97656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (ctx->method->init != NULL) 98656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return ctx->method->init(ctx); 99656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else 100656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return 1; 101656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 102656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 103656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint X509_LOOKUP_shutdown(X509_LOOKUP *ctx) 104656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 105656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (ctx->method == NULL) return 0; 106656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (ctx->method->shutdown != NULL) 107656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return ctx->method->shutdown(ctx); 108656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else 109656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return 1; 110656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 111656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 112656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint X509_LOOKUP_ctrl(X509_LOOKUP *ctx, int cmd, const char *argc, long argl, 113656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project char **ret) 114656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 115656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (ctx->method == NULL) return -1; 116656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (ctx->method->ctrl != NULL) 117656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return ctx->method->ctrl(ctx,cmd,argc,argl,ret); 118656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else 119656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return 1; 120656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 121656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 122656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint X509_LOOKUP_by_subject(X509_LOOKUP *ctx, int type, X509_NAME *name, 123656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project X509_OBJECT *ret) 124656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 125656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if ((ctx->method == NULL) || (ctx->method->get_by_subject == NULL)) 126656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return X509_LU_FAIL; 127656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (ctx->skip) return 0; 128656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return ctx->method->get_by_subject(ctx,type,name,ret); 129656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 130656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 131656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint X509_LOOKUP_by_issuer_serial(X509_LOOKUP *ctx, int type, X509_NAME *name, 132656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ASN1_INTEGER *serial, X509_OBJECT *ret) 133656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 134656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if ((ctx->method == NULL) || 135656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project (ctx->method->get_by_issuer_serial == NULL)) 136656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return X509_LU_FAIL; 137656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return ctx->method->get_by_issuer_serial(ctx,type,name,serial,ret); 138656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 139656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 140656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint X509_LOOKUP_by_fingerprint(X509_LOOKUP *ctx, int type, 141656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project unsigned char *bytes, int len, X509_OBJECT *ret) 142656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 143656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if ((ctx->method == NULL) || (ctx->method->get_by_fingerprint == NULL)) 144656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return X509_LU_FAIL; 145656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return ctx->method->get_by_fingerprint(ctx,type,bytes,len,ret); 146656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 147656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 148656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint X509_LOOKUP_by_alias(X509_LOOKUP *ctx, int type, char *str, int len, 149656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project X509_OBJECT *ret) 150656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 151656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if ((ctx->method == NULL) || (ctx->method->get_by_alias == NULL)) 152656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return X509_LU_FAIL; 153656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return ctx->method->get_by_alias(ctx,type,str,len,ret); 154656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 155656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 156656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 157656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic int x509_object_cmp(const X509_OBJECT * const *a, const X509_OBJECT * const *b) 158656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 159656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project int ret; 160656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 161656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ret=((*a)->type - (*b)->type); 162656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (ret) return ret; 163656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project switch ((*a)->type) 164656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 165656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case X509_LU_X509: 166656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ret=X509_subject_name_cmp((*a)->data.x509,(*b)->data.x509); 167656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project break; 168656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case X509_LU_CRL: 169656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ret=X509_CRL_cmp((*a)->data.crl,(*b)->data.crl); 170656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project break; 171656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project default: 172656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project /* abort(); */ 173656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return 0; 174656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 175656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return ret; 176656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 177656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 178656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectX509_STORE *X509_STORE_new(void) 179656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 180656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project X509_STORE *ret; 181656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 182656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if ((ret=(X509_STORE *)OPENSSL_malloc(sizeof(X509_STORE))) == NULL) 183656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return NULL; 184656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ret->objs = sk_X509_OBJECT_new(x509_object_cmp); 185656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ret->cache=1; 186656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ret->get_cert_methods=sk_X509_LOOKUP_new_null(); 187656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ret->verify=0; 188656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ret->verify_cb=0; 189656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 190656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if ((ret->param = X509_VERIFY_PARAM_new()) == NULL) 191656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return NULL; 192656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 193656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ret->get_issuer = 0; 194656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ret->check_issued = 0; 195656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ret->check_revocation = 0; 196656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ret->get_crl = 0; 197656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ret->check_crl = 0; 198656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ret->cert_crl = 0; 199656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ret->cleanup = 0; 200656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 20198d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom if (!CRYPTO_new_ex_data(CRYPTO_EX_INDEX_X509_STORE, ret, &ret->ex_data)) 20298d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom { 20398d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom sk_X509_OBJECT_free(ret->objs); 20498d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom OPENSSL_free(ret); 20598d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom return NULL; 20698d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom } 20798d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom 208656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ret->references=1; 209656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return ret; 210656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 211656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 212656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic void cleanup(X509_OBJECT *a) 213656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 214656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (a->type == X509_LU_X509) 215656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 216656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project X509_free(a->data.x509); 217656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 218656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (a->type == X509_LU_CRL) 219656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 220656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project X509_CRL_free(a->data.crl); 221656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 222656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else 223656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 224656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project /* abort(); */ 225656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 226656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 227656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project OPENSSL_free(a); 228656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 229656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 230656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectvoid X509_STORE_free(X509_STORE *vfy) 231656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 232656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project int i; 233656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project STACK_OF(X509_LOOKUP) *sk; 234656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project X509_LOOKUP *lu; 235656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 236656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (vfy == NULL) 237656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return; 238656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 239656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project sk=vfy->get_cert_methods; 240656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project for (i=0; i<sk_X509_LOOKUP_num(sk); i++) 241656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 242656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project lu=sk_X509_LOOKUP_value(sk,i); 243656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project X509_LOOKUP_shutdown(lu); 244656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project X509_LOOKUP_free(lu); 245656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 246656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project sk_X509_LOOKUP_free(sk); 247656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project sk_X509_OBJECT_pop_free(vfy->objs, cleanup); 248656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 249656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project CRYPTO_free_ex_data(CRYPTO_EX_INDEX_X509_STORE, vfy, &vfy->ex_data); 250656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (vfy->param) 251656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project X509_VERIFY_PARAM_free(vfy->param); 252656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project OPENSSL_free(vfy); 253656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 254656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 255656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectX509_LOOKUP *X509_STORE_add_lookup(X509_STORE *v, X509_LOOKUP_METHOD *m) 256656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 257656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project int i; 258656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project STACK_OF(X509_LOOKUP) *sk; 259656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project X509_LOOKUP *lu; 260656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 261656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project sk=v->get_cert_methods; 262656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project for (i=0; i<sk_X509_LOOKUP_num(sk); i++) 263656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 264656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project lu=sk_X509_LOOKUP_value(sk,i); 265656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (m == lu->method) 266656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 267656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return lu; 268656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 269656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 270656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project /* a new one */ 271656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project lu=X509_LOOKUP_new(m); 272656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (lu == NULL) 273656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return NULL; 274656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else 275656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 276656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project lu->store_ctx=v; 277656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (sk_X509_LOOKUP_push(v->get_cert_methods,lu)) 278656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return lu; 279656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else 280656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 281656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project X509_LOOKUP_free(lu); 282656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return NULL; 283656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 284656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 285656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 286656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 287656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint X509_STORE_get_by_subject(X509_STORE_CTX *vs, int type, X509_NAME *name, 288656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project X509_OBJECT *ret) 289656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 290656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project X509_STORE *ctx=vs->ctx; 291656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project X509_LOOKUP *lu; 292656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project X509_OBJECT stmp,*tmp; 293656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project int i,j; 294656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 29598d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom CRYPTO_w_lock(CRYPTO_LOCK_X509_STORE); 296656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project tmp=X509_OBJECT_retrieve_by_subject(ctx->objs,type,name); 29798d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom CRYPTO_w_unlock(CRYPTO_LOCK_X509_STORE); 298656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 299656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (tmp == NULL) 300656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 301656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project for (i=vs->current_method; i<sk_X509_LOOKUP_num(ctx->get_cert_methods); i++) 302656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 303656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project lu=sk_X509_LOOKUP_value(ctx->get_cert_methods,i); 304656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project j=X509_LOOKUP_by_subject(lu,type,name,&stmp); 305656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (j < 0) 306656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 307656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project vs->current_method=j; 308656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return j; 309656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 310656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (j) 311656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 312656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project tmp= &stmp; 313656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project break; 314656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 315656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 316656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project vs->current_method=0; 317656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (tmp == NULL) 318656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return 0; 319656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 320656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 321656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* if (ret->data.ptr != NULL) 322656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project X509_OBJECT_free_contents(ret); */ 323656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 324656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ret->type=tmp->type; 325656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ret->data.ptr=tmp->data.ptr; 326656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 327656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project X509_OBJECT_up_ref_count(ret); 328656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 329656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return 1; 330656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 331656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 332656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint X509_STORE_add_cert(X509_STORE *ctx, X509 *x) 333656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 334656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project X509_OBJECT *obj; 335656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project int ret=1; 336656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 337656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (x == NULL) return 0; 338656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project obj=(X509_OBJECT *)OPENSSL_malloc(sizeof(X509_OBJECT)); 339656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (obj == NULL) 340656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 341656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project X509err(X509_F_X509_STORE_ADD_CERT,ERR_R_MALLOC_FAILURE); 342656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return 0; 343656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 344656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project obj->type=X509_LU_X509; 345656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project obj->data.x509=x; 346656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 347656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project CRYPTO_w_lock(CRYPTO_LOCK_X509_STORE); 348656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 349656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project X509_OBJECT_up_ref_count(obj); 350656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 351656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (X509_OBJECT_retrieve_match(ctx->objs, obj)) 352656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 353656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project X509_OBJECT_free_contents(obj); 354656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project OPENSSL_free(obj); 355656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project X509err(X509_F_X509_STORE_ADD_CERT,X509_R_CERT_ALREADY_IN_HASH_TABLE); 356656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ret=0; 357656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 358656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else sk_X509_OBJECT_push(ctx->objs, obj); 359656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 360656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project CRYPTO_w_unlock(CRYPTO_LOCK_X509_STORE); 361656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 362656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return ret; 363656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 364656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 365656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint X509_STORE_add_crl(X509_STORE *ctx, X509_CRL *x) 366656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 367656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project X509_OBJECT *obj; 368656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project int ret=1; 369656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 370656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (x == NULL) return 0; 371656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project obj=(X509_OBJECT *)OPENSSL_malloc(sizeof(X509_OBJECT)); 372656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (obj == NULL) 373656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 374656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project X509err(X509_F_X509_STORE_ADD_CRL,ERR_R_MALLOC_FAILURE); 375656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return 0; 376656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 377656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project obj->type=X509_LU_CRL; 378656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project obj->data.crl=x; 379656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 380656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project CRYPTO_w_lock(CRYPTO_LOCK_X509_STORE); 381656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 382656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project X509_OBJECT_up_ref_count(obj); 383656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 384656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (X509_OBJECT_retrieve_match(ctx->objs, obj)) 385656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 386656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project X509_OBJECT_free_contents(obj); 387656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project OPENSSL_free(obj); 388656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project X509err(X509_F_X509_STORE_ADD_CRL,X509_R_CERT_ALREADY_IN_HASH_TABLE); 389656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ret=0; 390656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 391656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else sk_X509_OBJECT_push(ctx->objs, obj); 392656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 393656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project CRYPTO_w_unlock(CRYPTO_LOCK_X509_STORE); 394656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 395656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return ret; 396656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 397656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 398656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectvoid X509_OBJECT_up_ref_count(X509_OBJECT *a) 399656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 400656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project switch (a->type) 401656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 402656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case X509_LU_X509: 403656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project CRYPTO_add(&a->data.x509->references,1,CRYPTO_LOCK_X509); 404656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project break; 405656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case X509_LU_CRL: 406656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project CRYPTO_add(&a->data.crl->references,1,CRYPTO_LOCK_X509_CRL); 407656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project break; 408656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 409656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 410656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 411656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectvoid X509_OBJECT_free_contents(X509_OBJECT *a) 412656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 413656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project switch (a->type) 414656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 415656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case X509_LU_X509: 416656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project X509_free(a->data.x509); 417656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project break; 418656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case X509_LU_CRL: 419656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project X509_CRL_free(a->data.crl); 420656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project break; 421656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 422656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 423656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 424656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint X509_OBJECT_idx_by_subject(STACK_OF(X509_OBJECT) *h, int type, 425656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project X509_NAME *name) 426656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 427656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project X509_OBJECT stmp; 428656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project X509 x509_s; 429656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project X509_CINF cinf_s; 430656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project X509_CRL crl_s; 431656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project X509_CRL_INFO crl_info_s; 432656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 433656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project stmp.type=type; 434656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project switch (type) 435656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 436656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case X509_LU_X509: 437656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project stmp.data.x509= &x509_s; 438656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project x509_s.cert_info= &cinf_s; 439656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project cinf_s.subject=name; 440656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project break; 441656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case X509_LU_CRL: 442656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project stmp.data.crl= &crl_s; 443656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project crl_s.crl= &crl_info_s; 444656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project crl_info_s.issuer=name; 445656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project break; 446656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project default: 447656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project /* abort(); */ 448656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return -1; 449656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 450656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 451656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return sk_X509_OBJECT_find(h,&stmp); 452656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 453656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 454656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectX509_OBJECT *X509_OBJECT_retrieve_by_subject(STACK_OF(X509_OBJECT) *h, int type, 455656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project X509_NAME *name) 45698d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom { 457656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project int idx; 458656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project idx = X509_OBJECT_idx_by_subject(h, type, name); 459656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (idx==-1) return NULL; 460656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return sk_X509_OBJECT_value(h, idx); 46198d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom } 462656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 463656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectX509_OBJECT *X509_OBJECT_retrieve_match(STACK_OF(X509_OBJECT) *h, X509_OBJECT *x) 46498d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom { 465656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project int idx, i; 466656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project X509_OBJECT *obj; 467656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project idx = sk_X509_OBJECT_find(h, x); 468656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (idx == -1) return NULL; 469656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (x->type != X509_LU_X509) return sk_X509_OBJECT_value(h, idx); 470656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project for (i = idx; i < sk_X509_OBJECT_num(h); i++) 471656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 472656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project obj = sk_X509_OBJECT_value(h, i); 473656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (x509_object_cmp((const X509_OBJECT **)&obj, (const X509_OBJECT **)&x)) 474656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return NULL; 475656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if ((x->type != X509_LU_X509) || !X509_cmp(obj->data.x509, x->data.x509)) 476656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return obj; 477656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 478656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return NULL; 47998d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom } 480656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 481656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 482656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* Try to get issuer certificate from store. Due to limitations 483656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * of the API this can only retrieve a single certificate matching 484656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * a given subject name. However it will fill the cache with all 48598d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom * matching certificates, so we can examine the cache for all 486656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * matches. 487656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 488656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * Return values are: 489656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 1 lookup successful. 490656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 0 certificate not found. 491656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * -1 some other error. 492656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project */ 493656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint X509_STORE_CTX_get1_issuer(X509 **issuer, X509_STORE_CTX *ctx, X509 *x) 49498d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom { 495656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project X509_NAME *xn; 496656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project X509_OBJECT obj, *pobj; 49798d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom int i, ok, idx, ret; 498656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xn=X509_get_issuer_name(x); 499656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ok=X509_STORE_get_by_subject(ctx,X509_LU_X509,xn,&obj); 500656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (ok != X509_LU_X509) 501656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 502656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (ok == X509_LU_RETRY) 503656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 504656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project X509_OBJECT_free_contents(&obj); 505656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project X509err(X509_F_X509_STORE_CTX_GET1_ISSUER,X509_R_SHOULD_RETRY); 506656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return -1; 507656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 508656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (ok != X509_LU_FAIL) 509656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 510656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project X509_OBJECT_free_contents(&obj); 511656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project /* not good :-(, break anyway */ 512656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return -1; 513656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 514656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return 0; 515656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 516656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project /* If certificate matches all OK */ 517656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (ctx->check_issued(ctx, x, obj.data.x509)) 518656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 519656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *issuer = obj.data.x509; 520656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return 1; 521656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 522656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project X509_OBJECT_free_contents(&obj); 523656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 52498d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom /* Else find index of first cert accepted by 'check_issued' */ 52598d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom ret = 0; 52698d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom CRYPTO_w_lock(CRYPTO_LOCK_X509_STORE); 52798d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom idx = X509_OBJECT_idx_by_subject(ctx->ctx->objs, X509_LU_X509, xn); 52898d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom if (idx != -1) /* should be true as we've had at least one match */ 529656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 53098d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom /* Look through all matching certs for suitable issuer */ 53198d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom for (i = idx; i < sk_X509_OBJECT_num(ctx->ctx->objs); i++) 532656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 53398d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom pobj = sk_X509_OBJECT_value(ctx->ctx->objs, i); 53498d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom /* See if we've run past the matches */ 53598d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom if (pobj->type != X509_LU_X509) 53698d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom break; 53798d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom if (X509_NAME_cmp(xn, X509_get_subject_name(pobj->data.x509))) 53898d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom break; 53998d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom if (ctx->check_issued(ctx, x, pobj->data.x509)) 54098d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom { 54198d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom *issuer = pobj->data.x509; 54298d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom X509_OBJECT_up_ref_count(pobj); 54398d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom ret = 1; 54498d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom break; 54598d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom } 546656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 547656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 54898d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom CRYPTO_w_unlock(CRYPTO_LOCK_X509_STORE); 54998d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom return ret; 55098d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom } 551656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 552656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint X509_STORE_set_flags(X509_STORE *ctx, unsigned long flags) 553656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 554656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return X509_VERIFY_PARAM_set_flags(ctx->param, flags); 555656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 556656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 557656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint X509_STORE_set_depth(X509_STORE *ctx, int depth) 558656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 559656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project X509_VERIFY_PARAM_set_depth(ctx->param, depth); 560656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return 1; 561656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 562656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 563656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint X509_STORE_set_purpose(X509_STORE *ctx, int purpose) 564656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 565656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return X509_VERIFY_PARAM_set_purpose(ctx->param, purpose); 566656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 567656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 568656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint X509_STORE_set_trust(X509_STORE *ctx, int trust) 569656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 570656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return X509_VERIFY_PARAM_set_trust(ctx->param, trust); 571656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 572656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 573656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint X509_STORE_set1_param(X509_STORE *ctx, X509_VERIFY_PARAM *param) 574656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 575656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return X509_VERIFY_PARAM_set1(ctx->param, param); 576656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 577656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 578656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectIMPLEMENT_STACK_OF(X509_LOOKUP) 579656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectIMPLEMENT_STACK_OF(X509_OBJECT) 580