Skip to content

Commit

Permalink
Add EXTERNAL support
Browse files Browse the repository at this point in the history
- Remove EXTERNAL from asn1p_l.l and asn1p_y.y
- Add EXTERNAL ASN.1 definition from ITU-T X.208 in
  skeletons/standard-modules/ASN1C-UsefulInformationObjectClasses.asn1
- Add a test case:
  tests/tests-asn1c-compiler/159-EXTERNAL-OK.asn1
  tests/tests-c-compiler/check-src/check-159.c
- Regenerate all tests/tests-asn1c-compiler/*.asn1.* files
  • Loading branch information
velichkov committed Sep 11, 2018
1 parent 58aafa6 commit 6dba416
Show file tree
Hide file tree
Showing 76 changed files with 13,075 additions and 3 deletions.
2 changes: 1 addition & 1 deletion libasn1parser/asn1p_l.l
Original file line number Diff line number Diff line change
Expand Up @@ -317,7 +317,7 @@ EXCEPT return TOK_EXCEPT;
EXPLICIT return TOK_EXPLICIT;
EXPORTS return TOK_EXPORTS;
EXTENSIBILITY return TOK_EXTENSIBILITY;
EXTERNAL return TOK_EXTERNAL;
/*EXTERNAL return TOK_EXTERNAL;*/
FALSE return TOK_FALSE;
FROM return TOK_FROM;
GeneralizedTime return TOK_GeneralizedTime;
Expand Down
4 changes: 2 additions & 2 deletions libasn1parser/asn1p_y.y
Original file line number Diff line number Diff line change
Expand Up @@ -205,7 +205,7 @@ static asn1p_module_t *currentModule;
%token TOK_EXPLICIT
%token TOK_EXPORTS
%token TOK_EXTENSIBILITY
%token TOK_EXTERNAL
/*%token TOK_EXTERNAL*/
%token TOK_FALSE
%token TOK_FROM
%token TOK_GeneralizedTime
Expand Down Expand Up @@ -1703,7 +1703,7 @@ BasicTypeId:
| TOK_OCTET TOK_STRING { $$ = ASN_BASIC_OCTET_STRING; }
| TOK_OBJECT TOK_IDENTIFIER { $$ = ASN_BASIC_OBJECT_IDENTIFIER; }
| TOK_RELATIVE_OID { $$ = ASN_BASIC_RELATIVE_OID; }
| TOK_EXTERNAL { $$ = ASN_BASIC_EXTERNAL; }
/* | TOK_EXTERNAL { $$ = ASN_BASIC_EXTERNAL; } */
| TOK_EMBEDDED TOK_PDV { $$ = ASN_BASIC_EMBEDDED_PDV; }
| TOK_CHARACTER TOK_STRING { $$ = ASN_BASIC_CHARACTER_STRING; }
| TOK_UTCTime { $$ = ASN_BASIC_UTCTime; }
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,4 +28,16 @@ DEFINITIONS ::= BEGIN
&property BIT STRING { handles-invalid-encodings(0) } DEFAULT {}
} WITH SYNTAX { &Type IDENTIFIED BY &id [HAS PROPERTY &property] }

--
-- From "ITU-T Recommendation X.208", "34 The external type"
--
EXTERNAL ::= [UNIVERSAL 8] IMPLICIT SEQUENCE
{direct-reference OBJECT IDENTIFIER OPTIONAL,
indirect-reference INTEGER OPTIONAL,
data-value-descriptor ObjectDescriptor OPTIONAL,
encoding CHOICE
{single-ASN1-type [0] ANY,
octet-aligned [1] IMPLICIT OCTET STRING,
arbitrary [2] IMPLICIT BIT STRING}}

END
182 changes: 182 additions & 0 deletions tests/tests-asn1c-compiler/03-enum-OK.asn1.-Pfwide-types
Original file line number Diff line number Diff line change
Expand Up @@ -411,3 +411,185 @@ asn_TYPE_descriptor_t asn_DEF_Enum5 = {
&asn_SPC_Enum5_specs_1 /* Additional specs */
};


/*** <<< INCLUDES [EXTERNAL] >>> ***/

#include <OBJECT_IDENTIFIER.h>
#include <INTEGER.h>
#include <ObjectDescriptor.h>
#include <ANY.h>
#include <OCTET_STRING.h>
#include <BIT_STRING.h>
#include <constr_CHOICE.h>
#include <constr_SEQUENCE.h>

/*** <<< DEPS [EXTERNAL] >>> ***/

typedef enum encoding_PR {
encoding_PR_NOTHING, /* No components present */
encoding_PR_single_ASN1_type,
encoding_PR_octet_aligned,
encoding_PR_arbitrary
} encoding_PR;

/*** <<< TYPE-DECLS [EXTERNAL] >>> ***/

typedef struct EXTERNAL {
OBJECT_IDENTIFIER_t *direct_reference /* OPTIONAL */;
INTEGER_t *indirect_reference /* OPTIONAL */;
ObjectDescriptor_t *data_value_descriptor /* OPTIONAL */;
struct encoding {
encoding_PR present;
union EXTERNAL__encoding_u {
ANY_t single_ASN1_type;
OCTET_STRING_t octet_aligned;
BIT_STRING_t arbitrary;
} choice;

/* Context for parsing across buffer boundaries */
asn_struct_ctx_t _asn_ctx;
} encoding;

/* Context for parsing across buffer boundaries */
asn_struct_ctx_t _asn_ctx;
} EXTERNAL_t;

/*** <<< FUNC-DECLS [EXTERNAL] >>> ***/

extern asn_TYPE_descriptor_t asn_DEF_EXTERNAL;

/*** <<< STAT-DEFS [EXTERNAL] >>> ***/

static asn_TYPE_member_t asn_MBR_encoding_5[] = {
{ ATF_NOFLAGS, 0, offsetof(struct encoding, choice.single_ASN1_type),
.tag = (ASN_TAG_CLASS_CONTEXT | (0 << 2)),
.tag_mode = +1, /* EXPLICIT tag at current level */
.type = &asn_DEF_ANY,
.type_selector = 0,
{ .oer_constraints = 0, .per_constraints = 0, .general_constraints = 0 },
0, 0, /* No default value */
.name = "single-ASN1-type"
},
{ ATF_NOFLAGS, 0, offsetof(struct encoding, choice.octet_aligned),
.tag = (ASN_TAG_CLASS_CONTEXT | (1 << 2)),
.tag_mode = -1, /* IMPLICIT tag at current level */
.type = &asn_DEF_OCTET_STRING,
.type_selector = 0,
{ .oer_constraints = 0, .per_constraints = 0, .general_constraints = 0 },
0, 0, /* No default value */
.name = "octet-aligned"
},
{ ATF_NOFLAGS, 0, offsetof(struct encoding, choice.arbitrary),
.tag = (ASN_TAG_CLASS_CONTEXT | (2 << 2)),
.tag_mode = -1, /* IMPLICIT tag at current level */
.type = &asn_DEF_BIT_STRING,
.type_selector = 0,
{ .oer_constraints = 0, .per_constraints = 0, .general_constraints = 0 },
0, 0, /* No default value */
.name = "arbitrary"
},
};
static const asn_TYPE_tag2member_t asn_MAP_encoding_tag2el_5[] = {
{ (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* single-ASN1-type */
{ (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* octet-aligned */
{ (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* arbitrary */
};
static asn_CHOICE_specifics_t asn_SPC_encoding_specs_5 = {
sizeof(struct encoding),
offsetof(struct encoding, _asn_ctx),
offsetof(struct encoding, present),
sizeof(((struct encoding *)0)->present),
.tag2el = asn_MAP_encoding_tag2el_5,
.tag2el_count = 3, /* Count of tags in the map */
0, 0,
.first_extension = -1 /* Extensions start */
};
static /* Use -fall-defs-global to expose */
asn_TYPE_descriptor_t asn_DEF_encoding_5 = {
"encoding",
"encoding",
&asn_OP_CHOICE,
0, /* No effective tags (pointer) */
0, /* No effective tags (count) */
0, /* No tags (pointer) */
0, /* No tags (count) */
{ 0, 0, CHOICE_constraint },
asn_MBR_encoding_5,
3, /* Elements count */
&asn_SPC_encoding_specs_5 /* Additional specs */
};

static asn_TYPE_member_t asn_MBR_EXTERNAL_1[] = {
{ ATF_POINTER, 3, offsetof(struct EXTERNAL, direct_reference),
.tag = (ASN_TAG_CLASS_UNIVERSAL | (6 << 2)),
.tag_mode = 0,
.type = &asn_DEF_OBJECT_IDENTIFIER,
.type_selector = 0,
{ .oer_constraints = 0, .per_constraints = 0, .general_constraints = 0 },
0, 0, /* No default value */
.name = "direct-reference"
},
{ ATF_POINTER, 2, offsetof(struct EXTERNAL, indirect_reference),
.tag = (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)),
.tag_mode = 0,
.type = &asn_DEF_INTEGER,
.type_selector = 0,
{ .oer_constraints = 0, .per_constraints = 0, .general_constraints = 0 },
0, 0, /* No default value */
.name = "indirect-reference"
},
{ ATF_POINTER, 1, offsetof(struct EXTERNAL, data_value_descriptor),
.tag = (ASN_TAG_CLASS_UNIVERSAL | (7 << 2)),
.tag_mode = 0,
.type = &asn_DEF_ObjectDescriptor,
.type_selector = 0,
{ .oer_constraints = 0, .per_constraints = 0, .general_constraints = 0 },
0, 0, /* No default value */
.name = "data-value-descriptor"
},
{ ATF_NOFLAGS, 0, offsetof(struct EXTERNAL, encoding),
.tag = -1 /* Ambiguous tag (CHOICE?) */,
.tag_mode = 0,
.type = &asn_DEF_encoding_5,
.type_selector = 0,
{ .oer_constraints = 0, .per_constraints = 0, .general_constraints = 0 },
0, 0, /* No default value */
.name = "encoding"
},
};
static const ber_tlv_tag_t asn_DEF_EXTERNAL_tags_1[] = {
(ASN_TAG_CLASS_UNIVERSAL | (8 << 2)),
(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
};
static const asn_TYPE_tag2member_t asn_MAP_EXTERNAL_tag2el_1[] = {
{ (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 1, 0, 0 }, /* indirect-reference */
{ (ASN_TAG_CLASS_UNIVERSAL | (6 << 2)), 0, 0, 0 }, /* direct-reference */
{ (ASN_TAG_CLASS_UNIVERSAL | (7 << 2)), 2, 0, 0 }, /* data-value-descriptor */
{ (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 3, 0, 0 }, /* single-ASN1-type */
{ (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 3, 0, 0 }, /* octet-aligned */
{ (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 3, 0, 0 } /* arbitrary */
};
static asn_SEQUENCE_specifics_t asn_SPC_EXTERNAL_specs_1 = {
sizeof(struct EXTERNAL),
offsetof(struct EXTERNAL, _asn_ctx),
.tag2el = asn_MAP_EXTERNAL_tag2el_1,
.tag2el_count = 6, /* Count of tags in the map */
0, 0, 0, /* Optional elements (not needed) */
-1, /* First extension addition */
};
asn_TYPE_descriptor_t asn_DEF_EXTERNAL = {
"EXTERNAL",
"EXTERNAL",
&asn_OP_SEQUENCE,
asn_DEF_EXTERNAL_tags_1,
sizeof(asn_DEF_EXTERNAL_tags_1)
/sizeof(asn_DEF_EXTERNAL_tags_1[0]) - 1, /* 1 */
asn_DEF_EXTERNAL_tags_1, /* Same as above */
sizeof(asn_DEF_EXTERNAL_tags_1)
/sizeof(asn_DEF_EXTERNAL_tags_1[0]), /* 2 */
{ 0, 0, SEQUENCE_constraint },
asn_MBR_EXTERNAL_1,
4, /* Elements count */
&asn_SPC_EXTERNAL_specs_1 /* Additional specs */
};

Loading

0 comments on commit 6dba416

Please sign in to comment.