Merge branch 'vendor/LIBRESSL'
[dragonfly.git] / crypto / libressl / crypto / ocsp / ocsp_asn.c
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 static const ASN1_TEMPLATE OCSP_SIGNATURE_seq_tt[] = {
63         {
64                 .flags = 0,
65                 .tag = 0,
66                 .offset = offsetof(OCSP_SIGNATURE, signatureAlgorithm),
67                 .field_name = "signatureAlgorithm",
68                 .item = &X509_ALGOR_it,
69         },
70         {
71                 .flags = 0,
72                 .tag = 0,
73                 .offset = offsetof(OCSP_SIGNATURE, signature),
74                 .field_name = "signature",
75                 .item = &ASN1_BIT_STRING_it,
76         },
77         {
78                 .flags = ASN1_TFLG_EXPLICIT | ASN1_TFLG_SEQUENCE_OF | ASN1_TFLG_OPTIONAL,
79                 .tag = 0,
80                 .offset = offsetof(OCSP_SIGNATURE, certs),
81                 .field_name = "certs",
82                 .item = &X509_it,
83         },
84 };
85
86 const ASN1_ITEM OCSP_SIGNATURE_it = {
87         .itype = ASN1_ITYPE_SEQUENCE,
88         .utype = V_ASN1_SEQUENCE,
89         .templates = OCSP_SIGNATURE_seq_tt,
90         .tcount = sizeof(OCSP_SIGNATURE_seq_tt) / sizeof(ASN1_TEMPLATE),
91         .funcs = NULL,
92         .size = sizeof(OCSP_SIGNATURE),
93         .sname = "OCSP_SIGNATURE",
94 };
95
96
97 OCSP_SIGNATURE *
98 d2i_OCSP_SIGNATURE(OCSP_SIGNATURE **a, const unsigned char **in, long len)
99 {
100         return (OCSP_SIGNATURE *)ASN1_item_d2i((ASN1_VALUE **)a, in, len,
101             &OCSP_SIGNATURE_it);
102 }
103
104 int
105 i2d_OCSP_SIGNATURE(OCSP_SIGNATURE *a, unsigned char **out)
106 {
107         return ASN1_item_i2d((ASN1_VALUE *)a, out, &OCSP_SIGNATURE_it);
108 }
109
110 OCSP_SIGNATURE *
111 OCSP_SIGNATURE_new(void)
112 {
113         return (OCSP_SIGNATURE *)ASN1_item_new(&OCSP_SIGNATURE_it);
114 }
115
116 void
117 OCSP_SIGNATURE_free(OCSP_SIGNATURE *a)
118 {
119         ASN1_item_free((ASN1_VALUE *)a, &OCSP_SIGNATURE_it);
120 }
121
122 static const ASN1_TEMPLATE OCSP_CERTID_seq_tt[] = {
123         {
124                 .flags = 0,
125                 .tag = 0,
126                 .offset = offsetof(OCSP_CERTID, hashAlgorithm),
127                 .field_name = "hashAlgorithm",
128                 .item = &X509_ALGOR_it,
129         },
130         {
131                 .flags = 0,
132                 .tag = 0,
133                 .offset = offsetof(OCSP_CERTID, issuerNameHash),
134                 .field_name = "issuerNameHash",
135                 .item = &ASN1_OCTET_STRING_it,
136         },
137         {
138                 .flags = 0,
139                 .tag = 0,
140                 .offset = offsetof(OCSP_CERTID, issuerKeyHash),
141                 .field_name = "issuerKeyHash",
142                 .item = &ASN1_OCTET_STRING_it,
143         },
144         {
145                 .flags = 0,
146                 .tag = 0,
147                 .offset = offsetof(OCSP_CERTID, serialNumber),
148                 .field_name = "serialNumber",
149                 .item = &ASN1_INTEGER_it,
150         },
151 };
152
153 const ASN1_ITEM OCSP_CERTID_it = {
154         .itype = ASN1_ITYPE_SEQUENCE,
155         .utype = V_ASN1_SEQUENCE,
156         .templates = OCSP_CERTID_seq_tt,
157         .tcount = sizeof(OCSP_CERTID_seq_tt) / sizeof(ASN1_TEMPLATE),
158         .funcs = NULL,
159         .size = sizeof(OCSP_CERTID),
160         .sname = "OCSP_CERTID",
161 };
162
163
164 OCSP_CERTID *
165 d2i_OCSP_CERTID(OCSP_CERTID **a, const unsigned char **in, long len)
166 {
167         return (OCSP_CERTID *)ASN1_item_d2i((ASN1_VALUE **)a, in, len,
168             &OCSP_CERTID_it);
169 }
170
171 int
172 i2d_OCSP_CERTID(OCSP_CERTID *a, unsigned char **out)
173 {
174         return ASN1_item_i2d((ASN1_VALUE *)a, out, &OCSP_CERTID_it);
175 }
176
177 OCSP_CERTID *
178 OCSP_CERTID_new(void)
179 {
180         return (OCSP_CERTID *)ASN1_item_new(&OCSP_CERTID_it);
181 }
182
183 void
184 OCSP_CERTID_free(OCSP_CERTID *a)
185 {
186         ASN1_item_free((ASN1_VALUE *)a, &OCSP_CERTID_it);
187 }
188
189 static const ASN1_TEMPLATE OCSP_ONEREQ_seq_tt[] = {
190         {
191                 .flags = 0,
192                 .tag = 0,
193                 .offset = offsetof(OCSP_ONEREQ, reqCert),
194                 .field_name = "reqCert",
195                 .item = &OCSP_CERTID_it,
196         },
197         {
198                 .flags = ASN1_TFLG_EXPLICIT | ASN1_TFLG_SEQUENCE_OF | ASN1_TFLG_OPTIONAL,
199                 .tag = 0,
200                 .offset = offsetof(OCSP_ONEREQ, singleRequestExtensions),
201                 .field_name = "singleRequestExtensions",
202                 .item = &X509_EXTENSION_it,
203         },
204 };
205
206 const ASN1_ITEM OCSP_ONEREQ_it = {
207         .itype = ASN1_ITYPE_SEQUENCE,
208         .utype = V_ASN1_SEQUENCE,
209         .templates = OCSP_ONEREQ_seq_tt,
210         .tcount = sizeof(OCSP_ONEREQ_seq_tt) / sizeof(ASN1_TEMPLATE),
211         .funcs = NULL,
212         .size = sizeof(OCSP_ONEREQ),
213         .sname = "OCSP_ONEREQ",
214 };
215
216
217 OCSP_ONEREQ *
218 d2i_OCSP_ONEREQ(OCSP_ONEREQ **a, const unsigned char **in, long len)
219 {
220         return (OCSP_ONEREQ *)ASN1_item_d2i((ASN1_VALUE **)a, in, len,
221             &OCSP_ONEREQ_it);
222 }
223
224 int
225 i2d_OCSP_ONEREQ(OCSP_ONEREQ *a, unsigned char **out)
226 {
227         return ASN1_item_i2d((ASN1_VALUE *)a, out, &OCSP_ONEREQ_it);
228 }
229
230 OCSP_ONEREQ *
231 OCSP_ONEREQ_new(void)
232 {
233         return (OCSP_ONEREQ *)ASN1_item_new(&OCSP_ONEREQ_it);
234 }
235
236 void
237 OCSP_ONEREQ_free(OCSP_ONEREQ *a)
238 {
239         ASN1_item_free((ASN1_VALUE *)a, &OCSP_ONEREQ_it);
240 }
241
242 static const ASN1_TEMPLATE OCSP_REQINFO_seq_tt[] = {
243         {
244                 .flags = ASN1_TFLG_EXPLICIT | ASN1_TFLG_OPTIONAL,
245                 .tag = 0,
246                 .offset = offsetof(OCSP_REQINFO, version),
247                 .field_name = "version",
248                 .item = &ASN1_INTEGER_it,
249         },
250         {
251                 .flags = ASN1_TFLG_EXPLICIT | ASN1_TFLG_OPTIONAL,
252                 .tag = 1,
253                 .offset = offsetof(OCSP_REQINFO, requestorName),
254                 .field_name = "requestorName",
255                 .item = &GENERAL_NAME_it,
256         },
257         {
258                 .flags = ASN1_TFLG_SEQUENCE_OF,
259                 .tag = 0,
260                 .offset = offsetof(OCSP_REQINFO, requestList),
261                 .field_name = "requestList",
262                 .item = &OCSP_ONEREQ_it,
263         },
264         {
265                 .flags = ASN1_TFLG_EXPLICIT | ASN1_TFLG_SEQUENCE_OF | ASN1_TFLG_OPTIONAL,
266                 .tag = 2,
267                 .offset = offsetof(OCSP_REQINFO, requestExtensions),
268                 .field_name = "requestExtensions",
269                 .item = &X509_EXTENSION_it,
270         },
271 };
272
273 const ASN1_ITEM OCSP_REQINFO_it = {
274         .itype = ASN1_ITYPE_SEQUENCE,
275         .utype = V_ASN1_SEQUENCE,
276         .templates = OCSP_REQINFO_seq_tt,
277         .tcount = sizeof(OCSP_REQINFO_seq_tt) / sizeof(ASN1_TEMPLATE),
278         .funcs = NULL,
279         .size = sizeof(OCSP_REQINFO),
280         .sname = "OCSP_REQINFO",
281 };
282
283
284 OCSP_REQINFO *
285 d2i_OCSP_REQINFO(OCSP_REQINFO **a, const unsigned char **in, long len)
286 {
287         return (OCSP_REQINFO *)ASN1_item_d2i((ASN1_VALUE **)a, in, len,
288             &OCSP_REQINFO_it);
289 }
290
291 int
292 i2d_OCSP_REQINFO(OCSP_REQINFO *a, unsigned char **out)
293 {
294         return ASN1_item_i2d((ASN1_VALUE *)a, out, &OCSP_REQINFO_it);
295 }
296
297 OCSP_REQINFO *
298 OCSP_REQINFO_new(void)
299 {
300         return (OCSP_REQINFO *)ASN1_item_new(&OCSP_REQINFO_it);
301 }
302
303 void
304 OCSP_REQINFO_free(OCSP_REQINFO *a)
305 {
306         ASN1_item_free((ASN1_VALUE *)a, &OCSP_REQINFO_it);
307 }
308
309 static const ASN1_TEMPLATE OCSP_REQUEST_seq_tt[] = {
310         {
311                 .flags = 0,
312                 .tag = 0,
313                 .offset = offsetof(OCSP_REQUEST, tbsRequest),
314                 .field_name = "tbsRequest",
315                 .item = &OCSP_REQINFO_it,
316         },
317         {
318                 .flags = ASN1_TFLG_EXPLICIT | ASN1_TFLG_OPTIONAL,
319                 .tag = 0,
320                 .offset = offsetof(OCSP_REQUEST, optionalSignature),
321                 .field_name = "optionalSignature",
322                 .item = &OCSP_SIGNATURE_it,
323         },
324 };
325
326 const ASN1_ITEM OCSP_REQUEST_it = {
327         .itype = ASN1_ITYPE_SEQUENCE,
328         .utype = V_ASN1_SEQUENCE,
329         .templates = OCSP_REQUEST_seq_tt,
330         .tcount = sizeof(OCSP_REQUEST_seq_tt) / sizeof(ASN1_TEMPLATE),
331         .funcs = NULL,
332         .size = sizeof(OCSP_REQUEST),
333         .sname = "OCSP_REQUEST",
334 };
335
336
337 OCSP_REQUEST *
338 d2i_OCSP_REQUEST(OCSP_REQUEST **a, const unsigned char **in, long len)
339 {
340         return (OCSP_REQUEST *)ASN1_item_d2i((ASN1_VALUE **)a, in, len,
341             &OCSP_REQUEST_it);
342 }
343
344 int
345 i2d_OCSP_REQUEST(OCSP_REQUEST *a, unsigned char **out)
346 {
347         return ASN1_item_i2d((ASN1_VALUE *)a, out, &OCSP_REQUEST_it);
348 }
349
350 OCSP_REQUEST *
351 OCSP_REQUEST_new(void)
352 {
353         return (OCSP_REQUEST *)ASN1_item_new(&OCSP_REQUEST_it);
354 }
355
356 void
357 OCSP_REQUEST_free(OCSP_REQUEST *a)
358 {
359         ASN1_item_free((ASN1_VALUE *)a, &OCSP_REQUEST_it);
360 }
361
362 /* OCSP_RESPONSE templates */
363
364 static const ASN1_TEMPLATE OCSP_RESPBYTES_seq_tt[] = {
365         {
366                 .flags = 0,
367                 .tag = 0,
368                 .offset = offsetof(OCSP_RESPBYTES, responseType),
369                 .field_name = "responseType",
370                 .item = &ASN1_OBJECT_it,
371         },
372         {
373                 .flags = 0,
374                 .tag = 0,
375                 .offset = offsetof(OCSP_RESPBYTES, response),
376                 .field_name = "response",
377                 .item = &ASN1_OCTET_STRING_it,
378         },
379 };
380
381 const ASN1_ITEM OCSP_RESPBYTES_it = {
382         .itype = ASN1_ITYPE_SEQUENCE,
383         .utype = V_ASN1_SEQUENCE,
384         .templates = OCSP_RESPBYTES_seq_tt,
385         .tcount = sizeof(OCSP_RESPBYTES_seq_tt) / sizeof(ASN1_TEMPLATE),
386         .funcs = NULL,
387         .size = sizeof(OCSP_RESPBYTES),
388         .sname = "OCSP_RESPBYTES",
389 };
390
391
392 OCSP_RESPBYTES *
393 d2i_OCSP_RESPBYTES(OCSP_RESPBYTES **a, const unsigned char **in, long len)
394 {
395         return (OCSP_RESPBYTES *)ASN1_item_d2i((ASN1_VALUE **)a, in, len,
396             &OCSP_RESPBYTES_it);
397 }
398
399 int
400 i2d_OCSP_RESPBYTES(OCSP_RESPBYTES *a, unsigned char **out)
401 {
402         return ASN1_item_i2d((ASN1_VALUE *)a, out, &OCSP_RESPBYTES_it);
403 }
404
405 OCSP_RESPBYTES *
406 OCSP_RESPBYTES_new(void)
407 {
408         return (OCSP_RESPBYTES *)ASN1_item_new(&OCSP_RESPBYTES_it);
409 }
410
411 void
412 OCSP_RESPBYTES_free(OCSP_RESPBYTES *a)
413 {
414         ASN1_item_free((ASN1_VALUE *)a, &OCSP_RESPBYTES_it);
415 }
416
417 static const ASN1_TEMPLATE OCSP_RESPONSE_seq_tt[] = {
418         {
419                 .flags = 0,
420                 .tag = 0,
421                 .offset = offsetof(OCSP_RESPONSE, responseStatus),
422                 .field_name = "responseStatus",
423                 .item = &ASN1_ENUMERATED_it,
424         },
425         {
426                 .flags = ASN1_TFLG_EXPLICIT | ASN1_TFLG_OPTIONAL,
427                 .tag = 0,
428                 .offset = offsetof(OCSP_RESPONSE, responseBytes),
429                 .field_name = "responseBytes",
430                 .item = &OCSP_RESPBYTES_it,
431         },
432 };
433
434 const ASN1_ITEM OCSP_RESPONSE_it = {
435         .itype = ASN1_ITYPE_SEQUENCE,
436         .utype = V_ASN1_SEQUENCE,
437         .templates = OCSP_RESPONSE_seq_tt,
438         .tcount = sizeof(OCSP_RESPONSE_seq_tt) / sizeof(ASN1_TEMPLATE),
439         .funcs = NULL,
440         .size = sizeof(OCSP_RESPONSE),
441         .sname = "OCSP_RESPONSE",
442 };
443
444
445 OCSP_RESPONSE *
446 d2i_OCSP_RESPONSE(OCSP_RESPONSE **a, const unsigned char **in, long len)
447 {
448         return (OCSP_RESPONSE *)ASN1_item_d2i((ASN1_VALUE **)a, in, len,
449             &OCSP_RESPONSE_it);
450 }
451
452 int
453 i2d_OCSP_RESPONSE(OCSP_RESPONSE *a, unsigned char **out)
454 {
455         return ASN1_item_i2d((ASN1_VALUE *)a, out, &OCSP_RESPONSE_it);
456 }
457
458 OCSP_RESPONSE *
459 OCSP_RESPONSE_new(void)
460 {
461         return (OCSP_RESPONSE *)ASN1_item_new(&OCSP_RESPONSE_it);
462 }
463
464 void
465 OCSP_RESPONSE_free(OCSP_RESPONSE *a)
466 {
467         ASN1_item_free((ASN1_VALUE *)a, &OCSP_RESPONSE_it);
468 }
469
470 static const ASN1_TEMPLATE OCSP_RESPID_ch_tt[] = {
471         {
472                 .flags = ASN1_TFLG_EXPLICIT,
473                 .tag = 1,
474                 .offset = offsetof(OCSP_RESPID, value.byName),
475                 .field_name = "value.byName",
476                 .item = &X509_NAME_it,
477         },
478         {
479                 .flags = ASN1_TFLG_EXPLICIT,
480                 .tag = 2,
481                 .offset = offsetof(OCSP_RESPID, value.byKey),
482                 .field_name = "value.byKey",
483                 .item = &ASN1_OCTET_STRING_it,
484         },
485 };
486
487 const ASN1_ITEM OCSP_RESPID_it = {
488         .itype = ASN1_ITYPE_CHOICE,
489         .utype = offsetof(OCSP_RESPID, type),
490         .templates = OCSP_RESPID_ch_tt,
491         .tcount = sizeof(OCSP_RESPID_ch_tt) / sizeof(ASN1_TEMPLATE),
492         .funcs = NULL,
493         .size = sizeof(OCSP_RESPID),
494         .sname = "OCSP_RESPID",
495 };
496
497
498 OCSP_RESPID *
499 d2i_OCSP_RESPID(OCSP_RESPID **a, const unsigned char **in, long len)
500 {
501         return (OCSP_RESPID *)ASN1_item_d2i((ASN1_VALUE **)a, in, len,
502             &OCSP_RESPID_it);
503 }
504
505 int
506 i2d_OCSP_RESPID(OCSP_RESPID *a, unsigned char **out)
507 {
508         return ASN1_item_i2d((ASN1_VALUE *)a, out, &OCSP_RESPID_it);
509 }
510
511 OCSP_RESPID *
512 OCSP_RESPID_new(void)
513 {
514         return (OCSP_RESPID *)ASN1_item_new(&OCSP_RESPID_it);
515 }
516
517 void
518 OCSP_RESPID_free(OCSP_RESPID *a)
519 {
520         ASN1_item_free((ASN1_VALUE *)a, &OCSP_RESPID_it);
521 }
522
523 static const ASN1_TEMPLATE OCSP_REVOKEDINFO_seq_tt[] = {
524         {
525                 .flags = 0,
526                 .tag = 0,
527                 .offset = offsetof(OCSP_REVOKEDINFO, revocationTime),
528                 .field_name = "revocationTime",
529                 .item = &ASN1_GENERALIZEDTIME_it,
530         },
531         {
532                 .flags = ASN1_TFLG_EXPLICIT | ASN1_TFLG_OPTIONAL,
533                 .tag = 0,
534                 .offset = offsetof(OCSP_REVOKEDINFO, revocationReason),
535                 .field_name = "revocationReason",
536                 .item = &ASN1_ENUMERATED_it,
537         },
538 };
539
540 const ASN1_ITEM OCSP_REVOKEDINFO_it = {
541         .itype = ASN1_ITYPE_SEQUENCE,
542         .utype = V_ASN1_SEQUENCE,
543         .templates = OCSP_REVOKEDINFO_seq_tt,
544         .tcount = sizeof(OCSP_REVOKEDINFO_seq_tt) / sizeof(ASN1_TEMPLATE),
545         .funcs = NULL,
546         .size = sizeof(OCSP_REVOKEDINFO),
547         .sname = "OCSP_REVOKEDINFO",
548 };
549
550
551 OCSP_REVOKEDINFO *
552 d2i_OCSP_REVOKEDINFO(OCSP_REVOKEDINFO **a, const unsigned char **in, long len)
553 {
554         return (OCSP_REVOKEDINFO *)ASN1_item_d2i((ASN1_VALUE **)a, in, len,
555             &OCSP_REVOKEDINFO_it);
556 }
557
558 int
559 i2d_OCSP_REVOKEDINFO(OCSP_REVOKEDINFO *a, unsigned char **out)
560 {
561         return ASN1_item_i2d((ASN1_VALUE *)a, out, &OCSP_REVOKEDINFO_it);
562 }
563
564 OCSP_REVOKEDINFO *
565 OCSP_REVOKEDINFO_new(void)
566 {
567         return (OCSP_REVOKEDINFO *)ASN1_item_new(&OCSP_REVOKEDINFO_it);
568 }
569
570 void
571 OCSP_REVOKEDINFO_free(OCSP_REVOKEDINFO *a)
572 {
573         ASN1_item_free((ASN1_VALUE *)a, &OCSP_REVOKEDINFO_it);
574 }
575
576 static const ASN1_TEMPLATE OCSP_CERTSTATUS_ch_tt[] = {
577         {
578                 .flags = ASN1_TFLG_IMPLICIT,
579                 .tag = 0,
580                 .offset = offsetof(OCSP_CERTSTATUS, value.good),
581                 .field_name = "value.good",
582                 .item = &ASN1_NULL_it,
583         },
584         {
585                 .flags = ASN1_TFLG_IMPLICIT,
586                 .tag = 1,
587                 .offset = offsetof(OCSP_CERTSTATUS, value.revoked),
588                 .field_name = "value.revoked",
589                 .item = &OCSP_REVOKEDINFO_it,
590         },
591         {
592                 .flags = ASN1_TFLG_IMPLICIT,
593                 .tag = 2,
594                 .offset = offsetof(OCSP_CERTSTATUS, value.unknown),
595                 .field_name = "value.unknown",
596                 .item = &ASN1_NULL_it,
597         },
598 };
599
600 const ASN1_ITEM OCSP_CERTSTATUS_it = {
601         .itype = ASN1_ITYPE_CHOICE,
602         .utype = offsetof(OCSP_CERTSTATUS, type),
603         .templates = OCSP_CERTSTATUS_ch_tt,
604         .tcount = sizeof(OCSP_CERTSTATUS_ch_tt) / sizeof(ASN1_TEMPLATE),
605         .funcs = NULL,
606         .size = sizeof(OCSP_CERTSTATUS),
607         .sname = "OCSP_CERTSTATUS",
608 };
609
610
611 OCSP_CERTSTATUS *
612 d2i_OCSP_CERTSTATUS(OCSP_CERTSTATUS **a, const unsigned char **in, long len)
613 {
614         return (OCSP_CERTSTATUS *)ASN1_item_d2i((ASN1_VALUE **)a, in, len,
615             &OCSP_CERTSTATUS_it);
616 }
617
618 int
619 i2d_OCSP_CERTSTATUS(OCSP_CERTSTATUS *a, unsigned char **out)
620 {
621         return ASN1_item_i2d((ASN1_VALUE *)a, out, &OCSP_CERTSTATUS_it);
622 }
623
624 OCSP_CERTSTATUS *
625 OCSP_CERTSTATUS_new(void)
626 {
627         return (OCSP_CERTSTATUS *)ASN1_item_new(&OCSP_CERTSTATUS_it);
628 }
629
630 void
631 OCSP_CERTSTATUS_free(OCSP_CERTSTATUS *a)
632 {
633         ASN1_item_free((ASN1_VALUE *)a, &OCSP_CERTSTATUS_it);
634 }
635
636 static const ASN1_TEMPLATE OCSP_SINGLERESP_seq_tt[] = {
637         {
638                 .flags = 0,
639                 .tag = 0,
640                 .offset = offsetof(OCSP_SINGLERESP, certId),
641                 .field_name = "certId",
642                 .item = &OCSP_CERTID_it,
643         },
644         {
645                 .flags = 0,
646                 .tag = 0,
647                 .offset = offsetof(OCSP_SINGLERESP, certStatus),
648                 .field_name = "certStatus",
649                 .item = &OCSP_CERTSTATUS_it,
650         },
651         {
652                 .flags = 0,
653                 .tag = 0,
654                 .offset = offsetof(OCSP_SINGLERESP, thisUpdate),
655                 .field_name = "thisUpdate",
656                 .item = &ASN1_GENERALIZEDTIME_it,
657         },
658         {
659                 .flags = ASN1_TFLG_EXPLICIT | ASN1_TFLG_OPTIONAL,
660                 .tag = 0,
661                 .offset = offsetof(OCSP_SINGLERESP, nextUpdate),
662                 .field_name = "nextUpdate",
663                 .item = &ASN1_GENERALIZEDTIME_it,
664         },
665         {
666                 .flags = ASN1_TFLG_EXPLICIT | ASN1_TFLG_SEQUENCE_OF | ASN1_TFLG_OPTIONAL,
667                 .tag = 1,
668                 .offset = offsetof(OCSP_SINGLERESP, singleExtensions),
669                 .field_name = "singleExtensions",
670                 .item = &X509_EXTENSION_it,
671         },
672 };
673
674 const ASN1_ITEM OCSP_SINGLERESP_it = {
675         .itype = ASN1_ITYPE_SEQUENCE,
676         .utype = V_ASN1_SEQUENCE,
677         .templates = OCSP_SINGLERESP_seq_tt,
678         .tcount = sizeof(OCSP_SINGLERESP_seq_tt) / sizeof(ASN1_TEMPLATE),
679         .funcs = NULL,
680         .size = sizeof(OCSP_SINGLERESP),
681         .sname = "OCSP_SINGLERESP",
682 };
683
684
685 OCSP_SINGLERESP *
686 d2i_OCSP_SINGLERESP(OCSP_SINGLERESP **a, const unsigned char **in, long len)
687 {
688         return (OCSP_SINGLERESP *)ASN1_item_d2i((ASN1_VALUE **)a, in, len,
689             &OCSP_SINGLERESP_it);
690 }
691
692 int
693 i2d_OCSP_SINGLERESP(OCSP_SINGLERESP *a, unsigned char **out)
694 {
695         return ASN1_item_i2d((ASN1_VALUE *)a, out, &OCSP_SINGLERESP_it);
696 }
697
698 OCSP_SINGLERESP *
699 OCSP_SINGLERESP_new(void)
700 {
701         return (OCSP_SINGLERESP *)ASN1_item_new(&OCSP_SINGLERESP_it);
702 }
703
704 void
705 OCSP_SINGLERESP_free(OCSP_SINGLERESP *a)
706 {
707         ASN1_item_free((ASN1_VALUE *)a, &OCSP_SINGLERESP_it);
708 }
709
710 static const ASN1_TEMPLATE OCSP_RESPDATA_seq_tt[] = {
711         {
712                 .flags = ASN1_TFLG_EXPLICIT | ASN1_TFLG_OPTIONAL,
713                 .tag = 0,
714                 .offset = offsetof(OCSP_RESPDATA, version),
715                 .field_name = "version",
716                 .item = &ASN1_INTEGER_it,
717         },
718         {
719                 .flags = 0,
720                 .tag = 0,
721                 .offset = offsetof(OCSP_RESPDATA, responderId),
722                 .field_name = "responderId",
723                 .item = &OCSP_RESPID_it,
724         },
725         {
726                 .flags = 0,
727                 .tag = 0,
728                 .offset = offsetof(OCSP_RESPDATA, producedAt),
729                 .field_name = "producedAt",
730                 .item = &ASN1_GENERALIZEDTIME_it,
731         },
732         {
733                 .flags = ASN1_TFLG_SEQUENCE_OF,
734                 .tag = 0,
735                 .offset = offsetof(OCSP_RESPDATA, responses),
736                 .field_name = "responses",
737                 .item = &OCSP_SINGLERESP_it,
738         },
739         {
740                 .flags = ASN1_TFLG_EXPLICIT | ASN1_TFLG_SEQUENCE_OF | ASN1_TFLG_OPTIONAL,
741                 .tag = 1,
742                 .offset = offsetof(OCSP_RESPDATA, responseExtensions),
743                 .field_name = "responseExtensions",
744                 .item = &X509_EXTENSION_it,
745         },
746 };
747
748 const ASN1_ITEM OCSP_RESPDATA_it = {
749         .itype = ASN1_ITYPE_SEQUENCE,
750         .utype = V_ASN1_SEQUENCE,
751         .templates = OCSP_RESPDATA_seq_tt,
752         .tcount = sizeof(OCSP_RESPDATA_seq_tt) / sizeof(ASN1_TEMPLATE),
753         .funcs = NULL,
754         .size = sizeof(OCSP_RESPDATA),
755         .sname = "OCSP_RESPDATA",
756 };
757
758
759 OCSP_RESPDATA *
760 d2i_OCSP_RESPDATA(OCSP_RESPDATA **a, const unsigned char **in, long len)
761 {
762         return (OCSP_RESPDATA *)ASN1_item_d2i((ASN1_VALUE **)a, in, len,
763             &OCSP_RESPDATA_it);
764 }
765
766 int
767 i2d_OCSP_RESPDATA(OCSP_RESPDATA *a, unsigned char **out)
768 {
769         return ASN1_item_i2d((ASN1_VALUE *)a, out, &OCSP_RESPDATA_it);
770 }
771
772 OCSP_RESPDATA *
773 OCSP_RESPDATA_new(void)
774 {
775         return (OCSP_RESPDATA *)ASN1_item_new(&OCSP_RESPDATA_it);
776 }
777
778 void
779 OCSP_RESPDATA_free(OCSP_RESPDATA *a)
780 {
781         ASN1_item_free((ASN1_VALUE *)a, &OCSP_RESPDATA_it);
782 }
783
784 static const ASN1_TEMPLATE OCSP_BASICRESP_seq_tt[] = {
785         {
786                 .flags = 0,
787                 .tag = 0,
788                 .offset = offsetof(OCSP_BASICRESP, tbsResponseData),
789                 .field_name = "tbsResponseData",
790                 .item = &OCSP_RESPDATA_it,
791         },
792         {
793                 .flags = 0,
794                 .tag = 0,
795                 .offset = offsetof(OCSP_BASICRESP, signatureAlgorithm),
796                 .field_name = "signatureAlgorithm",
797                 .item = &X509_ALGOR_it,
798         },
799         {
800                 .flags = 0,
801                 .tag = 0,
802                 .offset = offsetof(OCSP_BASICRESP, signature),
803                 .field_name = "signature",
804                 .item = &ASN1_BIT_STRING_it,
805         },
806         {
807                 .flags = ASN1_TFLG_EXPLICIT | ASN1_TFLG_SEQUENCE_OF | ASN1_TFLG_OPTIONAL,
808                 .tag = 0,
809                 .offset = offsetof(OCSP_BASICRESP, certs),
810                 .field_name = "certs",
811                 .item = &X509_it,
812         },
813 };
814
815 const ASN1_ITEM OCSP_BASICRESP_it = {
816         .itype = ASN1_ITYPE_SEQUENCE,
817         .utype = V_ASN1_SEQUENCE,
818         .templates = OCSP_BASICRESP_seq_tt,
819         .tcount = sizeof(OCSP_BASICRESP_seq_tt) / sizeof(ASN1_TEMPLATE),
820         .funcs = NULL,
821         .size = sizeof(OCSP_BASICRESP),
822         .sname = "OCSP_BASICRESP",
823 };
824
825
826 OCSP_BASICRESP *
827 d2i_OCSP_BASICRESP(OCSP_BASICRESP **a, const unsigned char **in, long len)
828 {
829         return (OCSP_BASICRESP *)ASN1_item_d2i((ASN1_VALUE **)a, in, len,
830             &OCSP_BASICRESP_it);
831 }
832
833 int
834 i2d_OCSP_BASICRESP(OCSP_BASICRESP *a, unsigned char **out)
835 {
836         return ASN1_item_i2d((ASN1_VALUE *)a, out, &OCSP_BASICRESP_it);
837 }
838
839 OCSP_BASICRESP *
840 OCSP_BASICRESP_new(void)
841 {
842         return (OCSP_BASICRESP *)ASN1_item_new(&OCSP_BASICRESP_it);
843 }
844
845 void
846 OCSP_BASICRESP_free(OCSP_BASICRESP *a)
847 {
848         ASN1_item_free((ASN1_VALUE *)a, &OCSP_BASICRESP_it);
849 }
850
851 static const ASN1_TEMPLATE OCSP_CRLID_seq_tt[] = {
852         {
853                 .flags = ASN1_TFLG_EXPLICIT | ASN1_TFLG_OPTIONAL,
854                 .tag = 0,
855                 .offset = offsetof(OCSP_CRLID, crlUrl),
856                 .field_name = "crlUrl",
857                 .item = &ASN1_IA5STRING_it,
858         },
859         {
860                 .flags = ASN1_TFLG_EXPLICIT | ASN1_TFLG_OPTIONAL,
861                 .tag = 1,
862                 .offset = offsetof(OCSP_CRLID, crlNum),
863                 .field_name = "crlNum",
864                 .item = &ASN1_INTEGER_it,
865         },
866         {
867                 .flags = ASN1_TFLG_EXPLICIT | ASN1_TFLG_OPTIONAL,
868                 .tag = 2,
869                 .offset = offsetof(OCSP_CRLID, crlTime),
870                 .field_name = "crlTime",
871                 .item = &ASN1_GENERALIZEDTIME_it,
872         },
873 };
874
875 const ASN1_ITEM OCSP_CRLID_it = {
876         .itype = ASN1_ITYPE_SEQUENCE,
877         .utype = V_ASN1_SEQUENCE,
878         .templates = OCSP_CRLID_seq_tt,
879         .tcount = sizeof(OCSP_CRLID_seq_tt) / sizeof(ASN1_TEMPLATE),
880         .funcs = NULL,
881         .size = sizeof(OCSP_CRLID),
882         .sname = "OCSP_CRLID",
883 };
884
885
886 OCSP_CRLID *
887 d2i_OCSP_CRLID(OCSP_CRLID **a, const unsigned char **in, long len)
888 {
889         return (OCSP_CRLID *)ASN1_item_d2i((ASN1_VALUE **)a, in, len,
890             &OCSP_CRLID_it);
891 }
892
893 int
894 i2d_OCSP_CRLID(OCSP_CRLID *a, unsigned char **out)
895 {
896         return ASN1_item_i2d((ASN1_VALUE *)a, out, &OCSP_CRLID_it);
897 }
898
899 OCSP_CRLID *
900 OCSP_CRLID_new(void)
901 {
902         return (OCSP_CRLID *)ASN1_item_new(&OCSP_CRLID_it);
903 }
904
905 void
906 OCSP_CRLID_free(OCSP_CRLID *a)
907 {
908         ASN1_item_free((ASN1_VALUE *)a, &OCSP_CRLID_it);
909 }
910
911 static const ASN1_TEMPLATE OCSP_SERVICELOC_seq_tt[] = {
912         {
913                 .flags = 0,
914                 .tag = 0,
915                 .offset = offsetof(OCSP_SERVICELOC, issuer),
916                 .field_name = "issuer",
917                 .item = &X509_NAME_it,
918         },
919         {
920                 .flags = ASN1_TFLG_SEQUENCE_OF | ASN1_TFLG_OPTIONAL,
921                 .tag = 0,
922                 .offset = offsetof(OCSP_SERVICELOC, locator),
923                 .field_name = "locator",
924                 .item = &ACCESS_DESCRIPTION_it,
925         },
926 };
927
928 const ASN1_ITEM OCSP_SERVICELOC_it = {
929         .itype = ASN1_ITYPE_SEQUENCE,
930         .utype = V_ASN1_SEQUENCE,
931         .templates = OCSP_SERVICELOC_seq_tt,
932         .tcount = sizeof(OCSP_SERVICELOC_seq_tt) / sizeof(ASN1_TEMPLATE),
933         .funcs = NULL,
934         .size = sizeof(OCSP_SERVICELOC),
935         .sname = "OCSP_SERVICELOC",
936 };
937
938
939 OCSP_SERVICELOC *
940 d2i_OCSP_SERVICELOC(OCSP_SERVICELOC **a, const unsigned char **in, long len)
941 {
942         return (OCSP_SERVICELOC *)ASN1_item_d2i((ASN1_VALUE **)a, in, len,
943             &OCSP_SERVICELOC_it);
944 }
945
946 int
947 i2d_OCSP_SERVICELOC(OCSP_SERVICELOC *a, unsigned char **out)
948 {
949         return ASN1_item_i2d((ASN1_VALUE *)a, out, &OCSP_SERVICELOC_it);
950 }
951
952 OCSP_SERVICELOC *
953 OCSP_SERVICELOC_new(void)
954 {
955         return (OCSP_SERVICELOC *)ASN1_item_new(&OCSP_SERVICELOC_it);
956 }
957
958 void
959 OCSP_SERVICELOC_free(OCSP_SERVICELOC *a)
960 {
961         ASN1_item_free((ASN1_VALUE *)a, &OCSP_SERVICELOC_it);
962 }