v3_genn.c
Go to the documentation of this file.
1 /* v3_genn.c */
2 /*
3  * Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL project
4  * 1999.
5  */
6 /* ====================================================================
7  * Copyright (c) 1999-2008 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 #include <stdio.h>
59 
60 #include <openssl/asn1t.h>
61 #include <openssl/conf.h>
62 #include <openssl/obj.h>
63 #include <openssl/x509v3.h>
64 
65 
68  /* Maybe have a true ANY DEFINED BY later */
69  ASN1_EXP(OTHERNAME, value, ASN1_ANY, 0)
71 
73 
75  /* DirectoryString is a CHOICE type, so use explicit tagging. */
76  ASN1_EXP_OPT(EDIPARTYNAME, nameAssigner, DIRECTORYSTRING, 0),
77  ASN1_EXP(EDIPARTYNAME, partyName, DIRECTORYSTRING, 1)
79 
81 
86  /* Don't decode this */
88  /* X509_NAME is a CHOICE type so use EXPLICIT */
89  ASN1_EXP(GENERAL_NAME, d.directoryName, X509_NAME, GEN_DIRNAME),
91  ASN1_IMP(GENERAL_NAME, d.uniformResourceIdentifier, ASN1_IA5STRING, GEN_URI),
93  ASN1_IMP(GENERAL_NAME, d.registeredID, ASN1_OBJECT, GEN_RID)
95 
97 
98 ASN1_ITEM_TEMPLATE(GENERAL_NAMES) =
100 ASN1_ITEM_TEMPLATE_END(GENERAL_NAMES)
101 
102 IMPLEMENT_ASN1_FUNCTIONS(GENERAL_NAMES)
103 
105 
106 static int edipartyname_cmp(const EDIPARTYNAME *a, const EDIPARTYNAME *b)
107 {
108  /* nameAssigner is optional and may be NULL. */
109  if (a->nameAssigner == NULL) {
110  if (b->nameAssigner != NULL) {
111  return -1;
112  }
113  } else {
114  if (b->nameAssigner == NULL ||
115  ASN1_STRING_cmp(a->nameAssigner, b->nameAssigner) != 0) {
116  return -1;
117  }
118  }
119 
120  /* partyName may not be NULL. */
121  return ASN1_STRING_cmp(a->partyName, b->partyName);
122 }
123 
124 /* Returns 0 if they are equal, != 0 otherwise. */
125 int GENERAL_NAME_cmp(const GENERAL_NAME *a, const GENERAL_NAME *b)
126 {
127  if (!a || !b || a->type != b->type)
128  return -1;
129 
130  switch (a->type) {
131  case GEN_X400:
132  return ASN1_STRING_cmp(a->d.x400Address, b->d.x400Address);
133 
134  case GEN_EDIPARTY:
135  return edipartyname_cmp(a->d.ediPartyName, b->d.ediPartyName);
136 
137  case GEN_OTHERNAME:
138  return OTHERNAME_cmp(a->d.otherName, b->d.otherName);
139 
140  case GEN_EMAIL:
141  case GEN_DNS:
142  case GEN_URI:
143  return ASN1_STRING_cmp(a->d.ia5, b->d.ia5);
144 
145  case GEN_DIRNAME:
146  return X509_NAME_cmp(a->d.dirn, b->d.dirn);
147 
148  case GEN_IPADD:
149  return ASN1_OCTET_STRING_cmp(a->d.ip, b->d.ip);
150 
151  case GEN_RID:
152  return OBJ_cmp(a->d.rid, b->d.rid);
153  }
154 
155  return -1;
156 }
157 
158 /* Returns 0 if they are equal, != 0 otherwise. */
160 {
161  int result = -1;
162 
163  if (!a || !b)
164  return -1;
165  /* Check their type first. */
166  if ((result = OBJ_cmp(a->type_id, b->type_id)) != 0)
167  return result;
168  /* Check the value. */
169  result = ASN1_TYPE_cmp(a->value, b->value);
170  return result;
171 }
172 
174 {
175  switch (type) {
176  case GEN_X400:
177  a->d.x400Address = value;
178  break;
179 
180  case GEN_EDIPARTY:
181  a->d.ediPartyName = value;
182  break;
183 
184  case GEN_OTHERNAME:
185  a->d.otherName = value;
186  break;
187 
188  case GEN_EMAIL:
189  case GEN_DNS:
190  case GEN_URI:
191  a->d.ia5 = value;
192  break;
193 
194  case GEN_DIRNAME:
195  a->d.dirn = value;
196  break;
197 
198  case GEN_IPADD:
199  a->d.ip = value;
200  break;
201 
202  case GEN_RID:
203  a->d.rid = value;
204  break;
205  }
206  a->type = type;
207 }
208 
209 void *GENERAL_NAME_get0_value(const GENERAL_NAME *a, int *ptype)
210 {
211  if (ptype)
212  *ptype = a->type;
213  switch (a->type) {
214  case GEN_X400:
215  return a->d.x400Address;
216 
217  case GEN_EDIPARTY:
218  return a->d.ediPartyName;
219 
220  case GEN_OTHERNAME:
221  return a->d.otherName;
222 
223  case GEN_EMAIL:
224  case GEN_DNS:
225  case GEN_URI:
226  return a->d.ia5;
227 
228  case GEN_DIRNAME:
229  return a->d.dirn;
230 
231  case GEN_IPADD:
232  return a->d.ip;
233 
234  case GEN_RID:
235  return a->d.rid;
236 
237  default:
238  return NULL;
239  }
240 }
241 
244 {
245  OTHERNAME *oth;
246  oth = OTHERNAME_new();
247  if (!oth)
248  return 0;
249  ASN1_TYPE_free(oth->value);
250  oth->type_id = oid;
251  oth->value = value;
253  return 1;
254 }
255 
257  ASN1_OBJECT **poid, ASN1_TYPE **pvalue)
258 {
259  if (gen->type != GEN_OTHERNAME)
260  return 0;
261  if (poid)
262  *poid = gen->d.otherName->type_id;
263  if (pvalue)
264  *pvalue = gen->d.otherName->value;
265  return 1;
266 }
GENERAL_NAME_set0_othername
OPENSSL_EXPORT int GENERAL_NAME_set0_othername(GENERAL_NAME *gen, ASN1_OBJECT *oid, ASN1_TYPE *value)
_gevent_test_main.result
result
Definition: _gevent_test_main.py:96
ASN1_OCTET_STRING_cmp
#define ASN1_OCTET_STRING_cmp
Definition: boringssl_prefix_symbols.h:658
GENERAL_NAME_st::type
int type
Definition: x509v3.h:184
GEN_IPADD
#define GEN_IPADD
Definition: x509v3.h:181
GENERAL_NAME_st
Definition: x509v3.h:173
GENERAL_NAME_get0_otherName
OPENSSL_EXPORT int GENERAL_NAME_get0_otherName(const GENERAL_NAME *gen, ASN1_OBJECT **poid, ASN1_TYPE **pvalue)
EDIPartyName_st
Definition: x509v3.h:168
ASN1_CHOICE
#define ASN1_CHOICE(tname)
Definition: asn1t.h:198
x509v3.h
GENERAL_NAME_st::otherName
OTHERNAME * otherName
Definition: x509v3.h:187
a
int a
Definition: abseil-cpp/absl/container/internal/hash_policy_traits_test.cc:88
OTHERNAME_new
#define OTHERNAME_new
Definition: boringssl_prefix_symbols.h:1902
X509_NAME_cmp
#define X509_NAME_cmp
Definition: boringssl_prefix_symbols.h:2376
IMPLEMENT_ASN1_FUNCTIONS
#define IMPLEMENT_ASN1_FUNCTIONS(stname)
Definition: asn1t.h:636
asn1_object_st
Definition: third_party/boringssl-with-bazel/src/crypto/asn1/internal.h:102
ASN1_TFLG_SEQUENCE_OF
#define ASN1_TFLG_SEQUENCE_OF
Definition: asn1t.h:393
ASN1_EXP
#define ASN1_EXP(stname, field, type, tag)
Definition: asn1t.h:278
otherName_st::value
ASN1_TYPE * value
Definition: x509v3.h:165
GEN_EMAIL
#define GEN_EMAIL
Definition: x509v3.h:175
GEN_DNS
#define GEN_DNS
Definition: x509v3.h:176
ASN1_ITEM_TEMPLATE
ASN1_ITEM_TEMPLATE(CERTIFICATEPOLICIES)
oid
uint8_t oid[9]
Definition: digest_extra.c:124
ASN1_TYPE_free
OPENSSL_EXPORT void ASN1_TYPE_free(ASN1_TYPE *a)
GENERAL_NAME_set0_value
OPENSSL_EXPORT void GENERAL_NAME_set0_value(GENERAL_NAME *a, int type, void *value)
ASN1_STRING_cmp
#define ASN1_STRING_cmp
Definition: boringssl_prefix_symbols.h:676
otherName_st
Definition: x509v3.h:163
ASN1_SEQUENCE
#define ASN1_SEQUENCE(tname)
Definition: asn1t.h:130
asn1t.h
IMPLEMENT_ASN1_DUP_FUNCTION
#define IMPLEMENT_ASN1_DUP_FUNCTION(stname)
Definition: asn1t.h:696
GENERAL_NAME_get0_value
OPENSSL_EXPORT void * GENERAL_NAME_get0_value(const GENERAL_NAME *a, int *ptype)
gen
OPENSSL_EXPORT GENERAL_NAME * gen
Definition: x509v3.h:495
conf.h
b
uint64_t b
Definition: abseil-cpp/absl/container/internal/layout_test.cc:53
GEN_EDIPARTY
#define GEN_EDIPARTY
Definition: x509v3.h:179
d
static const fe d
Definition: curve25519_tables.h:19
ASN1_IMP
#define ASN1_IMP(stname, field, type, tag)
Definition: asn1t.h:271
OBJ_cmp
#define OBJ_cmp
Definition: boringssl_prefix_symbols.h:1845
ASN1_EX_TEMPLATE_TYPE
#define ASN1_EX_TEMPLATE_TYPE(flags, tag, name, type)
Definition: asn1t.h:235
value
const char * value
Definition: hpack_parser_table.cc:165
ASN1_CHOICE_END
#define ASN1_CHOICE_END(stname)
Definition: asn1t.h:205
GEN_X400
#define GEN_X400
Definition: x509v3.h:177
ASN1_SEQUENCE_END
ASN1_SEQUENCE_END(X509_NAME_ENTRY)
Definition: x_name.c:103
ASN1_TYPE_cmp
#define ASN1_TYPE_cmp
Definition: boringssl_prefix_symbols.h:710
GENERAL_NAME_st::d
union GENERAL_NAME_st::@370 d
otherName_st::type_id
ASN1_OBJECT * type_id
Definition: x509v3.h:164
GEN_OTHERNAME
#define GEN_OTHERNAME
Definition: x509v3.h:174
ASN1_EXP_OPT
#define ASN1_EXP_OPT(stname, field, type, tag)
Definition: asn1t.h:279
GENERAL_NAME_cmp
OPENSSL_EXPORT int GENERAL_NAME_cmp(const GENERAL_NAME *a, const GENERAL_NAME *b)
GEN_URI
#define GEN_URI
Definition: x509v3.h:180
obj.h
asyncio_get_stats.type
type
Definition: asyncio_get_stats.py:37
asn1_type_st
Definition: asn1.h:1481
GEN_RID
#define GEN_RID
Definition: x509v3.h:182
GEN_DIRNAME
#define GEN_DIRNAME
Definition: x509v3.h:178
X509_name_st
Definition: third_party/boringssl-with-bazel/src/crypto/x509/internal.h:95
ASN1_ITEM_TEMPLATE_END
#define ASN1_ITEM_TEMPLATE_END(tname)
Definition: asn1t.h:95
OTHERNAME_cmp
OPENSSL_EXPORT int OTHERNAME_cmp(OTHERNAME *a, OTHERNAME *b)
asn1_string_st
Definition: asn1.h:543
ASN1_SIMPLE
#define ASN1_SIMPLE(stname, field, type)
Definition: asn1t.h:265


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