]>
Commit | Line | Data |
---|---|---|
0c9d6818 | 1 | /* |
3c2bdd7d | 2 | * Copyright 2017-2021 The OpenSSL Project Authors. All Rights Reserved. |
0c9d6818 | 3 | * |
4286ca47 | 4 | * Licensed under the Apache License 2.0 (the "License"). You may not use |
0c9d6818 F |
5 | * this file except in compliance with the License. You can obtain a copy |
6 | * in the file LICENSE in the source distribution or at | |
7 | * https://www.openssl.org/source/license.html | |
8 | */ | |
9 | #include <stdio.h> | |
10 | #include "internal/cryptlib.h" | |
11 | #include <openssl/conf.h> | |
50cd4768 | 12 | #include <openssl/types.h> |
0c9d6818 F |
13 | #include <openssl/asn1.h> |
14 | #include <openssl/asn1t.h> | |
15 | ||
16 | #include <openssl/x509v3.h> | |
17 | ||
18 | #include <openssl/safestack.h> | |
19 | ||
20 | #include "v3_admis.h" | |
21 | #include "ext_dat.h" | |
22 | ||
0c9d6818 F |
23 | ASN1_SEQUENCE(NAMING_AUTHORITY) = { |
24 | ASN1_OPT(NAMING_AUTHORITY, namingAuthorityId, ASN1_OBJECT), | |
25 | ASN1_OPT(NAMING_AUTHORITY, namingAuthorityUrl, ASN1_IA5STRING), | |
26 | ASN1_OPT(NAMING_AUTHORITY, namingAuthorityText, DIRECTORYSTRING), | |
27 | } ASN1_SEQUENCE_END(NAMING_AUTHORITY) | |
28 | ||
29 | ASN1_SEQUENCE(PROFESSION_INFO) = { | |
30 | ASN1_EXP_OPT(PROFESSION_INFO, namingAuthority, NAMING_AUTHORITY, 0), | |
31 | ASN1_SEQUENCE_OF(PROFESSION_INFO, professionItems, DIRECTORYSTRING), | |
32 | ASN1_SEQUENCE_OF_OPT(PROFESSION_INFO, professionOIDs, ASN1_OBJECT), | |
33 | ASN1_OPT(PROFESSION_INFO, registrationNumber, ASN1_PRINTABLESTRING), | |
34 | ASN1_OPT(PROFESSION_INFO, addProfessionInfo, ASN1_OCTET_STRING), | |
35 | } ASN1_SEQUENCE_END(PROFESSION_INFO) | |
36 | ||
37 | ASN1_SEQUENCE(ADMISSIONS) = { | |
38 | ASN1_EXP_OPT(ADMISSIONS, admissionAuthority, GENERAL_NAME, 0), | |
39 | ASN1_EXP_OPT(ADMISSIONS, namingAuthority, NAMING_AUTHORITY, 1), | |
40 | ASN1_SEQUENCE_OF(ADMISSIONS, professionInfos, PROFESSION_INFO), | |
41 | } ASN1_SEQUENCE_END(ADMISSIONS) | |
42 | ||
43 | ASN1_SEQUENCE(ADMISSION_SYNTAX) = { | |
44 | ASN1_OPT(ADMISSION_SYNTAX, admissionAuthority, GENERAL_NAME), | |
45 | ASN1_SEQUENCE_OF(ADMISSION_SYNTAX, contentsOfAdmissions, ADMISSIONS), | |
46 | } ASN1_SEQUENCE_END(ADMISSION_SYNTAX) | |
47 | ||
48 | IMPLEMENT_ASN1_FUNCTIONS(NAMING_AUTHORITY) | |
49 | IMPLEMENT_ASN1_FUNCTIONS(PROFESSION_INFO) | |
50 | IMPLEMENT_ASN1_FUNCTIONS(ADMISSIONS) | |
51 | IMPLEMENT_ASN1_FUNCTIONS(ADMISSION_SYNTAX) | |
52 | ||
53 | static int i2r_ADMISSION_SYNTAX(const struct v3_ext_method *method, void *in, | |
54 | BIO *bp, int ind); | |
55 | ||
47864aea | 56 | const X509V3_EXT_METHOD ossl_v3_ext_admission = { |
0c9d6818 F |
57 | NID_x509ExtAdmission, /* .ext_nid = */ |
58 | 0, /* .ext_flags = */ | |
59 | ASN1_ITEM_ref(ADMISSION_SYNTAX), /* .it = */ | |
60 | NULL, NULL, NULL, NULL, | |
61 | NULL, /* .i2s = */ | |
62 | NULL, /* .s2i = */ | |
63 | NULL, /* .i2v = */ | |
64 | NULL, /* .v2i = */ | |
65 | &i2r_ADMISSION_SYNTAX, /* .i2r = */ | |
66 | NULL, /* .r2i = */ | |
67 | NULL /* extension-specific data */ | |
68 | }; | |
69 | ||
70 | ||
71 | static int i2r_NAMING_AUTHORITY(const struct v3_ext_method *method, void *in, | |
72 | BIO *bp, int ind) | |
73 | { | |
74 | NAMING_AUTHORITY * namingAuthority = (NAMING_AUTHORITY*) in; | |
75 | ||
76 | if (namingAuthority == NULL) | |
77 | return 0; | |
78 | ||
79 | if (namingAuthority->namingAuthorityId == NULL | |
80 | && namingAuthority->namingAuthorityText == NULL | |
81 | && namingAuthority->namingAuthorityUrl == NULL) | |
82 | return 0; | |
83 | ||
84 | if (BIO_printf(bp, "%*snamingAuthority: ", ind, "") <= 0) | |
85 | goto err; | |
86 | ||
87 | if (namingAuthority->namingAuthorityId != NULL) { | |
88 | char objbuf[128]; | |
89 | const char *ln = OBJ_nid2ln(OBJ_obj2nid(namingAuthority->namingAuthorityId)); | |
90 | ||
91 | if (BIO_printf(bp, "%*s admissionAuthorityId: ", ind, "") <= 0) | |
92 | goto err; | |
93 | ||
cbe29648 | 94 | OBJ_obj2txt(objbuf, sizeof(objbuf), namingAuthority->namingAuthorityId, 1); |
0c9d6818 F |
95 | |
96 | if (BIO_printf(bp, "%s%s%s%s\n", ln ? ln : "", | |
97 | ln ? " (" : "", objbuf, ln ? ")" : "") <= 0) | |
98 | goto err; | |
99 | } | |
100 | if (namingAuthority->namingAuthorityText != NULL) { | |
101 | if (BIO_printf(bp, "%*s namingAuthorityText: ", ind, "") <= 0 | |
102 | || ASN1_STRING_print(bp, namingAuthority->namingAuthorityText) <= 0 | |
103 | || BIO_printf(bp, "\n") <= 0) | |
104 | goto err; | |
105 | } | |
1287dabd | 106 | if (namingAuthority->namingAuthorityUrl != NULL) { |
0c9d6818 F |
107 | if (BIO_printf(bp, "%*s namingAuthorityUrl: ", ind, "") <= 0 |
108 | || ASN1_STRING_print(bp, namingAuthority->namingAuthorityUrl) <= 0 | |
109 | || BIO_printf(bp, "\n") <= 0) | |
110 | goto err; | |
111 | } | |
112 | return 1; | |
113 | ||
114 | err: | |
115 | return 0; | |
116 | } | |
117 | ||
118 | static int i2r_ADMISSION_SYNTAX(const struct v3_ext_method *method, void *in, | |
119 | BIO *bp, int ind) | |
120 | { | |
121 | ADMISSION_SYNTAX * admission = (ADMISSION_SYNTAX *)in; | |
122 | int i, j, k; | |
123 | ||
124 | if (admission->admissionAuthority != NULL) { | |
125 | if (BIO_printf(bp, "%*sadmissionAuthority:\n", ind, "") <= 0 | |
126 | || BIO_printf(bp, "%*s ", ind, "") <= 0 | |
127 | || GENERAL_NAME_print(bp, admission->admissionAuthority) <= 0 | |
128 | || BIO_printf(bp, "\n") <= 0) | |
129 | goto err; | |
130 | } | |
131 | ||
132 | for (i = 0; i < sk_ADMISSIONS_num(admission->contentsOfAdmissions); i++) { | |
133 | ADMISSIONS* entry = sk_ADMISSIONS_value(admission->contentsOfAdmissions, i); | |
134 | ||
135 | if (BIO_printf(bp, "%*sEntry %0d:\n", ind, "", 1 + i) <= 0) goto err; | |
136 | ||
137 | if (entry->admissionAuthority != NULL) { | |
138 | if (BIO_printf(bp, "%*s admissionAuthority:\n", ind, "") <= 0 | |
139 | || BIO_printf(bp, "%*s ", ind, "") <= 0 | |
140 | || GENERAL_NAME_print(bp, entry->admissionAuthority) <= 0 | |
141 | || BIO_printf(bp, "\n") <= 0) | |
142 | goto err; | |
143 | } | |
144 | ||
145 | if (entry->namingAuthority != NULL) { | |
146 | if (i2r_NAMING_AUTHORITY(method, entry->namingAuthority, bp, ind) <= 0) | |
147 | goto err; | |
148 | } | |
149 | ||
150 | for (j = 0; j < sk_PROFESSION_INFO_num(entry->professionInfos); j++) { | |
151 | PROFESSION_INFO* pinfo = sk_PROFESSION_INFO_value(entry->professionInfos, j); | |
152 | ||
153 | if (BIO_printf(bp, "%*s Profession Info Entry %0d:\n", ind, "", 1 + j) <= 0) | |
154 | goto err; | |
155 | ||
156 | if (pinfo->registrationNumber != NULL) { | |
157 | if (BIO_printf(bp, "%*s registrationNumber: ", ind, "") <= 0 | |
158 | || ASN1_STRING_print(bp, pinfo->registrationNumber) <= 0 | |
159 | || BIO_printf(bp, "\n") <= 0) | |
160 | goto err; | |
161 | } | |
162 | ||
163 | if (pinfo->namingAuthority != NULL) { | |
164 | if (i2r_NAMING_AUTHORITY(method, pinfo->namingAuthority, bp, ind + 2) <= 0) | |
165 | goto err; | |
166 | } | |
167 | ||
168 | if (pinfo->professionItems != NULL) { | |
169 | ||
170 | if (BIO_printf(bp, "%*s Info Entries:\n", ind, "") <= 0) | |
171 | goto err; | |
172 | for (k = 0; k < sk_ASN1_STRING_num(pinfo->professionItems); k++) { | |
173 | ASN1_STRING* val = sk_ASN1_STRING_value(pinfo->professionItems, k); | |
174 | ||
175 | if (BIO_printf(bp, "%*s ", ind, "") <= 0 | |
176 | || ASN1_STRING_print(bp, val) <= 0 | |
177 | || BIO_printf(bp, "\n") <= 0) | |
178 | goto err; | |
179 | } | |
180 | } | |
181 | ||
182 | if (pinfo->professionOIDs != NULL) { | |
183 | if (BIO_printf(bp, "%*s Profession OIDs:\n", ind, "") <= 0) | |
184 | goto err; | |
185 | for (k = 0; k < sk_ASN1_OBJECT_num(pinfo->professionOIDs); k++) { | |
186 | ASN1_OBJECT* obj = sk_ASN1_OBJECT_value(pinfo->professionOIDs, k); | |
187 | const char *ln = OBJ_nid2ln(OBJ_obj2nid(obj)); | |
188 | char objbuf[128]; | |
189 | ||
190 | OBJ_obj2txt(objbuf, sizeof(objbuf), obj, 1); | |
191 | if (BIO_printf(bp, "%*s %s%s%s%s\n", ind, "", | |
192 | ln ? ln : "", ln ? " (" : "", | |
193 | objbuf, ln ? ")" : "") <= 0) | |
194 | goto err; | |
195 | } | |
196 | } | |
197 | } | |
198 | } | |
199 | return 1; | |
200 | ||
201 | err: | |
202 | return -1; | |
203 | } | |
fa743582 RS |
204 | |
205 | const ASN1_OBJECT *NAMING_AUTHORITY_get0_authorityId(const NAMING_AUTHORITY *n) | |
206 | { | |
207 | return n->namingAuthorityId; | |
208 | } | |
209 | ||
210 | void NAMING_AUTHORITY_set0_authorityId(NAMING_AUTHORITY *n, ASN1_OBJECT* id) | |
211 | { | |
212 | ASN1_OBJECT_free(n->namingAuthorityId); | |
213 | n->namingAuthorityId = id; | |
214 | } | |
215 | ||
216 | const ASN1_IA5STRING *NAMING_AUTHORITY_get0_authorityURL( | |
217 | const NAMING_AUTHORITY *n) | |
218 | { | |
219 | return n->namingAuthorityUrl; | |
220 | } | |
221 | ||
222 | void NAMING_AUTHORITY_set0_authorityURL(NAMING_AUTHORITY *n, ASN1_IA5STRING* u) | |
223 | { | |
224 | ASN1_IA5STRING_free(n->namingAuthorityUrl); | |
225 | n->namingAuthorityUrl = u; | |
226 | } | |
227 | ||
228 | const ASN1_STRING *NAMING_AUTHORITY_get0_authorityText( | |
229 | const NAMING_AUTHORITY *n) | |
230 | { | |
231 | return n->namingAuthorityText; | |
232 | } | |
233 | ||
234 | void NAMING_AUTHORITY_set0_authorityText(NAMING_AUTHORITY *n, ASN1_STRING* t) | |
235 | { | |
236 | ASN1_IA5STRING_free(n->namingAuthorityText); | |
237 | n->namingAuthorityText = t; | |
238 | } | |
239 | ||
240 | const GENERAL_NAME *ADMISSION_SYNTAX_get0_admissionAuthority(const ADMISSION_SYNTAX *as) | |
241 | { | |
242 | return as->admissionAuthority; | |
243 | } | |
244 | ||
245 | void ADMISSION_SYNTAX_set0_admissionAuthority(ADMISSION_SYNTAX *as, | |
246 | GENERAL_NAME *aa) | |
247 | { | |
248 | GENERAL_NAME_free(as->admissionAuthority); | |
249 | as->admissionAuthority = aa; | |
250 | } | |
251 | ||
252 | const STACK_OF(ADMISSIONS) *ADMISSION_SYNTAX_get0_contentsOfAdmissions(const ADMISSION_SYNTAX *as) | |
253 | { | |
254 | return as->contentsOfAdmissions; | |
255 | } | |
256 | ||
257 | void ADMISSION_SYNTAX_set0_contentsOfAdmissions(ADMISSION_SYNTAX *as, | |
258 | STACK_OF(ADMISSIONS) *a) | |
259 | { | |
260 | sk_ADMISSIONS_pop_free(as->contentsOfAdmissions, ADMISSIONS_free); | |
261 | as->contentsOfAdmissions = a; | |
262 | } | |
263 | ||
264 | const GENERAL_NAME *ADMISSIONS_get0_admissionAuthority(const ADMISSIONS *a) | |
265 | { | |
266 | return a->admissionAuthority; | |
267 | } | |
268 | ||
269 | void ADMISSIONS_set0_admissionAuthority(ADMISSIONS *a, GENERAL_NAME *aa) | |
270 | { | |
271 | GENERAL_NAME_free(a->admissionAuthority); | |
272 | a->admissionAuthority = aa; | |
273 | } | |
274 | ||
275 | const NAMING_AUTHORITY *ADMISSIONS_get0_namingAuthority(const ADMISSIONS *a) | |
276 | { | |
277 | return a->namingAuthority; | |
278 | } | |
279 | ||
280 | void ADMISSIONS_set0_namingAuthority(ADMISSIONS *a, NAMING_AUTHORITY *na) | |
281 | { | |
282 | NAMING_AUTHORITY_free(a->namingAuthority); | |
283 | a->namingAuthority = na; | |
284 | } | |
285 | ||
286 | const PROFESSION_INFOS *ADMISSIONS_get0_professionInfos(const ADMISSIONS *a) | |
287 | { | |
288 | return a->professionInfos; | |
289 | } | |
290 | ||
291 | void ADMISSIONS_set0_professionInfos(ADMISSIONS *a, PROFESSION_INFOS *pi) | |
292 | { | |
293 | sk_PROFESSION_INFO_pop_free(a->professionInfos, PROFESSION_INFO_free); | |
294 | a->professionInfos = pi; | |
295 | } | |
296 | ||
297 | const ASN1_OCTET_STRING *PROFESSION_INFO_get0_addProfessionInfo(const PROFESSION_INFO *pi) | |
298 | { | |
299 | return pi->addProfessionInfo; | |
300 | } | |
301 | ||
302 | void PROFESSION_INFO_set0_addProfessionInfo(PROFESSION_INFO *pi, | |
303 | ASN1_OCTET_STRING *aos) | |
304 | { | |
305 | ASN1_OCTET_STRING_free(pi->addProfessionInfo); | |
306 | pi->addProfessionInfo = aos; | |
307 | } | |
308 | ||
309 | const NAMING_AUTHORITY *PROFESSION_INFO_get0_namingAuthority(const PROFESSION_INFO *pi) | |
310 | { | |
311 | return pi->namingAuthority; | |
312 | } | |
313 | ||
314 | void PROFESSION_INFO_set0_namingAuthority(PROFESSION_INFO *pi, | |
315 | NAMING_AUTHORITY *na) | |
316 | { | |
317 | NAMING_AUTHORITY_free(pi->namingAuthority); | |
318 | pi->namingAuthority = na; | |
319 | } | |
320 | ||
321 | const STACK_OF(ASN1_STRING) *PROFESSION_INFO_get0_professionItems(const PROFESSION_INFO *pi) | |
322 | { | |
323 | return pi->professionItems; | |
324 | } | |
325 | ||
326 | void PROFESSION_INFO_set0_professionItems(PROFESSION_INFO *pi, | |
327 | STACK_OF(ASN1_STRING) *as) | |
328 | { | |
329 | sk_ASN1_STRING_pop_free(pi->professionItems, ASN1_STRING_free); | |
330 | pi->professionItems = as; | |
331 | } | |
332 | ||
333 | const STACK_OF(ASN1_OBJECT) *PROFESSION_INFO_get0_professionOIDs(const PROFESSION_INFO *pi) | |
334 | { | |
335 | return pi->professionOIDs; | |
336 | } | |
337 | ||
338 | void PROFESSION_INFO_set0_professionOIDs(PROFESSION_INFO *pi, | |
339 | STACK_OF(ASN1_OBJECT) *po) | |
340 | { | |
341 | sk_ASN1_OBJECT_pop_free(pi->professionOIDs, ASN1_OBJECT_free); | |
342 | pi->professionOIDs = po; | |
343 | } | |
344 | ||
345 | const ASN1_PRINTABLESTRING *PROFESSION_INFO_get0_registrationNumber(const PROFESSION_INFO *pi) | |
346 | { | |
347 | return pi->registrationNumber; | |
348 | } | |
349 | ||
350 | void PROFESSION_INFO_set0_registrationNumber(PROFESSION_INFO *pi, | |
351 | ASN1_PRINTABLESTRING *rn) | |
352 | { | |
353 | ASN1_PRINTABLESTRING_free(pi->registrationNumber); | |
354 | pi->registrationNumber = rn; | |
355 | } |