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);