by_file.c
Go to the documentation of this file.
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 #include <stdlib.h>
59 
60 #include <openssl/err.h>
61 #include <openssl/pem.h>
62 #include <openssl/thread.h>
63 
64 #include "internal.h"
65 
66 #ifndef OPENSSL_NO_STDIO
67 
68 static int by_file_ctrl(X509_LOOKUP *ctx, int cmd, const char *argc,
69  long argl, char **ret);
71  "Load file into cache",
72  NULL, /* new */
73  NULL, /* free */
74  NULL, /* init */
75  NULL, /* shutdown */
76  by_file_ctrl, /* ctrl */
77  NULL, /* get_by_subject */
78  NULL, /* get_by_issuer_serial */
79  NULL, /* get_by_fingerprint */
80  NULL, /* get_by_alias */
81 };
82 
84 {
85  return (&x509_file_lookup);
86 }
87 
88 static int by_file_ctrl(X509_LOOKUP *ctx, int cmd, const char *argp,
89  long argl, char **ret)
90 {
91  int ok = 0;
92  const char *file;
93 
94  switch (cmd) {
95  case X509_L_FILE_LOAD:
96  if (argl == X509_FILETYPE_DEFAULT) {
98  if (file)
100  X509_FILETYPE_PEM) != 0);
101 
102  else
105  X509_FILETYPE_PEM) != 0);
106 
107  if (!ok) {
109  }
110  } else {
111  if (argl == X509_FILETYPE_PEM)
113  X509_FILETYPE_PEM) != 0);
114  else
115  ok = (X509_load_cert_file(ctx, argp, (int)argl) != 0);
116  }
117  break;
118  }
119  return (ok);
120 }
121 
122 int X509_load_cert_file(X509_LOOKUP *ctx, const char *file, int type)
123 {
124  int ret = 0;
125  BIO *in = NULL;
126  int i, count = 0;
127  X509 *x = NULL;
128 
129  if (file == NULL)
130  return (1);
131  in = BIO_new(BIO_s_file());
132 
133  if ((in == NULL) || (BIO_read_filename(in, file) <= 0)) {
135  goto err;
136  }
137 
138  if (type == X509_FILETYPE_PEM) {
139  for (;;) {
140  x = PEM_read_bio_X509_AUX(in, NULL, NULL, NULL);
141  if (x == NULL) {
143  if (ERR_GET_LIB(error) == ERR_LIB_PEM &&
145  count > 0) {
146  ERR_clear_error();
147  break;
148  }
150  goto err;
151  }
152  i = X509_STORE_add_cert(ctx->store_ctx, x);
153  if (!i)
154  goto err;
155  count++;
156  X509_free(x);
157  x = NULL;
158  }
159  ret = count;
160  } else if (type == X509_FILETYPE_ASN1) {
161  x = d2i_X509_bio(in, NULL);
162  if (x == NULL) {
164  goto err;
165  }
166  i = X509_STORE_add_cert(ctx->store_ctx, x);
167  if (!i)
168  goto err;
169  ret = i;
170  } else {
172  goto err;
173  }
174  err:
175  if (x != NULL)
176  X509_free(x);
177  if (in != NULL)
178  BIO_free(in);
179  return (ret);
180 }
181 
182 int X509_load_crl_file(X509_LOOKUP *ctx, const char *file, int type)
183 {
184  int ret = 0;
185  BIO *in = NULL;
186  int i, count = 0;
187  X509_CRL *x = NULL;
188 
189  if (file == NULL)
190  return (1);
191  in = BIO_new(BIO_s_file());
192 
193  if ((in == NULL) || (BIO_read_filename(in, file) <= 0)) {
195  goto err;
196  }
197 
198  if (type == X509_FILETYPE_PEM) {
199  for (;;) {
200  x = PEM_read_bio_X509_CRL(in, NULL, NULL, NULL);
201  if (x == NULL) {
203  if (ERR_GET_LIB(error) == ERR_LIB_PEM &&
205  count > 0) {
206  ERR_clear_error();
207  break;
208  }
210  goto err;
211  }
212  i = X509_STORE_add_crl(ctx->store_ctx, x);
213  if (!i)
214  goto err;
215  count++;
216  X509_CRL_free(x);
217  x = NULL;
218  }
219  ret = count;
220  } else if (type == X509_FILETYPE_ASN1) {
221  x = d2i_X509_CRL_bio(in, NULL);
222  if (x == NULL) {
224  goto err;
225  }
226  i = X509_STORE_add_crl(ctx->store_ctx, x);
227  if (!i)
228  goto err;
229  ret = i;
230  } else {
232  goto err;
233  }
234  err:
235  if (x != NULL)
236  X509_CRL_free(x);
237  if (in != NULL)
238  BIO_free(in);
239  return (ret);
240 }
241 
243 {
245  X509_INFO *itmp;
246  BIO *in;
247  size_t i;
248  int count = 0;
249  if (type != X509_FILETYPE_PEM)
250  return X509_load_cert_file(ctx, file, type);
251  in = BIO_new_file(file, "r");
252  if (!in) {
254  return 0;
255  }
256  inf = PEM_X509_INFO_read_bio(in, NULL, NULL, NULL);
257  BIO_free(in);
258  if (!inf) {
260  return 0;
261  }
262  for (i = 0; i < sk_X509_INFO_num(inf); i++) {
263  itmp = sk_X509_INFO_value(inf, i);
264  if (itmp->x509) {
265  X509_STORE_add_cert(ctx->store_ctx, itmp->x509);
266  count++;
267  }
268  if (itmp->crl) {
269  X509_STORE_add_crl(ctx->store_ctx, itmp->crl);
270  count++;
271  }
272  }
273  sk_X509_INFO_pop_free(inf, X509_INFO_free);
274  return count;
275 }
276 
277 #endif /* OPENSSL_NO_STDIO */
X509_info_st::x509
X509 * x509
Definition: x509.h:288
test_server.argp
argp
Definition: test_server.py:33
PEM_read_bio_X509_AUX
#define PEM_read_bio_X509_AUX
Definition: boringssl_prefix_symbols.h:1956
ctx
Definition: benchmark-async.c:30
X509_FILETYPE_ASN1
#define X509_FILETYPE_ASN1
Definition: x509.h:99
file
const grpc_generator::File * file
Definition: python_private_generator.h:38
bio_st
Definition: bio.h:822
ERR_R_SYS_LIB
#define ERR_R_SYS_LIB
Definition: err.h:330
OPENSSL_PUT_ERROR
#define OPENSSL_PUT_ERROR(library, reason)
Definition: err.h:423
error
grpc_error_handle error
Definition: retry_filter.cc:499
x509_file_lookup
static X509_LOOKUP_METHOD x509_file_lookup
Definition: by_file.c:70
error_ref_leak.err
err
Definition: error_ref_leak.py:35
file
Definition: bloaty/third_party/zlib/examples/gzappend.c:170
pem.h
PEM_R_NO_START_LINE
#define PEM_R_NO_START_LINE
Definition: pem.h:477
X509_get_default_cert_file_env
#define X509_get_default_cert_file_env
Definition: boringssl_prefix_symbols.h:2652
X509_FILETYPE_PEM
#define X509_FILETYPE_PEM
Definition: x509.h:98
d2i_X509_bio
#define d2i_X509_bio
Definition: boringssl_prefix_symbols.h:3054
X509_free
#define X509_free
Definition: boringssl_prefix_symbols.h:2632
uint32_t
unsigned int uint32_t
Definition: stdint-msvc2008.h:80
X509_load_cert_file
int X509_load_cert_file(X509_LOOKUP *ctx, const char *file, int type)
Definition: by_file.c:122
in
const char * in
Definition: third_party/abseil-cpp/absl/strings/internal/str_format/parser_test.cc:391
X509_get_default_cert_file
#define X509_get_default_cert_file
Definition: boringssl_prefix_symbols.h:2651
ERR_GET_REASON
#define ERR_GET_REASON(packed_error)
Definition: err.h:171
STACK_OF
#define STACK_OF(type)
Definition: stack.h:125
X509_R_LOADING_DEFAULTS
#define X509_R_LOADING_DEFAULTS
Definition: x509.h:2395
X509_CRL_free
#define X509_CRL_free
Definition: boringssl_prefix_symbols.h:2294
PEM_X509_INFO_read_bio
#define PEM_X509_INFO_read_bio
Definition: boringssl_prefix_symbols.h:1913
X509_STORE_add_cert
#define X509_STORE_add_cert
Definition: boringssl_prefix_symbols.h:2524
X509_R_BAD_X509_FILETYPE
#define X509_R_BAD_X509_FILETYPE
Definition: x509.h:2379
X509_crl_st
Definition: third_party/boringssl-with-bazel/src/crypto/x509/internal.h:195
ERR_GET_LIB
#define ERR_GET_LIB(packed_error)
Definition: err.h:166
by_file_ctrl
static int by_file_ctrl(X509_LOOKUP *ctx, int cmd, const char *argc, long argl, char **ret)
Definition: by_file.c:88
regen-readme.cmd
cmd
Definition: regen-readme.py:21
err.h
X509_L_FILE_LOAD
#define X509_L_FILE_LOAD
Definition: x509.h:1909
x
int x
Definition: bloaty/third_party/googletest/googlemock/test/gmock-matchers_test.cc:3610
x509_lookup_method_st
Definition: third_party/boringssl-with-bazel/src/crypto/x509/internal.h:249
BIO_new_file
#define BIO_new_file
Definition: boringssl_prefix_symbols.h:818
internal.h
BIO_new
#define BIO_new
Definition: boringssl_prefix_symbols.h:814
ERR_peek_last_error
#define ERR_peek_last_error
Definition: boringssl_prefix_symbols.h:1431
inf
const char inf[]
Definition: bloaty/third_party/protobuf/php/ext/google/protobuf/upb.c:12099
ERR_R_ASN1_LIB
#define ERR_R_ASN1_LIB
Definition: err.h:340
X509_load_crl_file
int X509_load_crl_file(X509_LOOKUP *ctx, const char *file, int type)
Definition: by_file.c:182
BIO_free
#define BIO_free
Definition: boringssl_prefix_symbols.h:787
X509_info_st
Definition: x509.h:287
PEM_read_bio_X509_CRL
#define PEM_read_bio_X509_CRL
Definition: boringssl_prefix_symbols.h:1957
BIO_read_filename
#define BIO_read_filename
Definition: boringssl_prefix_symbols.h:833
X509_FILETYPE_DEFAULT
#define X509_FILETYPE_DEFAULT
Definition: x509.h:100
x509_st
Definition: third_party/boringssl-with-bazel/src/crypto/x509/internal.h:139
X509_STORE_add_crl
#define X509_STORE_add_crl
Definition: boringssl_prefix_symbols.h:2525
x509_lookup_st
Definition: third_party/boringssl-with-bazel/src/crypto/x509/internal.h:300
count
int * count
Definition: bloaty/third_party/googletest/googlemock/test/gmock_stress_test.cc:96
X509_LOOKUP_file
X509_LOOKUP_METHOD * X509_LOOKUP_file(void)
Definition: by_file.c:83
ret
UniquePtr< SSL_SESSION > ret
Definition: ssl_x509.cc:1029
ERR_LIB_PEM
@ ERR_LIB_PEM
Definition: err.h:300
ok
bool ok
Definition: async_end2end_test.cc:197
ERR_clear_error
#define ERR_clear_error
Definition: boringssl_prefix_symbols.h:1413
X509_info_st::crl
X509_CRL * crl
Definition: x509.h:289
X509_INFO_free
#define X509_INFO_free
Definition: boringssl_prefix_symbols.h:2345
BIO_s_file
#define BIO_s_file
Definition: boringssl_prefix_symbols.h:838
asyncio_get_stats.type
type
Definition: asyncio_get_stats.py:37
X509_load_cert_crl_file
int X509_load_cert_crl_file(X509_LOOKUP *ctx, const char *file, int type)
Definition: by_file.c:242
thread.h
ERR_R_PEM_LIB
#define ERR_R_PEM_LIB
Definition: err.h:337
getenv
#define getenv(ptr)
Definition: ares_private.h:106
d2i_X509_CRL_bio
#define d2i_X509_CRL_bio
Definition: boringssl_prefix_symbols.h:3040
i
uint64_t i
Definition: abseil-cpp/absl/container/btree_benchmark.cc:230


grpc
Author(s):
autogenerated on Fri May 16 2025 02:57:51