diff --git a/lib/asn1/asn1parse.y b/lib/asn1/asn1parse.y index f6f6ec0e5..d9e3fba2d 100644 --- a/lib/asn1/asn1parse.y +++ b/lib/asn1/asn1parse.y @@ -1432,8 +1432,10 @@ TaggedType : Tag tagenv Type * IMPLICIT tags of CHOICE types are EXPLICIT * instead. */ - if (t->type == TChoice) + if (t->type == TChoice) { + $$->implicit_choice = 1; $$->tag.tagenv = TE_EXPLICIT; + } if($3->type == TTag && $2 == TE_IMPLICIT) { $$->subtype = $3->subtype; free($3); diff --git a/lib/asn1/gen.c b/lib/asn1/gen.c index f55c636b7..af543d966 100644 --- a/lib/asn1/gen.c +++ b/lib/asn1/gen.c @@ -1529,6 +1529,9 @@ define_type(int level, const char *name, const char *basename, Type *pt, Type *t fprintf(jsonfile, "\"ttype\":\"TeletexString\",\"ctype\":\"heim_general_string\""); break; case TTag: + if (t->implicit_choice) { + fprintf(jsonfile, "\"desired_tagenv\":\"IMPLICIT\","); + } fprintf(jsonfile, "\"tagclass\":\"%s\",\"tagvalue\":%d,\"tagenv\":\"%s\",\n", tagclassnames[t->tag.tagclass], t->tag.tagvalue, t->tag.tagenv == TE_EXPLICIT ? "EXPLICIT" : "IMPLICIT"); diff --git a/lib/asn1/symbol.h b/lib/asn1/symbol.h index 8a24e2515..bce2e1fe4 100644 --- a/lib/asn1/symbol.h +++ b/lib/asn1/symbol.h @@ -200,6 +200,7 @@ struct type { struct range *range; struct constraint_spec *constraint; unsigned long id; + unsigned int implicit_choice:1; }; typedef struct type Type;