v3_prn.c
Go to the documentation of this file.
1 /* v3_prn.c */
2 /*
3  * Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL project
4  * 1999.
5  */
6 /* ====================================================================
7  * Copyright (c) 1999 The OpenSSL Project. All rights reserved.
8  *
9  * Redistribution and use in source and binary forms, with or without
10  * modification, are permitted provided that the following conditions
11  * are met:
12  *
13  * 1. Redistributions of source code must retain the above copyright
14  * notice, this list of conditions and the following disclaimer.
15  *
16  * 2. Redistributions in binary form must reproduce the above copyright
17  * notice, this list of conditions and the following disclaimer in
18  * the documentation and/or other materials provided with the
19  * distribution.
20  *
21  * 3. All advertising materials mentioning features or use of this
22  * software must display the following acknowledgment:
23  * "This product includes software developed by the OpenSSL Project
24  * for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)"
25  *
26  * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
27  * endorse or promote products derived from this software without
28  * prior written permission. For written permission, please contact
29  * licensing@OpenSSL.org.
30  *
31  * 5. Products derived from this software may not be called "OpenSSL"
32  * nor may "OpenSSL" appear in their names without prior written
33  * permission of the OpenSSL Project.
34  *
35  * 6. Redistributions of any form whatsoever must retain the following
36  * acknowledgment:
37  * "This product includes software developed by the OpenSSL Project
38  * for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)"
39  *
40  * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
41  * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
42  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
43  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR
44  * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
45  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
46  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
47  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
48  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
49  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
50  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
51  * OF THE POSSIBILITY OF SUCH DAMAGE.
52  * ====================================================================
53  *
54  * This product includes cryptographic software written by Eric Young
55  * (eay@cryptsoft.com). This product includes software written by Tim
56  * Hudson (tjh@cryptsoft.com). */
57 
58 /* X509 v3 extension utilities */
59 
60 #include <stdio.h>
61 
62 #include <openssl/bio.h>
63 #include <openssl/conf.h>
64 #include <openssl/mem.h>
65 #include <openssl/x509v3.h>
66 
67 /* Extension printing routines */
68 
70  unsigned long flag, int indent, int supported);
71 
72 /* Print out a name+value stack */
73 
75  int ml)
76 {
77  size_t i;
78  CONF_VALUE *nval;
79  if (!val)
80  return;
81  if (!ml || !sk_CONF_VALUE_num(val)) {
82  BIO_printf(out, "%*s", indent, "");
83  if (!sk_CONF_VALUE_num(val))
84  BIO_puts(out, "<EMPTY>\n");
85  }
86  for (i = 0; i < sk_CONF_VALUE_num(val); i++) {
87  if (ml)
88  BIO_printf(out, "%*s", indent, "");
89  else if (i > 0)
90  BIO_printf(out, ", ");
91  nval = sk_CONF_VALUE_value(val, i);
92  if (!nval->name)
93  BIO_puts(out, nval->value);
94  else if (!nval->value)
95  BIO_puts(out, nval->name);
96  else
97  BIO_printf(out, "%s:%s", nval->name, nval->value);
98  if (ml)
99  BIO_puts(out, "\n");
100  }
101 }
102 
103 /* Main routine: print out a general extension */
104 
106  int indent)
107 {
108  void *ext_str = NULL;
109  char *value = NULL;
110  const X509V3_EXT_METHOD *method;
111  STACK_OF(CONF_VALUE) *nval = NULL;
112  int ok = 1;
113 
114  if (!(method = X509V3_EXT_get(ext)))
115  return unknown_ext_print(out, ext, flag, indent, 0);
116  const ASN1_STRING *ext_data = X509_EXTENSION_get_data(ext);
117  const unsigned char *p = ASN1_STRING_get0_data(ext_data);
118  if (method->it) {
119  ext_str = ASN1_item_d2i(NULL, &p, ASN1_STRING_length(ext_data),
120  ASN1_ITEM_ptr(method->it));
121  } else {
122  ext_str = method->d2i(NULL, &p, ASN1_STRING_length(ext_data));
123  }
124 
125  if (!ext_str)
126  return unknown_ext_print(out, ext, flag, indent, 1);
127 
128  if (method->i2s) {
129  if (!(value = method->i2s(method, ext_str))) {
130  ok = 0;
131  goto err;
132  }
133  BIO_printf(out, "%*s%s", indent, "", value);
134  } else if (method->i2v) {
135  if (!(nval = method->i2v(method, ext_str, NULL))) {
136  ok = 0;
137  goto err;
138  }
140  method->ext_flags & X509V3_EXT_MULTILINE);
141  } else if (method->i2r) {
142  if (!method->i2r(method, ext_str, out, indent))
143  ok = 0;
144  } else
145  ok = 0;
146 
147  err:
148  sk_CONF_VALUE_pop_free(nval, X509V3_conf_free);
149  if (value)
151  if (method->it)
152  ASN1_item_free(ext_str, ASN1_ITEM_ptr(method->it));
153  else
154  method->ext_free(ext_str);
155  return ok;
156 }
157 
158 int X509V3_extensions_print(BIO *bp, const char *title,
159  const STACK_OF(X509_EXTENSION) *exts,
160  unsigned long flag, int indent)
161 {
162  size_t i;
163  int j;
164 
165  if (sk_X509_EXTENSION_num(exts) <= 0)
166  return 1;
167 
168  if (title) {
169  BIO_printf(bp, "%*s%s:\n", indent, "", title);
170  indent += 4;
171  }
172 
173  for (i = 0; i < sk_X509_EXTENSION_num(exts); i++) {
174  ASN1_OBJECT *obj;
176  ex = sk_X509_EXTENSION_value(exts, i);
177  if (indent && BIO_printf(bp, "%*s", indent, "") <= 0)
178  return 0;
180  i2a_ASN1_OBJECT(bp, obj);
182  if (BIO_printf(bp, ": %s\n", j ? "critical" : "") <= 0)
183  return 0;
184  if (!X509V3_EXT_print(bp, ex, flag, indent + 4)) {
185  BIO_printf(bp, "%*s", indent + 4, "");
187  }
188  if (BIO_write(bp, "\n", 1) <= 0)
189  return 0;
190  }
191  return 1;
192 }
193 
195  unsigned long flag, int indent, int supported)
196 {
197  switch (flag & X509V3_EXT_UNKNOWN_MASK) {
198 
199  case X509V3_EXT_DEFAULT:
200  return 0;
201 
203  if (supported)
204  BIO_printf(out, "%*s<Parse Error>", indent, "");
205  else
206  BIO_printf(out, "%*s<Not Supported>", indent, "");
207  return 1;
208 
214  }
215 
216  default:
217  return 1;
218  }
219 }
220 
222 {
223  BIO *bio_tmp;
224  int ret;
225  if (!(bio_tmp = BIO_new_fp(fp, BIO_NOCLOSE)))
226  return 0;
227  ret = X509V3_EXT_print(bio_tmp, ext, flag, indent);
228  BIO_free(bio_tmp);
229  return ret;
230 }
flag
uint32_t flag
Definition: ssl_versions.cc:162
obj
OPENSSL_EXPORT const ASN1_OBJECT * obj
Definition: x509.h:1671
BIO_new_fp
#define BIO_new_fp
Definition: boringssl_prefix_symbols.h:819
gen_build_yaml.out
dictionary out
Definition: src/benchmark/gen_build_yaml.py:24
bio_st
Definition: bio.h:822
X509V3_EXT_print
int X509V3_EXT_print(BIO *out, X509_EXTENSION *ext, unsigned long flag, int indent)
Definition: v3_prn.c:105
ext
void * ext
Definition: x509v3.h:87
bio.h
error_ref_leak.err
err
Definition: error_ref_leak.py:35
x509v3.h
X509V3_EXT_print_fp
int X509V3_EXT_print_fp(FILE *fp, X509_EXTENSION *ext, int flag, int indent)
Definition: v3_prn.c:221
X509V3_EXT_ERROR_UNKNOWN
#define X509V3_EXT_ERROR_UNKNOWN
Definition: x509v3.h:791
BIO_write
#define BIO_write
Definition: boringssl_prefix_symbols.h:870
xds_manager.p
p
Definition: xds_manager.py:60
python_utils.upload_rbe_results.indent
indent
Definition: upload_rbe_results.py:183
ASN1_ITEM_ptr
#define ASN1_ITEM_ptr(iptr)
Definition: asn1.h:316
BIO_hexdump
#define BIO_hexdump
Definition: boringssl_prefix_symbols.h:800
X509_extension_st
Definition: third_party/boringssl-with-bazel/src/crypto/x509/internal.h:117
ex
OPENSSL_EXPORT X509_EXTENSION * ex
Definition: x509.h:1418
BIO_printf
#define BIO_printf
Definition: boringssl_prefix_symbols.h:827
asn1_object_st
Definition: third_party/boringssl-with-bazel/src/crypto/asn1/internal.h:102
conf_value_st::value
char * value
Definition: conf.h:85
STACK_OF
#define STACK_OF(type)
Definition: stack.h:125
X509_EXTENSION_get_object
#define X509_EXTENSION_get_object
Definition: boringssl_prefix_symbols.h:2339
X509_EXTENSION_get_data
#define X509_EXTENSION_get_data
Definition: boringssl_prefix_symbols.h:2338
X509V3_conf_free
#define X509V3_conf_free
Definition: boringssl_prefix_symbols.h:2238
X509V3_EXT_UNKNOWN_MASK
#define X509V3_EXT_UNKNOWN_MASK
Definition: x509v3.h:784
ASN1_STRING_length
#define ASN1_STRING_length
Definition: boringssl_prefix_symbols.h:683
X509V3_EXT_PARSE_UNKNOWN
#define X509V3_EXT_PARSE_UNKNOWN
Definition: x509v3.h:794
X509V3_EXT_val_prn
void X509V3_EXT_val_prn(BIO *out, STACK_OF(CONF_VALUE) *val, int indent, int ml)
Definition: v3_prn.c:74
unknown_ext_print
static int unknown_ext_print(BIO *out, X509_EXTENSION *ext, unsigned long flag, int indent, int supported)
Definition: v3_prn.c:194
data
char data[kBufferLength]
Definition: abseil-cpp/absl/strings/internal/str_format/float_conversion.cc:1006
conf.h
X509V3_extensions_print
int X509V3_extensions_print(BIO *bp, const char *title, const STACK_OF(X509_EXTENSION) *exts, unsigned long flag, int indent)
Definition: v3_prn.c:158
X509V3_EXT_DUMP_UNKNOWN
#define X509V3_EXT_DUMP_UNKNOWN
Definition: x509v3.h:797
value
const char * value
Definition: hpack_parser_table.cc:165
BIO_free
#define BIO_free
Definition: boringssl_prefix_symbols.h:787
i2a_ASN1_OBJECT
#define i2a_ASN1_OBJECT
Definition: boringssl_prefix_symbols.h:3172
benchmark.FILE
FILE
Definition: benchmark.py:21
X509V3_EXT_DEFAULT
#define X509V3_EXT_DEFAULT
Definition: x509v3.h:788
X509V3_EXT_MULTILINE
#define X509V3_EXT_MULTILINE
Definition: x509v3.h:155
X509V3_EXT_get
#define X509V3_EXT_get
Definition: boringssl_prefix_symbols.h:2222
ret
UniquePtr< SSL_SESSION > ret
Definition: ssl_x509.cc:1029
BIO_puts
#define BIO_puts
Definition: boringssl_prefix_symbols.h:830
ASN1_STRING_get0_data
#define ASN1_STRING_get0_data
Definition: boringssl_prefix_symbols.h:681
ok
bool ok
Definition: async_end2end_test.cc:197
BIO_NOCLOSE
#define BIO_NOCLOSE
Definition: bio.h:373
v3_ext_method
Definition: x509v3.h:102
mem.h
ASN1_item_free
#define ASN1_item_free
Definition: boringssl_prefix_symbols.h:746
X509_EXTENSION_get_critical
#define X509_EXTENSION_get_critical
Definition: boringssl_prefix_symbols.h:2337
ASN1_STRING_print
#define ASN1_STRING_print
Definition: boringssl_prefix_symbols.h:685
method
NSString * method
Definition: ProtoMethod.h:28
OPENSSL_free
#define OPENSSL_free
Definition: boringssl_prefix_symbols.h:1869
ASN1_item_d2i
#define ASN1_item_d2i
Definition: boringssl_prefix_symbols.h:737
asn1_string_st
Definition: asn1.h:543
i
uint64_t i
Definition: abseil-cpp/absl/container/btree_benchmark.cc:230
conf_value_st
Definition: conf.h:82
conf_value_st::name
char * name
Definition: conf.h:84


grpc
Author(s):
autogenerated on Fri May 16 2025 03:00:50