1 /* asn1t.h */ 2 /* 3 * Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL project 4 * 2000. 5 */ 6 /* ==================================================================== 7 * Copyright (c) 2000-2005 The OpenSSL Project. All rights reserved. 8 * 9 * Redistribution and use in source and binary forms, with or without 10 * modification, are permitted provided that the following conditions 11 * are met: 12 * 13 * 1. Redistributions of source code must retain the above copyright 14 * notice, this list of conditions and the following disclaimer. 15 * 16 * 2. Redistributions in binary form must reproduce the above copyright 17 * notice, this list of conditions and the following disclaimer in 18 * the documentation and/or other materials provided with the 19 * distribution. 20 * 21 * 3. All advertising materials mentioning features or use of this 22 * software must display the following acknowledgment: 23 * "This product includes software developed by the OpenSSL Project 24 * for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)" 25 * 26 * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to 27 * endorse or promote products derived from this software without 28 * prior written permission. For written permission, please contact 29 * licensing@OpenSSL.org. 30 * 31 * 5. Products derived from this software may not be called "OpenSSL" 32 * nor may "OpenSSL" appear in their names without prior written 33 * permission of the OpenSSL Project. 34 * 35 * 6. Redistributions of any form whatsoever must retain the following 36 * acknowledgment: 37 * "This product includes software developed by the OpenSSL Project 38 * for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)" 39 * 40 * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY 41 * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 42 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 43 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR 44 * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 45 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 46 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 47 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 48 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 49 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 50 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED 51 * OF THE POSSIBILITY OF SUCH DAMAGE. 52 * ==================================================================== 53 * 54 * This product includes cryptographic software written by Eric Young 55 * (eay@cryptsoft.com). This product includes software written by Tim 56 * Hudson (tjh@cryptsoft.com). 57 * 58 */ 59 #ifndef HEADER_ASN1T_H 60 # define HEADER_ASN1T_H 61 62 # include <stddef.h> 63 # include <openssl/e_os2.h> 64 # include <openssl/asn1.h> 65 66 # ifdef OPENSSL_BUILD_SHLIBCRYPTO 67 # undef OPENSSL_EXTERN 68 # define OPENSSL_EXTERN OPENSSL_EXPORT 69 # endif 70 71 /* ASN1 template defines, structures and functions */ 72 73 #ifdef __cplusplus 74 extern "C" { 75 #endif 76 77 # ifndef OPENSSL_EXPORT_VAR_AS_FUNCTION 78 79 /* Macro to obtain ASN1_ADB pointer from a type (only used internally) */ 80 # define ASN1_ADB_ptr(iptr) ((const ASN1_ADB *)(iptr)) 81 82 /* Macros for start and end of ASN1_ITEM definition */ 83 84 # define ASN1_ITEM_start(itname) \ 85 OPENSSL_GLOBAL const ASN1_ITEM itname##_it = { 86 87 # define ASN1_ITEM_end(itname) \ 88 }; 89 90 # else 91 92 /* Macro to obtain ASN1_ADB pointer from a type (only used internally) */ 93 # define ASN1_ADB_ptr(iptr) ((const ASN1_ADB *)(iptr())) 94 95 /* Macros for start and end of ASN1_ITEM definition */ 96 97 # define ASN1_ITEM_start(itname) \ 98 const ASN1_ITEM * itname##_it(void) \ 99 { \ 100 static const ASN1_ITEM local_it = { 101 102 # define ASN1_ITEM_end(itname) \ 103 }; \ 104 return &local_it; \ 105 } 106 107 # endif 108 109 /* Macros to aid ASN1 template writing */ 110 111 # define ASN1_ITEM_TEMPLATE(tname) \ 112 static const ASN1_TEMPLATE tname##_item_tt 113 114 # define ASN1_ITEM_TEMPLATE_END(tname) \ 115 ;\ 116 ASN1_ITEM_start(tname) \ 117 ASN1_ITYPE_PRIMITIVE,\ 118 -1,\ 119 &tname##_item_tt,\ 120 0,\ 121 NULL,\ 122 0,\ 123 #tname \ 124 ASN1_ITEM_end(tname) 125 126 /* This is a ASN1 type which just embeds a template */ 127 128 /*- 129 * This pair helps declare a SEQUENCE. We can do: 130 * 131 * ASN1_SEQUENCE(stname) = { 132 * ... SEQUENCE components ... 133 * } ASN1_SEQUENCE_END(stname) 134 * 135 * This will produce an ASN1_ITEM called stname_it 136 * for a structure called stname. 137 * 138 * If you want the same structure but a different 139 * name then use: 140 * 141 * ASN1_SEQUENCE(itname) = { 142 * ... SEQUENCE components ... 143 * } ASN1_SEQUENCE_END_name(stname, itname) 144 * 145 * This will create an item called itname_it using 146 * a structure called stname. 147 */ 148 149 # define ASN1_SEQUENCE(tname) \ 150 static const ASN1_TEMPLATE tname##_seq_tt[] 151 152 # define ASN1_SEQUENCE_END(stname) ASN1_SEQUENCE_END_name(stname, stname) 153 154 # define ASN1_SEQUENCE_END_name(stname, tname) \ 155 ;\ 156 ASN1_ITEM_start(tname) \ 157 ASN1_ITYPE_SEQUENCE,\ 158 V_ASN1_SEQUENCE,\ 159 tname##_seq_tt,\ 160 sizeof(tname##_seq_tt) / sizeof(ASN1_TEMPLATE),\ 161 NULL,\ 162 sizeof(stname),\ 163 #stname \ 164 ASN1_ITEM_end(tname) 165 166 # define ASN1_NDEF_SEQUENCE(tname) \ 167 ASN1_SEQUENCE(tname) 168 169 # define ASN1_NDEF_SEQUENCE_cb(tname, cb) \ 170 ASN1_SEQUENCE_cb(tname, cb) 171 172 # define ASN1_SEQUENCE_cb(tname, cb) \ 173 static const ASN1_AUX tname##_aux = {NULL, 0, 0, 0, cb, 0}; \ 174 ASN1_SEQUENCE(tname) 175 176 # define ASN1_BROKEN_SEQUENCE(tname) \ 177 static const ASN1_AUX tname##_aux = {NULL, ASN1_AFLG_BROKEN, 0, 0, 0, 0}; \ 178 ASN1_SEQUENCE(tname) 179 180 # define ASN1_SEQUENCE_ref(tname, cb, lck) \ 181 static const ASN1_AUX tname##_aux = {NULL, ASN1_AFLG_REFCOUNT, offsetof(tname, references), lck, cb, 0}; \ 182 ASN1_SEQUENCE(tname) 183 184 # define ASN1_SEQUENCE_enc(tname, enc, cb) \ 185 static const ASN1_AUX tname##_aux = {NULL, ASN1_AFLG_ENCODING, 0, 0, cb, offsetof(tname, enc)}; \ 186 ASN1_SEQUENCE(tname) 187 188 # define ASN1_NDEF_SEQUENCE_END(tname) \ 189 ;\ 190 ASN1_ITEM_start(tname) \ 191 ASN1_ITYPE_NDEF_SEQUENCE,\ 192 V_ASN1_SEQUENCE,\ 193 tname##_seq_tt,\ 194 sizeof(tname##_seq_tt) / sizeof(ASN1_TEMPLATE),\ 195 NULL,\ 196 sizeof(tname),\ 197 #tname \ 198 ASN1_ITEM_end(tname) 199 200 # define ASN1_BROKEN_SEQUENCE_END(stname) ASN1_SEQUENCE_END_ref(stname, stname) 201 202 # define ASN1_SEQUENCE_END_enc(stname, tname) ASN1_SEQUENCE_END_ref(stname, tname) 203 204 # define ASN1_SEQUENCE_END_cb(stname, tname) ASN1_SEQUENCE_END_ref(stname, tname) 205 206 # define ASN1_SEQUENCE_END_ref(stname, tname) \ 207 ;\ 208 ASN1_ITEM_start(tname) \ 209 ASN1_ITYPE_SEQUENCE,\ 210 V_ASN1_SEQUENCE,\ 211 tname##_seq_tt,\ 212 sizeof(tname##_seq_tt) / sizeof(ASN1_TEMPLATE),\ 213 &tname##_aux,\ 214 sizeof(stname),\ 215 #stname \ 216 ASN1_ITEM_end(tname) 217 218 # define ASN1_NDEF_SEQUENCE_END_cb(stname, tname) \ 219 ;\ 220 ASN1_ITEM_start(tname) \ 221 ASN1_ITYPE_NDEF_SEQUENCE,\ 222 V_ASN1_SEQUENCE,\ 223 tname##_seq_tt,\ 224 sizeof(tname##_seq_tt) / sizeof(ASN1_TEMPLATE),\ 225 &tname##_aux,\ 226 sizeof(stname),\ 227 #stname \ 228 ASN1_ITEM_end(tname) 229 230 /*- 231 * This pair helps declare a CHOICE type. We can do: 232 * 233 * ASN1_CHOICE(chname) = { 234 * ... CHOICE options ... 235 * ASN1_CHOICE_END(chname) 236 * 237 * This will produce an ASN1_ITEM called chname_it 238 * for a structure called chname. The structure 239 * definition must look like this: 240 * typedef struct { 241 * int type; 242 * union { 243 * ASN1_SOMETHING *opt1; 244 * ASN1_SOMEOTHER *opt2; 245 * } value; 246 * } chname; 247 * 248 * the name of the selector must be 'type'. 249 * to use an alternative selector name use the 250 * ASN1_CHOICE_END_selector() version. 251 */ 252 253 # define ASN1_CHOICE(tname) \ 254 static const ASN1_TEMPLATE tname##_ch_tt[] 255 256 # define ASN1_CHOICE_cb(tname, cb) \ 257 static const ASN1_AUX tname##_aux = {NULL, 0, 0, 0, cb, 0}; \ 258 ASN1_CHOICE(tname) 259 260 # define ASN1_CHOICE_END(stname) ASN1_CHOICE_END_name(stname, stname) 261 262 # define ASN1_CHOICE_END_name(stname, tname) ASN1_CHOICE_END_selector(stname, tname, type) 263 264 # define ASN1_CHOICE_END_selector(stname, tname, selname) \ 265 ;\ 266 ASN1_ITEM_start(tname) \ 267 ASN1_ITYPE_CHOICE,\ 268 offsetof(stname,selname) ,\ 269 tname##_ch_tt,\ 270 sizeof(tname##_ch_tt) / sizeof(ASN1_TEMPLATE),\ 271 NULL,\ 272 sizeof(stname),\ 273 #stname \ 274 ASN1_ITEM_end(tname) 275 276 # define ASN1_CHOICE_END_cb(stname, tname, selname) \ 277 ;\ 278 ASN1_ITEM_start(tname) \ 279 ASN1_ITYPE_CHOICE,\ 280 offsetof(stname,selname) ,\ 281 tname##_ch_tt,\ 282 sizeof(tname##_ch_tt) / sizeof(ASN1_TEMPLATE),\ 283 &tname##_aux,\ 284 sizeof(stname),\ 285 #stname \ 286 ASN1_ITEM_end(tname) 287 288 /* This helps with the template wrapper form of ASN1_ITEM */ 289 290 # define ASN1_EX_TEMPLATE_TYPE(flags, tag, name, type) { \ 291 (flags), (tag), 0,\ 292 #name, ASN1_ITEM_ref(type) } 293 294 /* These help with SEQUENCE or CHOICE components */ 295 296 /* used to declare other types */ 297 298 # define ASN1_EX_TYPE(flags, tag, stname, field, type) { \ 299 (flags), (tag), offsetof(stname, field),\ 300 #field, ASN1_ITEM_ref(type) } 301 302 /* used when the structure is combined with the parent */ 303 304 # define ASN1_EX_COMBINE(flags, tag, type) { \ 305 (flags)|ASN1_TFLG_COMBINE, (tag), 0, NULL, ASN1_ITEM_ref(type) } 306 307 /* implicit and explicit helper macros */ 308 309 # define ASN1_IMP_EX(stname, field, type, tag, ex) \ 310 ASN1_EX_TYPE(ASN1_TFLG_IMPLICIT | ex, tag, stname, field, type) 311 312 # define ASN1_EXP_EX(stname, field, type, tag, ex) \ 313 ASN1_EX_TYPE(ASN1_TFLG_EXPLICIT | ex, tag, stname, field, type) 314 315 /* Any defined by macros: the field used is in the table itself */ 316 317 # ifndef OPENSSL_EXPORT_VAR_AS_FUNCTION 318 # define ASN1_ADB_OBJECT(tblname) { ASN1_TFLG_ADB_OID, -1, 0, #tblname, (const ASN1_ITEM *)&(tblname##_adb) } 319 # define ASN1_ADB_INTEGER(tblname) { ASN1_TFLG_ADB_INT, -1, 0, #tblname, (const ASN1_ITEM *)&(tblname##_adb) } 320 # else 321 # define ASN1_ADB_OBJECT(tblname) { ASN1_TFLG_ADB_OID, -1, 0, #tblname, tblname##_adb } 322 # define ASN1_ADB_INTEGER(tblname) { ASN1_TFLG_ADB_INT, -1, 0, #tblname, tblname##_adb } 323 # endif 324 /* Plain simple type */ 325 # define ASN1_SIMPLE(stname, field, type) ASN1_EX_TYPE(0,0, stname, field, type) 326 327 /* OPTIONAL simple type */ 328 # define ASN1_OPT(stname, field, type) ASN1_EX_TYPE(ASN1_TFLG_OPTIONAL, 0, stname, field, type) 329 330 /* IMPLICIT tagged simple type */ 331 # define ASN1_IMP(stname, field, type, tag) ASN1_IMP_EX(stname, field, type, tag, 0) 332 333 /* IMPLICIT tagged OPTIONAL simple type */ 334 # define ASN1_IMP_OPT(stname, field, type, tag) ASN1_IMP_EX(stname, field, type, tag, ASN1_TFLG_OPTIONAL) 335 336 /* Same as above but EXPLICIT */ 337 338 # define ASN1_EXP(stname, field, type, tag) ASN1_EXP_EX(stname, field, type, tag, 0) 339 # define ASN1_EXP_OPT(stname, field, type, tag) ASN1_EXP_EX(stname, field, type, tag, ASN1_TFLG_OPTIONAL) 340 341 /* SEQUENCE OF type */ 342 # define ASN1_SEQUENCE_OF(stname, field, type) \ 343 ASN1_EX_TYPE(ASN1_TFLG_SEQUENCE_OF, 0, stname, field, type) 344 345 /* OPTIONAL SEQUENCE OF */ 346 # define ASN1_SEQUENCE_OF_OPT(stname, field, type) \ 347 ASN1_EX_TYPE(ASN1_TFLG_SEQUENCE_OF|ASN1_TFLG_OPTIONAL, 0, stname, field, type) 348 349 /* Same as above but for SET OF */ 350 351 # define ASN1_SET_OF(stname, field, type) \ 352 ASN1_EX_TYPE(ASN1_TFLG_SET_OF, 0, stname, field, type) 353 354 # define ASN1_SET_OF_OPT(stname, field, type) \ 355 ASN1_EX_TYPE(ASN1_TFLG_SET_OF|ASN1_TFLG_OPTIONAL, 0, stname, field, type) 356 357 /* Finally compound types of SEQUENCE, SET, IMPLICIT, EXPLICIT and OPTIONAL */ 358 359 # define ASN1_IMP_SET_OF(stname, field, type, tag) \ 360 ASN1_IMP_EX(stname, field, type, tag, ASN1_TFLG_SET_OF) 361 362 # define ASN1_EXP_SET_OF(stname, field, type, tag) \ 363 ASN1_EXP_EX(stname, field, type, tag, ASN1_TFLG_SET_OF) 364 365 # define ASN1_IMP_SET_OF_OPT(stname, field, type, tag) \ 366 ASN1_IMP_EX(stname, field, type, tag, ASN1_TFLG_SET_OF|ASN1_TFLG_OPTIONAL) 367 368 # define ASN1_EXP_SET_OF_OPT(stname, field, type, tag) \ 369 ASN1_EXP_EX(stname, field, type, tag, ASN1_TFLG_SET_OF|ASN1_TFLG_OPTIONAL) 370 371 # define ASN1_IMP_SEQUENCE_OF(stname, field, type, tag) \ 372 ASN1_IMP_EX(stname, field, type, tag, ASN1_TFLG_SEQUENCE_OF) 373 374 # define ASN1_IMP_SEQUENCE_OF_OPT(stname, field, type, tag) \ 375 ASN1_IMP_EX(stname, field, type, tag, ASN1_TFLG_SEQUENCE_OF|ASN1_TFLG_OPTIONAL) 376 377 # define ASN1_EXP_SEQUENCE_OF(stname, field, type, tag) \ 378 ASN1_EXP_EX(stname, field, type, tag, ASN1_TFLG_SEQUENCE_OF) 379 380 # define ASN1_EXP_SEQUENCE_OF_OPT(stname, field, type, tag) \ 381 ASN1_EXP_EX(stname, field, type, tag, ASN1_TFLG_SEQUENCE_OF|ASN1_TFLG_OPTIONAL) 382 383 /* EXPLICIT using indefinite length constructed form */ 384 # define ASN1_NDEF_EXP(stname, field, type, tag) \ 385 ASN1_EXP_EX(stname, field, type, tag, ASN1_TFLG_NDEF) 386 387 /* EXPLICIT OPTIONAL using indefinite length constructed form */ 388 # define ASN1_NDEF_EXP_OPT(stname, field, type, tag) \ 389 ASN1_EXP_EX(stname, field, type, tag, ASN1_TFLG_OPTIONAL|ASN1_TFLG_NDEF) 390 391 /* Macros for the ASN1_ADB structure */ 392 393 # define ASN1_ADB(name) \ 394 static const ASN1_ADB_TABLE name##_adbtbl[] 395 396 # ifndef OPENSSL_EXPORT_VAR_AS_FUNCTION 397 398 # define ASN1_ADB_END(name, flags, field, app_table, def, none) \ 399 ;\ 400 static const ASN1_ADB name##_adb = {\ 401 flags,\ 402 offsetof(name, field),\ 403 app_table,\ 404 name##_adbtbl,\ 405 sizeof(name##_adbtbl) / sizeof(ASN1_ADB_TABLE),\ 406 def,\ 407 none\ 408 } 409 410 # else 411 412 # define ASN1_ADB_END(name, flags, field, app_table, def, none) \ 413 ;\ 414 static const ASN1_ITEM *name##_adb(void) \ 415 { \ 416 static const ASN1_ADB internal_adb = \ 417 {\ 418 flags,\ 419 offsetof(name, field),\ 420 app_table,\ 421 name##_adbtbl,\ 422 sizeof(name##_adbtbl) / sizeof(ASN1_ADB_TABLE),\ 423 def,\ 424 none\ 425 }; \ 426 return (const ASN1_ITEM *) &internal_adb; \ 427 } \ 428 void dummy_function(void) 429 430 # endif 431 432 # define ADB_ENTRY(val, template) {val, template} 433 434 # define ASN1_ADB_TEMPLATE(name) \ 435 static const ASN1_TEMPLATE name##_tt 436 437 /* 438 * This is the ASN1 template structure that defines a wrapper round the 439 * actual type. It determines the actual position of the field in the value 440 * structure, various flags such as OPTIONAL and the field name. 441 */ 442 443 struct ASN1_TEMPLATE_st { 444 unsigned long flags; /* Various flags */ 445 long tag; /* tag, not used if no tagging */ 446 unsigned long offset; /* Offset of this field in structure */ 447 # ifndef NO_ASN1_FIELD_NAMES 448 const char *field_name; /* Field name */ 449 # endif 450 ASN1_ITEM_EXP *item; /* Relevant ASN1_ITEM or ASN1_ADB */ 451 }; 452 453 /* Macro to extract ASN1_ITEM and ASN1_ADB pointer from ASN1_TEMPLATE */ 454 455 # define ASN1_TEMPLATE_item(t) (t->item_ptr) 456 # define ASN1_TEMPLATE_adb(t) (t->item_ptr) 457 458 typedef struct ASN1_ADB_TABLE_st ASN1_ADB_TABLE; 459 typedef struct ASN1_ADB_st ASN1_ADB; 460 461 struct ASN1_ADB_st { 462 unsigned long flags; /* Various flags */ 463 unsigned long offset; /* Offset of selector field */ 464 STACK_OF(ASN1_ADB_TABLE) **app_items; /* Application defined items */ 465 const ASN1_ADB_TABLE *tbl; /* Table of possible types */ 466 long tblcount; /* Number of entries in tbl */ 467 const ASN1_TEMPLATE *default_tt; /* Type to use if no match */ 468 const ASN1_TEMPLATE *null_tt; /* Type to use if selector is NULL */ 469 }; 470 471 struct ASN1_ADB_TABLE_st { 472 long value; /* NID for an object or value for an int */ 473 const ASN1_TEMPLATE tt; /* item for this value */ 474 }; 475 476 /* template flags */ 477 478 /* Field is optional */ 479 # define ASN1_TFLG_OPTIONAL (0x1) 480 481 /* Field is a SET OF */ 482 # define ASN1_TFLG_SET_OF (0x1 << 1) 483 484 /* Field is a SEQUENCE OF */ 485 # define ASN1_TFLG_SEQUENCE_OF (0x2 << 1) 486 487 /* 488 * Special case: this refers to a SET OF that will be sorted into DER order 489 * when encoded *and* the corresponding STACK will be modified to match the 490 * new order. 491 */ 492 # define ASN1_TFLG_SET_ORDER (0x3 << 1) 493 494 /* Mask for SET OF or SEQUENCE OF */ 495 # define ASN1_TFLG_SK_MASK (0x3 << 1) 496 497 /* 498 * These flags mean the tag should be taken from the tag field. If EXPLICIT 499 * then the underlying type is used for the inner tag. 500 */ 501 502 /* IMPLICIT tagging */ 503 # define ASN1_TFLG_IMPTAG (0x1 << 3) 504 505 /* EXPLICIT tagging, inner tag from underlying type */ 506 # define ASN1_TFLG_EXPTAG (0x2 << 3) 507 508 # define ASN1_TFLG_TAG_MASK (0x3 << 3) 509 510 /* context specific IMPLICIT */ 511 # define ASN1_TFLG_IMPLICIT ASN1_TFLG_IMPTAG|ASN1_TFLG_CONTEXT 512 513 /* context specific EXPLICIT */ 514 # define ASN1_TFLG_EXPLICIT ASN1_TFLG_EXPTAG|ASN1_TFLG_CONTEXT 515 516 /* 517 * If tagging is in force these determine the type of tag to use. Otherwise 518 * the tag is determined by the underlying type. These values reflect the 519 * actual octet format. 520 */ 521 522 /* Universal tag */ 523 # define ASN1_TFLG_UNIVERSAL (0x0<<6) 524 /* Application tag */ 525 # define ASN1_TFLG_APPLICATION (0x1<<6) 526 /* Context specific tag */ 527 # define ASN1_TFLG_CONTEXT (0x2<<6) 528 /* Private tag */ 529 # define ASN1_TFLG_PRIVATE (0x3<<6) 530 531 # define ASN1_TFLG_TAG_CLASS (0x3<<6) 532 533 /* 534 * These are for ANY DEFINED BY type. In this case the 'item' field points to 535 * an ASN1_ADB structure which contains a table of values to decode the 536 * relevant type 537 */ 538 539 # define ASN1_TFLG_ADB_MASK (0x3<<8) 540 541 # define ASN1_TFLG_ADB_OID (0x1<<8) 542 543 # define ASN1_TFLG_ADB_INT (0x1<<9) 544 545 /* 546 * This flag means a parent structure is passed instead of the field: this is 547 * useful is a SEQUENCE is being combined with a CHOICE for example. Since 548 * this means the structure and item name will differ we need to use the 549 * ASN1_CHOICE_END_name() macro for example. 550 */ 551 552 # define ASN1_TFLG_COMBINE (0x1<<10) 553 554 /* 555 * This flag when present in a SEQUENCE OF, SET OF or EXPLICIT causes 556 * indefinite length constructed encoding to be used if required. 557 */ 558 559 # define ASN1_TFLG_NDEF (0x1<<11) 560 561 /* This is the actual ASN1 item itself */ 562 563 struct ASN1_ITEM_st { 564 char itype; /* The item type, primitive, SEQUENCE, CHOICE 565 * or extern */ 566 long utype; /* underlying type */ 567 const ASN1_TEMPLATE *templates; /* If SEQUENCE or CHOICE this contains 568 * the contents */ 569 long tcount; /* Number of templates if SEQUENCE or CHOICE */ 570 const void *funcs; /* functions that handle this type */ 571 long size; /* Structure size (usually) */ 572 # ifndef NO_ASN1_FIELD_NAMES 573 const char *sname; /* Structure name */ 574 # endif 575 }; 576 577 /*- 578 * These are values for the itype field and 579 * determine how the type is interpreted. 580 * 581 * For PRIMITIVE types the underlying type 582 * determines the behaviour if items is NULL. 583 * 584 * Otherwise templates must contain a single 585 * template and the type is treated in the 586 * same way as the type specified in the template. 587 * 588 * For SEQUENCE types the templates field points 589 * to the members, the size field is the 590 * structure size. 591 * 592 * For CHOICE types the templates field points 593 * to each possible member (typically a union) 594 * and the 'size' field is the offset of the 595 * selector. 596 * 597 * The 'funcs' field is used for application 598 * specific functions. 599 * 600 * For COMPAT types the funcs field gives a 601 * set of functions that handle this type, this 602 * supports the old d2i, i2d convention. 603 * 604 * The EXTERN type uses a new style d2i/i2d. 605 * The new style should be used where possible 606 * because it avoids things like the d2i IMPLICIT 607 * hack. 608 * 609 * MSTRING is a multiple string type, it is used 610 * for a CHOICE of character strings where the 611 * actual strings all occupy an ASN1_STRING 612 * structure. In this case the 'utype' field 613 * has a special meaning, it is used as a mask 614 * of acceptable types using the B_ASN1 constants. 615 * 616 * NDEF_SEQUENCE is the same as SEQUENCE except 617 * that it will use indefinite length constructed 618 * encoding if requested. 619 * 620 */ 621 622 # define ASN1_ITYPE_PRIMITIVE 0x0 623 624 # define ASN1_ITYPE_SEQUENCE 0x1 625 626 # define ASN1_ITYPE_CHOICE 0x2 627 628 # define ASN1_ITYPE_COMPAT 0x3 629 630 # define ASN1_ITYPE_EXTERN 0x4 631 632 # define ASN1_ITYPE_MSTRING 0x5 633 634 # define ASN1_ITYPE_NDEF_SEQUENCE 0x6 635 636 /* 637 * Cache for ASN1 tag and length, so we don't keep re-reading it for things 638 * like CHOICE 639 */ 640 641 struct ASN1_TLC_st { 642 char valid; /* Values below are valid */ 643 int ret; /* return value */ 644 long plen; /* length */ 645 int ptag; /* class value */ 646 int pclass; /* class value */ 647 int hdrlen; /* header length */ 648 }; 649 650 /* Typedefs for ASN1 function pointers */ 651 652 typedef ASN1_VALUE *ASN1_new_func(void); 653 typedef void ASN1_free_func(ASN1_VALUE *a); 654 typedef ASN1_VALUE *ASN1_d2i_func(ASN1_VALUE **a, const unsigned char **in, 655 long length); 656 typedef int ASN1_i2d_func(ASN1_VALUE *a, unsigned char **in); 657 658 typedef int ASN1_ex_d2i(ASN1_VALUE **pval, const unsigned char **in, long len, 659 const ASN1_ITEM *it, int tag, int aclass, char opt, 660 ASN1_TLC *ctx); 661 662 typedef int ASN1_ex_i2d(ASN1_VALUE **pval, unsigned char **out, 663 const ASN1_ITEM *it, int tag, int aclass); 664 typedef int ASN1_ex_new_func(ASN1_VALUE **pval, const ASN1_ITEM *it); 665 typedef void ASN1_ex_free_func(ASN1_VALUE **pval, const ASN1_ITEM *it); 666 667 typedef int ASN1_ex_print_func(BIO *out, ASN1_VALUE **pval, 668 int indent, const char *fname, 669 const ASN1_PCTX *pctx); 670 671 typedef int ASN1_primitive_i2c(ASN1_VALUE **pval, unsigned char *cont, 672 int *putype, const ASN1_ITEM *it); 673 typedef int ASN1_primitive_c2i(ASN1_VALUE **pval, const unsigned char *cont, 674 int len, int utype, char *free_cont, 675 const ASN1_ITEM *it); 676 typedef int ASN1_primitive_print(BIO *out, ASN1_VALUE **pval, 677 const ASN1_ITEM *it, int indent, 678 const ASN1_PCTX *pctx); 679 680 typedef struct ASN1_COMPAT_FUNCS_st { 681 ASN1_new_func *asn1_new; 682 ASN1_free_func *asn1_free; 683 ASN1_d2i_func *asn1_d2i; 684 ASN1_i2d_func *asn1_i2d; 685 } ASN1_COMPAT_FUNCS; 686 687 typedef struct ASN1_EXTERN_FUNCS_st { 688 void *app_data; 689 ASN1_ex_new_func *asn1_ex_new; 690 ASN1_ex_free_func *asn1_ex_free; 691 ASN1_ex_free_func *asn1_ex_clear; 692 ASN1_ex_d2i *asn1_ex_d2i; 693 ASN1_ex_i2d *asn1_ex_i2d; 694 ASN1_ex_print_func *asn1_ex_print; 695 } ASN1_EXTERN_FUNCS; 696 697 typedef struct ASN1_PRIMITIVE_FUNCS_st { 698 void *app_data; 699 unsigned long flags; 700 ASN1_ex_new_func *prim_new; 701 ASN1_ex_free_func *prim_free; 702 ASN1_ex_free_func *prim_clear; 703 ASN1_primitive_c2i *prim_c2i; 704 ASN1_primitive_i2c *prim_i2c; 705 ASN1_primitive_print *prim_print; 706 } ASN1_PRIMITIVE_FUNCS; 707 708 /* 709 * This is the ASN1_AUX structure: it handles various miscellaneous 710 * requirements. For example the use of reference counts and an informational 711 * callback. The "informational callback" is called at various points during 712 * the ASN1 encoding and decoding. It can be used to provide minor 713 * customisation of the structures used. This is most useful where the 714 * supplied routines *almost* do the right thing but need some extra help at 715 * a few points. If the callback returns zero then it is assumed a fatal 716 * error has occurred and the main operation should be abandoned. If major 717 * changes in the default behaviour are required then an external type is 718 * more appropriate. 719 */ 720 721 typedef int ASN1_aux_cb(int operation, ASN1_VALUE **in, const ASN1_ITEM *it, 722 void *exarg); 723 724 typedef struct ASN1_AUX_st { 725 void *app_data; 726 int flags; 727 int ref_offset; /* Offset of reference value */ 728 int ref_lock; /* Lock type to use */ 729 ASN1_aux_cb *asn1_cb; 730 int enc_offset; /* Offset of ASN1_ENCODING structure */ 731 } ASN1_AUX; 732 733 /* For print related callbacks exarg points to this structure */ 734 typedef struct ASN1_PRINT_ARG_st { 735 BIO *out; 736 int indent; 737 const ASN1_PCTX *pctx; 738 } ASN1_PRINT_ARG; 739 740 /* For streaming related callbacks exarg points to this structure */ 741 typedef struct ASN1_STREAM_ARG_st { 742 /* BIO to stream through */ 743 BIO *out; 744 /* BIO with filters appended */ 745 BIO *ndef_bio; 746 /* Streaming I/O boundary */ 747 unsigned char **boundary; 748 } ASN1_STREAM_ARG; 749 750 /* Flags in ASN1_AUX */ 751 752 /* Use a reference count */ 753 # define ASN1_AFLG_REFCOUNT 1 754 /* Save the encoding of structure (useful for signatures) */ 755 # define ASN1_AFLG_ENCODING 2 756 /* The Sequence length is invalid */ 757 # define ASN1_AFLG_BROKEN 4 758 759 /* operation values for asn1_cb */ 760 761 # define ASN1_OP_NEW_PRE 0 762 # define ASN1_OP_NEW_POST 1 763 # define ASN1_OP_FREE_PRE 2 764 # define ASN1_OP_FREE_POST 3 765 # define ASN1_OP_D2I_PRE 4 766 # define ASN1_OP_D2I_POST 5 767 # define ASN1_OP_I2D_PRE 6 768 # define ASN1_OP_I2D_POST 7 769 # define ASN1_OP_PRINT_PRE 8 770 # define ASN1_OP_PRINT_POST 9 771 # define ASN1_OP_STREAM_PRE 10 772 # define ASN1_OP_STREAM_POST 11 773 # define ASN1_OP_DETACHED_PRE 12 774 # define ASN1_OP_DETACHED_POST 13 775 776 /* Macro to implement a primitive type */ 777 # define IMPLEMENT_ASN1_TYPE(stname) IMPLEMENT_ASN1_TYPE_ex(stname, stname, 0) 778 # define IMPLEMENT_ASN1_TYPE_ex(itname, vname, ex) \ 779 ASN1_ITEM_start(itname) \ 780 ASN1_ITYPE_PRIMITIVE, V_##vname, NULL, 0, NULL, ex, #itname \ 781 ASN1_ITEM_end(itname) 782 783 /* Macro to implement a multi string type */ 784 # define IMPLEMENT_ASN1_MSTRING(itname, mask) \ 785 ASN1_ITEM_start(itname) \ 786 ASN1_ITYPE_MSTRING, mask, NULL, 0, NULL, sizeof(ASN1_STRING), #itname \ 787 ASN1_ITEM_end(itname) 788 789 /* Macro to implement an ASN1_ITEM in terms of old style funcs */ 790 791 # define IMPLEMENT_COMPAT_ASN1(sname) IMPLEMENT_COMPAT_ASN1_type(sname, V_ASN1_SEQUENCE) 792 793 # define IMPLEMENT_COMPAT_ASN1_type(sname, tag) \ 794 static const ASN1_COMPAT_FUNCS sname##_ff = { \ 795 (ASN1_new_func *)sname##_new, \ 796 (ASN1_free_func *)sname##_free, \ 797 (ASN1_d2i_func *)d2i_##sname, \ 798 (ASN1_i2d_func *)i2d_##sname, \ 799 }; \ 800 ASN1_ITEM_start(sname) \ 801 ASN1_ITYPE_COMPAT, \ 802 tag, \ 803 NULL, \ 804 0, \ 805 &sname##_ff, \ 806 0, \ 807 #sname \ 808 ASN1_ITEM_end(sname) 809 810 # define IMPLEMENT_EXTERN_ASN1(sname, tag, fptrs) \ 811 ASN1_ITEM_start(sname) \ 812 ASN1_ITYPE_EXTERN, \ 813 tag, \ 814 NULL, \ 815 0, \ 816 &fptrs, \ 817 0, \ 818 #sname \ 819 ASN1_ITEM_end(sname) 820 821 /* Macro to implement standard functions in terms of ASN1_ITEM structures */ 822 823 # define IMPLEMENT_ASN1_FUNCTIONS(stname) IMPLEMENT_ASN1_FUNCTIONS_fname(stname, stname, stname) 824 825 # define IMPLEMENT_ASN1_FUNCTIONS_name(stname, itname) IMPLEMENT_ASN1_FUNCTIONS_fname(stname, itname, itname) 826 827 # define IMPLEMENT_ASN1_FUNCTIONS_ENCODE_name(stname, itname) \ 828 IMPLEMENT_ASN1_FUNCTIONS_ENCODE_fname(stname, itname, itname) 829 830 # define IMPLEMENT_STATIC_ASN1_ALLOC_FUNCTIONS(stname) \ 831 IMPLEMENT_ASN1_ALLOC_FUNCTIONS_pfname(static, stname, stname, stname) 832 833 # define IMPLEMENT_ASN1_ALLOC_FUNCTIONS(stname) \ 834 IMPLEMENT_ASN1_ALLOC_FUNCTIONS_fname(stname, stname, stname) 835 836 # define IMPLEMENT_ASN1_ALLOC_FUNCTIONS_pfname(pre, stname, itname, fname) \ 837 pre stname *fname##_new(void) \ 838 { \ 839 return (stname *)ASN1_item_new(ASN1_ITEM_rptr(itname)); \ 840 } \ 841 pre void fname##_free(stname *a) \ 842 { \ 843 ASN1_item_free((ASN1_VALUE *)a, ASN1_ITEM_rptr(itname)); \ 844 } 845 846 # define IMPLEMENT_ASN1_ALLOC_FUNCTIONS_fname(stname, itname, fname) \ 847 stname *fname##_new(void) \ 848 { \ 849 return (stname *)ASN1_item_new(ASN1_ITEM_rptr(itname)); \ 850 } \ 851 void fname##_free(stname *a) \ 852 { \ 853 ASN1_item_free((ASN1_VALUE *)a, ASN1_ITEM_rptr(itname)); \ 854 } 855 856 # define IMPLEMENT_ASN1_FUNCTIONS_fname(stname, itname, fname) \ 857 IMPLEMENT_ASN1_ENCODE_FUNCTIONS_fname(stname, itname, fname) \ 858 IMPLEMENT_ASN1_ALLOC_FUNCTIONS_fname(stname, itname, fname) 859 860 # define IMPLEMENT_ASN1_ENCODE_FUNCTIONS_fname(stname, itname, fname) \ 861 stname *d2i_##fname(stname **a, const unsigned char **in, long len) \ 862 { \ 863 return (stname *)ASN1_item_d2i((ASN1_VALUE **)a, in, len, ASN1_ITEM_rptr(itname));\ 864 } \ 865 int i2d_##fname(stname *a, unsigned char **out) \ 866 { \ 867 return ASN1_item_i2d((ASN1_VALUE *)a, out, ASN1_ITEM_rptr(itname));\ 868 } 869 870 # define IMPLEMENT_ASN1_NDEF_FUNCTION(stname) \ 871 int i2d_##stname##_NDEF(stname *a, unsigned char **out) \ 872 { \ 873 return ASN1_item_ndef_i2d((ASN1_VALUE *)a, out, ASN1_ITEM_rptr(stname));\ 874 } 875 876 /* 877 * This includes evil casts to remove const: they will go away when full ASN1 878 * constification is done. 879 */ 880 # define IMPLEMENT_ASN1_ENCODE_FUNCTIONS_const_fname(stname, itname, fname) \ 881 stname *d2i_##fname(stname **a, const unsigned char **in, long len) \ 882 { \ 883 return (stname *)ASN1_item_d2i((ASN1_VALUE **)a, in, len, ASN1_ITEM_rptr(itname));\ 884 } \ 885 int i2d_##fname(const stname *a, unsigned char **out) \ 886 { \ 887 return ASN1_item_i2d((ASN1_VALUE *)a, out, ASN1_ITEM_rptr(itname));\ 888 } 889 890 # define IMPLEMENT_ASN1_DUP_FUNCTION(stname) \ 891 stname * stname##_dup(stname *x) \ 892 { \ 893 return ASN1_item_dup(ASN1_ITEM_rptr(stname), x); \ 894 } 895 896 # define IMPLEMENT_ASN1_PRINT_FUNCTION(stname) \ 897 IMPLEMENT_ASN1_PRINT_FUNCTION_fname(stname, stname, stname) 898 899 # define IMPLEMENT_ASN1_PRINT_FUNCTION_fname(stname, itname, fname) \ 900 int fname##_print_ctx(BIO *out, stname *x, int indent, \ 901 const ASN1_PCTX *pctx) \ 902 { \ 903 return ASN1_item_print(out, (ASN1_VALUE *)x, indent, \ 904 ASN1_ITEM_rptr(itname), pctx); \ 905 } 906 907 # define IMPLEMENT_ASN1_FUNCTIONS_const(name) \ 908 IMPLEMENT_ASN1_FUNCTIONS_const_fname(name, name, name) 909 910 # define IMPLEMENT_ASN1_FUNCTIONS_const_fname(stname, itname, fname) \ 911 IMPLEMENT_ASN1_ENCODE_FUNCTIONS_const_fname(stname, itname, fname) \ 912 IMPLEMENT_ASN1_ALLOC_FUNCTIONS_fname(stname, itname, fname) 913 914 /* external definitions for primitive types */ 915 916 DECLARE_ASN1_ITEM(ASN1_BOOLEAN) 917 DECLARE_ASN1_ITEM(ASN1_TBOOLEAN) 918 DECLARE_ASN1_ITEM(ASN1_FBOOLEAN) 919 DECLARE_ASN1_ITEM(ASN1_SEQUENCE) 920 DECLARE_ASN1_ITEM(CBIGNUM) 921 DECLARE_ASN1_ITEM(BIGNUM) 922 DECLARE_ASN1_ITEM(LONG) 923 DECLARE_ASN1_ITEM(ZLONG) 924 925 DECLARE_STACK_OF(ASN1_VALUE) 926 927 /* Functions used internally by the ASN1 code */ 928 929 int ASN1_item_ex_new(ASN1_VALUE **pval, const ASN1_ITEM *it); 930 void ASN1_item_ex_free(ASN1_VALUE **pval, const ASN1_ITEM *it); 931 int ASN1_template_new(ASN1_VALUE **pval, const ASN1_TEMPLATE *tt); 932 int ASN1_primitive_new(ASN1_VALUE **pval, const ASN1_ITEM *it); 933 934 void ASN1_template_free(ASN1_VALUE **pval, const ASN1_TEMPLATE *tt); 935 int ASN1_template_d2i(ASN1_VALUE **pval, const unsigned char **in, long len, 936 const ASN1_TEMPLATE *tt); 937 int ASN1_item_ex_d2i(ASN1_VALUE **pval, const unsigned char **in, long len, 938 const ASN1_ITEM *it, int tag, int aclass, char opt, 939 ASN1_TLC *ctx); 940 941 int ASN1_item_ex_i2d(ASN1_VALUE **pval, unsigned char **out, 942 const ASN1_ITEM *it, int tag, int aclass); 943 int ASN1_template_i2d(ASN1_VALUE **pval, unsigned char **out, 944 const ASN1_TEMPLATE *tt); 945 void ASN1_primitive_free(ASN1_VALUE **pval, const ASN1_ITEM *it); 946 947 int asn1_ex_i2c(ASN1_VALUE **pval, unsigned char *cont, int *putype, 948 const ASN1_ITEM *it); 949 int asn1_ex_c2i(ASN1_VALUE **pval, const unsigned char *cont, int len, 950 int utype, char *free_cont, const ASN1_ITEM *it); 951 952 int asn1_get_choice_selector(ASN1_VALUE **pval, const ASN1_ITEM *it); 953 int asn1_set_choice_selector(ASN1_VALUE **pval, int value, 954 const ASN1_ITEM *it); 955 956 ASN1_VALUE **asn1_get_field_ptr(ASN1_VALUE **pval, const ASN1_TEMPLATE *tt); 957 958 const ASN1_TEMPLATE *asn1_do_adb(ASN1_VALUE **pval, const ASN1_TEMPLATE *tt, 959 int nullerr); 960 961 int asn1_do_lock(ASN1_VALUE **pval, int op, const ASN1_ITEM *it); 962 963 void asn1_enc_init(ASN1_VALUE **pval, const ASN1_ITEM *it); 964 void asn1_enc_free(ASN1_VALUE **pval, const ASN1_ITEM *it); 965 int asn1_enc_restore(int *len, unsigned char **out, ASN1_VALUE **pval, 966 const ASN1_ITEM *it); 967 int asn1_enc_save(ASN1_VALUE **pval, const unsigned char *in, int inlen, 968 const ASN1_ITEM *it); 969 970 #ifdef __cplusplus 971 } 972 #endif 973 #endif 974