X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=crypto%2Fx509%2Fby_file.c;h=92e00d2d7335ab711defac1294634ef94a45fe2c;hb=e51d1321fc91f2008022827009baea2dab938a2e;hp=5eb6cf20518f070bf88979e0ce4ad9fdf2e4725b;hpb=ec577822f95a8bca0023c5c77cef1a4916822d4a;p=oweals%2Fopenssl.git diff --git a/crypto/x509/by_file.c b/crypto/x509/by_file.c index 5eb6cf2051..92e00d2d73 100644 --- a/crypto/x509/by_file.c +++ b/crypto/x509/by_file.c @@ -59,8 +59,6 @@ #include #include #include -#include -#include #include "cryptlib.h" #include @@ -68,15 +66,10 @@ #include #include -#ifndef NO_STDIO - -#ifndef NOPROTO -static int by_file_ctrl(X509_LOOKUP *ctx,int cmd,char *argc, - long argl,char **ret); -#else -static int by_file_ctrl(); -#endif +#ifndef OPENSSL_NO_STDIO +static int by_file_ctrl(X509_LOOKUP *ctx, int cmd, const char *argc, + long argl, char **ret); X509_LOOKUP_METHOD x509_file_lookup= { "Load file into cache", @@ -96,10 +89,10 @@ X509_LOOKUP_METHOD *X509_LOOKUP_file(void) return(&x509_file_lookup); } -static int by_file_ctrl(X509_LOOKUP *ctx, int cmd, char *argp, long argl, +static int by_file_ctrl(X509_LOOKUP *ctx, int cmd, const char *argp, long argl, char **ret) { - int ok=0,ok2=0; + int ok=0; char *file; switch (cmd) @@ -107,31 +100,30 @@ static int by_file_ctrl(X509_LOOKUP *ctx, int cmd, char *argp, long argl, case X509_L_FILE_LOAD: if (argl == X509_FILETYPE_DEFAULT) { - ok=X509_load_cert_file(ctx,X509_get_default_cert_file(), - X509_FILETYPE_PEM); - ok2=X509_load_crl_file(ctx,X509_get_default_cert_file(), - X509_FILETYPE_PEM); - if (!ok || !ok2) + ok = (X509_load_cert_crl_file(ctx,X509_get_default_cert_file(), + X509_FILETYPE_PEM) != 0); + if (!ok) { X509err(X509_F_BY_FILE_CTRL,X509_R_LOADING_DEFAULTS); } else { file=(char *)Getenv(X509_get_default_cert_file_env()); - ok=X509_load_cert_file(ctx,file, - X509_FILETYPE_PEM); - ok2=X509_load_crl_file(ctx,file, - X509_FILETYPE_PEM); + ok = (X509_load_cert_crl_file(ctx,file, + X509_FILETYPE_PEM) != 0); } } else { - ok=X509_load_cert_file(ctx,argp,(int)argl); - ok2=X509_load_crl_file(ctx,argp,(int)argl); + if(argl == X509_FILETYPE_PEM) + ok = (X509_load_cert_crl_file(ctx,argp, + X509_FILETYPE_PEM) != 0); + else + ok = (X509_load_cert_file(ctx,argp,(int)argl) != 0); } break; } - return((ok && ok2)?ok:0); + return(ok); } int X509_load_cert_file(X509_LOOKUP *ctx, const char *file, int type) @@ -154,7 +146,7 @@ int X509_load_cert_file(X509_LOOKUP *ctx, const char *file, int type) { for (;;) { - x=PEM_read_bio_X509(in,NULL,NULL); + x=PEM_read_bio_X509_AUX(in,NULL,NULL,NULL); if (x == NULL) { if ((ERR_GET_REASON(ERR_peek_error()) == @@ -221,7 +213,7 @@ int X509_load_crl_file(X509_LOOKUP *ctx, const char *file, int type) { for (;;) { - x=PEM_read_bio_X509_CRL(in,NULL,NULL); + x=PEM_read_bio_X509_CRL(in,NULL,NULL,NULL); if (x == NULL) { if ((ERR_GET_REASON(ERR_peek_error()) == @@ -268,5 +260,39 @@ err: return(ret); } -#endif /* NO_STDIO */ +int X509_load_cert_crl_file(X509_LOOKUP *ctx, const char *file, int type) +{ + STACK_OF(X509_INFO) *inf; + X509_INFO *itmp; + BIO *in; + int i, count = 0; + if(type != X509_FILETYPE_PEM) + return X509_load_cert_file(ctx, file, type); + in = BIO_new_file(file, "r"); + if(!in) { + X509err(X509_F_X509_LOAD_CERT_CRL_FILE,ERR_R_SYS_LIB); + return 0; + } + inf = PEM_X509_INFO_read_bio(in, NULL, NULL, NULL); + BIO_free(in); + if(!inf) { + X509err(X509_F_X509_LOAD_CERT_CRL_FILE,ERR_R_PEM_LIB); + return 0; + } + for(i = 0; i < sk_X509_INFO_num(inf); i++) { + itmp = sk_X509_INFO_value(inf, i); + if(itmp->x509) { + X509_STORE_add_cert(ctx->store_ctx, itmp->x509); + count++; + } else if(itmp->crl) { + X509_STORE_add_crl(ctx->store_ctx, itmp->crl); + count++; + } + } + sk_X509_INFO_pop_free(inf, X509_INFO_free); + return count; +} + + +#endif /* OPENSSL_NO_STDIO */