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 *
d2i_OCSP_SIGNATURE(OCSP_SIGNATURE ** a,const unsigned char ** in,long len)100 d2i_OCSP_SIGNATURE(OCSP_SIGNATURE **a, const unsigned char **in, long len)
101 {
102 return (OCSP_SIGNATURE *)ASN1_item_d2i((ASN1_VALUE **)a, in, len,
103 &OCSP_SIGNATURE_it);
104 }
105
106 int
i2d_OCSP_SIGNATURE(OCSP_SIGNATURE * a,unsigned char ** out)107 i2d_OCSP_SIGNATURE(OCSP_SIGNATURE *a, unsigned char **out)
108 {
109 return ASN1_item_i2d((ASN1_VALUE *)a, out, &OCSP_SIGNATURE_it);
110 }
111
112 OCSP_SIGNATURE *
OCSP_SIGNATURE_new(void)113 OCSP_SIGNATURE_new(void)
114 {
115 return (OCSP_SIGNATURE *)ASN1_item_new(&OCSP_SIGNATURE_it);
116 }
117
118 void
OCSP_SIGNATURE_free(OCSP_SIGNATURE * a)119 OCSP_SIGNATURE_free(OCSP_SIGNATURE *a)
120 {
121 ASN1_item_free((ASN1_VALUE *)a, &OCSP_SIGNATURE_it);
122 }
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 *
d2i_OCSP_CERTID(OCSP_CERTID ** a,const unsigned char ** in,long len)167 d2i_OCSP_CERTID(OCSP_CERTID **a, const unsigned char **in, long len)
168 {
169 return (OCSP_CERTID *)ASN1_item_d2i((ASN1_VALUE **)a, in, len,
170 &OCSP_CERTID_it);
171 }
172
173 int
i2d_OCSP_CERTID(OCSP_CERTID * a,unsigned char ** out)174 i2d_OCSP_CERTID(OCSP_CERTID *a, unsigned char **out)
175 {
176 return ASN1_item_i2d((ASN1_VALUE *)a, out, &OCSP_CERTID_it);
177 }
178
179 OCSP_CERTID *
OCSP_CERTID_new(void)180 OCSP_CERTID_new(void)
181 {
182 return (OCSP_CERTID *)ASN1_item_new(&OCSP_CERTID_it);
183 }
184
185 void
OCSP_CERTID_free(OCSP_CERTID * a)186 OCSP_CERTID_free(OCSP_CERTID *a)
187 {
188 ASN1_item_free((ASN1_VALUE *)a, &OCSP_CERTID_it);
189 }
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 *
d2i_OCSP_ONEREQ(OCSP_ONEREQ ** a,const unsigned char ** in,long len)220 d2i_OCSP_ONEREQ(OCSP_ONEREQ **a, const unsigned char **in, long len)
221 {
222 return (OCSP_ONEREQ *)ASN1_item_d2i((ASN1_VALUE **)a, in, len,
223 &OCSP_ONEREQ_it);
224 }
225
226 int
i2d_OCSP_ONEREQ(OCSP_ONEREQ * a,unsigned char ** out)227 i2d_OCSP_ONEREQ(OCSP_ONEREQ *a, unsigned char **out)
228 {
229 return ASN1_item_i2d((ASN1_VALUE *)a, out, &OCSP_ONEREQ_it);
230 }
231
232 OCSP_ONEREQ *
OCSP_ONEREQ_new(void)233 OCSP_ONEREQ_new(void)
234 {
235 return (OCSP_ONEREQ *)ASN1_item_new(&OCSP_ONEREQ_it);
236 }
237
238 void
OCSP_ONEREQ_free(OCSP_ONEREQ * a)239 OCSP_ONEREQ_free(OCSP_ONEREQ *a)
240 {
241 ASN1_item_free((ASN1_VALUE *)a, &OCSP_ONEREQ_it);
242 }
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 *
d2i_OCSP_REQINFO(OCSP_REQINFO ** a,const unsigned char ** in,long len)287 d2i_OCSP_REQINFO(OCSP_REQINFO **a, const unsigned char **in, long len)
288 {
289 return (OCSP_REQINFO *)ASN1_item_d2i((ASN1_VALUE **)a, in, len,
290 &OCSP_REQINFO_it);
291 }
292
293 int
i2d_OCSP_REQINFO(OCSP_REQINFO * a,unsigned char ** out)294 i2d_OCSP_REQINFO(OCSP_REQINFO *a, unsigned char **out)
295 {
296 return ASN1_item_i2d((ASN1_VALUE *)a, out, &OCSP_REQINFO_it);
297 }
298
299 OCSP_REQINFO *
OCSP_REQINFO_new(void)300 OCSP_REQINFO_new(void)
301 {
302 return (OCSP_REQINFO *)ASN1_item_new(&OCSP_REQINFO_it);
303 }
304
305 void
OCSP_REQINFO_free(OCSP_REQINFO * a)306 OCSP_REQINFO_free(OCSP_REQINFO *a)
307 {
308 ASN1_item_free((ASN1_VALUE *)a, &OCSP_REQINFO_it);
309 }
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 *
d2i_OCSP_REQUEST(OCSP_REQUEST ** a,const unsigned char ** in,long len)339 d2i_OCSP_REQUEST(OCSP_REQUEST **a, const unsigned char **in, long len)
340 {
341 return (OCSP_REQUEST *)ASN1_item_d2i((ASN1_VALUE **)a, in, len,
342 &OCSP_REQUEST_it);
343 }
344
345 int
i2d_OCSP_REQUEST(OCSP_REQUEST * a,unsigned char ** out)346 i2d_OCSP_REQUEST(OCSP_REQUEST *a, unsigned char **out)
347 {
348 return ASN1_item_i2d((ASN1_VALUE *)a, out, &OCSP_REQUEST_it);
349 }
350
351 OCSP_REQUEST *
d2i_OCSP_REQUEST_bio(BIO * bp,OCSP_REQUEST ** a)352 d2i_OCSP_REQUEST_bio(BIO *bp, OCSP_REQUEST **a)
353 {
354 return ASN1_item_d2i_bio(&OCSP_REQUEST_it, bp, a);
355 }
356
357 int
i2d_OCSP_REQUEST_bio(BIO * bp,OCSP_REQUEST * a)358 i2d_OCSP_REQUEST_bio(BIO *bp, OCSP_REQUEST *a)
359 {
360 return ASN1_item_i2d_bio(&OCSP_REQUEST_it, bp, a);
361 }
362
363 OCSP_REQUEST *
OCSP_REQUEST_new(void)364 OCSP_REQUEST_new(void)
365 {
366 return (OCSP_REQUEST *)ASN1_item_new(&OCSP_REQUEST_it);
367 }
368
369 void
OCSP_REQUEST_free(OCSP_REQUEST * a)370 OCSP_REQUEST_free(OCSP_REQUEST *a)
371 {
372 ASN1_item_free((ASN1_VALUE *)a, &OCSP_REQUEST_it);
373 }
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 *
d2i_OCSP_RESPBYTES(OCSP_RESPBYTES ** a,const unsigned char ** in,long len)406 d2i_OCSP_RESPBYTES(OCSP_RESPBYTES **a, const unsigned char **in, long len)
407 {
408 return (OCSP_RESPBYTES *)ASN1_item_d2i((ASN1_VALUE **)a, in, len,
409 &OCSP_RESPBYTES_it);
410 }
411
412 int
i2d_OCSP_RESPBYTES(OCSP_RESPBYTES * a,unsigned char ** out)413 i2d_OCSP_RESPBYTES(OCSP_RESPBYTES *a, unsigned char **out)
414 {
415 return ASN1_item_i2d((ASN1_VALUE *)a, out, &OCSP_RESPBYTES_it);
416 }
417
418 OCSP_RESPBYTES *
OCSP_RESPBYTES_new(void)419 OCSP_RESPBYTES_new(void)
420 {
421 return (OCSP_RESPBYTES *)ASN1_item_new(&OCSP_RESPBYTES_it);
422 }
423
424 void
OCSP_RESPBYTES_free(OCSP_RESPBYTES * a)425 OCSP_RESPBYTES_free(OCSP_RESPBYTES *a)
426 {
427 ASN1_item_free((ASN1_VALUE *)a, &OCSP_RESPBYTES_it);
428 }
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 *
d2i_OCSP_RESPONSE(OCSP_RESPONSE ** a,const unsigned char ** in,long len)459 d2i_OCSP_RESPONSE(OCSP_RESPONSE **a, const unsigned char **in, long len)
460 {
461 return (OCSP_RESPONSE *)ASN1_item_d2i((ASN1_VALUE **)a, in, len,
462 &OCSP_RESPONSE_it);
463 }
464
465 int
i2d_OCSP_RESPONSE(OCSP_RESPONSE * a,unsigned char ** out)466 i2d_OCSP_RESPONSE(OCSP_RESPONSE *a, unsigned char **out)
467 {
468 return ASN1_item_i2d((ASN1_VALUE *)a, out, &OCSP_RESPONSE_it);
469 }
470
471 OCSP_RESPONSE *
d2i_OCSP_RESPONSE_bio(BIO * bp,OCSP_RESPONSE ** a)472 d2i_OCSP_RESPONSE_bio(BIO *bp, OCSP_RESPONSE **a)
473 {
474 return ASN1_item_d2i_bio(&OCSP_RESPONSE_it, bp, a);
475 }
476
477 int
i2d_OCSP_RESPONSE_bio(BIO * bp,OCSP_RESPONSE * a)478 i2d_OCSP_RESPONSE_bio(BIO *bp, OCSP_RESPONSE *a)
479 {
480 return ASN1_item_i2d_bio(&OCSP_RESPONSE_it, bp, a);
481 }
482
483 OCSP_RESPONSE *
OCSP_RESPONSE_new(void)484 OCSP_RESPONSE_new(void)
485 {
486 return (OCSP_RESPONSE *)ASN1_item_new(&OCSP_RESPONSE_it);
487 }
488
489 void
OCSP_RESPONSE_free(OCSP_RESPONSE * a)490 OCSP_RESPONSE_free(OCSP_RESPONSE *a)
491 {
492 ASN1_item_free((ASN1_VALUE *)a, &OCSP_RESPONSE_it);
493 }
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 *
d2i_OCSP_RESPID(OCSP_RESPID ** a,const unsigned char ** in,long len)524 d2i_OCSP_RESPID(OCSP_RESPID **a, const unsigned char **in, long len)
525 {
526 return (OCSP_RESPID *)ASN1_item_d2i((ASN1_VALUE **)a, in, len,
527 &OCSP_RESPID_it);
528 }
529
530 int
i2d_OCSP_RESPID(OCSP_RESPID * a,unsigned char ** out)531 i2d_OCSP_RESPID(OCSP_RESPID *a, unsigned char **out)
532 {
533 return ASN1_item_i2d((ASN1_VALUE *)a, out, &OCSP_RESPID_it);
534 }
535
536 OCSP_RESPID *
OCSP_RESPID_new(void)537 OCSP_RESPID_new(void)
538 {
539 return (OCSP_RESPID *)ASN1_item_new(&OCSP_RESPID_it);
540 }
541
542 void
OCSP_RESPID_free(OCSP_RESPID * a)543 OCSP_RESPID_free(OCSP_RESPID *a)
544 {
545 ASN1_item_free((ASN1_VALUE *)a, &OCSP_RESPID_it);
546 }
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 *
d2i_OCSP_REVOKEDINFO(OCSP_REVOKEDINFO ** a,const unsigned char ** in,long len)577 d2i_OCSP_REVOKEDINFO(OCSP_REVOKEDINFO **a, const unsigned char **in, long len)
578 {
579 return (OCSP_REVOKEDINFO *)ASN1_item_d2i((ASN1_VALUE **)a, in, len,
580 &OCSP_REVOKEDINFO_it);
581 }
582
583 int
i2d_OCSP_REVOKEDINFO(OCSP_REVOKEDINFO * a,unsigned char ** out)584 i2d_OCSP_REVOKEDINFO(OCSP_REVOKEDINFO *a, unsigned char **out)
585 {
586 return ASN1_item_i2d((ASN1_VALUE *)a, out, &OCSP_REVOKEDINFO_it);
587 }
588
589 OCSP_REVOKEDINFO *
OCSP_REVOKEDINFO_new(void)590 OCSP_REVOKEDINFO_new(void)
591 {
592 return (OCSP_REVOKEDINFO *)ASN1_item_new(&OCSP_REVOKEDINFO_it);
593 }
594
595 void
OCSP_REVOKEDINFO_free(OCSP_REVOKEDINFO * a)596 OCSP_REVOKEDINFO_free(OCSP_REVOKEDINFO *a)
597 {
598 ASN1_item_free((ASN1_VALUE *)a, &OCSP_REVOKEDINFO_it);
599 }
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 *
d2i_OCSP_CERTSTATUS(OCSP_CERTSTATUS ** a,const unsigned char ** in,long len)637 d2i_OCSP_CERTSTATUS(OCSP_CERTSTATUS **a, const unsigned char **in, long len)
638 {
639 return (OCSP_CERTSTATUS *)ASN1_item_d2i((ASN1_VALUE **)a, in, len,
640 &OCSP_CERTSTATUS_it);
641 }
642
643 int
i2d_OCSP_CERTSTATUS(OCSP_CERTSTATUS * a,unsigned char ** out)644 i2d_OCSP_CERTSTATUS(OCSP_CERTSTATUS *a, unsigned char **out)
645 {
646 return ASN1_item_i2d((ASN1_VALUE *)a, out, &OCSP_CERTSTATUS_it);
647 }
648
649 OCSP_CERTSTATUS *
OCSP_CERTSTATUS_new(void)650 OCSP_CERTSTATUS_new(void)
651 {
652 return (OCSP_CERTSTATUS *)ASN1_item_new(&OCSP_CERTSTATUS_it);
653 }
654
655 void
OCSP_CERTSTATUS_free(OCSP_CERTSTATUS * a)656 OCSP_CERTSTATUS_free(OCSP_CERTSTATUS *a)
657 {
658 ASN1_item_free((ASN1_VALUE *)a, &OCSP_CERTSTATUS_it);
659 }
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 *
d2i_OCSP_SINGLERESP(OCSP_SINGLERESP ** a,const unsigned char ** in,long len)711 d2i_OCSP_SINGLERESP(OCSP_SINGLERESP **a, const unsigned char **in, long len)
712 {
713 return (OCSP_SINGLERESP *)ASN1_item_d2i((ASN1_VALUE **)a, in, len,
714 &OCSP_SINGLERESP_it);
715 }
716
717 int
i2d_OCSP_SINGLERESP(OCSP_SINGLERESP * a,unsigned char ** out)718 i2d_OCSP_SINGLERESP(OCSP_SINGLERESP *a, unsigned char **out)
719 {
720 return ASN1_item_i2d((ASN1_VALUE *)a, out, &OCSP_SINGLERESP_it);
721 }
722
723 OCSP_SINGLERESP *
OCSP_SINGLERESP_new(void)724 OCSP_SINGLERESP_new(void)
725 {
726 return (OCSP_SINGLERESP *)ASN1_item_new(&OCSP_SINGLERESP_it);
727 }
728
729 void
OCSP_SINGLERESP_free(OCSP_SINGLERESP * a)730 OCSP_SINGLERESP_free(OCSP_SINGLERESP *a)
731 {
732 ASN1_item_free((ASN1_VALUE *)a, &OCSP_SINGLERESP_it);
733 }
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 *
d2i_OCSP_RESPDATA(OCSP_RESPDATA ** a,const unsigned char ** in,long len)785 d2i_OCSP_RESPDATA(OCSP_RESPDATA **a, const unsigned char **in, long len)
786 {
787 return (OCSP_RESPDATA *)ASN1_item_d2i((ASN1_VALUE **)a, in, len,
788 &OCSP_RESPDATA_it);
789 }
790
791 int
i2d_OCSP_RESPDATA(OCSP_RESPDATA * a,unsigned char ** out)792 i2d_OCSP_RESPDATA(OCSP_RESPDATA *a, unsigned char **out)
793 {
794 return ASN1_item_i2d((ASN1_VALUE *)a, out, &OCSP_RESPDATA_it);
795 }
796
797 OCSP_RESPDATA *
OCSP_RESPDATA_new(void)798 OCSP_RESPDATA_new(void)
799 {
800 return (OCSP_RESPDATA *)ASN1_item_new(&OCSP_RESPDATA_it);
801 }
802
803 void
OCSP_RESPDATA_free(OCSP_RESPDATA * a)804 OCSP_RESPDATA_free(OCSP_RESPDATA *a)
805 {
806 ASN1_item_free((ASN1_VALUE *)a, &OCSP_RESPDATA_it);
807 }
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 *
d2i_OCSP_BASICRESP(OCSP_BASICRESP ** a,const unsigned char ** in,long len)852 d2i_OCSP_BASICRESP(OCSP_BASICRESP **a, const unsigned char **in, long len)
853 {
854 return (OCSP_BASICRESP *)ASN1_item_d2i((ASN1_VALUE **)a, in, len,
855 &OCSP_BASICRESP_it);
856 }
857
858 int
i2d_OCSP_BASICRESP(OCSP_BASICRESP * a,unsigned char ** out)859 i2d_OCSP_BASICRESP(OCSP_BASICRESP *a, unsigned char **out)
860 {
861 return ASN1_item_i2d((ASN1_VALUE *)a, out, &OCSP_BASICRESP_it);
862 }
863
864 OCSP_BASICRESP *
OCSP_BASICRESP_new(void)865 OCSP_BASICRESP_new(void)
866 {
867 return (OCSP_BASICRESP *)ASN1_item_new(&OCSP_BASICRESP_it);
868 }
869
870 void
OCSP_BASICRESP_free(OCSP_BASICRESP * a)871 OCSP_BASICRESP_free(OCSP_BASICRESP *a)
872 {
873 ASN1_item_free((ASN1_VALUE *)a, &OCSP_BASICRESP_it);
874 }
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 *
d2i_OCSP_CRLID(OCSP_CRLID ** a,const unsigned char ** in,long len)912 d2i_OCSP_CRLID(OCSP_CRLID **a, const unsigned char **in, long len)
913 {
914 return (OCSP_CRLID *)ASN1_item_d2i((ASN1_VALUE **)a, in, len,
915 &OCSP_CRLID_it);
916 }
917
918 int
i2d_OCSP_CRLID(OCSP_CRLID * a,unsigned char ** out)919 i2d_OCSP_CRLID(OCSP_CRLID *a, unsigned char **out)
920 {
921 return ASN1_item_i2d((ASN1_VALUE *)a, out, &OCSP_CRLID_it);
922 }
923
924 OCSP_CRLID *
OCSP_CRLID_new(void)925 OCSP_CRLID_new(void)
926 {
927 return (OCSP_CRLID *)ASN1_item_new(&OCSP_CRLID_it);
928 }
929
930 void
OCSP_CRLID_free(OCSP_CRLID * a)931 OCSP_CRLID_free(OCSP_CRLID *a)
932 {
933 ASN1_item_free((ASN1_VALUE *)a, &OCSP_CRLID_it);
934 }
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 *
d2i_OCSP_SERVICELOC(OCSP_SERVICELOC ** a,const unsigned char ** in,long len)965 d2i_OCSP_SERVICELOC(OCSP_SERVICELOC **a, const unsigned char **in, long len)
966 {
967 return (OCSP_SERVICELOC *)ASN1_item_d2i((ASN1_VALUE **)a, in, len,
968 &OCSP_SERVICELOC_it);
969 }
970
971 int
i2d_OCSP_SERVICELOC(OCSP_SERVICELOC * a,unsigned char ** out)972 i2d_OCSP_SERVICELOC(OCSP_SERVICELOC *a, unsigned char **out)
973 {
974 return ASN1_item_i2d((ASN1_VALUE *)a, out, &OCSP_SERVICELOC_it);
975 }
976
977 OCSP_SERVICELOC *
OCSP_SERVICELOC_new(void)978 OCSP_SERVICELOC_new(void)
979 {
980 return (OCSP_SERVICELOC *)ASN1_item_new(&OCSP_SERVICELOC_it);
981 }
982
983 void
OCSP_SERVICELOC_free(OCSP_SERVICELOC * a)984 OCSP_SERVICELOC_free(OCSP_SERVICELOC *a)
985 {
986 ASN1_item_free((ASN1_VALUE *)a, &OCSP_SERVICELOC_it);
987 }
988