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