/src/libressl/crypto/ocsp/ocsp_asn.c
Line | Count | Source (jump to first uncovered line) |
1 | | /* $OpenBSD: ocsp_asn.c,v 1.10 2022/01/07 09:45:52 tb Exp $ */ |
2 | | /* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL |
3 | | * project 2000. |
4 | | */ |
5 | | /* ==================================================================== |
6 | | * Copyright (c) 2000 The OpenSSL Project. All rights reserved. |
7 | | * |
8 | | * Redistribution and use in source and binary forms, with or without |
9 | | * modification, are permitted provided that the following conditions |
10 | | * are met: |
11 | | * |
12 | | * 1. Redistributions of source code must retain the above copyright |
13 | | * notice, this list of conditions and the following disclaimer. |
14 | | * |
15 | | * 2. Redistributions in binary form must reproduce the above copyright |
16 | | * notice, this list of conditions and the following disclaimer in |
17 | | * the documentation and/or other materials provided with the |
18 | | * distribution. |
19 | | * |
20 | | * 3. All advertising materials mentioning features or use of this |
21 | | * software must display the following acknowledgment: |
22 | | * "This product includes software developed by the OpenSSL Project |
23 | | * for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)" |
24 | | * |
25 | | * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to |
26 | | * endorse or promote products derived from this software without |
27 | | * prior written permission. For written permission, please contact |
28 | | * licensing@OpenSSL.org. |
29 | | * |
30 | | * 5. Products derived from this software may not be called "OpenSSL" |
31 | | * nor may "OpenSSL" appear in their names without prior written |
32 | | * permission of the OpenSSL Project. |
33 | | * |
34 | | * 6. Redistributions of any form whatsoever must retain the following |
35 | | * acknowledgment: |
36 | | * "This product includes software developed by the OpenSSL Project |
37 | | * for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)" |
38 | | * |
39 | | * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY |
40 | | * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
41 | | * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR |
42 | | * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR |
43 | | * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
44 | | * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
45 | | * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; |
46 | | * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) |
47 | | * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, |
48 | | * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) |
49 | | * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED |
50 | | * OF THE POSSIBILITY OF SUCH DAMAGE. |
51 | | * ==================================================================== |
52 | | * |
53 | | * This product includes cryptographic software written by Eric Young |
54 | | * (eay@cryptsoft.com). This product includes software written by Tim |
55 | | * Hudson (tjh@cryptsoft.com). |
56 | | * |
57 | | */ |
58 | | #include <openssl/asn1.h> |
59 | | #include <openssl/asn1t.h> |
60 | | #include <openssl/ocsp.h> |
61 | | |
62 | | #include "ocsp_local.h" |
63 | | |
64 | | static const ASN1_TEMPLATE OCSP_SIGNATURE_seq_tt[] = { |
65 | | { |
66 | | .flags = 0, |
67 | | .tag = 0, |
68 | | .offset = offsetof(OCSP_SIGNATURE, signatureAlgorithm), |
69 | | .field_name = "signatureAlgorithm", |
70 | | .item = &X509_ALGOR_it, |
71 | | }, |
72 | | { |
73 | | .flags = 0, |
74 | | .tag = 0, |
75 | | .offset = offsetof(OCSP_SIGNATURE, signature), |
76 | | .field_name = "signature", |
77 | | .item = &ASN1_BIT_STRING_it, |
78 | | }, |
79 | | { |
80 | | .flags = ASN1_TFLG_EXPLICIT | ASN1_TFLG_SEQUENCE_OF | ASN1_TFLG_OPTIONAL, |
81 | | .tag = 0, |
82 | | .offset = offsetof(OCSP_SIGNATURE, certs), |
83 | | .field_name = "certs", |
84 | | .item = &X509_it, |
85 | | }, |
86 | | }; |
87 | | |
88 | | const ASN1_ITEM OCSP_SIGNATURE_it = { |
89 | | .itype = ASN1_ITYPE_SEQUENCE, |
90 | | .utype = V_ASN1_SEQUENCE, |
91 | | .templates = OCSP_SIGNATURE_seq_tt, |
92 | | .tcount = sizeof(OCSP_SIGNATURE_seq_tt) / sizeof(ASN1_TEMPLATE), |
93 | | .funcs = NULL, |
94 | | .size = sizeof(OCSP_SIGNATURE), |
95 | | .sname = "OCSP_SIGNATURE", |
96 | | }; |
97 | | |
98 | | |
99 | | OCSP_SIGNATURE * |
100 | | d2i_OCSP_SIGNATURE(OCSP_SIGNATURE **a, const unsigned char **in, long len) |
101 | 0 | { |
102 | 0 | return (OCSP_SIGNATURE *)ASN1_item_d2i((ASN1_VALUE **)a, in, len, |
103 | 0 | &OCSP_SIGNATURE_it); |
104 | 0 | } |
105 | | |
106 | | int |
107 | | i2d_OCSP_SIGNATURE(OCSP_SIGNATURE *a, unsigned char **out) |
108 | 0 | { |
109 | 0 | return ASN1_item_i2d((ASN1_VALUE *)a, out, &OCSP_SIGNATURE_it); |
110 | 0 | } |
111 | | |
112 | | OCSP_SIGNATURE * |
113 | | OCSP_SIGNATURE_new(void) |
114 | 0 | { |
115 | 0 | return (OCSP_SIGNATURE *)ASN1_item_new(&OCSP_SIGNATURE_it); |
116 | 0 | } |
117 | | |
118 | | void |
119 | | OCSP_SIGNATURE_free(OCSP_SIGNATURE *a) |
120 | 0 | { |
121 | 0 | ASN1_item_free((ASN1_VALUE *)a, &OCSP_SIGNATURE_it); |
122 | 0 | } |
123 | | |
124 | | static const ASN1_TEMPLATE OCSP_CERTID_seq_tt[] = { |
125 | | { |
126 | | .flags = 0, |
127 | | .tag = 0, |
128 | | .offset = offsetof(OCSP_CERTID, hashAlgorithm), |
129 | | .field_name = "hashAlgorithm", |
130 | | .item = &X509_ALGOR_it, |
131 | | }, |
132 | | { |
133 | | .flags = 0, |
134 | | .tag = 0, |
135 | | .offset = offsetof(OCSP_CERTID, issuerNameHash), |
136 | | .field_name = "issuerNameHash", |
137 | | .item = &ASN1_OCTET_STRING_it, |
138 | | }, |
139 | | { |
140 | | .flags = 0, |
141 | | .tag = 0, |
142 | | .offset = offsetof(OCSP_CERTID, issuerKeyHash), |
143 | | .field_name = "issuerKeyHash", |
144 | | .item = &ASN1_OCTET_STRING_it, |
145 | | }, |
146 | | { |
147 | | .flags = 0, |
148 | | .tag = 0, |
149 | | .offset = offsetof(OCSP_CERTID, serialNumber), |
150 | | .field_name = "serialNumber", |
151 | | .item = &ASN1_INTEGER_it, |
152 | | }, |
153 | | }; |
154 | | |
155 | | const ASN1_ITEM OCSP_CERTID_it = { |
156 | | .itype = ASN1_ITYPE_SEQUENCE, |
157 | | .utype = V_ASN1_SEQUENCE, |
158 | | .templates = OCSP_CERTID_seq_tt, |
159 | | .tcount = sizeof(OCSP_CERTID_seq_tt) / sizeof(ASN1_TEMPLATE), |
160 | | .funcs = NULL, |
161 | | .size = sizeof(OCSP_CERTID), |
162 | | .sname = "OCSP_CERTID", |
163 | | }; |
164 | | |
165 | | |
166 | | OCSP_CERTID * |
167 | | d2i_OCSP_CERTID(OCSP_CERTID **a, const unsigned char **in, long len) |
168 | 0 | { |
169 | 0 | return (OCSP_CERTID *)ASN1_item_d2i((ASN1_VALUE **)a, in, len, |
170 | 0 | &OCSP_CERTID_it); |
171 | 0 | } |
172 | | |
173 | | int |
174 | | i2d_OCSP_CERTID(OCSP_CERTID *a, unsigned char **out) |
175 | 0 | { |
176 | 0 | return ASN1_item_i2d((ASN1_VALUE *)a, out, &OCSP_CERTID_it); |
177 | 0 | } |
178 | | |
179 | | OCSP_CERTID * |
180 | | OCSP_CERTID_new(void) |
181 | 0 | { |
182 | 0 | return (OCSP_CERTID *)ASN1_item_new(&OCSP_CERTID_it); |
183 | 0 | } |
184 | | |
185 | | void |
186 | | OCSP_CERTID_free(OCSP_CERTID *a) |
187 | 0 | { |
188 | 0 | ASN1_item_free((ASN1_VALUE *)a, &OCSP_CERTID_it); |
189 | 0 | } |
190 | | |
191 | | static const ASN1_TEMPLATE OCSP_ONEREQ_seq_tt[] = { |
192 | | { |
193 | | .flags = 0, |
194 | | .tag = 0, |
195 | | .offset = offsetof(OCSP_ONEREQ, reqCert), |
196 | | .field_name = "reqCert", |
197 | | .item = &OCSP_CERTID_it, |
198 | | }, |
199 | | { |
200 | | .flags = ASN1_TFLG_EXPLICIT | ASN1_TFLG_SEQUENCE_OF | ASN1_TFLG_OPTIONAL, |
201 | | .tag = 0, |
202 | | .offset = offsetof(OCSP_ONEREQ, singleRequestExtensions), |
203 | | .field_name = "singleRequestExtensions", |
204 | | .item = &X509_EXTENSION_it, |
205 | | }, |
206 | | }; |
207 | | |
208 | | const ASN1_ITEM OCSP_ONEREQ_it = { |
209 | | .itype = ASN1_ITYPE_SEQUENCE, |
210 | | .utype = V_ASN1_SEQUENCE, |
211 | | .templates = OCSP_ONEREQ_seq_tt, |
212 | | .tcount = sizeof(OCSP_ONEREQ_seq_tt) / sizeof(ASN1_TEMPLATE), |
213 | | .funcs = NULL, |
214 | | .size = sizeof(OCSP_ONEREQ), |
215 | | .sname = "OCSP_ONEREQ", |
216 | | }; |
217 | | |
218 | | |
219 | | OCSP_ONEREQ * |
220 | | d2i_OCSP_ONEREQ(OCSP_ONEREQ **a, const unsigned char **in, long len) |
221 | 0 | { |
222 | 0 | return (OCSP_ONEREQ *)ASN1_item_d2i((ASN1_VALUE **)a, in, len, |
223 | 0 | &OCSP_ONEREQ_it); |
224 | 0 | } |
225 | | |
226 | | int |
227 | | i2d_OCSP_ONEREQ(OCSP_ONEREQ *a, unsigned char **out) |
228 | 0 | { |
229 | 0 | return ASN1_item_i2d((ASN1_VALUE *)a, out, &OCSP_ONEREQ_it); |
230 | 0 | } |
231 | | |
232 | | OCSP_ONEREQ * |
233 | | OCSP_ONEREQ_new(void) |
234 | 0 | { |
235 | 0 | return (OCSP_ONEREQ *)ASN1_item_new(&OCSP_ONEREQ_it); |
236 | 0 | } |
237 | | |
238 | | void |
239 | | OCSP_ONEREQ_free(OCSP_ONEREQ *a) |
240 | 0 | { |
241 | 0 | ASN1_item_free((ASN1_VALUE *)a, &OCSP_ONEREQ_it); |
242 | 0 | } |
243 | | |
244 | | static const ASN1_TEMPLATE OCSP_REQINFO_seq_tt[] = { |
245 | | { |
246 | | .flags = ASN1_TFLG_EXPLICIT | ASN1_TFLG_OPTIONAL, |
247 | | .tag = 0, |
248 | | .offset = offsetof(OCSP_REQINFO, version), |
249 | | .field_name = "version", |
250 | | .item = &ASN1_INTEGER_it, |
251 | | }, |
252 | | { |
253 | | .flags = ASN1_TFLG_EXPLICIT | ASN1_TFLG_OPTIONAL, |
254 | | .tag = 1, |
255 | | .offset = offsetof(OCSP_REQINFO, requestorName), |
256 | | .field_name = "requestorName", |
257 | | .item = &GENERAL_NAME_it, |
258 | | }, |
259 | | { |
260 | | .flags = ASN1_TFLG_SEQUENCE_OF, |
261 | | .tag = 0, |
262 | | .offset = offsetof(OCSP_REQINFO, requestList), |
263 | | .field_name = "requestList", |
264 | | .item = &OCSP_ONEREQ_it, |
265 | | }, |
266 | | { |
267 | | .flags = ASN1_TFLG_EXPLICIT | ASN1_TFLG_SEQUENCE_OF | ASN1_TFLG_OPTIONAL, |
268 | | .tag = 2, |
269 | | .offset = offsetof(OCSP_REQINFO, requestExtensions), |
270 | | .field_name = "requestExtensions", |
271 | | .item = &X509_EXTENSION_it, |
272 | | }, |
273 | | }; |
274 | | |
275 | | const ASN1_ITEM OCSP_REQINFO_it = { |
276 | | .itype = ASN1_ITYPE_SEQUENCE, |
277 | | .utype = V_ASN1_SEQUENCE, |
278 | | .templates = OCSP_REQINFO_seq_tt, |
279 | | .tcount = sizeof(OCSP_REQINFO_seq_tt) / sizeof(ASN1_TEMPLATE), |
280 | | .funcs = NULL, |
281 | | .size = sizeof(OCSP_REQINFO), |
282 | | .sname = "OCSP_REQINFO", |
283 | | }; |
284 | | |
285 | | |
286 | | OCSP_REQINFO * |
287 | | d2i_OCSP_REQINFO(OCSP_REQINFO **a, const unsigned char **in, long len) |
288 | 0 | { |
289 | 0 | return (OCSP_REQINFO *)ASN1_item_d2i((ASN1_VALUE **)a, in, len, |
290 | 0 | &OCSP_REQINFO_it); |
291 | 0 | } |
292 | | |
293 | | int |
294 | | i2d_OCSP_REQINFO(OCSP_REQINFO *a, unsigned char **out) |
295 | 0 | { |
296 | 0 | return ASN1_item_i2d((ASN1_VALUE *)a, out, &OCSP_REQINFO_it); |
297 | 0 | } |
298 | | |
299 | | OCSP_REQINFO * |
300 | | OCSP_REQINFO_new(void) |
301 | 0 | { |
302 | 0 | return (OCSP_REQINFO *)ASN1_item_new(&OCSP_REQINFO_it); |
303 | 0 | } |
304 | | |
305 | | void |
306 | | OCSP_REQINFO_free(OCSP_REQINFO *a) |
307 | 0 | { |
308 | 0 | ASN1_item_free((ASN1_VALUE *)a, &OCSP_REQINFO_it); |
309 | 0 | } |
310 | | |
311 | | static const ASN1_TEMPLATE OCSP_REQUEST_seq_tt[] = { |
312 | | { |
313 | | .flags = 0, |
314 | | .tag = 0, |
315 | | .offset = offsetof(OCSP_REQUEST, tbsRequest), |
316 | | .field_name = "tbsRequest", |
317 | | .item = &OCSP_REQINFO_it, |
318 | | }, |
319 | | { |
320 | | .flags = ASN1_TFLG_EXPLICIT | ASN1_TFLG_OPTIONAL, |
321 | | .tag = 0, |
322 | | .offset = offsetof(OCSP_REQUEST, optionalSignature), |
323 | | .field_name = "optionalSignature", |
324 | | .item = &OCSP_SIGNATURE_it, |
325 | | }, |
326 | | }; |
327 | | |
328 | | const ASN1_ITEM OCSP_REQUEST_it = { |
329 | | .itype = ASN1_ITYPE_SEQUENCE, |
330 | | .utype = V_ASN1_SEQUENCE, |
331 | | .templates = OCSP_REQUEST_seq_tt, |
332 | | .tcount = sizeof(OCSP_REQUEST_seq_tt) / sizeof(ASN1_TEMPLATE), |
333 | | .funcs = NULL, |
334 | | .size = sizeof(OCSP_REQUEST), |
335 | | .sname = "OCSP_REQUEST", |
336 | | }; |
337 | | |
338 | | OCSP_REQUEST * |
339 | | d2i_OCSP_REQUEST(OCSP_REQUEST **a, const unsigned char **in, long len) |
340 | 0 | { |
341 | 0 | return (OCSP_REQUEST *)ASN1_item_d2i((ASN1_VALUE **)a, in, len, |
342 | 0 | &OCSP_REQUEST_it); |
343 | 0 | } |
344 | | |
345 | | int |
346 | | i2d_OCSP_REQUEST(OCSP_REQUEST *a, unsigned char **out) |
347 | 0 | { |
348 | 0 | return ASN1_item_i2d((ASN1_VALUE *)a, out, &OCSP_REQUEST_it); |
349 | 0 | } |
350 | | |
351 | | OCSP_REQUEST * |
352 | | d2i_OCSP_REQUEST_bio(BIO *bp, OCSP_REQUEST **a) |
353 | 0 | { |
354 | 0 | return ASN1_item_d2i_bio(&OCSP_REQUEST_it, bp, a); |
355 | 0 | } |
356 | | |
357 | | int |
358 | | i2d_OCSP_REQUEST_bio(BIO *bp, OCSP_REQUEST *a) |
359 | 0 | { |
360 | 0 | return ASN1_item_i2d_bio(&OCSP_REQUEST_it, bp, a); |
361 | 0 | } |
362 | | |
363 | | OCSP_REQUEST * |
364 | | OCSP_REQUEST_new(void) |
365 | 0 | { |
366 | 0 | return (OCSP_REQUEST *)ASN1_item_new(&OCSP_REQUEST_it); |
367 | 0 | } |
368 | | |
369 | | void |
370 | | OCSP_REQUEST_free(OCSP_REQUEST *a) |
371 | 0 | { |
372 | 0 | ASN1_item_free((ASN1_VALUE *)a, &OCSP_REQUEST_it); |
373 | 0 | } |
374 | | |
375 | | /* OCSP_RESPONSE templates */ |
376 | | |
377 | | static const ASN1_TEMPLATE OCSP_RESPBYTES_seq_tt[] = { |
378 | | { |
379 | | .flags = 0, |
380 | | .tag = 0, |
381 | | .offset = offsetof(OCSP_RESPBYTES, responseType), |
382 | | .field_name = "responseType", |
383 | | .item = &ASN1_OBJECT_it, |
384 | | }, |
385 | | { |
386 | | .flags = 0, |
387 | | .tag = 0, |
388 | | .offset = offsetof(OCSP_RESPBYTES, response), |
389 | | .field_name = "response", |
390 | | .item = &ASN1_OCTET_STRING_it, |
391 | | }, |
392 | | }; |
393 | | |
394 | | const ASN1_ITEM OCSP_RESPBYTES_it = { |
395 | | .itype = ASN1_ITYPE_SEQUENCE, |
396 | | .utype = V_ASN1_SEQUENCE, |
397 | | .templates = OCSP_RESPBYTES_seq_tt, |
398 | | .tcount = sizeof(OCSP_RESPBYTES_seq_tt) / sizeof(ASN1_TEMPLATE), |
399 | | .funcs = NULL, |
400 | | .size = sizeof(OCSP_RESPBYTES), |
401 | | .sname = "OCSP_RESPBYTES", |
402 | | }; |
403 | | |
404 | | |
405 | | OCSP_RESPBYTES * |
406 | | d2i_OCSP_RESPBYTES(OCSP_RESPBYTES **a, const unsigned char **in, long len) |
407 | 0 | { |
408 | 0 | return (OCSP_RESPBYTES *)ASN1_item_d2i((ASN1_VALUE **)a, in, len, |
409 | 0 | &OCSP_RESPBYTES_it); |
410 | 0 | } |
411 | | |
412 | | int |
413 | | i2d_OCSP_RESPBYTES(OCSP_RESPBYTES *a, unsigned char **out) |
414 | 0 | { |
415 | 0 | return ASN1_item_i2d((ASN1_VALUE *)a, out, &OCSP_RESPBYTES_it); |
416 | 0 | } |
417 | | |
418 | | OCSP_RESPBYTES * |
419 | | OCSP_RESPBYTES_new(void) |
420 | 0 | { |
421 | 0 | return (OCSP_RESPBYTES *)ASN1_item_new(&OCSP_RESPBYTES_it); |
422 | 0 | } |
423 | | |
424 | | void |
425 | | OCSP_RESPBYTES_free(OCSP_RESPBYTES *a) |
426 | 0 | { |
427 | 0 | ASN1_item_free((ASN1_VALUE *)a, &OCSP_RESPBYTES_it); |
428 | 0 | } |
429 | | |
430 | | static const ASN1_TEMPLATE OCSP_RESPONSE_seq_tt[] = { |
431 | | { |
432 | | .flags = 0, |
433 | | .tag = 0, |
434 | | .offset = offsetof(OCSP_RESPONSE, responseStatus), |
435 | | .field_name = "responseStatus", |
436 | | .item = &ASN1_ENUMERATED_it, |
437 | | }, |
438 | | { |
439 | | .flags = ASN1_TFLG_EXPLICIT | ASN1_TFLG_OPTIONAL, |
440 | | .tag = 0, |
441 | | .offset = offsetof(OCSP_RESPONSE, responseBytes), |
442 | | .field_name = "responseBytes", |
443 | | .item = &OCSP_RESPBYTES_it, |
444 | | }, |
445 | | }; |
446 | | |
447 | | const ASN1_ITEM OCSP_RESPONSE_it = { |
448 | | .itype = ASN1_ITYPE_SEQUENCE, |
449 | | .utype = V_ASN1_SEQUENCE, |
450 | | .templates = OCSP_RESPONSE_seq_tt, |
451 | | .tcount = sizeof(OCSP_RESPONSE_seq_tt) / sizeof(ASN1_TEMPLATE), |
452 | | .funcs = NULL, |
453 | | .size = sizeof(OCSP_RESPONSE), |
454 | | .sname = "OCSP_RESPONSE", |
455 | | }; |
456 | | |
457 | | |
458 | | OCSP_RESPONSE * |
459 | | d2i_OCSP_RESPONSE(OCSP_RESPONSE **a, const unsigned char **in, long len) |
460 | 0 | { |
461 | 0 | return (OCSP_RESPONSE *)ASN1_item_d2i((ASN1_VALUE **)a, in, len, |
462 | 0 | &OCSP_RESPONSE_it); |
463 | 0 | } |
464 | | |
465 | | int |
466 | | i2d_OCSP_RESPONSE(OCSP_RESPONSE *a, unsigned char **out) |
467 | 0 | { |
468 | 0 | return ASN1_item_i2d((ASN1_VALUE *)a, out, &OCSP_RESPONSE_it); |
469 | 0 | } |
470 | | |
471 | | OCSP_RESPONSE * |
472 | | d2i_OCSP_RESPONSE_bio(BIO *bp, OCSP_RESPONSE **a) |
473 | 0 | { |
474 | 0 | return ASN1_item_d2i_bio(&OCSP_RESPONSE_it, bp, a); |
475 | 0 | } |
476 | | |
477 | | int |
478 | | i2d_OCSP_RESPONSE_bio(BIO *bp, OCSP_RESPONSE *a) |
479 | 0 | { |
480 | 0 | return ASN1_item_i2d_bio(&OCSP_RESPONSE_it, bp, a); |
481 | 0 | } |
482 | | |
483 | | OCSP_RESPONSE * |
484 | | OCSP_RESPONSE_new(void) |
485 | 0 | { |
486 | 0 | return (OCSP_RESPONSE *)ASN1_item_new(&OCSP_RESPONSE_it); |
487 | 0 | } |
488 | | |
489 | | void |
490 | | OCSP_RESPONSE_free(OCSP_RESPONSE *a) |
491 | 0 | { |
492 | 0 | ASN1_item_free((ASN1_VALUE *)a, &OCSP_RESPONSE_it); |
493 | 0 | } |
494 | | |
495 | | static const ASN1_TEMPLATE OCSP_RESPID_ch_tt[] = { |
496 | | { |
497 | | .flags = ASN1_TFLG_EXPLICIT, |
498 | | .tag = 1, |
499 | | .offset = offsetof(OCSP_RESPID, value.byName), |
500 | | .field_name = "value.byName", |
501 | | .item = &X509_NAME_it, |
502 | | }, |
503 | | { |
504 | | .flags = ASN1_TFLG_EXPLICIT, |
505 | | .tag = 2, |
506 | | .offset = offsetof(OCSP_RESPID, value.byKey), |
507 | | .field_name = "value.byKey", |
508 | | .item = &ASN1_OCTET_STRING_it, |
509 | | }, |
510 | | }; |
511 | | |
512 | | const ASN1_ITEM OCSP_RESPID_it = { |
513 | | .itype = ASN1_ITYPE_CHOICE, |
514 | | .utype = offsetof(OCSP_RESPID, type), |
515 | | .templates = OCSP_RESPID_ch_tt, |
516 | | .tcount = sizeof(OCSP_RESPID_ch_tt) / sizeof(ASN1_TEMPLATE), |
517 | | .funcs = NULL, |
518 | | .size = sizeof(OCSP_RESPID), |
519 | | .sname = "OCSP_RESPID", |
520 | | }; |
521 | | |
522 | | |
523 | | OCSP_RESPID * |
524 | | d2i_OCSP_RESPID(OCSP_RESPID **a, const unsigned char **in, long len) |
525 | 575 | { |
526 | 575 | return (OCSP_RESPID *)ASN1_item_d2i((ASN1_VALUE **)a, in, len, |
527 | 575 | &OCSP_RESPID_it); |
528 | 575 | } |
529 | | |
530 | | int |
531 | | i2d_OCSP_RESPID(OCSP_RESPID *a, unsigned char **out) |
532 | 0 | { |
533 | 0 | return ASN1_item_i2d((ASN1_VALUE *)a, out, &OCSP_RESPID_it); |
534 | 0 | } |
535 | | |
536 | | OCSP_RESPID * |
537 | | OCSP_RESPID_new(void) |
538 | 0 | { |
539 | 0 | return (OCSP_RESPID *)ASN1_item_new(&OCSP_RESPID_it); |
540 | 0 | } |
541 | | |
542 | | void |
543 | | OCSP_RESPID_free(OCSP_RESPID *a) |
544 | 38 | { |
545 | 38 | ASN1_item_free((ASN1_VALUE *)a, &OCSP_RESPID_it); |
546 | 38 | } |
547 | | |
548 | | static const ASN1_TEMPLATE OCSP_REVOKEDINFO_seq_tt[] = { |
549 | | { |
550 | | .flags = 0, |
551 | | .tag = 0, |
552 | | .offset = offsetof(OCSP_REVOKEDINFO, revocationTime), |
553 | | .field_name = "revocationTime", |
554 | | .item = &ASN1_GENERALIZEDTIME_it, |
555 | | }, |
556 | | { |
557 | | .flags = ASN1_TFLG_EXPLICIT | ASN1_TFLG_OPTIONAL, |
558 | | .tag = 0, |
559 | | .offset = offsetof(OCSP_REVOKEDINFO, revocationReason), |
560 | | .field_name = "revocationReason", |
561 | | .item = &ASN1_ENUMERATED_it, |
562 | | }, |
563 | | }; |
564 | | |
565 | | const ASN1_ITEM OCSP_REVOKEDINFO_it = { |
566 | | .itype = ASN1_ITYPE_SEQUENCE, |
567 | | .utype = V_ASN1_SEQUENCE, |
568 | | .templates = OCSP_REVOKEDINFO_seq_tt, |
569 | | .tcount = sizeof(OCSP_REVOKEDINFO_seq_tt) / sizeof(ASN1_TEMPLATE), |
570 | | .funcs = NULL, |
571 | | .size = sizeof(OCSP_REVOKEDINFO), |
572 | | .sname = "OCSP_REVOKEDINFO", |
573 | | }; |
574 | | |
575 | | |
576 | | OCSP_REVOKEDINFO * |
577 | | d2i_OCSP_REVOKEDINFO(OCSP_REVOKEDINFO **a, const unsigned char **in, long len) |
578 | 0 | { |
579 | 0 | return (OCSP_REVOKEDINFO *)ASN1_item_d2i((ASN1_VALUE **)a, in, len, |
580 | 0 | &OCSP_REVOKEDINFO_it); |
581 | 0 | } |
582 | | |
583 | | int |
584 | | i2d_OCSP_REVOKEDINFO(OCSP_REVOKEDINFO *a, unsigned char **out) |
585 | 0 | { |
586 | 0 | return ASN1_item_i2d((ASN1_VALUE *)a, out, &OCSP_REVOKEDINFO_it); |
587 | 0 | } |
588 | | |
589 | | OCSP_REVOKEDINFO * |
590 | | OCSP_REVOKEDINFO_new(void) |
591 | 0 | { |
592 | 0 | return (OCSP_REVOKEDINFO *)ASN1_item_new(&OCSP_REVOKEDINFO_it); |
593 | 0 | } |
594 | | |
595 | | void |
596 | | OCSP_REVOKEDINFO_free(OCSP_REVOKEDINFO *a) |
597 | 0 | { |
598 | 0 | ASN1_item_free((ASN1_VALUE *)a, &OCSP_REVOKEDINFO_it); |
599 | 0 | } |
600 | | |
601 | | static const ASN1_TEMPLATE OCSP_CERTSTATUS_ch_tt[] = { |
602 | | { |
603 | | .flags = ASN1_TFLG_IMPLICIT, |
604 | | .tag = 0, |
605 | | .offset = offsetof(OCSP_CERTSTATUS, value.good), |
606 | | .field_name = "value.good", |
607 | | .item = &ASN1_NULL_it, |
608 | | }, |
609 | | { |
610 | | .flags = ASN1_TFLG_IMPLICIT, |
611 | | .tag = 1, |
612 | | .offset = offsetof(OCSP_CERTSTATUS, value.revoked), |
613 | | .field_name = "value.revoked", |
614 | | .item = &OCSP_REVOKEDINFO_it, |
615 | | }, |
616 | | { |
617 | | .flags = ASN1_TFLG_IMPLICIT, |
618 | | .tag = 2, |
619 | | .offset = offsetof(OCSP_CERTSTATUS, value.unknown), |
620 | | .field_name = "value.unknown", |
621 | | .item = &ASN1_NULL_it, |
622 | | }, |
623 | | }; |
624 | | |
625 | | const ASN1_ITEM OCSP_CERTSTATUS_it = { |
626 | | .itype = ASN1_ITYPE_CHOICE, |
627 | | .utype = offsetof(OCSP_CERTSTATUS, type), |
628 | | .templates = OCSP_CERTSTATUS_ch_tt, |
629 | | .tcount = sizeof(OCSP_CERTSTATUS_ch_tt) / sizeof(ASN1_TEMPLATE), |
630 | | .funcs = NULL, |
631 | | .size = sizeof(OCSP_CERTSTATUS), |
632 | | .sname = "OCSP_CERTSTATUS", |
633 | | }; |
634 | | |
635 | | |
636 | | OCSP_CERTSTATUS * |
637 | | d2i_OCSP_CERTSTATUS(OCSP_CERTSTATUS **a, const unsigned char **in, long len) |
638 | 0 | { |
639 | 0 | return (OCSP_CERTSTATUS *)ASN1_item_d2i((ASN1_VALUE **)a, in, len, |
640 | 0 | &OCSP_CERTSTATUS_it); |
641 | 0 | } |
642 | | |
643 | | int |
644 | | i2d_OCSP_CERTSTATUS(OCSP_CERTSTATUS *a, unsigned char **out) |
645 | 0 | { |
646 | 0 | return ASN1_item_i2d((ASN1_VALUE *)a, out, &OCSP_CERTSTATUS_it); |
647 | 0 | } |
648 | | |
649 | | OCSP_CERTSTATUS * |
650 | | OCSP_CERTSTATUS_new(void) |
651 | 0 | { |
652 | 0 | return (OCSP_CERTSTATUS *)ASN1_item_new(&OCSP_CERTSTATUS_it); |
653 | 0 | } |
654 | | |
655 | | void |
656 | | OCSP_CERTSTATUS_free(OCSP_CERTSTATUS *a) |
657 | 0 | { |
658 | 0 | ASN1_item_free((ASN1_VALUE *)a, &OCSP_CERTSTATUS_it); |
659 | 0 | } |
660 | | |
661 | | static const ASN1_TEMPLATE OCSP_SINGLERESP_seq_tt[] = { |
662 | | { |
663 | | .flags = 0, |
664 | | .tag = 0, |
665 | | .offset = offsetof(OCSP_SINGLERESP, certId), |
666 | | .field_name = "certId", |
667 | | .item = &OCSP_CERTID_it, |
668 | | }, |
669 | | { |
670 | | .flags = 0, |
671 | | .tag = 0, |
672 | | .offset = offsetof(OCSP_SINGLERESP, certStatus), |
673 | | .field_name = "certStatus", |
674 | | .item = &OCSP_CERTSTATUS_it, |
675 | | }, |
676 | | { |
677 | | .flags = 0, |
678 | | .tag = 0, |
679 | | .offset = offsetof(OCSP_SINGLERESP, thisUpdate), |
680 | | .field_name = "thisUpdate", |
681 | | .item = &ASN1_GENERALIZEDTIME_it, |
682 | | }, |
683 | | { |
684 | | .flags = ASN1_TFLG_EXPLICIT | ASN1_TFLG_OPTIONAL, |
685 | | .tag = 0, |
686 | | .offset = offsetof(OCSP_SINGLERESP, nextUpdate), |
687 | | .field_name = "nextUpdate", |
688 | | .item = &ASN1_GENERALIZEDTIME_it, |
689 | | }, |
690 | | { |
691 | | .flags = ASN1_TFLG_EXPLICIT | ASN1_TFLG_SEQUENCE_OF | ASN1_TFLG_OPTIONAL, |
692 | | .tag = 1, |
693 | | .offset = offsetof(OCSP_SINGLERESP, singleExtensions), |
694 | | .field_name = "singleExtensions", |
695 | | .item = &X509_EXTENSION_it, |
696 | | }, |
697 | | }; |
698 | | |
699 | | const ASN1_ITEM OCSP_SINGLERESP_it = { |
700 | | .itype = ASN1_ITYPE_SEQUENCE, |
701 | | .utype = V_ASN1_SEQUENCE, |
702 | | .templates = OCSP_SINGLERESP_seq_tt, |
703 | | .tcount = sizeof(OCSP_SINGLERESP_seq_tt) / sizeof(ASN1_TEMPLATE), |
704 | | .funcs = NULL, |
705 | | .size = sizeof(OCSP_SINGLERESP), |
706 | | .sname = "OCSP_SINGLERESP", |
707 | | }; |
708 | | |
709 | | |
710 | | OCSP_SINGLERESP * |
711 | | d2i_OCSP_SINGLERESP(OCSP_SINGLERESP **a, const unsigned char **in, long len) |
712 | 0 | { |
713 | 0 | return (OCSP_SINGLERESP *)ASN1_item_d2i((ASN1_VALUE **)a, in, len, |
714 | 0 | &OCSP_SINGLERESP_it); |
715 | 0 | } |
716 | | |
717 | | int |
718 | | i2d_OCSP_SINGLERESP(OCSP_SINGLERESP *a, unsigned char **out) |
719 | 0 | { |
720 | 0 | return ASN1_item_i2d((ASN1_VALUE *)a, out, &OCSP_SINGLERESP_it); |
721 | 0 | } |
722 | | |
723 | | OCSP_SINGLERESP * |
724 | | OCSP_SINGLERESP_new(void) |
725 | 0 | { |
726 | 0 | return (OCSP_SINGLERESP *)ASN1_item_new(&OCSP_SINGLERESP_it); |
727 | 0 | } |
728 | | |
729 | | void |
730 | | OCSP_SINGLERESP_free(OCSP_SINGLERESP *a) |
731 | 0 | { |
732 | 0 | ASN1_item_free((ASN1_VALUE *)a, &OCSP_SINGLERESP_it); |
733 | 0 | } |
734 | | |
735 | | static const ASN1_TEMPLATE OCSP_RESPDATA_seq_tt[] = { |
736 | | { |
737 | | .flags = ASN1_TFLG_EXPLICIT | ASN1_TFLG_OPTIONAL, |
738 | | .tag = 0, |
739 | | .offset = offsetof(OCSP_RESPDATA, version), |
740 | | .field_name = "version", |
741 | | .item = &ASN1_INTEGER_it, |
742 | | }, |
743 | | { |
744 | | .flags = 0, |
745 | | .tag = 0, |
746 | | .offset = offsetof(OCSP_RESPDATA, responderId), |
747 | | .field_name = "responderId", |
748 | | .item = &OCSP_RESPID_it, |
749 | | }, |
750 | | { |
751 | | .flags = 0, |
752 | | .tag = 0, |
753 | | .offset = offsetof(OCSP_RESPDATA, producedAt), |
754 | | .field_name = "producedAt", |
755 | | .item = &ASN1_GENERALIZEDTIME_it, |
756 | | }, |
757 | | { |
758 | | .flags = ASN1_TFLG_SEQUENCE_OF, |
759 | | .tag = 0, |
760 | | .offset = offsetof(OCSP_RESPDATA, responses), |
761 | | .field_name = "responses", |
762 | | .item = &OCSP_SINGLERESP_it, |
763 | | }, |
764 | | { |
765 | | .flags = ASN1_TFLG_EXPLICIT | ASN1_TFLG_SEQUENCE_OF | ASN1_TFLG_OPTIONAL, |
766 | | .tag = 1, |
767 | | .offset = offsetof(OCSP_RESPDATA, responseExtensions), |
768 | | .field_name = "responseExtensions", |
769 | | .item = &X509_EXTENSION_it, |
770 | | }, |
771 | | }; |
772 | | |
773 | | const ASN1_ITEM OCSP_RESPDATA_it = { |
774 | | .itype = ASN1_ITYPE_SEQUENCE, |
775 | | .utype = V_ASN1_SEQUENCE, |
776 | | .templates = OCSP_RESPDATA_seq_tt, |
777 | | .tcount = sizeof(OCSP_RESPDATA_seq_tt) / sizeof(ASN1_TEMPLATE), |
778 | | .funcs = NULL, |
779 | | .size = sizeof(OCSP_RESPDATA), |
780 | | .sname = "OCSP_RESPDATA", |
781 | | }; |
782 | | |
783 | | |
784 | | OCSP_RESPDATA * |
785 | | d2i_OCSP_RESPDATA(OCSP_RESPDATA **a, const unsigned char **in, long len) |
786 | 0 | { |
787 | 0 | return (OCSP_RESPDATA *)ASN1_item_d2i((ASN1_VALUE **)a, in, len, |
788 | 0 | &OCSP_RESPDATA_it); |
789 | 0 | } |
790 | | |
791 | | int |
792 | | i2d_OCSP_RESPDATA(OCSP_RESPDATA *a, unsigned char **out) |
793 | 0 | { |
794 | 0 | return ASN1_item_i2d((ASN1_VALUE *)a, out, &OCSP_RESPDATA_it); |
795 | 0 | } |
796 | | |
797 | | OCSP_RESPDATA * |
798 | | OCSP_RESPDATA_new(void) |
799 | 0 | { |
800 | 0 | return (OCSP_RESPDATA *)ASN1_item_new(&OCSP_RESPDATA_it); |
801 | 0 | } |
802 | | |
803 | | void |
804 | | OCSP_RESPDATA_free(OCSP_RESPDATA *a) |
805 | 0 | { |
806 | 0 | ASN1_item_free((ASN1_VALUE *)a, &OCSP_RESPDATA_it); |
807 | 0 | } |
808 | | |
809 | | static const ASN1_TEMPLATE OCSP_BASICRESP_seq_tt[] = { |
810 | | { |
811 | | .flags = 0, |
812 | | .tag = 0, |
813 | | .offset = offsetof(OCSP_BASICRESP, tbsResponseData), |
814 | | .field_name = "tbsResponseData", |
815 | | .item = &OCSP_RESPDATA_it, |
816 | | }, |
817 | | { |
818 | | .flags = 0, |
819 | | .tag = 0, |
820 | | .offset = offsetof(OCSP_BASICRESP, signatureAlgorithm), |
821 | | .field_name = "signatureAlgorithm", |
822 | | .item = &X509_ALGOR_it, |
823 | | }, |
824 | | { |
825 | | .flags = 0, |
826 | | .tag = 0, |
827 | | .offset = offsetof(OCSP_BASICRESP, signature), |
828 | | .field_name = "signature", |
829 | | .item = &ASN1_BIT_STRING_it, |
830 | | }, |
831 | | { |
832 | | .flags = ASN1_TFLG_EXPLICIT | ASN1_TFLG_SEQUENCE_OF | ASN1_TFLG_OPTIONAL, |
833 | | .tag = 0, |
834 | | .offset = offsetof(OCSP_BASICRESP, certs), |
835 | | .field_name = "certs", |
836 | | .item = &X509_it, |
837 | | }, |
838 | | }; |
839 | | |
840 | | const ASN1_ITEM OCSP_BASICRESP_it = { |
841 | | .itype = ASN1_ITYPE_SEQUENCE, |
842 | | .utype = V_ASN1_SEQUENCE, |
843 | | .templates = OCSP_BASICRESP_seq_tt, |
844 | | .tcount = sizeof(OCSP_BASICRESP_seq_tt) / sizeof(ASN1_TEMPLATE), |
845 | | .funcs = NULL, |
846 | | .size = sizeof(OCSP_BASICRESP), |
847 | | .sname = "OCSP_BASICRESP", |
848 | | }; |
849 | | |
850 | | |
851 | | OCSP_BASICRESP * |
852 | | d2i_OCSP_BASICRESP(OCSP_BASICRESP **a, const unsigned char **in, long len) |
853 | 0 | { |
854 | 0 | return (OCSP_BASICRESP *)ASN1_item_d2i((ASN1_VALUE **)a, in, len, |
855 | 0 | &OCSP_BASICRESP_it); |
856 | 0 | } |
857 | | |
858 | | int |
859 | | i2d_OCSP_BASICRESP(OCSP_BASICRESP *a, unsigned char **out) |
860 | 0 | { |
861 | 0 | return ASN1_item_i2d((ASN1_VALUE *)a, out, &OCSP_BASICRESP_it); |
862 | 0 | } |
863 | | |
864 | | OCSP_BASICRESP * |
865 | | OCSP_BASICRESP_new(void) |
866 | 0 | { |
867 | 0 | return (OCSP_BASICRESP *)ASN1_item_new(&OCSP_BASICRESP_it); |
868 | 0 | } |
869 | | |
870 | | void |
871 | | OCSP_BASICRESP_free(OCSP_BASICRESP *a) |
872 | 0 | { |
873 | 0 | ASN1_item_free((ASN1_VALUE *)a, &OCSP_BASICRESP_it); |
874 | 0 | } |
875 | | |
876 | | static const ASN1_TEMPLATE OCSP_CRLID_seq_tt[] = { |
877 | | { |
878 | | .flags = ASN1_TFLG_EXPLICIT | ASN1_TFLG_OPTIONAL, |
879 | | .tag = 0, |
880 | | .offset = offsetof(OCSP_CRLID, crlUrl), |
881 | | .field_name = "crlUrl", |
882 | | .item = &ASN1_IA5STRING_it, |
883 | | }, |
884 | | { |
885 | | .flags = ASN1_TFLG_EXPLICIT | ASN1_TFLG_OPTIONAL, |
886 | | .tag = 1, |
887 | | .offset = offsetof(OCSP_CRLID, crlNum), |
888 | | .field_name = "crlNum", |
889 | | .item = &ASN1_INTEGER_it, |
890 | | }, |
891 | | { |
892 | | .flags = ASN1_TFLG_EXPLICIT | ASN1_TFLG_OPTIONAL, |
893 | | .tag = 2, |
894 | | .offset = offsetof(OCSP_CRLID, crlTime), |
895 | | .field_name = "crlTime", |
896 | | .item = &ASN1_GENERALIZEDTIME_it, |
897 | | }, |
898 | | }; |
899 | | |
900 | | const ASN1_ITEM OCSP_CRLID_it = { |
901 | | .itype = ASN1_ITYPE_SEQUENCE, |
902 | | .utype = V_ASN1_SEQUENCE, |
903 | | .templates = OCSP_CRLID_seq_tt, |
904 | | .tcount = sizeof(OCSP_CRLID_seq_tt) / sizeof(ASN1_TEMPLATE), |
905 | | .funcs = NULL, |
906 | | .size = sizeof(OCSP_CRLID), |
907 | | .sname = "OCSP_CRLID", |
908 | | }; |
909 | | |
910 | | |
911 | | OCSP_CRLID * |
912 | | d2i_OCSP_CRLID(OCSP_CRLID **a, const unsigned char **in, long len) |
913 | 0 | { |
914 | 0 | return (OCSP_CRLID *)ASN1_item_d2i((ASN1_VALUE **)a, in, len, |
915 | 0 | &OCSP_CRLID_it); |
916 | 0 | } |
917 | | |
918 | | int |
919 | | i2d_OCSP_CRLID(OCSP_CRLID *a, unsigned char **out) |
920 | 0 | { |
921 | 0 | return ASN1_item_i2d((ASN1_VALUE *)a, out, &OCSP_CRLID_it); |
922 | 0 | } |
923 | | |
924 | | OCSP_CRLID * |
925 | | OCSP_CRLID_new(void) |
926 | 0 | { |
927 | 0 | return (OCSP_CRLID *)ASN1_item_new(&OCSP_CRLID_it); |
928 | 0 | } |
929 | | |
930 | | void |
931 | | OCSP_CRLID_free(OCSP_CRLID *a) |
932 | 0 | { |
933 | 0 | ASN1_item_free((ASN1_VALUE *)a, &OCSP_CRLID_it); |
934 | 0 | } |
935 | | |
936 | | static const ASN1_TEMPLATE OCSP_SERVICELOC_seq_tt[] = { |
937 | | { |
938 | | .flags = 0, |
939 | | .tag = 0, |
940 | | .offset = offsetof(OCSP_SERVICELOC, issuer), |
941 | | .field_name = "issuer", |
942 | | .item = &X509_NAME_it, |
943 | | }, |
944 | | { |
945 | | .flags = ASN1_TFLG_SEQUENCE_OF | ASN1_TFLG_OPTIONAL, |
946 | | .tag = 0, |
947 | | .offset = offsetof(OCSP_SERVICELOC, locator), |
948 | | .field_name = "locator", |
949 | | .item = &ACCESS_DESCRIPTION_it, |
950 | | }, |
951 | | }; |
952 | | |
953 | | const ASN1_ITEM OCSP_SERVICELOC_it = { |
954 | | .itype = ASN1_ITYPE_SEQUENCE, |
955 | | .utype = V_ASN1_SEQUENCE, |
956 | | .templates = OCSP_SERVICELOC_seq_tt, |
957 | | .tcount = sizeof(OCSP_SERVICELOC_seq_tt) / sizeof(ASN1_TEMPLATE), |
958 | | .funcs = NULL, |
959 | | .size = sizeof(OCSP_SERVICELOC), |
960 | | .sname = "OCSP_SERVICELOC", |
961 | | }; |
962 | | |
963 | | |
964 | | OCSP_SERVICELOC * |
965 | | d2i_OCSP_SERVICELOC(OCSP_SERVICELOC **a, const unsigned char **in, long len) |
966 | 0 | { |
967 | 0 | return (OCSP_SERVICELOC *)ASN1_item_d2i((ASN1_VALUE **)a, in, len, |
968 | 0 | &OCSP_SERVICELOC_it); |
969 | 0 | } |
970 | | |
971 | | int |
972 | | i2d_OCSP_SERVICELOC(OCSP_SERVICELOC *a, unsigned char **out) |
973 | 0 | { |
974 | 0 | return ASN1_item_i2d((ASN1_VALUE *)a, out, &OCSP_SERVICELOC_it); |
975 | 0 | } |
976 | | |
977 | | OCSP_SERVICELOC * |
978 | | OCSP_SERVICELOC_new(void) |
979 | 0 | { |
980 | 0 | return (OCSP_SERVICELOC *)ASN1_item_new(&OCSP_SERVICELOC_it); |
981 | 0 | } |
982 | | |
983 | | void |
984 | | OCSP_SERVICELOC_free(OCSP_SERVICELOC *a) |
985 | 0 | { |
986 | 0 | ASN1_item_free((ASN1_VALUE *)a, &OCSP_SERVICELOC_it); |
987 | 0 | } |