xref: /openbsd/lib/libcrypto/ocsp/ocsp_asn.c (revision 8529ddd3)
1 /* $OpenBSD: ocsp_asn.c,v 1.7 2015/02/09 16:04:46 jsing 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 ASN1_SEQUENCE(OCSP_SIGNATURE) = {
63 	ASN1_SIMPLE(OCSP_SIGNATURE, signatureAlgorithm, X509_ALGOR),
64 	ASN1_SIMPLE(OCSP_SIGNATURE, signature, ASN1_BIT_STRING),
65 	ASN1_EXP_SEQUENCE_OF_OPT(OCSP_SIGNATURE, certs, X509, 0)
66 } ASN1_SEQUENCE_END(OCSP_SIGNATURE)
67 
68 
69 OCSP_SIGNATURE *
70 d2i_OCSP_SIGNATURE(OCSP_SIGNATURE **a, const unsigned char **in, long len)
71 {
72 	return (OCSP_SIGNATURE *)ASN1_item_d2i((ASN1_VALUE **)a, in, len,
73 	    &OCSP_SIGNATURE_it);
74 }
75 
76 int
77 i2d_OCSP_SIGNATURE(OCSP_SIGNATURE *a, unsigned char **out)
78 {
79 	return ASN1_item_i2d((ASN1_VALUE *)a, out, &OCSP_SIGNATURE_it);
80 }
81 
82 OCSP_SIGNATURE *
83 OCSP_SIGNATURE_new(void)
84 {
85 	return (OCSP_SIGNATURE *)ASN1_item_new(&OCSP_SIGNATURE_it);
86 }
87 
88 void
89 OCSP_SIGNATURE_free(OCSP_SIGNATURE *a)
90 {
91 	ASN1_item_free((ASN1_VALUE *)a, &OCSP_SIGNATURE_it);
92 }
93 
94 ASN1_SEQUENCE(OCSP_CERTID) = {
95 	ASN1_SIMPLE(OCSP_CERTID, hashAlgorithm, X509_ALGOR),
96 	ASN1_SIMPLE(OCSP_CERTID, issuerNameHash, ASN1_OCTET_STRING),
97 	ASN1_SIMPLE(OCSP_CERTID, issuerKeyHash, ASN1_OCTET_STRING),
98 	ASN1_SIMPLE(OCSP_CERTID, serialNumber, ASN1_INTEGER)
99 } ASN1_SEQUENCE_END(OCSP_CERTID)
100 
101 
102 OCSP_CERTID *
103 d2i_OCSP_CERTID(OCSP_CERTID **a, const unsigned char **in, long len)
104 {
105 	return (OCSP_CERTID *)ASN1_item_d2i((ASN1_VALUE **)a, in, len,
106 	    &OCSP_CERTID_it);
107 }
108 
109 int
110 i2d_OCSP_CERTID(OCSP_CERTID *a, unsigned char **out)
111 {
112 	return ASN1_item_i2d((ASN1_VALUE *)a, out, &OCSP_CERTID_it);
113 }
114 
115 OCSP_CERTID *
116 OCSP_CERTID_new(void)
117 {
118 	return (OCSP_CERTID *)ASN1_item_new(&OCSP_CERTID_it);
119 }
120 
121 void
122 OCSP_CERTID_free(OCSP_CERTID *a)
123 {
124 	ASN1_item_free((ASN1_VALUE *)a, &OCSP_CERTID_it);
125 }
126 
127 ASN1_SEQUENCE(OCSP_ONEREQ) = {
128 	ASN1_SIMPLE(OCSP_ONEREQ, reqCert, OCSP_CERTID),
129 	ASN1_EXP_SEQUENCE_OF_OPT(OCSP_ONEREQ, singleRequestExtensions, X509_EXTENSION, 0)
130 } ASN1_SEQUENCE_END(OCSP_ONEREQ)
131 
132 
133 OCSP_ONEREQ *
134 d2i_OCSP_ONEREQ(OCSP_ONEREQ **a, const unsigned char **in, long len)
135 {
136 	return (OCSP_ONEREQ *)ASN1_item_d2i((ASN1_VALUE **)a, in, len,
137 	    &OCSP_ONEREQ_it);
138 }
139 
140 int
141 i2d_OCSP_ONEREQ(OCSP_ONEREQ *a, unsigned char **out)
142 {
143 	return ASN1_item_i2d((ASN1_VALUE *)a, out, &OCSP_ONEREQ_it);
144 }
145 
146 OCSP_ONEREQ *
147 OCSP_ONEREQ_new(void)
148 {
149 	return (OCSP_ONEREQ *)ASN1_item_new(&OCSP_ONEREQ_it);
150 }
151 
152 void
153 OCSP_ONEREQ_free(OCSP_ONEREQ *a)
154 {
155 	ASN1_item_free((ASN1_VALUE *)a, &OCSP_ONEREQ_it);
156 }
157 
158 ASN1_SEQUENCE(OCSP_REQINFO) = {
159 	ASN1_EXP_OPT(OCSP_REQINFO, version, ASN1_INTEGER, 0),
160 	ASN1_EXP_OPT(OCSP_REQINFO, requestorName, GENERAL_NAME, 1),
161 	ASN1_SEQUENCE_OF(OCSP_REQINFO, requestList, OCSP_ONEREQ),
162 	ASN1_EXP_SEQUENCE_OF_OPT(OCSP_REQINFO, requestExtensions, X509_EXTENSION, 2)
163 } ASN1_SEQUENCE_END(OCSP_REQINFO)
164 
165 
166 OCSP_REQINFO *
167 d2i_OCSP_REQINFO(OCSP_REQINFO **a, const unsigned char **in, long len)
168 {
169 	return (OCSP_REQINFO *)ASN1_item_d2i((ASN1_VALUE **)a, in, len,
170 	    &OCSP_REQINFO_it);
171 }
172 
173 int
174 i2d_OCSP_REQINFO(OCSP_REQINFO *a, unsigned char **out)
175 {
176 	return ASN1_item_i2d((ASN1_VALUE *)a, out, &OCSP_REQINFO_it);
177 }
178 
179 OCSP_REQINFO *
180 OCSP_REQINFO_new(void)
181 {
182 	return (OCSP_REQINFO *)ASN1_item_new(&OCSP_REQINFO_it);
183 }
184 
185 void
186 OCSP_REQINFO_free(OCSP_REQINFO *a)
187 {
188 	ASN1_item_free((ASN1_VALUE *)a, &OCSP_REQINFO_it);
189 }
190 
191 ASN1_SEQUENCE(OCSP_REQUEST) = {
192 	ASN1_SIMPLE(OCSP_REQUEST, tbsRequest, OCSP_REQINFO),
193 	ASN1_EXP_OPT(OCSP_REQUEST, optionalSignature, OCSP_SIGNATURE, 0)
194 } ASN1_SEQUENCE_END(OCSP_REQUEST)
195 
196 
197 OCSP_REQUEST *
198 d2i_OCSP_REQUEST(OCSP_REQUEST **a, const unsigned char **in, long len)
199 {
200 	return (OCSP_REQUEST *)ASN1_item_d2i((ASN1_VALUE **)a, in, len,
201 	    &OCSP_REQUEST_it);
202 }
203 
204 int
205 i2d_OCSP_REQUEST(OCSP_REQUEST *a, unsigned char **out)
206 {
207 	return ASN1_item_i2d((ASN1_VALUE *)a, out, &OCSP_REQUEST_it);
208 }
209 
210 OCSP_REQUEST *
211 OCSP_REQUEST_new(void)
212 {
213 	return (OCSP_REQUEST *)ASN1_item_new(&OCSP_REQUEST_it);
214 }
215 
216 void
217 OCSP_REQUEST_free(OCSP_REQUEST *a)
218 {
219 	ASN1_item_free((ASN1_VALUE *)a, &OCSP_REQUEST_it);
220 }
221 
222 /* OCSP_RESPONSE templates */
223 
224 ASN1_SEQUENCE(OCSP_RESPBYTES) = {
225 	ASN1_SIMPLE(OCSP_RESPBYTES, responseType, ASN1_OBJECT),
226 	ASN1_SIMPLE(OCSP_RESPBYTES, response, ASN1_OCTET_STRING)
227 } ASN1_SEQUENCE_END(OCSP_RESPBYTES)
228 
229 
230 OCSP_RESPBYTES *
231 d2i_OCSP_RESPBYTES(OCSP_RESPBYTES **a, const unsigned char **in, long len)
232 {
233 	return (OCSP_RESPBYTES *)ASN1_item_d2i((ASN1_VALUE **)a, in, len,
234 	    &OCSP_RESPBYTES_it);
235 }
236 
237 int
238 i2d_OCSP_RESPBYTES(OCSP_RESPBYTES *a, unsigned char **out)
239 {
240 	return ASN1_item_i2d((ASN1_VALUE *)a, out, &OCSP_RESPBYTES_it);
241 }
242 
243 OCSP_RESPBYTES *
244 OCSP_RESPBYTES_new(void)
245 {
246 	return (OCSP_RESPBYTES *)ASN1_item_new(&OCSP_RESPBYTES_it);
247 }
248 
249 void
250 OCSP_RESPBYTES_free(OCSP_RESPBYTES *a)
251 {
252 	ASN1_item_free((ASN1_VALUE *)a, &OCSP_RESPBYTES_it);
253 }
254 
255 ASN1_SEQUENCE(OCSP_RESPONSE) = {
256 	ASN1_SIMPLE(OCSP_RESPONSE, responseStatus, ASN1_ENUMERATED),
257 	ASN1_EXP_OPT(OCSP_RESPONSE, responseBytes, OCSP_RESPBYTES, 0)
258 } ASN1_SEQUENCE_END(OCSP_RESPONSE)
259 
260 
261 OCSP_RESPONSE *
262 d2i_OCSP_RESPONSE(OCSP_RESPONSE **a, const unsigned char **in, long len)
263 {
264 	return (OCSP_RESPONSE *)ASN1_item_d2i((ASN1_VALUE **)a, in, len,
265 	    &OCSP_RESPONSE_it);
266 }
267 
268 int
269 i2d_OCSP_RESPONSE(OCSP_RESPONSE *a, unsigned char **out)
270 {
271 	return ASN1_item_i2d((ASN1_VALUE *)a, out, &OCSP_RESPONSE_it);
272 }
273 
274 OCSP_RESPONSE *
275 OCSP_RESPONSE_new(void)
276 {
277 	return (OCSP_RESPONSE *)ASN1_item_new(&OCSP_RESPONSE_it);
278 }
279 
280 void
281 OCSP_RESPONSE_free(OCSP_RESPONSE *a)
282 {
283 	ASN1_item_free((ASN1_VALUE *)a, &OCSP_RESPONSE_it);
284 }
285 
286 ASN1_CHOICE(OCSP_RESPID) = {
287 	ASN1_EXP(OCSP_RESPID, value.byName, X509_NAME, 1),
288 	ASN1_EXP(OCSP_RESPID, value.byKey, ASN1_OCTET_STRING, 2)
289 } ASN1_CHOICE_END(OCSP_RESPID)
290 
291 
292 OCSP_RESPID *
293 d2i_OCSP_RESPID(OCSP_RESPID **a, const unsigned char **in, long len)
294 {
295 	return (OCSP_RESPID *)ASN1_item_d2i((ASN1_VALUE **)a, in, len,
296 	    &OCSP_RESPID_it);
297 }
298 
299 int
300 i2d_OCSP_RESPID(OCSP_RESPID *a, unsigned char **out)
301 {
302 	return ASN1_item_i2d((ASN1_VALUE *)a, out, &OCSP_RESPID_it);
303 }
304 
305 OCSP_RESPID *
306 OCSP_RESPID_new(void)
307 {
308 	return (OCSP_RESPID *)ASN1_item_new(&OCSP_RESPID_it);
309 }
310 
311 void
312 OCSP_RESPID_free(OCSP_RESPID *a)
313 {
314 	ASN1_item_free((ASN1_VALUE *)a, &OCSP_RESPID_it);
315 }
316 
317 ASN1_SEQUENCE(OCSP_REVOKEDINFO) = {
318 	ASN1_SIMPLE(OCSP_REVOKEDINFO, revocationTime, ASN1_GENERALIZEDTIME),
319 	ASN1_EXP_OPT(OCSP_REVOKEDINFO, revocationReason, ASN1_ENUMERATED, 0)
320 } ASN1_SEQUENCE_END(OCSP_REVOKEDINFO)
321 
322 
323 OCSP_REVOKEDINFO *
324 d2i_OCSP_REVOKEDINFO(OCSP_REVOKEDINFO **a, const unsigned char **in, long len)
325 {
326 	return (OCSP_REVOKEDINFO *)ASN1_item_d2i((ASN1_VALUE **)a, in, len,
327 	    &OCSP_REVOKEDINFO_it);
328 }
329 
330 int
331 i2d_OCSP_REVOKEDINFO(OCSP_REVOKEDINFO *a, unsigned char **out)
332 {
333 	return ASN1_item_i2d((ASN1_VALUE *)a, out, &OCSP_REVOKEDINFO_it);
334 }
335 
336 OCSP_REVOKEDINFO *
337 OCSP_REVOKEDINFO_new(void)
338 {
339 	return (OCSP_REVOKEDINFO *)ASN1_item_new(&OCSP_REVOKEDINFO_it);
340 }
341 
342 void
343 OCSP_REVOKEDINFO_free(OCSP_REVOKEDINFO *a)
344 {
345 	ASN1_item_free((ASN1_VALUE *)a, &OCSP_REVOKEDINFO_it);
346 }
347 
348 ASN1_CHOICE(OCSP_CERTSTATUS) = {
349 	ASN1_IMP(OCSP_CERTSTATUS, value.good, ASN1_NULL, 0),
350 	ASN1_IMP(OCSP_CERTSTATUS, value.revoked, OCSP_REVOKEDINFO, 1),
351 	ASN1_IMP(OCSP_CERTSTATUS, value.unknown, ASN1_NULL, 2)
352 } ASN1_CHOICE_END(OCSP_CERTSTATUS)
353 
354 
355 OCSP_CERTSTATUS *
356 d2i_OCSP_CERTSTATUS(OCSP_CERTSTATUS **a, const unsigned char **in, long len)
357 {
358 	return (OCSP_CERTSTATUS *)ASN1_item_d2i((ASN1_VALUE **)a, in, len,
359 	    &OCSP_CERTSTATUS_it);
360 }
361 
362 int
363 i2d_OCSP_CERTSTATUS(OCSP_CERTSTATUS *a, unsigned char **out)
364 {
365 	return ASN1_item_i2d((ASN1_VALUE *)a, out, &OCSP_CERTSTATUS_it);
366 }
367 
368 OCSP_CERTSTATUS *
369 OCSP_CERTSTATUS_new(void)
370 {
371 	return (OCSP_CERTSTATUS *)ASN1_item_new(&OCSP_CERTSTATUS_it);
372 }
373 
374 void
375 OCSP_CERTSTATUS_free(OCSP_CERTSTATUS *a)
376 {
377 	ASN1_item_free((ASN1_VALUE *)a, &OCSP_CERTSTATUS_it);
378 }
379 
380 ASN1_SEQUENCE(OCSP_SINGLERESP) = {
381 	ASN1_SIMPLE(OCSP_SINGLERESP, certId, OCSP_CERTID),
382 	ASN1_SIMPLE(OCSP_SINGLERESP, certStatus, OCSP_CERTSTATUS),
383 	ASN1_SIMPLE(OCSP_SINGLERESP, thisUpdate, ASN1_GENERALIZEDTIME),
384 	ASN1_EXP_OPT(OCSP_SINGLERESP, nextUpdate, ASN1_GENERALIZEDTIME, 0),
385 	ASN1_EXP_SEQUENCE_OF_OPT(OCSP_SINGLERESP, singleExtensions, X509_EXTENSION, 1)
386 } ASN1_SEQUENCE_END(OCSP_SINGLERESP)
387 
388 
389 OCSP_SINGLERESP *
390 d2i_OCSP_SINGLERESP(OCSP_SINGLERESP **a, const unsigned char **in, long len)
391 {
392 	return (OCSP_SINGLERESP *)ASN1_item_d2i((ASN1_VALUE **)a, in, len,
393 	    &OCSP_SINGLERESP_it);
394 }
395 
396 int
397 i2d_OCSP_SINGLERESP(OCSP_SINGLERESP *a, unsigned char **out)
398 {
399 	return ASN1_item_i2d((ASN1_VALUE *)a, out, &OCSP_SINGLERESP_it);
400 }
401 
402 OCSP_SINGLERESP *
403 OCSP_SINGLERESP_new(void)
404 {
405 	return (OCSP_SINGLERESP *)ASN1_item_new(&OCSP_SINGLERESP_it);
406 }
407 
408 void
409 OCSP_SINGLERESP_free(OCSP_SINGLERESP *a)
410 {
411 	ASN1_item_free((ASN1_VALUE *)a, &OCSP_SINGLERESP_it);
412 }
413 
414 ASN1_SEQUENCE(OCSP_RESPDATA) = {
415 	ASN1_EXP_OPT(OCSP_RESPDATA, version, ASN1_INTEGER, 0),
416 	ASN1_SIMPLE(OCSP_RESPDATA, responderId, OCSP_RESPID),
417 	ASN1_SIMPLE(OCSP_RESPDATA, producedAt, ASN1_GENERALIZEDTIME),
418 	ASN1_SEQUENCE_OF(OCSP_RESPDATA, responses, OCSP_SINGLERESP),
419 	ASN1_EXP_SEQUENCE_OF_OPT(OCSP_RESPDATA, responseExtensions, X509_EXTENSION, 1)
420 } ASN1_SEQUENCE_END(OCSP_RESPDATA)
421 
422 
423 OCSP_RESPDATA *
424 d2i_OCSP_RESPDATA(OCSP_RESPDATA **a, const unsigned char **in, long len)
425 {
426 	return (OCSP_RESPDATA *)ASN1_item_d2i((ASN1_VALUE **)a, in, len,
427 	    &OCSP_RESPDATA_it);
428 }
429 
430 int
431 i2d_OCSP_RESPDATA(OCSP_RESPDATA *a, unsigned char **out)
432 {
433 	return ASN1_item_i2d((ASN1_VALUE *)a, out, &OCSP_RESPDATA_it);
434 }
435 
436 OCSP_RESPDATA *
437 OCSP_RESPDATA_new(void)
438 {
439 	return (OCSP_RESPDATA *)ASN1_item_new(&OCSP_RESPDATA_it);
440 }
441 
442 void
443 OCSP_RESPDATA_free(OCSP_RESPDATA *a)
444 {
445 	ASN1_item_free((ASN1_VALUE *)a, &OCSP_RESPDATA_it);
446 }
447 
448 ASN1_SEQUENCE(OCSP_BASICRESP) = {
449 	ASN1_SIMPLE(OCSP_BASICRESP, tbsResponseData, OCSP_RESPDATA),
450 	ASN1_SIMPLE(OCSP_BASICRESP, signatureAlgorithm, X509_ALGOR),
451 	ASN1_SIMPLE(OCSP_BASICRESP, signature, ASN1_BIT_STRING),
452 	ASN1_EXP_SEQUENCE_OF_OPT(OCSP_BASICRESP, certs, X509, 0)
453 } ASN1_SEQUENCE_END(OCSP_BASICRESP)
454 
455 
456 OCSP_BASICRESP *
457 d2i_OCSP_BASICRESP(OCSP_BASICRESP **a, const unsigned char **in, long len)
458 {
459 	return (OCSP_BASICRESP *)ASN1_item_d2i((ASN1_VALUE **)a, in, len,
460 	    &OCSP_BASICRESP_it);
461 }
462 
463 int
464 i2d_OCSP_BASICRESP(OCSP_BASICRESP *a, unsigned char **out)
465 {
466 	return ASN1_item_i2d((ASN1_VALUE *)a, out, &OCSP_BASICRESP_it);
467 }
468 
469 OCSP_BASICRESP *
470 OCSP_BASICRESP_new(void)
471 {
472 	return (OCSP_BASICRESP *)ASN1_item_new(&OCSP_BASICRESP_it);
473 }
474 
475 void
476 OCSP_BASICRESP_free(OCSP_BASICRESP *a)
477 {
478 	ASN1_item_free((ASN1_VALUE *)a, &OCSP_BASICRESP_it);
479 }
480 
481 ASN1_SEQUENCE(OCSP_CRLID) = {
482 	ASN1_EXP_OPT(OCSP_CRLID, crlUrl, ASN1_IA5STRING, 0),
483 	ASN1_EXP_OPT(OCSP_CRLID, crlNum, ASN1_INTEGER, 1),
484 	ASN1_EXP_OPT(OCSP_CRLID, crlTime, ASN1_GENERALIZEDTIME, 2)
485 } ASN1_SEQUENCE_END(OCSP_CRLID)
486 
487 
488 OCSP_CRLID *
489 d2i_OCSP_CRLID(OCSP_CRLID **a, const unsigned char **in, long len)
490 {
491 	return (OCSP_CRLID *)ASN1_item_d2i((ASN1_VALUE **)a, in, len,
492 	    &OCSP_CRLID_it);
493 }
494 
495 int
496 i2d_OCSP_CRLID(OCSP_CRLID *a, unsigned char **out)
497 {
498 	return ASN1_item_i2d((ASN1_VALUE *)a, out, &OCSP_CRLID_it);
499 }
500 
501 OCSP_CRLID *
502 OCSP_CRLID_new(void)
503 {
504 	return (OCSP_CRLID *)ASN1_item_new(&OCSP_CRLID_it);
505 }
506 
507 void
508 OCSP_CRLID_free(OCSP_CRLID *a)
509 {
510 	ASN1_item_free((ASN1_VALUE *)a, &OCSP_CRLID_it);
511 }
512 
513 ASN1_SEQUENCE(OCSP_SERVICELOC) = {
514 	ASN1_SIMPLE(OCSP_SERVICELOC, issuer, X509_NAME),
515 	ASN1_SEQUENCE_OF_OPT(OCSP_SERVICELOC, locator, ACCESS_DESCRIPTION)
516 } ASN1_SEQUENCE_END(OCSP_SERVICELOC)
517 
518 
519 OCSP_SERVICELOC *
520 d2i_OCSP_SERVICELOC(OCSP_SERVICELOC **a, const unsigned char **in, long len)
521 {
522 	return (OCSP_SERVICELOC *)ASN1_item_d2i((ASN1_VALUE **)a, in, len,
523 	    &OCSP_SERVICELOC_it);
524 }
525 
526 int
527 i2d_OCSP_SERVICELOC(OCSP_SERVICELOC *a, unsigned char **out)
528 {
529 	return ASN1_item_i2d((ASN1_VALUE *)a, out, &OCSP_SERVICELOC_it);
530 }
531 
532 OCSP_SERVICELOC *
533 OCSP_SERVICELOC_new(void)
534 {
535 	return (OCSP_SERVICELOC *)ASN1_item_new(&OCSP_SERVICELOC_it);
536 }
537 
538 void
539 OCSP_SERVICELOC_free(OCSP_SERVICELOC *a)
540 {
541 	ASN1_item_free((ASN1_VALUE *)a, &OCSP_SERVICELOC_it);
542 }
543