x509_v3.c
Go to the documentation of this file.
1 /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
2  * All rights reserved.
3  *
4  * This package is an SSL implementation written
5  * by Eric Young (eay@cryptsoft.com).
6  * The implementation was written so as to conform with Netscapes SSL.
7  *
8  * This library is free for commercial and non-commercial use as long as
9  * the following conditions are aheared to. The following conditions
10  * apply to all code found in this distribution, be it the RC4, RSA,
11  * lhash, DES, etc., code; not just the SSL code. The SSL documentation
12  * included with this distribution is covered by the same copyright terms
13  * except that the holder is Tim Hudson (tjh@cryptsoft.com).
14  *
15  * Copyright remains Eric Young's, and as such any Copyright notices in
16  * the code are not to be removed.
17  * If this package is used in a product, Eric Young should be given attribution
18  * as the author of the parts of the library used.
19  * This can be in the form of a textual message at program startup or
20  * in documentation (online or textual) provided with the package.
21  *
22  * Redistribution and use in source and binary forms, with or without
23  * modification, are permitted provided that the following conditions
24  * are met:
25  * 1. Redistributions of source code must retain the copyright
26  * notice, this list of conditions and the following disclaimer.
27  * 2. Redistributions in binary form must reproduce the above copyright
28  * notice, this list of conditions and the following disclaimer in the
29  * documentation and/or other materials provided with the distribution.
30  * 3. All advertising materials mentioning features or use of this software
31  * must display the following acknowledgement:
32  * "This product includes cryptographic software written by
33  * Eric Young (eay@cryptsoft.com)"
34  * The word 'cryptographic' can be left out if the rouines from the library
35  * being used are not cryptographic related :-).
36  * 4. If you include any Windows specific code (or a derivative thereof) from
37  * the apps directory (application code) you must include an acknowledgement:
38  * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
39  *
40  * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
41  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
42  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
43  * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
44  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
45  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
46  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
47  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
48  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
49  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
50  * SUCH DAMAGE.
51  *
52  * The licence and distribution terms for any publically available version or
53  * derivative of this code cannot be changed. i.e. this code cannot simply be
54  * copied and put under another distribution licence
55  * [including the GNU Public Licence.] */
56 
57 #include <openssl/asn1.h>
58 #include <openssl/err.h>
59 #include <openssl/evp.h>
60 #include <openssl/obj.h>
61 #include <openssl/stack.h>
62 #include <openssl/x509.h>
63 #include <openssl/x509v3.h>
64 
65 #include "internal.h"
66 
67 
69 {
70  if (x == NULL)
71  return (0);
72  return (sk_X509_EXTENSION_num(x));
73 }
74 
76  int lastpos)
77 {
78  const ASN1_OBJECT *obj = OBJ_nid2obj(nid);
79  if (obj == NULL) {
80  return -1;
81  }
82  return X509v3_get_ext_by_OBJ(x, obj, lastpos);
83 }
84 
86  const ASN1_OBJECT *obj, int lastpos)
87 {
88  int n;
90 
91  if (sk == NULL)
92  return (-1);
93  lastpos++;
94  if (lastpos < 0)
95  lastpos = 0;
96  n = sk_X509_EXTENSION_num(sk);
97  for (; lastpos < n; lastpos++) {
98  ex = sk_X509_EXTENSION_value(sk, lastpos);
99  if (OBJ_cmp(ex->object, obj) == 0)
100  return (lastpos);
101  }
102  return (-1);
103 }
104 
106  int lastpos)
107 {
108  if (sk == NULL) {
109  return -1;
110  }
111 
112  lastpos++;
113  if (lastpos < 0) {
114  lastpos = 0;
115  }
116 
117  crit = !!crit;
118  int n = sk_X509_EXTENSION_num(sk);
119  for (; lastpos < n; lastpos++) {
120  const X509_EXTENSION *ex = sk_X509_EXTENSION_value(sk, lastpos);
121  if (X509_EXTENSION_get_critical(ex) == crit) {
122  return lastpos;
123  }
124  }
125  return -1;
126 }
127 
129 {
130  if (x == NULL || loc < 0 || sk_X509_EXTENSION_num(x) <= (size_t)loc)
131  return NULL;
132  else
133  return sk_X509_EXTENSION_value(x, loc);
134 }
135 
137 {
139 
140  if (x == NULL || loc < 0 || sk_X509_EXTENSION_num(x) <= (size_t)loc)
141  return (NULL);
142  ret = sk_X509_EXTENSION_delete(x, loc);
143  return (ret);
144 }
145 
147  X509_EXTENSION *ex, int loc)
148 {
149  X509_EXTENSION *new_ex = NULL;
150  int n;
151  STACK_OF(X509_EXTENSION) *sk = NULL;
152 
153  if (x == NULL) {
155  goto err2;
156  }
157 
158  if (*x == NULL) {
159  if ((sk = sk_X509_EXTENSION_new_null()) == NULL)
160  goto err;
161  } else
162  sk = *x;
163 
164  n = sk_X509_EXTENSION_num(sk);
165  if (loc > n)
166  loc = n;
167  else if (loc < 0)
168  loc = n;
169 
170  if ((new_ex = X509_EXTENSION_dup(ex)) == NULL)
171  goto err2;
172  if (!sk_X509_EXTENSION_insert(sk, new_ex, loc))
173  goto err;
174  if (*x == NULL)
175  *x = sk;
176  return (sk);
177  err:
179  err2:
180  X509_EXTENSION_free(new_ex);
181  sk_X509_EXTENSION_free(sk);
182  return NULL;
183 }
184 
186  int crit,
187  const ASN1_OCTET_STRING *data)
188 {
189  const ASN1_OBJECT *obj;
191 
192  obj = OBJ_nid2obj(nid);
193  if (obj == NULL) {
195  return (NULL);
196  }
198  return (ret);
199 }
200 
202  const ASN1_OBJECT *obj, int crit,
203  const ASN1_OCTET_STRING *data)
204 {
206 
207  if ((ex == NULL) || (*ex == NULL)) {
208  if ((ret = X509_EXTENSION_new()) == NULL) {
210  return (NULL);
211  }
212  } else
213  ret = *ex;
214 
216  goto err;
217  if (!X509_EXTENSION_set_critical(ret, crit))
218  goto err;
220  goto err;
221 
222  if ((ex != NULL) && (*ex == NULL))
223  *ex = ret;
224  return (ret);
225  err:
226  if ((ex == NULL) || (ret != *ex))
228  return (NULL);
229 }
230 
232 {
233  if ((ex == NULL) || (obj == NULL))
234  return (0);
236  ex->object = OBJ_dup(obj);
237  return ex->object != NULL;
238 }
239 
241 {
242  if (ex == NULL)
243  return (0);
244  ex->critical = (crit) ? 0xFF : -1;
245  return (1);
246 }
247 
249 {
250  int i;
251 
252  if (ex == NULL)
253  return (0);
254  i = ASN1_OCTET_STRING_set(ex->value, data->data, data->length);
255  if (!i)
256  return (0);
257  return (1);
258 }
259 
261 {
262  if (ex == NULL)
263  return (NULL);
264  return (ex->object);
265 }
266 
268 {
269  if (ex == NULL)
270  return (NULL);
271  return (ex->value);
272 }
273 
275 {
276  if (ex == NULL)
277  return (0);
278  if (ex->critical > 0)
279  return 1;
280  return 0;
281 }
obj
OPENSSL_EXPORT const ASN1_OBJECT * obj
Definition: x509.h:1671
evp.h
OPENSSL_PUT_ERROR
#define OPENSSL_PUT_ERROR(library, reason)
Definition: err.h:423
X509v3_get_ext_by_NID
int X509v3_get_ext_by_NID(const STACK_OF(X509_EXTENSION) *x, int nid, int lastpos)
Definition: x509_v3.c:75
error_ref_leak.err
err
Definition: error_ref_leak.py:35
loc
OPENSSL_EXPORT X509_EXTENSION int loc
Definition: x509.h:1418
x509v3.h
X509_EXTENSION_set_data
int X509_EXTENSION_set_data(X509_EXTENSION *ex, const ASN1_OCTET_STRING *data)
Definition: x509_v3.c:248
STACK_OF
STACK_OF(X509_EXTENSION)
Definition: x509_v3.c:146
X509_extension_st
Definition: third_party/boringssl-with-bazel/src/crypto/x509/internal.h:117
ASN1_OCTET_STRING_set
#define ASN1_OCTET_STRING_set
Definition: boringssl_prefix_symbols.h:663
ex
OPENSSL_EXPORT X509_EXTENSION * ex
Definition: x509.h:1418
X509_EXTENSION_set_critical
int X509_EXTENSION_set_critical(X509_EXTENSION *ex, int crit)
Definition: x509_v3.c:240
OBJ_dup
#define OBJ_dup
Definition: boringssl_prefix_symbols.h:1847
asn1_object_st
Definition: third_party/boringssl-with-bazel/src/crypto/asn1/internal.h:102
X509v3_delete_ext
X509_EXTENSION * X509v3_delete_ext(STACK_OF(X509_EXTENSION) *x, int loc)
Definition: x509_v3.c:136
OBJ_nid2obj
#define OBJ_nid2obj
Definition: boringssl_prefix_symbols.h:1855
X509_R_UNKNOWN_NID
#define X509_R_UNKNOWN_NID
Definition: x509.h:2406
X509_extension_st::object
ASN1_OBJECT * object
Definition: third_party/boringssl-with-bazel/src/crypto/x509/internal.h:118
X509v3_get_ext_by_OBJ
int X509v3_get_ext_by_OBJ(const STACK_OF(X509_EXTENSION) *sk, const ASN1_OBJECT *obj, int lastpos)
Definition: x509_v3.c:85
ERR_R_PASSED_NULL_PARAMETER
#define ERR_R_PASSED_NULL_PARAMETER
Definition: err.h:373
X509_EXTENSION_create_by_OBJ
X509_EXTENSION * X509_EXTENSION_create_by_OBJ(X509_EXTENSION **ex, const ASN1_OBJECT *obj, int crit, const ASN1_OCTET_STRING *data)
Definition: x509_v3.c:201
X509_EXTENSION_create_by_NID
X509_EXTENSION * X509_EXTENSION_create_by_NID(X509_EXTENSION **ex, int nid, int crit, const ASN1_OCTET_STRING *data)
Definition: x509_v3.c:185
X509_EXTENSION_get_critical
int X509_EXTENSION_get_critical(const X509_EXTENSION *ex)
Definition: x509_v3.c:274
X509_extension_st::critical
ASN1_BOOLEAN critical
Definition: third_party/boringssl-with-bazel/src/crypto/x509/internal.h:119
err.h
X509_EXTENSION_new
#define X509_EXTENSION_new
Definition: boringssl_prefix_symbols.h:2341
ASN1_OBJECT_free
#define ASN1_OBJECT_free
Definition: boringssl_prefix_symbols.h:655
x
int x
Definition: bloaty/third_party/googletest/googlemock/test/gmock-matchers_test.cc:3610
data
char data[kBufferLength]
Definition: abseil-cpp/absl/strings/internal/str_format/float_conversion.cc:1006
internal.h
X509_EXTENSION_free
#define X509_EXTENSION_free
Definition: boringssl_prefix_symbols.h:2336
X509_EXTENSION_get_object
ASN1_OBJECT * X509_EXTENSION_get_object(X509_EXTENSION *ex)
Definition: x509_v3.c:260
n
int n
Definition: abseil-cpp/absl/container/btree_test.cc:1080
nid
int nid
Definition: cipher_extra.c:71
OBJ_cmp
#define OBJ_cmp
Definition: boringssl_prefix_symbols.h:1845
X509_EXTENSION_dup
OPENSSL_EXPORT X509_EXTENSION * X509_EXTENSION_dup(X509_EXTENSION *ex)
x509_st
Definition: third_party/boringssl-with-bazel/src/crypto/x509/internal.h:139
ret
UniquePtr< SSL_SESSION > ret
Definition: ssl_x509.cc:1029
X509_EXTENSION_set_object
int X509_EXTENSION_set_object(X509_EXTENSION *ex, const ASN1_OBJECT *obj)
Definition: x509_v3.c:231
obj.h
X509v3_get_ext_by_critical
int X509v3_get_ext_by_critical(const STACK_OF(X509_EXTENSION) *sk, int crit, int lastpos)
Definition: x509_v3.c:105
X509v3_get_ext
X509_EXTENSION * X509v3_get_ext(const STACK_OF(X509_EXTENSION) *x, int loc)
Definition: x509_v3.c:128
X509_EXTENSION_get_data
ASN1_OCTET_STRING * X509_EXTENSION_get_data(X509_EXTENSION *ex)
Definition: x509_v3.c:267
X509v3_add_ext
#define X509v3_add_ext
Definition: boringssl_prefix_symbols.h:2744
X509_extension_st::value
ASN1_OCTET_STRING * value
Definition: third_party/boringssl-with-bazel/src/crypto/x509/internal.h:120
X509v3_get_ext_count
int X509v3_get_ext_count(const STACK_OF(X509_EXTENSION) *x)
Definition: x509_v3.c:68
asn1_string_st
Definition: asn1.h:543
i
uint64_t i
Definition: abseil-cpp/absl/container/btree_benchmark.cc:230
asn1.h
ERR_R_MALLOC_FAILURE
#define ERR_R_MALLOC_FAILURE
Definition: err.h:371
stack.h
x509.h


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