x509_att.c
Go to the documentation of this file.
1 /* crypto/x509/x509_att.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 <openssl/asn1.h>
59 #include <openssl/err.h>
60 #include <openssl/evp.h>
61 #include <openssl/obj.h>
62 #include <openssl/stack.h>
63 #include <openssl/x509.h>
64 
65 #include "../asn1/internal.h"
66 #include "internal.h"
67 
68 
70 {
71  return sk_X509_ATTRIBUTE_num(x);
72 }
73 
75  int lastpos)
76 {
77  const ASN1_OBJECT *obj = OBJ_nid2obj(nid);
78  if (obj == NULL) {
79  return -1;
80  }
81  return X509at_get_attr_by_OBJ(x, obj, lastpos);
82 }
83 
85  const ASN1_OBJECT *obj, int lastpos)
86 {
87  int n;
89 
90  if (sk == NULL)
91  return (-1);
92  lastpos++;
93  if (lastpos < 0)
94  lastpos = 0;
95  n = sk_X509_ATTRIBUTE_num(sk);
96  for (; lastpos < n; lastpos++) {
97  ex = sk_X509_ATTRIBUTE_value(sk, lastpos);
98  if (OBJ_cmp(ex->object, obj) == 0)
99  return (lastpos);
100  }
101  return (-1);
102 }
103 
105 {
106  if (x == NULL || loc < 0 || sk_X509_ATTRIBUTE_num(x) <= (size_t)loc)
107  return NULL;
108  else
109  return sk_X509_ATTRIBUTE_value(x, loc);
110 }
111 
113 {
115 
116  if (x == NULL || loc < 0 || sk_X509_ATTRIBUTE_num(x) <= (size_t)loc)
117  return (NULL);
118  ret = sk_X509_ATTRIBUTE_delete(x, loc);
119  return (ret);
120 }
121 
124 {
125  X509_ATTRIBUTE *new_attr = NULL;
126  STACK_OF(X509_ATTRIBUTE) *sk = NULL;
127 
128  if (x == NULL) {
130  goto err2;
131  }
132 
133  if (*x == NULL) {
134  if ((sk = sk_X509_ATTRIBUTE_new_null()) == NULL)
135  goto err;
136  } else
137  sk = *x;
138 
139  if ((new_attr = X509_ATTRIBUTE_dup(attr)) == NULL)
140  goto err2;
141  if (!sk_X509_ATTRIBUTE_push(sk, new_attr))
142  goto err;
143  if (*x == NULL)
144  *x = sk;
145  return (sk);
146  err:
148  err2:
149  if (new_attr != NULL)
150  X509_ATTRIBUTE_free(new_attr);
151  if (sk != NULL)
152  sk_X509_ATTRIBUTE_free(sk);
153  return (NULL);
154 }
155 
157  **x, const ASN1_OBJECT *obj,
158  int type,
159  const unsigned char *bytes,
160  int len)
161 {
165  if (!attr)
166  return 0;
169  return ret;
170 }
171 
173  **x, int nid, int type,
174  const unsigned char *bytes,
175  int len)
176 {
180  if (!attr)
181  return 0;
184  return ret;
185 }
186 
188  **x, const char *attrname,
189  int type,
190  const unsigned char *bytes,
191  int len)
192 {
196  if (!attr)
197  return 0;
200  return ret;
201 }
202 
204  int attrtype, const void *data,
205  int len)
206 {
207  const ASN1_OBJECT *obj;
208 
209  obj = OBJ_nid2obj(nid);
210  if (obj == NULL) {
212  return (NULL);
213  }
214  return X509_ATTRIBUTE_create_by_OBJ(attr, obj, attrtype, data, len);
215 }
216 
218  const ASN1_OBJECT *obj,
219  int attrtype, const void *data,
220  int len)
221 {
223 
224  if ((attr == NULL) || (*attr == NULL)) {
225  if ((ret = X509_ATTRIBUTE_new()) == NULL) {
227  return (NULL);
228  }
229  } else
230  ret = *attr;
231 
233  goto err;
234  if (!X509_ATTRIBUTE_set1_data(ret, attrtype, data, len))
235  goto err;
236 
237  if ((attr != NULL) && (*attr == NULL))
238  *attr = ret;
239  return (ret);
240  err:
241  if ((attr == NULL) || (ret != *attr))
243  return (NULL);
244 }
245 
247  const char *attrname, int type,
248  const unsigned char *bytes,
249  int len)
250 {
251  ASN1_OBJECT *obj;
252  X509_ATTRIBUTE *nattr;
253 
254  obj = OBJ_txt2obj(attrname, 0);
255  if (obj == NULL) {
257  ERR_add_error_data(2, "name=", attrname);
258  return (NULL);
259  }
262  return nattr;
263 }
264 
266 {
267  if ((attr == NULL) || (obj == NULL))
268  return (0);
270  attr->object = OBJ_dup(obj);
271  return attr->object != NULL;
272 }
273 
275  const void *data, int len)
276 {
277  ASN1_TYPE *ttmp = NULL;
278  ASN1_STRING *stmp = NULL;
279  int atype = 0;
280  if (!attr)
281  return 0;
282  if (attrtype & MBSTRING_FLAG) {
283  stmp = ASN1_STRING_set_by_NID(NULL, data, len, attrtype,
285  if (!stmp) {
287  return 0;
288  }
289  atype = stmp->type;
290  } else if (len != -1) {
291  if (!(stmp = ASN1_STRING_type_new(attrtype)))
292  goto err;
293  if (!ASN1_STRING_set(stmp, data, len))
294  goto err;
295  atype = attrtype;
296  }
297  /*
298  * This is a bit naughty because the attribute should really have at
299  * least one value but some types use and zero length SET and require
300  * this.
301  */
302  if (attrtype == 0) {
303  ASN1_STRING_free(stmp);
304  return 1;
305  }
306  if (!(ttmp = ASN1_TYPE_new()))
307  goto err;
308  if ((len == -1) && !(attrtype & MBSTRING_FLAG)) {
309  if (!ASN1_TYPE_set1(ttmp, attrtype, data))
310  goto err;
311  } else {
312  ASN1_TYPE_set(ttmp, atype, stmp);
313  stmp = NULL;
314  }
315  if (!sk_ASN1_TYPE_push(attr->set, ttmp))
316  goto err;
317  return 1;
318  err:
320  ASN1_TYPE_free(ttmp);
321  ASN1_STRING_free(stmp);
322  return 0;
323 }
324 
326 {
327  return sk_ASN1_TYPE_num(attr->set);
328 }
329 
331 {
332  if (attr == NULL)
333  return (NULL);
334  return (attr->object);
335 }
336 
338  int attrtype, void *unused)
339 {
340  ASN1_TYPE *ttmp;
342  if (!ttmp)
343  return NULL;
344  if (attrtype != ASN1_TYPE_get(ttmp)) {
346  return NULL;
347  }
348  return (void *)asn1_type_value_as_pointer(ttmp);
349 }
350 
352 {
353  if (attr == NULL)
354  return NULL;
355  if (idx >= X509_ATTRIBUTE_count(attr))
356  return NULL;
357  return sk_ASN1_TYPE_value(attr->set, idx);
358 }
ASN1_TYPE_set
#define ASN1_TYPE_set
Definition: boringssl_prefix_symbols.h:714
X509_ATTRIBUTE_dup
OPENSSL_EXPORT X509_ATTRIBUTE * X509_ATTRIBUTE_dup(X509_ATTRIBUTE *xa)
obj
OPENSSL_EXPORT const ASN1_OBJECT * obj
Definition: x509.h:1671
asn1_type_value_as_pointer
#define asn1_type_value_as_pointer
Definition: boringssl_prefix_symbols.h:2842
X509at_get_attr_by_OBJ
int X509at_get_attr_by_OBJ(const STACK_OF(X509_ATTRIBUTE) *sk, const ASN1_OBJECT *obj, int lastpos)
Definition: x509_att.c:84
X509at_add1_attr_by_txt
#define X509at_add1_attr_by_txt
Definition: boringssl_prefix_symbols.h:2738
evp.h
x509_attributes_st::object
ASN1_OBJECT * object
Definition: third_party/boringssl-with-bazel/src/crypto/x509/internal.h:105
OPENSSL_PUT_ERROR
#define OPENSSL_PUT_ERROR(library, reason)
Definition: err.h:423
X509_ATTRIBUTE_free
#define X509_ATTRIBUTE_free
Definition: boringssl_prefix_symbols.h:2265
ASN1_STRING_type_new
#define ASN1_STRING_type_new
Definition: boringssl_prefix_symbols.h:695
error_ref_leak.err
err
Definition: error_ref_leak.py:35
loc
OPENSSL_EXPORT X509_EXTENSION int loc
Definition: x509.h:1418
ASN1_TYPE_get
#define ASN1_TYPE_get
Definition: boringssl_prefix_symbols.h:712
ASN1_STRING_free
#define ASN1_STRING_free
Definition: boringssl_prefix_symbols.h:680
STACK_OF
STACK_OF(X509_ATTRIBUTE)
Definition: x509_att.c:122
ex
OPENSSL_EXPORT X509_EXTENSION * ex
Definition: x509.h:1418
OBJ_dup
#define OBJ_dup
Definition: boringssl_prefix_symbols.h:1847
X509at_get_attr_by_NID
int X509at_get_attr_by_NID(const STACK_OF(X509_ATTRIBUTE) *x, int nid, int lastpos)
Definition: x509_att.c:74
X509_ATTRIBUTE_create_by_NID
X509_ATTRIBUTE * X509_ATTRIBUTE_create_by_NID(X509_ATTRIBUTE **attr, int nid, int attrtype, const void *data, int len)
Definition: x509_att.c:203
asn1_object_st
Definition: third_party/boringssl-with-bazel/src/crypto/asn1/internal.h:102
X509at_add1_attr_by_NID
#define X509at_add1_attr_by_NID
Definition: boringssl_prefix_symbols.h:2736
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
X509_ATTRIBUTE_create_by_OBJ
X509_ATTRIBUTE * X509_ATTRIBUTE_create_by_OBJ(X509_ATTRIBUTE **attr, const ASN1_OBJECT *obj, int attrtype, const void *data, int len)
Definition: x509_att.c:217
ASN1_STRING_set
#define ASN1_STRING_set
Definition: boringssl_prefix_symbols.h:688
OBJ_obj2nid
#define OBJ_obj2nid
Definition: boringssl_prefix_symbols.h:1857
X509_R_WRONG_TYPE
#define X509_R_WRONG_TYPE
Definition: x509.h:2411
internal.h
attrname
OPENSSL_EXPORT const char * attrname
Definition: x509.h:1683
ERR_R_PASSED_NULL_PARAMETER
#define ERR_R_PASSED_NULL_PARAMETER
Definition: err.h:373
ASN1_TYPE_free
OPENSSL_EXPORT void ASN1_TYPE_free(ASN1_TYPE *a)
X509_ATTRIBUTE_get0_type
ASN1_TYPE * X509_ATTRIBUTE_get0_type(X509_ATTRIBUTE *attr, int idx)
Definition: x509_att.c:351
X509_ATTRIBUTE_create_by_txt
X509_ATTRIBUTE * X509_ATTRIBUTE_create_by_txt(X509_ATTRIBUTE **attr, const char *attrname, int type, const unsigned char *bytes, int len)
Definition: x509_att.c:246
X509_R_INVALID_FIELD_NAME
#define X509_R_INVALID_FIELD_NAME
Definition: x509.h:2388
OBJ_txt2obj
#define OBJ_txt2obj
Definition: boringssl_prefix_symbols.h:1861
ASN1_STRING_set_by_NID
#define ASN1_STRING_set_by_NID
Definition: boringssl_prefix_symbols.h:690
ASN1_TYPE_set1
#define ASN1_TYPE_set1
Definition: boringssl_prefix_symbols.h:715
err.h
X509at_get_attr_count
int X509at_get_attr_count(const STACK_OF(X509_ATTRIBUTE) *x)
Definition: x509_att.c:69
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
X509at_add1_attr_by_OBJ
#define X509at_add1_attr_by_OBJ
Definition: boringssl_prefix_symbols.h:2737
MBSTRING_FLAG
#define MBSTRING_FLAG
Definition: asn1.h:721
x509_attributes_st
Definition: third_party/boringssl-with-bazel/src/crypto/x509/internal.h:104
X509_ATTRIBUTE_new
#define X509_ATTRIBUTE_new
Definition: boringssl_prefix_symbols.h:2270
n
int n
Definition: abseil-cpp/absl/container/btree_test.cc:1080
setup.idx
idx
Definition: third_party/bloaty/third_party/capstone/bindings/python/setup.py:197
nid
int nid
Definition: cipher_extra.c:71
OBJ_cmp
#define OBJ_cmp
Definition: boringssl_prefix_symbols.h:1845
ERR_R_ASN1_LIB
#define ERR_R_ASN1_LIB
Definition: err.h:340
X509_ATTRIBUTE_set1_data
int X509_ATTRIBUTE_set1_data(X509_ATTRIBUTE *attr, int attrtype, const void *data, int len)
Definition: x509_att.c:274
X509at_delete_attr
X509_ATTRIBUTE * X509at_delete_attr(STACK_OF(X509_ATTRIBUTE) *x, int loc)
Definition: x509_att.c:112
attr
OPENSSL_EXPORT X509_ATTRIBUTE * attr
Definition: x509.h:1666
x509_st
Definition: third_party/boringssl-with-bazel/src/crypto/x509/internal.h:139
bytes
uint8 bytes[10]
Definition: bloaty/third_party/protobuf/src/google/protobuf/io/coded_stream_unittest.cc:153
X509_ATTRIBUTE_count
int X509_ATTRIBUTE_count(const X509_ATTRIBUTE *attr)
Definition: x509_att.c:325
ret
UniquePtr< SSL_SESSION > ret
Definition: ssl_x509.cc:1029
X509_ATTRIBUTE_get0_object
ASN1_OBJECT * X509_ATTRIBUTE_get0_object(X509_ATTRIBUTE *attr)
Definition: x509_att.c:330
ERR_add_error_data
#define ERR_add_error_data
Definition: boringssl_prefix_symbols.h:1411
X509_ATTRIBUTE_set1_object
int X509_ATTRIBUTE_set1_object(X509_ATTRIBUTE *attr, const ASN1_OBJECT *obj)
Definition: x509_att.c:265
ASN1_TYPE_new
OPENSSL_EXPORT ASN1_TYPE * ASN1_TYPE_new(void)
asn1_string_st::type
int type
Definition: asn1.h:545
obj.h
asyncio_get_stats.type
type
Definition: asyncio_get_stats.py:37
len
int len
Definition: abseil-cpp/absl/base/internal/low_level_alloc_test.cc:46
asn1_type_st
Definition: asn1.h:1481
X509at_add1_attr
#define X509at_add1_attr
Definition: boringssl_prefix_symbols.h:2735
asn1_string_st
Definition: asn1.h:543
asn1.h
ERR_R_MALLOC_FAILURE
#define ERR_R_MALLOC_FAILURE
Definition: err.h:371
X509at_get_attr
X509_ATTRIBUTE * X509at_get_attr(const STACK_OF(X509_ATTRIBUTE) *x, int loc)
Definition: x509_att.c:104
stack.h
x509.h
X509_ATTRIBUTE_get0_data
void * X509_ATTRIBUTE_get0_data(X509_ATTRIBUTE *attr, int idx, int attrtype, void *unused)
Definition: x509_att.c:337


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