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 } 963