1 /* $NetBSD: asn1parse.y,v 1.2 2017/01/28 21:31:45 christos Exp $ */ 2 3 /* 4 * Copyright (c) 1997 - 2007 Kungliga Tekniska Högskolan 5 * (Royal Institute of Technology, Stockholm, Sweden). 6 * All rights reserved. 7 * 8 * Portions Copyright (c) 2009 Apple Inc. All rights reserved. 9 * 10 * Redistribution and use in source and binary forms, with or without 11 * modification, are permitted provided that the following conditions 12 * are met: 13 * 14 * 1. Redistributions of source code must retain the above copyright 15 * notice, this list of conditions and the following disclaimer. 16 * 17 * 2. Redistributions in binary form must reproduce the above copyright 18 * notice, this list of conditions and the following disclaimer in the 19 * documentation and/or other materials provided with the distribution. 20 * 21 * 3. Neither the name of the Institute nor the names of its contributors 22 * may be used to endorse or promote products derived from this software 23 * without specific prior written permission. 24 * 25 * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND 26 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 27 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 28 * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE 29 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 30 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 31 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 32 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 33 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 34 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 35 * SUCH DAMAGE. 36 */ 37 38 /* Id */ 39 40 %{ 41 42 #include <config.h> 43 44 #include <stdio.h> 45 #include <stdlib.h> 46 #include <stdint.h> 47 #include <string.h> 48 #include "symbol.h" 49 #include "lex.h" 50 #include "gen_locl.h" 51 #include "der.h" 52 53 static Type *new_type (Typetype t); 54 static struct constraint_spec *new_constraint_spec(enum ctype); 55 static Type *new_tag(int tagclass, int tagvalue, int tagenv, Type *oldtype); 56 void yyerror (const char *); 57 static struct objid *new_objid(const char *label, int value); 58 static void add_oid_to_tail(struct objid *, struct objid *); 59 static void fix_labels(Symbol *s); 60 61 struct string_list { 62 char *string; 63 struct string_list *next; 64 }; 65 66 static int default_tag_env = TE_EXPLICIT; 67 68 /* Declarations for Bison */ 69 #define YYMALLOC malloc 70 #define YYFREE free 71 72 %} 73 74 %union { 75 int64_t constant; 76 struct value *value; 77 struct range *range; 78 char *name; 79 Type *type; 80 Member *member; 81 struct objid *objid; 82 char *defval; 83 struct string_list *sl; 84 struct tagtype tag; 85 struct memhead *members; 86 struct constraint_spec *constraint_spec; 87 } 88 89 %token kw_ABSENT 90 %token kw_ABSTRACT_SYNTAX 91 %token kw_ALL 92 %token kw_APPLICATION 93 %token kw_AUTOMATIC 94 %token kw_BEGIN 95 %token kw_BIT 96 %token kw_BMPString 97 %token kw_BOOLEAN 98 %token kw_BY 99 %token kw_CHARACTER 100 %token kw_CHOICE 101 %token kw_CLASS 102 %token kw_COMPONENT 103 %token kw_COMPONENTS 104 %token kw_CONSTRAINED 105 %token kw_CONTAINING 106 %token kw_DEFAULT 107 %token kw_DEFINITIONS 108 %token kw_EMBEDDED 109 %token kw_ENCODED 110 %token kw_END 111 %token kw_ENUMERATED 112 %token kw_EXCEPT 113 %token kw_EXPLICIT 114 %token kw_EXPORTS 115 %token kw_EXTENSIBILITY 116 %token kw_EXTERNAL 117 %token kw_FALSE 118 %token kw_FROM 119 %token kw_GeneralString 120 %token kw_GeneralizedTime 121 %token kw_GraphicString 122 %token kw_IA5String 123 %token kw_IDENTIFIER 124 %token kw_IMPLICIT 125 %token kw_IMPLIED 126 %token kw_IMPORTS 127 %token kw_INCLUDES 128 %token kw_INSTANCE 129 %token kw_INTEGER 130 %token kw_INTERSECTION 131 %token kw_ISO646String 132 %token kw_MAX 133 %token kw_MIN 134 %token kw_MINUS_INFINITY 135 %token kw_NULL 136 %token kw_NumericString 137 %token kw_OBJECT 138 %token kw_OCTET 139 %token kw_OF 140 %token kw_OPTIONAL 141 %token kw_ObjectDescriptor 142 %token kw_PATTERN 143 %token kw_PDV 144 %token kw_PLUS_INFINITY 145 %token kw_PRESENT 146 %token kw_PRIVATE 147 %token kw_PrintableString 148 %token kw_REAL 149 %token kw_RELATIVE_OID 150 %token kw_SEQUENCE 151 %token kw_SET 152 %token kw_SIZE 153 %token kw_STRING 154 %token kw_SYNTAX 155 %token kw_T61String 156 %token kw_TAGS 157 %token kw_TRUE 158 %token kw_TYPE_IDENTIFIER 159 %token kw_TeletexString 160 %token kw_UNION 161 %token kw_UNIQUE 162 %token kw_UNIVERSAL 163 %token kw_UTCTime 164 %token kw_UTF8String 165 %token kw_UniversalString 166 %token kw_VideotexString 167 %token kw_VisibleString 168 %token kw_WITH 169 170 %token RANGE 171 %token EEQUAL 172 %token ELLIPSIS 173 174 %token <name> IDENTIFIER referencename 175 %token <name> STRING 176 177 %token <constant> NUMBER 178 %type <constant> SignedNumber 179 %type <constant> Class tagenv 180 181 %type <value> Value 182 %type <value> BuiltinValue 183 %type <value> IntegerValue 184 %type <value> BooleanValue 185 %type <value> ObjectIdentifierValue 186 %type <value> CharacterStringValue 187 %type <value> NullValue 188 %type <value> DefinedValue 189 %type <value> ReferencedValue 190 %type <value> Valuereference 191 192 %type <type> Type 193 %type <type> BuiltinType 194 %type <type> BitStringType 195 %type <type> BooleanType 196 %type <type> ChoiceType 197 %type <type> ConstrainedType 198 %type <type> EnumeratedType 199 %type <type> IntegerType 200 %type <type> NullType 201 %type <type> OctetStringType 202 %type <type> SequenceType 203 %type <type> SequenceOfType 204 %type <type> SetType 205 %type <type> SetOfType 206 %type <type> TaggedType 207 %type <type> ReferencedType 208 %type <type> DefinedType 209 %type <type> UsefulType 210 %type <type> ObjectIdentifierType 211 %type <type> CharacterStringType 212 %type <type> RestrictedCharactedStringType 213 214 %type <tag> Tag 215 216 %type <member> ComponentType 217 %type <member> NamedBit 218 %type <member> NamedNumber 219 %type <member> NamedType 220 %type <members> ComponentTypeList 221 %type <members> Enumerations 222 %type <members> NamedBitList 223 %type <members> NamedNumberList 224 225 %type <objid> objid objid_list objid_element objid_opt 226 %type <range> range size 227 228 %type <sl> referencenames 229 230 %type <constraint_spec> Constraint 231 %type <constraint_spec> ConstraintSpec 232 %type <constraint_spec> GeneralConstraint 233 %type <constraint_spec> ContentsConstraint 234 %type <constraint_spec> UserDefinedConstraint 235 236 237 238 %start ModuleDefinition 239 240 %% 241 242 ModuleDefinition: IDENTIFIER objid_opt kw_DEFINITIONS TagDefault ExtensionDefault 243 EEQUAL kw_BEGIN ModuleBody kw_END 244 { 245 checkundefined(); 246 } 247 ; 248 249 TagDefault : kw_EXPLICIT kw_TAGS 250 { default_tag_env = TE_EXPLICIT; } 251 | kw_IMPLICIT kw_TAGS 252 { default_tag_env = TE_IMPLICIT; } 253 | kw_AUTOMATIC kw_TAGS 254 { lex_error_message("automatic tagging is not supported"); } 255 | /* empty */ 256 ; 257 258 ExtensionDefault: kw_EXTENSIBILITY kw_IMPLIED 259 { lex_error_message("no extensibility options supported"); } 260 | /* empty */ 261 ; 262 263 ModuleBody : Exports Imports AssignmentList 264 | /* empty */ 265 ; 266 267 Imports : kw_IMPORTS SymbolsImported ';' 268 | /* empty */ 269 ; 270 271 SymbolsImported : SymbolsFromModuleList 272 | /* empty */ 273 ; 274 275 SymbolsFromModuleList: SymbolsFromModule 276 | SymbolsFromModuleList SymbolsFromModule 277 ; 278 279 SymbolsFromModule: referencenames kw_FROM IDENTIFIER objid_opt 280 { 281 struct string_list *sl; 282 for(sl = $1; sl != NULL; sl = sl->next) { 283 Symbol *s = addsym(sl->string); 284 s->stype = Stype; 285 gen_template_import(s); 286 } 287 add_import($3); 288 } 289 ; 290 291 Exports : kw_EXPORTS referencenames ';' 292 { 293 struct string_list *sl; 294 for(sl = $2; sl != NULL; sl = sl->next) 295 add_export(sl->string); 296 } 297 | kw_EXPORTS kw_ALL 298 | /* empty */ 299 ; 300 301 AssignmentList : Assignment 302 | Assignment AssignmentList 303 ; 304 305 Assignment : TypeAssignment 306 | ValueAssignment 307 ; 308 309 referencenames : IDENTIFIER ',' referencenames 310 { 311 $$ = emalloc(sizeof(*$$)); 312 $$->string = $1; 313 $$->next = $3; 314 } 315 | IDENTIFIER 316 { 317 $$ = emalloc(sizeof(*$$)); 318 $$->string = $1; 319 $$->next = NULL; 320 } 321 ; 322 323 TypeAssignment : IDENTIFIER EEQUAL Type 324 { 325 Symbol *s = addsym ($1); 326 s->stype = Stype; 327 s->type = $3; 328 fix_labels(s); 329 generate_type (s); 330 } 331 ; 332 333 Type : BuiltinType 334 | ReferencedType 335 | ConstrainedType 336 ; 337 338 BuiltinType : BitStringType 339 | BooleanType 340 | CharacterStringType 341 | ChoiceType 342 | EnumeratedType 343 | IntegerType 344 | NullType 345 | ObjectIdentifierType 346 | OctetStringType 347 | SequenceType 348 | SequenceOfType 349 | SetType 350 | SetOfType 351 | TaggedType 352 ; 353 354 BooleanType : kw_BOOLEAN 355 { 356 $$ = new_tag(ASN1_C_UNIV, UT_Boolean, 357 TE_EXPLICIT, new_type(TBoolean)); 358 } 359 ; 360 361 range : '(' Value RANGE Value ')' 362 { 363 if($2->type != integervalue) 364 lex_error_message("Non-integer used in first part of range"); 365 if($2->type != integervalue) 366 lex_error_message("Non-integer in second part of range"); 367 $$ = ecalloc(1, sizeof(*$$)); 368 $$->min = $2->u.integervalue; 369 $$->max = $4->u.integervalue; 370 } 371 | '(' Value RANGE kw_MAX ')' 372 { 373 if($2->type != integervalue) 374 lex_error_message("Non-integer in first part of range"); 375 $$ = ecalloc(1, sizeof(*$$)); 376 $$->min = $2->u.integervalue; 377 $$->max = INT_MAX; 378 } 379 | '(' kw_MIN RANGE Value ')' 380 { 381 if($4->type != integervalue) 382 lex_error_message("Non-integer in second part of range"); 383 $$ = ecalloc(1, sizeof(*$$)); 384 $$->min = INT_MIN; 385 $$->max = $4->u.integervalue; 386 } 387 | '(' Value ')' 388 { 389 if($2->type != integervalue) 390 lex_error_message("Non-integer used in limit"); 391 $$ = ecalloc(1, sizeof(*$$)); 392 $$->min = $2->u.integervalue; 393 $$->max = $2->u.integervalue; 394 } 395 ; 396 397 398 IntegerType : kw_INTEGER 399 { 400 $$ = new_tag(ASN1_C_UNIV, UT_Integer, 401 TE_EXPLICIT, new_type(TInteger)); 402 } 403 | kw_INTEGER range 404 { 405 $$ = new_type(TInteger); 406 $$->range = $2; 407 $$ = new_tag(ASN1_C_UNIV, UT_Integer, TE_EXPLICIT, $$); 408 } 409 | kw_INTEGER '{' NamedNumberList '}' 410 { 411 $$ = new_type(TInteger); 412 $$->members = $3; 413 $$ = new_tag(ASN1_C_UNIV, UT_Integer, TE_EXPLICIT, $$); 414 } 415 ; 416 417 NamedNumberList : NamedNumber 418 { 419 $$ = emalloc(sizeof(*$$)); 420 ASN1_TAILQ_INIT($$); 421 ASN1_TAILQ_INSERT_HEAD($$, $1, members); 422 } 423 | NamedNumberList ',' NamedNumber 424 { 425 ASN1_TAILQ_INSERT_TAIL($1, $3, members); 426 $$ = $1; 427 } 428 | NamedNumberList ',' ELLIPSIS 429 { $$ = $1; } /* XXX used for Enumerations */ 430 ; 431 432 NamedNumber : IDENTIFIER '(' SignedNumber ')' 433 { 434 $$ = emalloc(sizeof(*$$)); 435 $$->name = $1; 436 $$->gen_name = estrdup($1); 437 output_name ($$->gen_name); 438 $$->val = $3; 439 $$->optional = 0; 440 $$->ellipsis = 0; 441 $$->type = NULL; 442 } 443 ; 444 445 EnumeratedType : kw_ENUMERATED '{' Enumerations '}' 446 { 447 $$ = new_type(TInteger); 448 $$->members = $3; 449 $$ = new_tag(ASN1_C_UNIV, UT_Enumerated, TE_EXPLICIT, $$); 450 } 451 ; 452 453 Enumerations : NamedNumberList /* XXX */ 454 ; 455 456 BitStringType : kw_BIT kw_STRING 457 { 458 $$ = new_type(TBitString); 459 $$->members = emalloc(sizeof(*$$->members)); 460 ASN1_TAILQ_INIT($$->members); 461 $$ = new_tag(ASN1_C_UNIV, UT_BitString, TE_EXPLICIT, $$); 462 } 463 | kw_BIT kw_STRING '{' NamedBitList '}' 464 { 465 $$ = new_type(TBitString); 466 $$->members = $4; 467 $$ = new_tag(ASN1_C_UNIV, UT_BitString, TE_EXPLICIT, $$); 468 } 469 ; 470 471 ObjectIdentifierType: kw_OBJECT kw_IDENTIFIER 472 { 473 $$ = new_tag(ASN1_C_UNIV, UT_OID, 474 TE_EXPLICIT, new_type(TOID)); 475 } 476 ; 477 OctetStringType : kw_OCTET kw_STRING size 478 { 479 Type *t = new_type(TOctetString); 480 t->range = $3; 481 if (t->range) { 482 if (t->range->min < 0) 483 lex_error_message("can't use a negative SIZE range " 484 "length for OCTET STRING"); 485 } 486 $$ = new_tag(ASN1_C_UNIV, UT_OctetString, 487 TE_EXPLICIT, t); 488 } 489 ; 490 491 NullType : kw_NULL 492 { 493 $$ = new_tag(ASN1_C_UNIV, UT_Null, 494 TE_EXPLICIT, new_type(TNull)); 495 } 496 ; 497 498 size : 499 { $$ = NULL; } 500 | kw_SIZE range 501 { $$ = $2; } 502 ; 503 504 505 SequenceType : kw_SEQUENCE '{' /* ComponentTypeLists */ ComponentTypeList '}' 506 { 507 $$ = new_type(TSequence); 508 $$->members = $3; 509 $$ = new_tag(ASN1_C_UNIV, UT_Sequence, default_tag_env, $$); 510 } 511 | kw_SEQUENCE '{' '}' 512 { 513 $$ = new_type(TSequence); 514 $$->members = NULL; 515 $$ = new_tag(ASN1_C_UNIV, UT_Sequence, default_tag_env, $$); 516 } 517 ; 518 519 SequenceOfType : kw_SEQUENCE size kw_OF Type 520 { 521 $$ = new_type(TSequenceOf); 522 $$->range = $2; 523 if ($$->range) { 524 if ($$->range->min < 0) 525 lex_error_message("can't use a negative SIZE range " 526 "length for SEQUENCE OF"); 527 } 528 529 $$->subtype = $4; 530 $$ = new_tag(ASN1_C_UNIV, UT_Sequence, default_tag_env, $$); 531 } 532 ; 533 534 SetType : kw_SET '{' /* ComponentTypeLists */ ComponentTypeList '}' 535 { 536 $$ = new_type(TSet); 537 $$->members = $3; 538 $$ = new_tag(ASN1_C_UNIV, UT_Set, default_tag_env, $$); 539 } 540 | kw_SET '{' '}' 541 { 542 $$ = new_type(TSet); 543 $$->members = NULL; 544 $$ = new_tag(ASN1_C_UNIV, UT_Set, default_tag_env, $$); 545 } 546 ; 547 548 SetOfType : kw_SET kw_OF Type 549 { 550 $$ = new_type(TSetOf); 551 $$->subtype = $3; 552 $$ = new_tag(ASN1_C_UNIV, UT_Set, default_tag_env, $$); 553 } 554 ; 555 556 ChoiceType : kw_CHOICE '{' /* AlternativeTypeLists */ ComponentTypeList '}' 557 { 558 $$ = new_type(TChoice); 559 $$->members = $3; 560 } 561 ; 562 563 ReferencedType : DefinedType 564 | UsefulType 565 ; 566 567 DefinedType : IDENTIFIER 568 { 569 Symbol *s = addsym($1); 570 $$ = new_type(TType); 571 if(s->stype != Stype && s->stype != SUndefined) 572 lex_error_message ("%s is not a type\n", $1); 573 else 574 $$->symbol = s; 575 } 576 ; 577 578 UsefulType : kw_GeneralizedTime 579 { 580 $$ = new_tag(ASN1_C_UNIV, UT_GeneralizedTime, 581 TE_EXPLICIT, new_type(TGeneralizedTime)); 582 } 583 | kw_UTCTime 584 { 585 $$ = new_tag(ASN1_C_UNIV, UT_UTCTime, 586 TE_EXPLICIT, new_type(TUTCTime)); 587 } 588 ; 589 590 ConstrainedType : Type Constraint 591 { 592 /* if (Constraint.type == contentConstrant) { 593 assert(Constraint.u.constraint.type == octetstring|bitstring-w/o-NamedBitList); // remember to check type reference too 594 if (Constraint.u.constraint.type) { 595 assert((Constraint.u.constraint.type.length % 8) == 0); 596 } 597 } 598 if (Constraint.u.constraint.encoding) { 599 type == der-oid|ber-oid 600 } 601 */ 602 } 603 ; 604 605 606 Constraint : '(' ConstraintSpec ')' 607 { 608 $$ = $2; 609 } 610 ; 611 612 ConstraintSpec : GeneralConstraint 613 ; 614 615 GeneralConstraint: ContentsConstraint 616 | UserDefinedConstraint 617 ; 618 619 ContentsConstraint: kw_CONTAINING Type 620 { 621 $$ = new_constraint_spec(CT_CONTENTS); 622 $$->u.content.type = $2; 623 $$->u.content.encoding = NULL; 624 } 625 | kw_ENCODED kw_BY Value 626 { 627 if ($3->type != objectidentifiervalue) 628 lex_error_message("Non-OID used in ENCODED BY constraint"); 629 $$ = new_constraint_spec(CT_CONTENTS); 630 $$->u.content.type = NULL; 631 $$->u.content.encoding = $3; 632 } 633 | kw_CONTAINING Type kw_ENCODED kw_BY Value 634 { 635 if ($5->type != objectidentifiervalue) 636 lex_error_message("Non-OID used in ENCODED BY constraint"); 637 $$ = new_constraint_spec(CT_CONTENTS); 638 $$->u.content.type = $2; 639 $$->u.content.encoding = $5; 640 } 641 ; 642 643 UserDefinedConstraint: kw_CONSTRAINED kw_BY '{' '}' 644 { 645 $$ = new_constraint_spec(CT_USER); 646 } 647 ; 648 649 TaggedType : Tag tagenv Type 650 { 651 $$ = new_type(TTag); 652 $$->tag = $1; 653 $$->tag.tagenv = $2; 654 if (template_flag) { 655 $$->subtype = $3; 656 } else { 657 if($3->type == TTag && $2 == TE_IMPLICIT) { 658 $$->subtype = $3->subtype; 659 free($3); 660 } else { 661 $$->subtype = $3; 662 } 663 } 664 } 665 ; 666 667 Tag : '[' Class NUMBER ']' 668 { 669 $$.tagclass = $2; 670 $$.tagvalue = $3; 671 $$.tagenv = default_tag_env; 672 } 673 ; 674 675 Class : /* */ 676 { 677 $$ = ASN1_C_CONTEXT; 678 } 679 | kw_UNIVERSAL 680 { 681 $$ = ASN1_C_UNIV; 682 } 683 | kw_APPLICATION 684 { 685 $$ = ASN1_C_APPL; 686 } 687 | kw_PRIVATE 688 { 689 $$ = ASN1_C_PRIVATE; 690 } 691 ; 692 693 tagenv : /* */ 694 { 695 $$ = default_tag_env; 696 } 697 | kw_EXPLICIT 698 { 699 $$ = default_tag_env; 700 } 701 | kw_IMPLICIT 702 { 703 $$ = TE_IMPLICIT; 704 } 705 ; 706 707 708 ValueAssignment : IDENTIFIER Type EEQUAL Value 709 { 710 Symbol *s; 711 s = addsym ($1); 712 713 s->stype = SValue; 714 s->value = $4; 715 generate_constant (s); 716 } 717 ; 718 719 CharacterStringType: RestrictedCharactedStringType 720 ; 721 722 RestrictedCharactedStringType: kw_GeneralString 723 { 724 $$ = new_tag(ASN1_C_UNIV, UT_GeneralString, 725 TE_EXPLICIT, new_type(TGeneralString)); 726 } 727 | kw_TeletexString 728 { 729 $$ = new_tag(ASN1_C_UNIV, UT_TeletexString, 730 TE_EXPLICIT, new_type(TTeletexString)); 731 } 732 | kw_UTF8String 733 { 734 $$ = new_tag(ASN1_C_UNIV, UT_UTF8String, 735 TE_EXPLICIT, new_type(TUTF8String)); 736 } 737 | kw_PrintableString 738 { 739 $$ = new_tag(ASN1_C_UNIV, UT_PrintableString, 740 TE_EXPLICIT, new_type(TPrintableString)); 741 } 742 | kw_VisibleString 743 { 744 $$ = new_tag(ASN1_C_UNIV, UT_VisibleString, 745 TE_EXPLICIT, new_type(TVisibleString)); 746 } 747 | kw_IA5String 748 { 749 $$ = new_tag(ASN1_C_UNIV, UT_IA5String, 750 TE_EXPLICIT, new_type(TIA5String)); 751 } 752 | kw_BMPString 753 { 754 $$ = new_tag(ASN1_C_UNIV, UT_BMPString, 755 TE_EXPLICIT, new_type(TBMPString)); 756 } 757 | kw_UniversalString 758 { 759 $$ = new_tag(ASN1_C_UNIV, UT_UniversalString, 760 TE_EXPLICIT, new_type(TUniversalString)); 761 } 762 763 ; 764 765 ComponentTypeList: ComponentType 766 { 767 $$ = emalloc(sizeof(*$$)); 768 ASN1_TAILQ_INIT($$); 769 ASN1_TAILQ_INSERT_HEAD($$, $1, members); 770 } 771 | ComponentTypeList ',' ComponentType 772 { 773 ASN1_TAILQ_INSERT_TAIL($1, $3, members); 774 $$ = $1; 775 } 776 | ComponentTypeList ',' ELLIPSIS 777 { 778 struct member *m = ecalloc(1, sizeof(*m)); 779 m->name = estrdup("..."); 780 m->gen_name = estrdup("asn1_ellipsis"); 781 m->ellipsis = 1; 782 ASN1_TAILQ_INSERT_TAIL($1, m, members); 783 $$ = $1; 784 } 785 ; 786 787 NamedType : IDENTIFIER Type 788 { 789 $$ = emalloc(sizeof(*$$)); 790 $$->name = $1; 791 $$->gen_name = estrdup($1); 792 output_name ($$->gen_name); 793 $$->type = $2; 794 $$->ellipsis = 0; 795 } 796 ; 797 798 ComponentType : NamedType 799 { 800 $$ = $1; 801 $$->optional = 0; 802 $$->defval = NULL; 803 } 804 | NamedType kw_OPTIONAL 805 { 806 $$ = $1; 807 $$->optional = 1; 808 $$->defval = NULL; 809 } 810 | NamedType kw_DEFAULT Value 811 { 812 $$ = $1; 813 $$->optional = 0; 814 $$->defval = $3; 815 } 816 ; 817 818 NamedBitList : NamedBit 819 { 820 $$ = emalloc(sizeof(*$$)); 821 ASN1_TAILQ_INIT($$); 822 ASN1_TAILQ_INSERT_HEAD($$, $1, members); 823 } 824 | NamedBitList ',' NamedBit 825 { 826 ASN1_TAILQ_INSERT_TAIL($1, $3, members); 827 $$ = $1; 828 } 829 ; 830 831 NamedBit : IDENTIFIER '(' NUMBER ')' 832 { 833 $$ = emalloc(sizeof(*$$)); 834 $$->name = $1; 835 $$->gen_name = estrdup($1); 836 output_name ($$->gen_name); 837 $$->val = $3; 838 $$->optional = 0; 839 $$->ellipsis = 0; 840 $$->type = NULL; 841 } 842 ; 843 844 objid_opt : objid 845 | /* empty */ { $$ = NULL; } 846 ; 847 848 objid : '{' objid_list '}' 849 { 850 $$ = $2; 851 } 852 ; 853 854 objid_list : /* empty */ 855 { 856 $$ = NULL; 857 } 858 | objid_element objid_list 859 { 860 if ($2) { 861 $$ = $2; 862 add_oid_to_tail($2, $1); 863 } else { 864 $$ = $1; 865 } 866 } 867 ; 868 869 objid_element : IDENTIFIER '(' NUMBER ')' 870 { 871 $$ = new_objid($1, $3); 872 } 873 | IDENTIFIER 874 { 875 Symbol *s = addsym($1); 876 if(s->stype != SValue || 877 s->value->type != objectidentifiervalue) { 878 lex_error_message("%s is not an object identifier\n", 879 s->name); 880 exit(1); 881 } 882 $$ = s->value->u.objectidentifiervalue; 883 } 884 | NUMBER 885 { 886 $$ = new_objid(NULL, $1); 887 } 888 ; 889 890 Value : BuiltinValue 891 | ReferencedValue 892 ; 893 894 BuiltinValue : BooleanValue 895 | CharacterStringValue 896 | IntegerValue 897 | ObjectIdentifierValue 898 | NullValue 899 ; 900 901 ReferencedValue : DefinedValue 902 ; 903 904 DefinedValue : Valuereference 905 ; 906 907 Valuereference : IDENTIFIER 908 { 909 Symbol *s = addsym($1); 910 if(s->stype != SValue) 911 lex_error_message ("%s is not a value\n", 912 s->name); 913 else 914 $$ = s->value; 915 } 916 ; 917 918 CharacterStringValue: STRING 919 { 920 $$ = emalloc(sizeof(*$$)); 921 $$->type = stringvalue; 922 $$->u.stringvalue = $1; 923 } 924 ; 925 926 BooleanValue : kw_TRUE 927 { 928 $$ = emalloc(sizeof(*$$)); 929 $$->type = booleanvalue; 930 $$->u.booleanvalue = 0; 931 } 932 | kw_FALSE 933 { 934 $$ = emalloc(sizeof(*$$)); 935 $$->type = booleanvalue; 936 $$->u.booleanvalue = 0; 937 } 938 ; 939 940 IntegerValue : SignedNumber 941 { 942 $$ = emalloc(sizeof(*$$)); 943 $$->type = integervalue; 944 $$->u.integervalue = $1; 945 } 946 ; 947 948 SignedNumber : NUMBER 949 ; 950 951 NullValue : kw_NULL 952 { 953 } 954 ; 955 956 ObjectIdentifierValue: objid 957 { 958 $$ = emalloc(sizeof(*$$)); 959 $$->type = objectidentifiervalue; 960 $$->u.objectidentifiervalue = $1; 961 } 962 ; 963 964 %% 965 966 void 967 yyerror (const char *s) 968 { 969 lex_error_message ("%s\n", s); 970 } 971 972 static Type * 973 new_tag(int tagclass, int tagvalue, int tagenv, Type *oldtype) 974 { 975 Type *t; 976 if(oldtype->type == TTag && oldtype->tag.tagenv == TE_IMPLICIT) { 977 t = oldtype; 978 oldtype = oldtype->subtype; /* XXX */ 979 } else 980 t = new_type (TTag); 981 982 t->tag.tagclass = tagclass; 983 t->tag.tagvalue = tagvalue; 984 t->tag.tagenv = tagenv; 985 t->subtype = oldtype; 986 return t; 987 } 988 989 static struct objid * 990 new_objid(const char *label, int value) 991 { 992 struct objid *s; 993 s = emalloc(sizeof(*s)); 994 s->label = label; 995 s->value = value; 996 s->next = NULL; 997 return s; 998 } 999 1000 static void 1001 add_oid_to_tail(struct objid *head, struct objid *tail) 1002 { 1003 struct objid *o; 1004 o = head; 1005 while (o->next) 1006 o = o->next; 1007 o->next = tail; 1008 } 1009 1010 static unsigned long idcounter; 1011 1012 static Type * 1013 new_type (Typetype tt) 1014 { 1015 Type *t = ecalloc(1, sizeof(*t)); 1016 t->type = tt; 1017 t->id = idcounter++; 1018 return t; 1019 } 1020 1021 static struct constraint_spec * 1022 new_constraint_spec(enum ctype ct) 1023 { 1024 struct constraint_spec *c = ecalloc(1, sizeof(*c)); 1025 c->ctype = ct; 1026 return c; 1027 } 1028 1029 static void fix_labels2(Type *t, const char *prefix); 1030 static void fix_labels1(struct memhead *members, const char *prefix) 1031 { 1032 Member *m; 1033 1034 if(members == NULL) 1035 return; 1036 ASN1_TAILQ_FOREACH(m, members, members) { 1037 if (asprintf(&m->label, "%s_%s", prefix, m->gen_name) < 0) 1038 errx(1, "malloc"); 1039 if (m->label == NULL) 1040 errx(1, "malloc"); 1041 if(m->type != NULL) 1042 fix_labels2(m->type, m->label); 1043 } 1044 } 1045 1046 static void fix_labels2(Type *t, const char *prefix) 1047 { 1048 for(; t; t = t->subtype) 1049 fix_labels1(t->members, prefix); 1050 } 1051 1052 static void 1053 fix_labels(Symbol *s) 1054 { 1055 char *p = NULL; 1056 if (asprintf(&p, "choice_%s", s->gen_name) < 0 || p == NULL) 1057 errx(1, "malloc"); 1058 fix_labels2(s->type, p); 1059 free(p); 1060 } 1061