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)) 90a1a5710c055e139ea00e785f9eb55b3af3e4dab1Brian Carlstrom (*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; 199221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom ret->lookup_certs = 0; 200221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom ret->lookup_crls = 0; 201656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ret->cleanup = 0; 202656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 20398d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom if (!CRYPTO_new_ex_data(CRYPTO_EX_INDEX_X509_STORE, ret, &ret->ex_data)) 20498d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom { 20598d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom sk_X509_OBJECT_free(ret->objs); 20698d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom OPENSSL_free(ret); 20798d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom return NULL; 20898d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom } 20998d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom 210656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ret->references=1; 211656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return ret; 212656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 213656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 214656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic void cleanup(X509_OBJECT *a) 215656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 216656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (a->type == X509_LU_X509) 217656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 218656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project X509_free(a->data.x509); 219656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 220656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (a->type == X509_LU_CRL) 221656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 222656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project X509_CRL_free(a->data.crl); 223656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 224656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else 225656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 226656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project /* abort(); */ 227656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 228656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 229656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project OPENSSL_free(a); 230656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 231656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 232656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectvoid X509_STORE_free(X509_STORE *vfy) 233656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 234656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project int i; 235656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project STACK_OF(X509_LOOKUP) *sk; 236656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project X509_LOOKUP *lu; 237656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 238656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (vfy == NULL) 239656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return; 240656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 241656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project sk=vfy->get_cert_methods; 242656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project for (i=0; i<sk_X509_LOOKUP_num(sk); i++) 243656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 244656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project lu=sk_X509_LOOKUP_value(sk,i); 245656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project X509_LOOKUP_shutdown(lu); 246656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project X509_LOOKUP_free(lu); 247656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 248656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project sk_X509_LOOKUP_free(sk); 249656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project sk_X509_OBJECT_pop_free(vfy->objs, cleanup); 250656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 251656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project CRYPTO_free_ex_data(CRYPTO_EX_INDEX_X509_STORE, vfy, &vfy->ex_data); 252656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (vfy->param) 253656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project X509_VERIFY_PARAM_free(vfy->param); 254656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project OPENSSL_free(vfy); 255656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 256656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 257656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectX509_LOOKUP *X509_STORE_add_lookup(X509_STORE *v, X509_LOOKUP_METHOD *m) 258656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 259656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project int i; 260656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project STACK_OF(X509_LOOKUP) *sk; 261656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project X509_LOOKUP *lu; 262656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 263656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project sk=v->get_cert_methods; 264656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project for (i=0; i<sk_X509_LOOKUP_num(sk); i++) 265656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 266656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project lu=sk_X509_LOOKUP_value(sk,i); 267656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (m == lu->method) 268656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 269656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return lu; 270656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 271656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 272656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project /* a new one */ 273656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project lu=X509_LOOKUP_new(m); 274656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (lu == NULL) 275656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return NULL; 276656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else 277656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 278656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project lu->store_ctx=v; 279656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (sk_X509_LOOKUP_push(v->get_cert_methods,lu)) 280656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return lu; 281656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else 282656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 283656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project X509_LOOKUP_free(lu); 284656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return NULL; 285656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 286656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 287656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 288656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 289656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint X509_STORE_get_by_subject(X509_STORE_CTX *vs, int type, X509_NAME *name, 290656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project X509_OBJECT *ret) 291656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 292656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project X509_STORE *ctx=vs->ctx; 293656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project X509_LOOKUP *lu; 294656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project X509_OBJECT stmp,*tmp; 295656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project int i,j; 296656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 29798d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom CRYPTO_w_lock(CRYPTO_LOCK_X509_STORE); 298656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project tmp=X509_OBJECT_retrieve_by_subject(ctx->objs,type,name); 29998d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom CRYPTO_w_unlock(CRYPTO_LOCK_X509_STORE); 300656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 301221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (tmp == NULL || type == X509_LU_CRL) 302656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 303656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project for (i=vs->current_method; i<sk_X509_LOOKUP_num(ctx->get_cert_methods); i++) 304656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 305656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project lu=sk_X509_LOOKUP_value(ctx->get_cert_methods,i); 306656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project j=X509_LOOKUP_by_subject(lu,type,name,&stmp); 307656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (j < 0) 308656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 309656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project vs->current_method=j; 310656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return j; 311656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 312656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (j) 313656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 314656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project tmp= &stmp; 315656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project break; 316656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 317656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 318656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project vs->current_method=0; 319656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (tmp == NULL) 320656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return 0; 321656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 322656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 323656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* if (ret->data.ptr != NULL) 324656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project X509_OBJECT_free_contents(ret); */ 325656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 326656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ret->type=tmp->type; 327656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ret->data.ptr=tmp->data.ptr; 328656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 329656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project X509_OBJECT_up_ref_count(ret); 330656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 331656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return 1; 332656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 333656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 334656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint X509_STORE_add_cert(X509_STORE *ctx, X509 *x) 335656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 336656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project X509_OBJECT *obj; 337656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project int ret=1; 338656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 339656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (x == NULL) return 0; 340656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project obj=(X509_OBJECT *)OPENSSL_malloc(sizeof(X509_OBJECT)); 341656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (obj == NULL) 342656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 343656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project X509err(X509_F_X509_STORE_ADD_CERT,ERR_R_MALLOC_FAILURE); 344656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return 0; 345656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 346656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project obj->type=X509_LU_X509; 347656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project obj->data.x509=x; 348656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 349656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project CRYPTO_w_lock(CRYPTO_LOCK_X509_STORE); 350656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 351656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project X509_OBJECT_up_ref_count(obj); 352656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 353656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (X509_OBJECT_retrieve_match(ctx->objs, obj)) 354656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 355656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project X509_OBJECT_free_contents(obj); 356656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project OPENSSL_free(obj); 357656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project X509err(X509_F_X509_STORE_ADD_CERT,X509_R_CERT_ALREADY_IN_HASH_TABLE); 358656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ret=0; 359656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 360656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else sk_X509_OBJECT_push(ctx->objs, obj); 361656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 362656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project CRYPTO_w_unlock(CRYPTO_LOCK_X509_STORE); 363656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 364656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return ret; 365656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 366656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 367656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint X509_STORE_add_crl(X509_STORE *ctx, X509_CRL *x) 368656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 369656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project X509_OBJECT *obj; 370656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project int ret=1; 371656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 372656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (x == NULL) return 0; 373656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project obj=(X509_OBJECT *)OPENSSL_malloc(sizeof(X509_OBJECT)); 374656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (obj == NULL) 375656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 376656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project X509err(X509_F_X509_STORE_ADD_CRL,ERR_R_MALLOC_FAILURE); 377656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return 0; 378656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 379656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project obj->type=X509_LU_CRL; 380656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project obj->data.crl=x; 381656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 382656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project CRYPTO_w_lock(CRYPTO_LOCK_X509_STORE); 383656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 384656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project X509_OBJECT_up_ref_count(obj); 385656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 386656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (X509_OBJECT_retrieve_match(ctx->objs, obj)) 387656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 388656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project X509_OBJECT_free_contents(obj); 389656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project OPENSSL_free(obj); 390656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project X509err(X509_F_X509_STORE_ADD_CRL,X509_R_CERT_ALREADY_IN_HASH_TABLE); 391656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ret=0; 392656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 393656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else sk_X509_OBJECT_push(ctx->objs, obj); 394656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 395656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project CRYPTO_w_unlock(CRYPTO_LOCK_X509_STORE); 396656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 397656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return ret; 398656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 399656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 400656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectvoid X509_OBJECT_up_ref_count(X509_OBJECT *a) 401656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 402656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project switch (a->type) 403656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 404656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case X509_LU_X509: 405656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project CRYPTO_add(&a->data.x509->references,1,CRYPTO_LOCK_X509); 406656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project break; 407656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case X509_LU_CRL: 408656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project CRYPTO_add(&a->data.crl->references,1,CRYPTO_LOCK_X509_CRL); 409656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project break; 410656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 411656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 412656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 413656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectvoid X509_OBJECT_free_contents(X509_OBJECT *a) 414656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 415656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project switch (a->type) 416656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 417656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case X509_LU_X509: 418656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project X509_free(a->data.x509); 419656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project break; 420656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case X509_LU_CRL: 421656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project X509_CRL_free(a->data.crl); 422656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project break; 423656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 424656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 425656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 426221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromstatic int x509_object_idx_cnt(STACK_OF(X509_OBJECT) *h, int type, 427221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom X509_NAME *name, int *pnmatch) 428656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 429656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project X509_OBJECT stmp; 430656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project X509 x509_s; 431656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project X509_CINF cinf_s; 432656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project X509_CRL crl_s; 433656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project X509_CRL_INFO crl_info_s; 434221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom int idx; 435656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 436656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project stmp.type=type; 437656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project switch (type) 438656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 439656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case X509_LU_X509: 440656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project stmp.data.x509= &x509_s; 441656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project x509_s.cert_info= &cinf_s; 442656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project cinf_s.subject=name; 443656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project break; 444656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case X509_LU_CRL: 445656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project stmp.data.crl= &crl_s; 446656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project crl_s.crl= &crl_info_s; 447656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project crl_info_s.issuer=name; 448656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project break; 449656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project default: 450656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project /* abort(); */ 451656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return -1; 452656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 453656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 454221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom idx = sk_X509_OBJECT_find(h,&stmp); 455221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (idx >= 0 && pnmatch) 456221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom { 457221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom int tidx; 458221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom const X509_OBJECT *tobj, *pstmp; 459221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom *pnmatch = 1; 460221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom pstmp = &stmp; 461221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom for (tidx = idx + 1; tidx < sk_X509_OBJECT_num(h); tidx++) 462221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom { 463221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom tobj = sk_X509_OBJECT_value(h, tidx); 464221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (x509_object_cmp(&tobj, &pstmp)) 465221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom break; 466221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom (*pnmatch)++; 467221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom } 468221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom } 469221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom return idx; 470221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom } 471221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 472221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 473221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromint X509_OBJECT_idx_by_subject(STACK_OF(X509_OBJECT) *h, int type, 474221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom X509_NAME *name) 475221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom { 476221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom return x509_object_idx_cnt(h, type, name, NULL); 477656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 478656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 479656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectX509_OBJECT *X509_OBJECT_retrieve_by_subject(STACK_OF(X509_OBJECT) *h, int type, 480656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project X509_NAME *name) 48198d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom { 482656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project int idx; 483656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project idx = X509_OBJECT_idx_by_subject(h, type, name); 484656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (idx==-1) return NULL; 485656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return sk_X509_OBJECT_value(h, idx); 48698d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom } 487656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 488221304ee937bc0910948a8be1320cb8cc4eb6d36Brian CarlstromSTACK_OF(X509)* X509_STORE_get1_certs(X509_STORE_CTX *ctx, X509_NAME *nm) 489221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom { 490221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom int i, idx, cnt; 491221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom STACK_OF(X509) *sk; 492221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom X509 *x; 493221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom X509_OBJECT *obj; 494221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom sk = sk_X509_new_null(); 495221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom CRYPTO_w_lock(CRYPTO_LOCK_X509_STORE); 496221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom idx = x509_object_idx_cnt(ctx->ctx->objs, X509_LU_X509, nm, &cnt); 497221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (idx < 0) 498221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom { 499221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom /* Nothing found in cache: do lookup to possibly add new 500221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom * objects to cache 501221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom */ 502221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom X509_OBJECT xobj; 503221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom CRYPTO_w_unlock(CRYPTO_LOCK_X509_STORE); 504221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (!X509_STORE_get_by_subject(ctx, X509_LU_X509, nm, &xobj)) 505221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom { 506221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom sk_X509_free(sk); 507221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom return NULL; 508221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom } 509221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom X509_OBJECT_free_contents(&xobj); 510221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom CRYPTO_w_lock(CRYPTO_LOCK_X509_STORE); 511221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom idx = x509_object_idx_cnt(ctx->ctx->objs,X509_LU_X509,nm, &cnt); 512221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (idx < 0) 513221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom { 514221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom CRYPTO_w_unlock(CRYPTO_LOCK_X509_STORE); 515221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom sk_X509_free(sk); 516221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom return NULL; 517221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom } 518221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom } 519221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom for (i = 0; i < cnt; i++, idx++) 520221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom { 521221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom obj = sk_X509_OBJECT_value(ctx->ctx->objs, idx); 522221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom x = obj->data.x509; 523221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom CRYPTO_add(&x->references, 1, CRYPTO_LOCK_X509); 524221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (!sk_X509_push(sk, x)) 525221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom { 526221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom CRYPTO_w_unlock(CRYPTO_LOCK_X509_STORE); 527221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom X509_free(x); 528221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom sk_X509_pop_free(sk, X509_free); 529221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom return NULL; 530221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom } 531221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom } 532221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom CRYPTO_w_unlock(CRYPTO_LOCK_X509_STORE); 533221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom return sk; 534221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 535221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom } 536221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 537221304ee937bc0910948a8be1320cb8cc4eb6d36Brian CarlstromSTACK_OF(X509_CRL)* X509_STORE_get1_crls(X509_STORE_CTX *ctx, X509_NAME *nm) 538221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom { 539221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom int i, idx, cnt; 540221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom STACK_OF(X509_CRL) *sk; 541221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom X509_CRL *x; 542221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom X509_OBJECT *obj, xobj; 543221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom sk = sk_X509_CRL_new_null(); 544221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom CRYPTO_w_lock(CRYPTO_LOCK_X509_STORE); 545221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom /* Check cache first */ 546221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom idx = x509_object_idx_cnt(ctx->ctx->objs, X509_LU_CRL, nm, &cnt); 547221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 548221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom /* Always do lookup to possibly add new CRLs to cache 549221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom */ 550221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom CRYPTO_w_unlock(CRYPTO_LOCK_X509_STORE); 551221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (!X509_STORE_get_by_subject(ctx, X509_LU_CRL, nm, &xobj)) 552221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom { 553221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom sk_X509_CRL_free(sk); 554221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom return NULL; 555221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom } 556221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom X509_OBJECT_free_contents(&xobj); 557221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom CRYPTO_w_lock(CRYPTO_LOCK_X509_STORE); 558221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom idx = x509_object_idx_cnt(ctx->ctx->objs,X509_LU_CRL, nm, &cnt); 559221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (idx < 0) 560221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom { 561221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom CRYPTO_w_unlock(CRYPTO_LOCK_X509_STORE); 562221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom sk_X509_CRL_free(sk); 563221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom return NULL; 564221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom } 565221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 566221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom for (i = 0; i < cnt; i++, idx++) 567221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom { 568221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom obj = sk_X509_OBJECT_value(ctx->ctx->objs, idx); 569221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom x = obj->data.crl; 570221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom CRYPTO_add(&x->references, 1, CRYPTO_LOCK_X509_CRL); 571221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (!sk_X509_CRL_push(sk, x)) 572221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom { 573221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom CRYPTO_w_unlock(CRYPTO_LOCK_X509_STORE); 574221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom X509_CRL_free(x); 575221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom sk_X509_CRL_pop_free(sk, X509_CRL_free); 576221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom return NULL; 577221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom } 578221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom } 579221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom CRYPTO_w_unlock(CRYPTO_LOCK_X509_STORE); 580221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom return sk; 581221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom } 582221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 583656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectX509_OBJECT *X509_OBJECT_retrieve_match(STACK_OF(X509_OBJECT) *h, X509_OBJECT *x) 58498d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom { 585656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project int idx, i; 586656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project X509_OBJECT *obj; 587656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project idx = sk_X509_OBJECT_find(h, x); 588656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (idx == -1) return NULL; 589221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if ((x->type != X509_LU_X509) && (x->type != X509_LU_CRL)) 590221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom return sk_X509_OBJECT_value(h, idx); 591656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project for (i = idx; i < sk_X509_OBJECT_num(h); i++) 592656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 593656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project obj = sk_X509_OBJECT_value(h, i); 594656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (x509_object_cmp((const X509_OBJECT **)&obj, (const X509_OBJECT **)&x)) 595656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return NULL; 596221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (x->type == X509_LU_X509) 597221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom { 598221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (!X509_cmp(obj->data.x509, x->data.x509)) 599221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom return obj; 600221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom } 601221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom else if (x->type == X509_LU_CRL) 602221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom { 603221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (!X509_CRL_match(obj->data.crl, x->data.crl)) 604221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom return obj; 605221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom } 606221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom else 607656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return obj; 608656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 609656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return NULL; 61098d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom } 611656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 612656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 613656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* Try to get issuer certificate from store. Due to limitations 614656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * of the API this can only retrieve a single certificate matching 615656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * a given subject name. However it will fill the cache with all 61698d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom * matching certificates, so we can examine the cache for all 617656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * matches. 618656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 619656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * Return values are: 620656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 1 lookup successful. 621656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 0 certificate not found. 622656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * -1 some other error. 623656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project */ 624656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint X509_STORE_CTX_get1_issuer(X509 **issuer, X509_STORE_CTX *ctx, X509 *x) 62598d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom { 626656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project X509_NAME *xn; 627656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project X509_OBJECT obj, *pobj; 62898d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom int i, ok, idx, ret; 629656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xn=X509_get_issuer_name(x); 630656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ok=X509_STORE_get_by_subject(ctx,X509_LU_X509,xn,&obj); 631656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (ok != X509_LU_X509) 632656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 633656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (ok == X509_LU_RETRY) 634656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 635656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project X509_OBJECT_free_contents(&obj); 636656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project X509err(X509_F_X509_STORE_CTX_GET1_ISSUER,X509_R_SHOULD_RETRY); 637656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return -1; 638656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 639656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (ok != X509_LU_FAIL) 640656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 641656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project X509_OBJECT_free_contents(&obj); 642656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project /* not good :-(, break anyway */ 643656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return -1; 644656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 645656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return 0; 646656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 647656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project /* If certificate matches all OK */ 648656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (ctx->check_issued(ctx, x, obj.data.x509)) 649656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 650656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *issuer = obj.data.x509; 651656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return 1; 652656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 653656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project X509_OBJECT_free_contents(&obj); 654656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 65598d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom /* Else find index of first cert accepted by 'check_issued' */ 65698d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom ret = 0; 65798d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom CRYPTO_w_lock(CRYPTO_LOCK_X509_STORE); 65898d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom idx = X509_OBJECT_idx_by_subject(ctx->ctx->objs, X509_LU_X509, xn); 65998d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom if (idx != -1) /* should be true as we've had at least one match */ 660656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 66198d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom /* Look through all matching certs for suitable issuer */ 66298d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom for (i = idx; i < sk_X509_OBJECT_num(ctx->ctx->objs); i++) 663656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 66498d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom pobj = sk_X509_OBJECT_value(ctx->ctx->objs, i); 66598d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom /* See if we've run past the matches */ 66698d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom if (pobj->type != X509_LU_X509) 66798d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom break; 66898d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom if (X509_NAME_cmp(xn, X509_get_subject_name(pobj->data.x509))) 66998d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom break; 67098d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom if (ctx->check_issued(ctx, x, pobj->data.x509)) 67198d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom { 67298d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom *issuer = pobj->data.x509; 67398d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom X509_OBJECT_up_ref_count(pobj); 67498d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom ret = 1; 67598d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom break; 67698d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom } 677656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 678656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 67998d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom CRYPTO_w_unlock(CRYPTO_LOCK_X509_STORE); 68098d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom return ret; 68198d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom } 682656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 683656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint X509_STORE_set_flags(X509_STORE *ctx, unsigned long flags) 684656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 685656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return X509_VERIFY_PARAM_set_flags(ctx->param, flags); 686656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 687656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 688656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint X509_STORE_set_depth(X509_STORE *ctx, int depth) 689656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 690656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project X509_VERIFY_PARAM_set_depth(ctx->param, depth); 691656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return 1; 692656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 693656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 694656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint X509_STORE_set_purpose(X509_STORE *ctx, int purpose) 695656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 696656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return X509_VERIFY_PARAM_set_purpose(ctx->param, purpose); 697656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 698656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 699656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint X509_STORE_set_trust(X509_STORE *ctx, int trust) 700656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 701656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return X509_VERIFY_PARAM_set_trust(ctx->param, trust); 702656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 703656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 704656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint X509_STORE_set1_param(X509_STORE *ctx, X509_VERIFY_PARAM *param) 705656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 706656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return X509_VERIFY_PARAM_set1(ctx->param, param); 707656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 708656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 709221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromvoid X509_STORE_set_verify_cb(X509_STORE *ctx, 710221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom int (*verify_cb)(int, X509_STORE_CTX *)) 711221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom { 712221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom ctx->verify_cb = verify_cb; 713221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom } 714221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 715656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectIMPLEMENT_STACK_OF(X509_LOOKUP) 716656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectIMPLEMENT_STACK_OF(X509_OBJECT) 717