1c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org/* crypto/x509/by_file.c */ 2c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) 3c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * All rights reserved. 4c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * 5c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * This package is an SSL implementation written 6c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * by Eric Young (eay@cryptsoft.com). 7c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * The implementation was written so as to conform with Netscapes SSL. 8c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * 9c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * This library is free for commercial and non-commercial use as long as 10c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * the following conditions are aheared to. The following conditions 11c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * apply to all code found in this distribution, be it the RC4, RSA, 12c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * lhash, DES, etc., code; not just the SSL code. The SSL documentation 13c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * included with this distribution is covered by the same copyright terms 14c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * except that the holder is Tim Hudson (tjh@cryptsoft.com). 15c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * 16c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * Copyright remains Eric Young's, and as such any Copyright notices in 17c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * the code are not to be removed. 18c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * If this package is used in a product, Eric Young should be given attribution 19c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * as the author of the parts of the library used. 20c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * This can be in the form of a textual message at program startup or 21c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * in documentation (online or textual) provided with the package. 22c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * 23c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * Redistribution and use in source and binary forms, with or without 24c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * modification, are permitted provided that the following conditions 25c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * are met: 26c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * 1. Redistributions of source code must retain the copyright 27c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * notice, this list of conditions and the following disclaimer. 28c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * 2. Redistributions in binary form must reproduce the above copyright 29c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * notice, this list of conditions and the following disclaimer in the 30c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * documentation and/or other materials provided with the distribution. 31c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * 3. All advertising materials mentioning features or use of this software 32c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * must display the following acknowledgement: 33c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * "This product includes cryptographic software written by 34c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * Eric Young (eay@cryptsoft.com)" 35c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * The word 'cryptographic' can be left out if the rouines from the library 36c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * being used are not cryptographic related :-). 37c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * 4. If you include any Windows specific code (or a derivative thereof) from 38c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * the apps directory (application code) you must include an acknowledgement: 39c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" 40c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * 41c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND 42c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 43c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 44c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 45c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 46c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 47c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 48c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 49c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 50c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 51c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * SUCH DAMAGE. 52c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * 53c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * The licence and distribution terms for any publically available version or 54c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * derivative of this code cannot be changed. i.e. this code cannot simply be 55c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * copied and put under another distribution licence 56c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * [including the GNU Public Licence.] 57c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org */ 58c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 59c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#include <stdio.h> 60c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#include <time.h> 61c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#include <errno.h> 62c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 63c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#include "cryptlib.h" 64c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#include <openssl/lhash.h> 65c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#include <openssl/buffer.h> 66c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#include <openssl/x509.h> 67c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#include <openssl/pem.h> 68c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 69c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#ifndef OPENSSL_NO_STDIO 70c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 71c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgstatic int by_file_ctrl(X509_LOOKUP *ctx, int cmd, const char *argc, 72c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org long argl, char **ret); 73c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgX509_LOOKUP_METHOD x509_file_lookup= 74c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 75c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org "Load file into cache", 76c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org NULL, /* new */ 77c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org NULL, /* free */ 78c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org NULL, /* init */ 79c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org NULL, /* shutdown */ 80c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org by_file_ctrl, /* ctrl */ 81c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org NULL, /* get_by_subject */ 82c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org NULL, /* get_by_issuer_serial */ 83c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org NULL, /* get_by_fingerprint */ 84c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org NULL, /* get_by_alias */ 85c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org }; 86c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 87c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgX509_LOOKUP_METHOD *X509_LOOKUP_file(void) 88c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 89c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org return(&x509_file_lookup); 90c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 91c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 92c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgstatic int by_file_ctrl(X509_LOOKUP *ctx, int cmd, const char *argp, long argl, 93c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org char **ret) 94c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 95c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org int ok=0; 96c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org char *file; 97c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 98c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org switch (cmd) 99c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 100c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org case X509_L_FILE_LOAD: 101c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (argl == X509_FILETYPE_DEFAULT) 102c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 103480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org file = (char *)getenv(X509_get_default_cert_file_env()); 104c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (file) 105c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ok = (X509_load_cert_crl_file(ctx,file, 106c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org X509_FILETYPE_PEM) != 0); 107c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 108c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org else 109c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ok = (X509_load_cert_crl_file(ctx,X509_get_default_cert_file(), 110c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org X509_FILETYPE_PEM) != 0); 111c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 112c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (!ok) 113c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 114c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org X509err(X509_F_BY_FILE_CTRL,X509_R_LOADING_DEFAULTS); 115c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 116c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 117c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org else 118c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 119c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if(argl == X509_FILETYPE_PEM) 120c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ok = (X509_load_cert_crl_file(ctx,argp, 121c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org X509_FILETYPE_PEM) != 0); 122c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org else 123c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ok = (X509_load_cert_file(ctx,argp,(int)argl) != 0); 124c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 125c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org break; 126c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 127c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org return(ok); 128c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 129c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 130c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgint X509_load_cert_file(X509_LOOKUP *ctx, const char *file, int type) 131c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 132c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org int ret=0; 133c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org BIO *in=NULL; 134c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org int i,count=0; 135c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org X509 *x=NULL; 136c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 137c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (file == NULL) return(1); 138c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org in=BIO_new(BIO_s_file_internal()); 139c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 140c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if ((in == NULL) || (BIO_read_filename(in,file) <= 0)) 141c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 142c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org X509err(X509_F_X509_LOAD_CERT_FILE,ERR_R_SYS_LIB); 143c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org goto err; 144c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 145c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 146c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (type == X509_FILETYPE_PEM) 147c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 148c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org for (;;) 149c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 150c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org x=PEM_read_bio_X509_AUX(in,NULL,NULL,NULL); 151c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (x == NULL) 152c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 153c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if ((ERR_GET_REASON(ERR_peek_last_error()) == 154c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org PEM_R_NO_START_LINE) && (count > 0)) 155c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 156c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ERR_clear_error(); 157c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org break; 158c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 159c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org else 160c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 161c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org X509err(X509_F_X509_LOAD_CERT_FILE, 162c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ERR_R_PEM_LIB); 163c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org goto err; 164c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 165c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 166c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org i=X509_STORE_add_cert(ctx->store_ctx,x); 167c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (!i) goto err; 168c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org count++; 169c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org X509_free(x); 170c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org x=NULL; 171c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 172c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ret=count; 173c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 174c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org else if (type == X509_FILETYPE_ASN1) 175c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 176c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org x=d2i_X509_bio(in,NULL); 177c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (x == NULL) 178c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 179c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org X509err(X509_F_X509_LOAD_CERT_FILE,ERR_R_ASN1_LIB); 180c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org goto err; 181c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 182c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org i=X509_STORE_add_cert(ctx->store_ctx,x); 183c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (!i) goto err; 184c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ret=i; 185c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 186c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org else 187c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 188c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org X509err(X509_F_X509_LOAD_CERT_FILE,X509_R_BAD_X509_FILETYPE); 189c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org goto err; 190c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 191c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgerr: 192c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (x != NULL) X509_free(x); 193c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (in != NULL) BIO_free(in); 194c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org return(ret); 195c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 196c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 197c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgint X509_load_crl_file(X509_LOOKUP *ctx, const char *file, int type) 198c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 199c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org int ret=0; 200c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org BIO *in=NULL; 201c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org int i,count=0; 202c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org X509_CRL *x=NULL; 203c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 204c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (file == NULL) return(1); 205c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org in=BIO_new(BIO_s_file_internal()); 206c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 207c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if ((in == NULL) || (BIO_read_filename(in,file) <= 0)) 208c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 209c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org X509err(X509_F_X509_LOAD_CRL_FILE,ERR_R_SYS_LIB); 210c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org goto err; 211c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 212c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 213c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (type == X509_FILETYPE_PEM) 214c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 215c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org for (;;) 216c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 217c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org x=PEM_read_bio_X509_CRL(in,NULL,NULL,NULL); 218c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (x == NULL) 219c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 220c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if ((ERR_GET_REASON(ERR_peek_last_error()) == 221c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org PEM_R_NO_START_LINE) && (count > 0)) 222c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 223c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ERR_clear_error(); 224c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org break; 225c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 226c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org else 227c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 228c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org X509err(X509_F_X509_LOAD_CRL_FILE, 229c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ERR_R_PEM_LIB); 230c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org goto err; 231c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 232c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 233c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org i=X509_STORE_add_crl(ctx->store_ctx,x); 234c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (!i) goto err; 235c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org count++; 236c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org X509_CRL_free(x); 237c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org x=NULL; 238c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 239c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ret=count; 240c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 241c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org else if (type == X509_FILETYPE_ASN1) 242c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 243c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org x=d2i_X509_CRL_bio(in,NULL); 244c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (x == NULL) 245c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 246c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org X509err(X509_F_X509_LOAD_CRL_FILE,ERR_R_ASN1_LIB); 247c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org goto err; 248c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 249c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org i=X509_STORE_add_crl(ctx->store_ctx,x); 250c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (!i) goto err; 251c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ret=i; 252c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 253c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org else 254c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 255c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org X509err(X509_F_X509_LOAD_CRL_FILE,X509_R_BAD_X509_FILETYPE); 256c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org goto err; 257c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 258c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgerr: 259c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (x != NULL) X509_CRL_free(x); 260c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (in != NULL) BIO_free(in); 261c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org return(ret); 262c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 263c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 264c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgint X509_load_cert_crl_file(X509_LOOKUP *ctx, const char *file, int type) 265c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org{ 266c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org STACK_OF(X509_INFO) *inf; 267c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org X509_INFO *itmp; 268c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org BIO *in; 269c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org int i, count = 0; 270c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if(type != X509_FILETYPE_PEM) 271c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org return X509_load_cert_file(ctx, file, type); 272c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org in = BIO_new_file(file, "r"); 273c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if(!in) { 274c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org X509err(X509_F_X509_LOAD_CERT_CRL_FILE,ERR_R_SYS_LIB); 275c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org return 0; 276c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 277c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org inf = PEM_X509_INFO_read_bio(in, NULL, NULL, NULL); 278c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org BIO_free(in); 279c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if(!inf) { 280c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org X509err(X509_F_X509_LOAD_CERT_CRL_FILE,ERR_R_PEM_LIB); 281c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org return 0; 282c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 283c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org for(i = 0; i < sk_X509_INFO_num(inf); i++) { 284c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org itmp = sk_X509_INFO_value(inf, i); 285c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if(itmp->x509) { 286c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org X509_STORE_add_cert(ctx->store_ctx, itmp->x509); 287c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org count++; 288c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 289c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if(itmp->crl) { 290c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org X509_STORE_add_crl(ctx->store_ctx, itmp->crl); 291c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org count++; 292c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 293c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 294c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org sk_X509_INFO_pop_free(inf, X509_INFO_free); 295c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org return count; 296c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org} 297c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 298c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 299c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#endif /* OPENSSL_NO_STDIO */ 300c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 301