2 * Copyright (c) 1997 - 2007 Kungliga Tekniska Högskolan
3 * (Royal Institute of Technology, Stockholm, Sweden).
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
10 * 1. Redistributions of source code must retain the above copyright
11 * notice, this list of conditions and the following disclaimer.
13 * 2. Redistributions in binary form must reproduce the above copyright
14 * notice, this list of conditions and the following disclaimer in the
15 * documentation and/or other materials provided with the distribution.
17 * 3. Neither the name of the Institute nor the names of its contributors
18 * may be used to endorse or promote products derived from this software
19 * without specific prior written permission.
21 * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
22 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24 * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
25 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
27 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
30 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
50 static Type
*new_type
(Typetype t
);
51 static struct constraint_spec
*new_constraint_spec
(enum ctype
);
52 static Type
*new_tag
(int tagclass
, int tagvalue
, int tagenv
, Type
*oldtype
);
53 void yyerror (const char *);
54 static struct objid
*new_objid
(const char *label
, int value
);
55 static void add_oid_to_tail
(struct objid
*, struct objid
*);
56 static void fix_labels
(Symbol
*s
);
60 struct string_list
*next
;
74 struct string_list
*sl
;
76 struct memhead
*members
;
77 struct constraint_spec
*constraint_spec
;
81 %token kw_ABSTRACT_SYNTAX
106 %token kw_EXTENSIBILITY
110 %token kw_GeneralString
111 %token kw_GeneralizedTime
112 %token kw_GraphicString
121 %token kw_INTERSECTION
122 %token kw_ISO646String
125 %token kw_MINUS_INFINITY
127 %token kw_NumericString
132 %token kw_ObjectDescriptor
135 %token kw_PLUS_INFINITY
138 %token kw_PrintableString
140 %token kw_RELATIVE_OID
149 %token kw_TYPE_IDENTIFIER
150 %token kw_TeletexString
156 %token kw_UniversalString
157 %token kw_VideotexString
158 %token kw_VisibleString
165 %token
<name
> IDENTIFIER referencename
168 %token
<constant
> NUMBER
169 %type
<constant
> SignedNumber
170 %type
<constant
> Class tagenv
173 %type
<value
> BuiltinValue
174 %type
<value
> IntegerValue
175 %type
<value
> BooleanValue
176 %type
<value
> ObjectIdentifierValue
177 %type
<value
> CharacterStringValue
178 %type
<value
> NullValue
179 %type
<value
> DefinedValue
180 %type
<value
> ReferencedValue
181 %type
<value
> Valuereference
184 %type
<type
> BuiltinType
185 %type
<type
> BitStringType
186 %type
<type
> BooleanType
187 %type
<type
> ChoiceType
188 %type
<type
> ConstrainedType
189 %type
<type
> EnumeratedType
190 %type
<type
> IntegerType
191 %type
<type
> NullType
192 %type
<type
> OctetStringType
193 %type
<type
> SequenceType
194 %type
<type
> SequenceOfType
196 %type
<type
> SetOfType
197 %type
<type
> TaggedType
198 %type
<type
> ReferencedType
199 %type
<type
> DefinedType
200 %type
<type
> UsefulType
201 %type
<type
> ObjectIdentifierType
202 %type
<type
> CharacterStringType
203 %type
<type
> RestrictedCharactedStringType
207 %type
<member
> ComponentType
208 %type
<member
> NamedBit
209 %type
<member
> NamedNumber
210 %type
<member
> NamedType
211 %type
<members
> ComponentTypeList
212 %type
<members
> Enumerations
213 %type
<members
> NamedBitList
214 %type
<members
> NamedNumberList
216 %type
<objid
> objid objid_list objid_element objid_opt
217 %type
<range
> range size
219 %type
<sl
> referencenames
221 %type
<constraint_spec
> Constraint
222 %type
<constraint_spec
> ConstraintSpec
223 %type
<constraint_spec
> GeneralConstraint
224 %type
<constraint_spec
> ContentsConstraint
225 %type
<constraint_spec
> UserDefinedConstraint
229 %start ModuleDefinition
233 ModuleDefinition: IDENTIFIER objid_opt kw_DEFINITIONS TagDefault ExtensionDefault
234 EEQUAL kw_BEGIN ModuleBody kw_END
240 TagDefault
: kw_EXPLICIT kw_TAGS
241 | kw_IMPLICIT kw_TAGS
242 { error_message
("implicit tagging is not supported"); }
243 | kw_AUTOMATIC kw_TAGS
244 { error_message
("automatic tagging is not supported"); }
248 ExtensionDefault: kw_EXTENSIBILITY kw_IMPLIED
249 { error_message
("no extensibility options supported"); }
253 ModuleBody
: /* Exports */ Imports AssignmentList
257 Imports
: kw_IMPORTS SymbolsImported
';'
261 SymbolsImported
: SymbolsFromModuleList
265 SymbolsFromModuleList: SymbolsFromModule
266 | SymbolsFromModuleList SymbolsFromModule
269 SymbolsFromModule: referencenames kw_FROM IDENTIFIER objid_opt
271 struct string_list
*sl
;
272 for
(sl
= $1; sl
!= NULL
; sl
= sl
->next
) {
273 Symbol
*s
= addsym
(sl
->string);
280 AssignmentList
: Assignment
281 | Assignment AssignmentList
284 Assignment
: TypeAssignment
288 referencenames
: IDENTIFIER
',' referencenames
290 $$
= emalloc
(sizeof
(*$$
));
296 $$
= emalloc
(sizeof
(*$$
));
302 TypeAssignment
: IDENTIFIER EEQUAL Type
304 Symbol
*s
= addsym
($1);
317 BuiltinType
: BitStringType
319 | CharacterStringType
324 | ObjectIdentifierType
333 BooleanType
: kw_BOOLEAN
335 $$
= new_tag
(ASN1_C_UNIV
, UT_Boolean
,
336 TE_EXPLICIT
, new_type
(TBoolean
));
340 range
: '(' Value RANGE Value
')'
342 if
($2->type
!= integervalue
)
343 error_message
("Non-integer used in first part of range");
344 if
($2->type
!= integervalue
)
345 error_message
("Non-integer in second part of range");
346 $$
= ecalloc
(1, sizeof
(*$$
));
347 $$
->min
= $2->u.integervalue
;
348 $$
->max
= $4->u.integervalue
;
350 |
'(' Value RANGE kw_MAX
')'
352 if
($2->type
!= integervalue
)
353 error_message
("Non-integer in first part of range");
354 $$
= ecalloc
(1, sizeof
(*$$
));
355 $$
->min
= $2->u.integervalue
;
356 $$
->max
= $2->u.integervalue
- 1;
358 |
'(' kw_MIN RANGE Value
')'
360 if
($4->type
!= integervalue
)
361 error_message
("Non-integer in second part of range");
362 $$
= ecalloc
(1, sizeof
(*$$
));
363 $$
->min
= $4->u.integervalue
+ 2;
364 $$
->max
= $4->u.integervalue
;
368 if
($2->type
!= integervalue
)
369 error_message
("Non-integer used in limit");
370 $$
= ecalloc
(1, sizeof
(*$$
));
371 $$
->min
= $2->u.integervalue
;
372 $$
->max
= $2->u.integervalue
;
377 IntegerType
: kw_INTEGER
379 $$
= new_tag
(ASN1_C_UNIV
, UT_Integer
,
380 TE_EXPLICIT
, new_type
(TInteger
));
384 $$
= new_type
(TInteger
);
386 $$
= new_tag
(ASN1_C_UNIV
, UT_Integer
, TE_EXPLICIT
, $$
);
388 | kw_INTEGER
'{' NamedNumberList
'}'
390 $$
= new_type
(TInteger
);
392 $$
= new_tag
(ASN1_C_UNIV
, UT_Integer
, TE_EXPLICIT
, $$
);
396 NamedNumberList
: NamedNumber
398 $$
= emalloc
(sizeof
(*$$
));
400 ASN1_TAILQ_INSERT_HEAD
($$
, $1, members
);
402 | NamedNumberList
',' NamedNumber
404 ASN1_TAILQ_INSERT_TAIL
($1, $3, members
);
407 | NamedNumberList
',' ELLIPSIS
408 { $$
= $1; } /* XXX used for Enumerations */
411 NamedNumber
: IDENTIFIER
'(' SignedNumber
')'
413 $$
= emalloc
(sizeof
(*$$
));
415 $$
->gen_name
= estrdup
($1);
416 output_name
($$
->gen_name
);
424 EnumeratedType
: kw_ENUMERATED
'{' Enumerations
'}'
426 $$
= new_type
(TInteger
);
428 $$
= new_tag
(ASN1_C_UNIV
, UT_Enumerated
, TE_EXPLICIT
, $$
);
432 Enumerations
: NamedNumberList
/* XXX */
435 BitStringType
: kw_BIT kw_STRING
437 $$
= new_type
(TBitString
);
438 $$
->members
= emalloc
(sizeof
(*$$
->members
));
439 ASN1_TAILQ_INIT
($$
->members
);
440 $$
= new_tag
(ASN1_C_UNIV
, UT_BitString
, TE_EXPLICIT
, $$
);
442 | kw_BIT kw_STRING
'{' NamedBitList
'}'
444 $$
= new_type
(TBitString
);
446 $$
= new_tag
(ASN1_C_UNIV
, UT_BitString
, TE_EXPLICIT
, $$
);
450 ObjectIdentifierType: kw_OBJECT kw_IDENTIFIER
452 $$
= new_tag
(ASN1_C_UNIV
, UT_OID
,
453 TE_EXPLICIT
, new_type
(TOID
));
456 OctetStringType
: kw_OCTET kw_STRING size
458 Type
*t
= new_type
(TOctetString
);
460 $$
= new_tag
(ASN1_C_UNIV
, UT_OctetString
,
467 $$
= new_tag
(ASN1_C_UNIV
, UT_Null
,
468 TE_EXPLICIT
, new_type
(TNull
));
479 SequenceType
: kw_SEQUENCE
'{' /* ComponentTypeLists */ ComponentTypeList
'}'
481 $$
= new_type
(TSequence
);
483 $$
= new_tag
(ASN1_C_UNIV
, UT_Sequence
, TE_EXPLICIT
, $$
);
485 | kw_SEQUENCE
'{' '}'
487 $$
= new_type
(TSequence
);
489 $$
= new_tag
(ASN1_C_UNIV
, UT_Sequence
, TE_EXPLICIT
, $$
);
493 SequenceOfType
: kw_SEQUENCE size kw_OF Type
495 $$
= new_type
(TSequenceOf
);
498 $$
= new_tag
(ASN1_C_UNIV
, UT_Sequence
, TE_EXPLICIT
, $$
);
502 SetType
: kw_SET
'{' /* ComponentTypeLists */ ComponentTypeList
'}'
506 $$
= new_tag
(ASN1_C_UNIV
, UT_Set
, TE_EXPLICIT
, $$
);
512 $$
= new_tag
(ASN1_C_UNIV
, UT_Set
, TE_EXPLICIT
, $$
);
516 SetOfType
: kw_SET kw_OF Type
518 $$
= new_type
(TSetOf
);
520 $$
= new_tag
(ASN1_C_UNIV
, UT_Set
, TE_EXPLICIT
, $$
);
524 ChoiceType
: kw_CHOICE
'{' /* AlternativeTypeLists */ ComponentTypeList
'}'
526 $$
= new_type
(TChoice
);
531 ReferencedType
: DefinedType
535 DefinedType
: IDENTIFIER
537 Symbol
*s
= addsym
($1);
538 $$
= new_type
(TType
);
539 if
(s
->stype
!= Stype
&& s
->stype
!= SUndefined
)
540 error_message
("%s is not a type\n", $1);
546 UsefulType
: kw_GeneralizedTime
548 $$
= new_tag
(ASN1_C_UNIV
, UT_GeneralizedTime
,
549 TE_EXPLICIT
, new_type
(TGeneralizedTime
));
553 $$
= new_tag
(ASN1_C_UNIV
, UT_UTCTime
,
554 TE_EXPLICIT
, new_type
(TUTCTime
));
558 ConstrainedType
: Type Constraint
560 /* if (Constraint.type == contentConstrant) {
561 assert(Constraint.u.constraint.type == octetstring|bitstring-w/o-NamedBitList); // remember to check type reference too
562 if (Constraint.u.constraint.type) {
563 assert((Constraint.u.constraint.type.length % 8) == 0);
566 if (Constraint.u.constraint.encoding) {
567 type == der-oid|ber-oid
574 Constraint
: '(' ConstraintSpec
')'
580 ConstraintSpec
: GeneralConstraint
583 GeneralConstraint: ContentsConstraint
584 | UserDefinedConstraint
587 ContentsConstraint: kw_CONTAINING Type
589 $$
= new_constraint_spec
(CT_CONTENTS
);
590 $$
->u.content.type
= $2;
591 $$
->u.content.encoding
= NULL
;
593 | kw_ENCODED kw_BY Value
595 if
($3->type
!= objectidentifiervalue
)
596 error_message
("Non-OID used in ENCODED BY constraint");
597 $$
= new_constraint_spec
(CT_CONTENTS
);
598 $$
->u.content.type
= NULL
;
599 $$
->u.content.encoding
= $3;
601 | kw_CONTAINING Type kw_ENCODED kw_BY Value
603 if
($5->type
!= objectidentifiervalue
)
604 error_message
("Non-OID used in ENCODED BY constraint");
605 $$
= new_constraint_spec
(CT_CONTENTS
);
606 $$
->u.content.type
= $2;
607 $$
->u.content.encoding
= $5;
611 UserDefinedConstraint: kw_CONSTRAINED kw_BY
'{' '}'
613 $$
= new_constraint_spec
(CT_USER
);
617 TaggedType
: Tag tagenv Type
622 if
($3->type
== TTag
&& $2 == TE_IMPLICIT
) {
623 $$
->subtype
= $3->subtype
;
630 Tag
: '[' Class NUMBER
']'
634 $$.tagenv
= TE_EXPLICIT
;
671 ValueAssignment
: IDENTIFIER Type EEQUAL Value
678 generate_constant
(s
);
682 CharacterStringType: RestrictedCharactedStringType
685 RestrictedCharactedStringType: kw_GeneralString
687 $$
= new_tag
(ASN1_C_UNIV
, UT_GeneralString
,
688 TE_EXPLICIT
, new_type
(TGeneralString
));
692 $$
= new_tag
(ASN1_C_UNIV
, UT_UTF8String
,
693 TE_EXPLICIT
, new_type
(TUTF8String
));
697 $$
= new_tag
(ASN1_C_UNIV
, UT_PrintableString
,
698 TE_EXPLICIT
, new_type
(TPrintableString
));
702 $$
= new_tag
(ASN1_C_UNIV
, UT_VisibleString
,
703 TE_EXPLICIT
, new_type
(TVisibleString
));
707 $$
= new_tag
(ASN1_C_UNIV
, UT_IA5String
,
708 TE_EXPLICIT
, new_type
(TIA5String
));
712 $$
= new_tag
(ASN1_C_UNIV
, UT_BMPString
,
713 TE_EXPLICIT
, new_type
(TBMPString
));
717 $$
= new_tag
(ASN1_C_UNIV
, UT_UniversalString
,
718 TE_EXPLICIT
, new_type
(TUniversalString
));
723 ComponentTypeList: ComponentType
725 $$
= emalloc
(sizeof
(*$$
));
727 ASN1_TAILQ_INSERT_HEAD
($$
, $1, members
);
729 | ComponentTypeList
',' ComponentType
731 ASN1_TAILQ_INSERT_TAIL
($1, $3, members
);
734 | ComponentTypeList
',' ELLIPSIS
736 struct member
*m
= ecalloc
(1, sizeof
(*m
));
737 m
->name
= estrdup
("...");
738 m
->gen_name
= estrdup
("asn1_ellipsis");
740 ASN1_TAILQ_INSERT_TAIL
($1, m
, members
);
745 NamedType
: IDENTIFIER Type
747 $$
= emalloc
(sizeof
(*$$
));
749 $$
->gen_name
= estrdup
($1);
750 output_name
($$
->gen_name
);
756 ComponentType
: NamedType
762 | NamedType kw_OPTIONAL
768 | NamedType kw_DEFAULT Value
776 NamedBitList
: NamedBit
778 $$
= emalloc
(sizeof
(*$$
));
780 ASN1_TAILQ_INSERT_HEAD
($$
, $1, members
);
782 | NamedBitList
',' NamedBit
784 ASN1_TAILQ_INSERT_TAIL
($1, $3, members
);
789 NamedBit
: IDENTIFIER
'(' NUMBER
')'
791 $$
= emalloc
(sizeof
(*$$
));
793 $$
->gen_name
= estrdup
($1);
794 output_name
($$
->gen_name
);
803 |
/* empty */ { $$
= NULL
; }
806 objid
: '{' objid_list
'}'
812 objid_list
: /* empty */
816 | objid_element objid_list
820 add_oid_to_tail
($2, $1);
827 objid_element
: IDENTIFIER
'(' NUMBER
')'
829 $$
= new_objid
($1, $3);
833 Symbol
*s
= addsym
($1);
834 if
(s
->stype
!= SValue ||
835 s
->value
->type
!= objectidentifiervalue
) {
836 error_message
("%s is not an object identifier\n",
840 $$
= s
->value
->u.objectidentifiervalue
;
844 $$
= new_objid
(NULL
, $1);
852 BuiltinValue
: BooleanValue
853 | CharacterStringValue
855 | ObjectIdentifierValue
859 ReferencedValue
: DefinedValue
862 DefinedValue
: Valuereference
865 Valuereference
: IDENTIFIER
867 Symbol
*s
= addsym
($1);
868 if
(s
->stype
!= SValue
)
869 error_message
("%s is not a value\n",
876 CharacterStringValue: STRING
878 $$
= emalloc
(sizeof
(*$$
));
879 $$
->type
= stringvalue
;
880 $$
->u.stringvalue
= $1;
884 BooleanValue
: kw_TRUE
886 $$
= emalloc
(sizeof
(*$$
));
887 $$
->type
= booleanvalue
;
888 $$
->u.booleanvalue
= 0;
892 $$
= emalloc
(sizeof
(*$$
));
893 $$
->type
= booleanvalue
;
894 $$
->u.booleanvalue
= 0;
898 IntegerValue
: SignedNumber
900 $$
= emalloc
(sizeof
(*$$
));
901 $$
->type
= integervalue
;
902 $$
->u.integervalue
= $1;
906 SignedNumber
: NUMBER
914 ObjectIdentifierValue: objid
916 $$
= emalloc
(sizeof
(*$$
));
917 $$
->type
= objectidentifiervalue
;
918 $$
->u.objectidentifiervalue
= $1;
925 yyerror (const char *s
)
927 error_message
("%s\n", s
);
931 new_tag
(int tagclass
, int tagvalue
, int tagenv
, Type
*oldtype
)
934 if
(oldtype
->type
== TTag
&& oldtype
->tag.tagenv
== TE_IMPLICIT
) {
936 oldtype
= oldtype
->subtype
; /* XXX */
940 t
->tag.tagclass
= tagclass
;
941 t
->tag.tagvalue
= tagvalue
;
942 t
->tag.tagenv
= tagenv
;
943 t
->subtype
= oldtype
;
947 static struct objid
*
948 new_objid
(const char *label
, int value
)
951 s
= emalloc
(sizeof
(*s
));
959 add_oid_to_tail
(struct objid
*head
, struct objid
*tail
)
969 new_type
(Typetype tt
)
971 Type
*t
= ecalloc
(1, sizeof
(*t
));
976 static struct constraint_spec
*
977 new_constraint_spec
(enum ctype ct
)
979 struct constraint_spec
*c
= ecalloc
(1, sizeof
(*c
));
984 static void fix_labels2
(Type
*t
, const char *prefix
);
985 static void fix_labels1
(struct memhead
*members
, const char *prefix
)
991 ASN1_TAILQ_FOREACH
(m
, members
, members
) {
992 asprintf
(&m
->label
, "%s_%s", prefix
, m
->gen_name
);
993 if
(m
->label
== NULL
)
996 fix_labels2
(m
->type
, m
->label
);
1000 static void fix_labels2
(Type
*t
, const char *prefix
)
1002 for
(; t
; t
= t
->subtype
)
1003 fix_labels1
(t
->members
, prefix
);
1007 fix_labels
(Symbol
*s
)
1010 asprintf
(&p
, "choice_%s", s
->gen_name
);
1013 fix_labels2
(s
->type
, p
);