aboutsummaryrefslogtreecommitdiffstats
path: root/skeletons
diff options
context:
space:
mode:
authorvlm <vlm@59561ff5-6e30-0410-9f3c-9617f08c8826>2004-09-13 08:31:01 +0000
committervlm <vlm@59561ff5-6e30-0410-9f3c-9617f08c8826>2004-09-13 08:31:01 +0000
commit72425de1aa8e5a89ace3836027d75a5791aa022c (patch)
treeea7e4e6028c1cb6fbe6d19b4bd08b00113b56639 /skeletons
parent83204112b91eff1dbd5498e032735115503e8c31 (diff)
inner structures tagging fix. see 0.9.5 comment in ChangeLog
git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@311 59561ff5-6e30-0410-9f3c-9617f08c8826
Diffstat (limited to 'skeletons')
-rw-r--r--skeletons/BIT_STRING.c3
-rw-r--r--skeletons/BMPString.c6
-rw-r--r--skeletons/BOOLEAN.c4
-rw-r--r--skeletons/ENUMERATED.c4
-rw-r--r--skeletons/GeneralString.c6
-rw-r--r--skeletons/GeneralizedTime.c3
-rw-r--r--skeletons/GraphicString.c6
-rw-r--r--skeletons/IA5String.c6
-rw-r--r--skeletons/INTEGER.c4
-rw-r--r--skeletons/ISO646String.c6
-rw-r--r--skeletons/NULL.c4
-rw-r--r--skeletons/NativeEnumerated.c4
-rw-r--r--skeletons/NativeInteger.c4
-rw-r--r--skeletons/NumericString.c6
-rw-r--r--skeletons/OBJECT_IDENTIFIER.c5
-rw-r--r--skeletons/OCTET_STRING.c95
-rw-r--r--skeletons/ObjectDescriptor.c6
-rw-r--r--skeletons/PrintableString.c6
-rw-r--r--skeletons/RELATIVE-OID.c3
-rw-r--r--skeletons/T61String.c6
-rw-r--r--skeletons/TeletexString.c6
-rw-r--r--skeletons/UTCTime.c3
-rw-r--r--skeletons/UTF8String.c6
-rw-r--r--skeletons/UniversalString.c6
-rw-r--r--skeletons/VideotexString.c6
-rw-r--r--skeletons/VisibleString.c6
-rw-r--r--skeletons/constr_TYPE.h18
27 files changed, 177 insertions, 61 deletions
diff --git a/skeletons/BIT_STRING.c b/skeletons/BIT_STRING.c
index 7f1aa09a..a43a22aa 100644
--- a/skeletons/BIT_STRING.c
+++ b/skeletons/BIT_STRING.c
@@ -21,6 +21,9 @@ asn1_TYPE_descriptor_t asn1_DEF_BIT_STRING = {
asn1_DEF_BIT_STRING_tags,
sizeof(asn1_DEF_BIT_STRING_tags)
/ sizeof(asn1_DEF_BIT_STRING_tags[0]),
+ asn1_DEF_BIT_STRING_tags, /* Same as above */
+ sizeof(asn1_DEF_BIT_STRING_tags)
+ / sizeof(asn1_DEF_BIT_STRING_tags[0]),
-1, /* Both ways are fine */
0, 0, /* No members */
(void *)-1 /* Special indicator that this is a BIT STRING */
diff --git a/skeletons/BMPString.c b/skeletons/BMPString.c
index 87aaceae..3e779cce 100644
--- a/skeletons/BMPString.c
+++ b/skeletons/BMPString.c
@@ -8,7 +8,8 @@
* BMPString basic type description.
*/
static ber_tlv_tag_t asn1_DEF_BMPString_tags[] = {
- (ASN_TAG_CLASS_UNIVERSAL | (30 << 2))
+ (ASN_TAG_CLASS_UNIVERSAL | (30 << 2)), /* [UNIVERSAL 30] IMPLICIT ...*/
+ (ASN_TAG_CLASS_UNIVERSAL | (4 << 2)) /* ... OCTET STRING */
};
asn1_TYPE_descriptor_t asn1_DEF_BMPString = {
"BMPString",
@@ -20,6 +21,9 @@ asn1_TYPE_descriptor_t asn1_DEF_BMPString = {
0, /* Use generic outmost tag fetcher */
asn1_DEF_BMPString_tags,
sizeof(asn1_DEF_BMPString_tags)
+ / sizeof(asn1_DEF_BMPString_tags[0]) - 1,
+ asn1_DEF_BMPString_tags,
+ sizeof(asn1_DEF_BMPString_tags)
/ sizeof(asn1_DEF_BMPString_tags[0]),
-1, /* Both ways are fine */
0, 0, /* No members */
diff --git a/skeletons/BOOLEAN.c b/skeletons/BOOLEAN.c
index b7b4795a..5ba2e4f8 100644
--- a/skeletons/BOOLEAN.c
+++ b/skeletons/BOOLEAN.c
@@ -19,7 +19,9 @@ asn1_TYPE_descriptor_t asn1_DEF_BOOLEAN = {
BOOLEAN_free,
0, /* Use generic outmost tag fetcher */
asn1_DEF_BOOLEAN_tags,
- sizeof(asn1_DEF_BOOLEAN_tags)/sizeof(asn1_DEF_BOOLEAN_tags[0]),
+ sizeof(asn1_DEF_BOOLEAN_tags) / sizeof(asn1_DEF_BOOLEAN_tags[0]),
+ asn1_DEF_BOOLEAN_tags, /* Same as above */
+ sizeof(asn1_DEF_BOOLEAN_tags) / sizeof(asn1_DEF_BOOLEAN_tags[0]),
0, /* Always in primitive form */
0, 0, /* No members */
0 /* No specifics */
diff --git a/skeletons/ENUMERATED.c b/skeletons/ENUMERATED.c
index 9c8db298..ed908b56 100644
--- a/skeletons/ENUMERATED.c
+++ b/skeletons/ENUMERATED.c
@@ -19,7 +19,9 @@ asn1_TYPE_descriptor_t asn1_DEF_ENUMERATED = {
INTEGER_free, /* Implemented in terms of INTEGER */
0, /* Use generic outmost tag fetcher */
asn1_DEF_ENUMERATED_tags,
- sizeof(asn1_DEF_ENUMERATED_tags)/sizeof(asn1_DEF_ENUMERATED_tags[0]),
+ sizeof(asn1_DEF_ENUMERATED_tags) / sizeof(asn1_DEF_ENUMERATED_tags[0]),
+ asn1_DEF_ENUMERATED_tags, /* Same as above */
+ sizeof(asn1_DEF_ENUMERATED_tags) / sizeof(asn1_DEF_ENUMERATED_tags[0]),
0, /* Primitive */
0, 0, /* No members */
0 /* No specifics */
diff --git a/skeletons/GeneralString.c b/skeletons/GeneralString.c
index feef7ccb..dfca2cac 100644
--- a/skeletons/GeneralString.c
+++ b/skeletons/GeneralString.c
@@ -8,7 +8,8 @@
* GeneralString basic type description.
*/
static ber_tlv_tag_t asn1_DEF_GeneralString_tags[] = {
- (ASN_TAG_CLASS_UNIVERSAL | (27 << 2))
+ (ASN_TAG_CLASS_UNIVERSAL | (27 << 2)), /* [UNIVERSAL 27] IMPLICIT ...*/
+ (ASN_TAG_CLASS_UNIVERSAL | (4 << 2)) /* ... OCTET STRING */
};
asn1_TYPE_descriptor_t asn1_DEF_GeneralString = {
"GeneralString",
@@ -20,6 +21,9 @@ asn1_TYPE_descriptor_t asn1_DEF_GeneralString = {
0, /* Use generic outmost tag fetcher */
asn1_DEF_GeneralString_tags,
sizeof(asn1_DEF_GeneralString_tags)
+ / sizeof(asn1_DEF_GeneralString_tags[0]) - 1,
+ asn1_DEF_GeneralString_tags,
+ sizeof(asn1_DEF_GeneralString_tags)
/ sizeof(asn1_DEF_GeneralString_tags[0]),
-1, /* Both ways are fine */
0, 0, /* No members */
diff --git a/skeletons/GeneralizedTime.c b/skeletons/GeneralizedTime.c
index c66c3145..6a89b2d6 100644
--- a/skeletons/GeneralizedTime.c
+++ b/skeletons/GeneralizedTime.c
@@ -85,6 +85,9 @@ asn1_TYPE_descriptor_t asn1_DEF_GeneralizedTime = {
asn1_DEF_GeneralizedTime_tags,
sizeof(asn1_DEF_GeneralizedTime_tags)
/ sizeof(asn1_DEF_GeneralizedTime_tags[0]),
+ asn1_DEF_GeneralizedTime_tags, /* Same as above */
+ sizeof(asn1_DEF_GeneralizedTime_tags)
+ / sizeof(asn1_DEF_GeneralizedTime_tags[0]),
-1, /* Both ways are fine */
0, 0, /* No members */
0 /* No specifics */
diff --git a/skeletons/GraphicString.c b/skeletons/GraphicString.c
index f6d0ae9f..ceb247d6 100644
--- a/skeletons/GraphicString.c
+++ b/skeletons/GraphicString.c
@@ -8,7 +8,8 @@
* GraphicString basic type description.
*/
static ber_tlv_tag_t asn1_DEF_GraphicString_tags[] = {
- (ASN_TAG_CLASS_UNIVERSAL | (25 << 2))
+ (ASN_TAG_CLASS_UNIVERSAL | (25 << 2)), /* [UNIVERSAL 25] IMPLICIT ...*/
+ (ASN_TAG_CLASS_UNIVERSAL | (4 << 2)) /* ... OCTET STRING */
};
asn1_TYPE_descriptor_t asn1_DEF_GraphicString = {
"GraphicString",
@@ -20,6 +21,9 @@ asn1_TYPE_descriptor_t asn1_DEF_GraphicString = {
0, /* Use generic outmost tag fetcher */
asn1_DEF_GraphicString_tags,
sizeof(asn1_DEF_GraphicString_tags)
+ / sizeof(asn1_DEF_GraphicString_tags[0]) - 1,
+ asn1_DEF_GraphicString_tags,
+ sizeof(asn1_DEF_GraphicString_tags)
/ sizeof(asn1_DEF_GraphicString_tags[0]),
-1, /* Both ways are fine */
0, 0, /* No members */
diff --git a/skeletons/IA5String.c b/skeletons/IA5String.c
index 33f38a64..9fc308b1 100644
--- a/skeletons/IA5String.c
+++ b/skeletons/IA5String.c
@@ -8,7 +8,8 @@
* IA5String basic type description.
*/
static ber_tlv_tag_t asn1_DEF_IA5String_tags[] = {
- (ASN_TAG_CLASS_UNIVERSAL | (22 << 2))
+ (ASN_TAG_CLASS_UNIVERSAL | (22 << 2)), /* [UNIVERSAL 22] IMPLICIT ...*/
+ (ASN_TAG_CLASS_UNIVERSAL | (4 << 2)) /* ... OCTET STRING */
};
asn1_TYPE_descriptor_t asn1_DEF_IA5String = {
"IA5String",
@@ -20,6 +21,9 @@ asn1_TYPE_descriptor_t asn1_DEF_IA5String = {
0, /* Use generic outmost tag fetcher */
asn1_DEF_IA5String_tags,
sizeof(asn1_DEF_IA5String_tags)
+ / sizeof(asn1_DEF_IA5String_tags[0]) - 1,
+ asn1_DEF_IA5String_tags,
+ sizeof(asn1_DEF_IA5String_tags)
/ sizeof(asn1_DEF_IA5String_tags[0]),
-1, /* Both ways are fine */
0, 0, /* No members */
diff --git a/skeletons/INTEGER.c b/skeletons/INTEGER.c
index 14e91c6d..5bfcf1fb 100644
--- a/skeletons/INTEGER.c
+++ b/skeletons/INTEGER.c
@@ -21,7 +21,9 @@ asn1_TYPE_descriptor_t asn1_DEF_INTEGER = {
INTEGER_free,
0, /* Use generic outmost tag fetcher */
asn1_DEF_INTEGER_tags,
- sizeof(asn1_DEF_INTEGER_tags)/sizeof(asn1_DEF_INTEGER_tags[0]),
+ sizeof(asn1_DEF_INTEGER_tags) / sizeof(asn1_DEF_INTEGER_tags[0]),
+ asn1_DEF_INTEGER_tags, /* Same as above */
+ sizeof(asn1_DEF_INTEGER_tags) / sizeof(asn1_DEF_INTEGER_tags[0]),
0, /* Always in primitive form */
0, 0, /* No members */
0 /* No specifics */
diff --git a/skeletons/ISO646String.c b/skeletons/ISO646String.c
index 7ce54968..8a99cbcb 100644
--- a/skeletons/ISO646String.c
+++ b/skeletons/ISO646String.c
@@ -8,7 +8,8 @@
* ISO646String basic type description.
*/
static ber_tlv_tag_t asn1_DEF_ISO646String_tags[] = {
- (ASN_TAG_CLASS_UNIVERSAL | (26 << 2))
+ (ASN_TAG_CLASS_UNIVERSAL | (26 << 2)), /* [UNIVERSAL 26] IMPLICIT ...*/
+ (ASN_TAG_CLASS_UNIVERSAL | (4 << 2)) /* ... OCTET STRING */
};
asn1_TYPE_descriptor_t asn1_DEF_ISO646String = {
"ISO646String",
@@ -20,6 +21,9 @@ asn1_TYPE_descriptor_t asn1_DEF_ISO646String = {
0, /* Use generic outmost tag fetcher */
asn1_DEF_ISO646String_tags,
sizeof(asn1_DEF_ISO646String_tags)
+ / sizeof(asn1_DEF_ISO646String_tags[0]) - 1,
+ asn1_DEF_ISO646String_tags,
+ sizeof(asn1_DEF_ISO646String_tags)
/ sizeof(asn1_DEF_ISO646String_tags[0]),
-1, /* Both ways are fine */
0, 0, /* No members */
diff --git a/skeletons/NULL.c b/skeletons/NULL.c
index 42afa7e3..36796b8a 100644
--- a/skeletons/NULL.c
+++ b/skeletons/NULL.c
@@ -20,7 +20,9 @@ asn1_TYPE_descriptor_t asn1_DEF_NULL = {
BOOLEAN_free,
0, /* Use generic outmost tag fetcher */
asn1_DEF_NULL_tags,
- sizeof(asn1_DEF_NULL_tags)/sizeof(asn1_DEF_NULL_tags[0]),
+ sizeof(asn1_DEF_NULL_tags) / sizeof(asn1_DEF_NULL_tags[0]),
+ asn1_DEF_NULL_tags, /* Same as above */
+ sizeof(asn1_DEF_NULL_tags) / sizeof(asn1_DEF_NULL_tags[0]),
0, /* Always in primitive form */
0, 0, /* No members */
0 /* No specifics */
diff --git a/skeletons/NativeEnumerated.c b/skeletons/NativeEnumerated.c
index 9c4fd8f5..53ce5012 100644
--- a/skeletons/NativeEnumerated.c
+++ b/skeletons/NativeEnumerated.c
@@ -26,7 +26,9 @@ asn1_TYPE_descriptor_t asn1_DEF_NativeEnumerated = {
NativeInteger_free,
0, /* Use generic outmost tag fetcher */
asn1_DEF_NativeEnumerated_tags,
- sizeof(asn1_DEF_NativeEnumerated_tags)/sizeof(asn1_DEF_NativeEnumerated_tags[0]),
+ sizeof(asn1_DEF_NativeEnumerated_tags) / sizeof(asn1_DEF_NativeEnumerated_tags[0]),
+ asn1_DEF_NativeEnumerated_tags, /* Same as above */
+ sizeof(asn1_DEF_NativeEnumerated_tags) / sizeof(asn1_DEF_NativeEnumerated_tags[0]),
0, /* Always in primitive form */
0, 0, /* No members */
0 /* No specifics */
diff --git a/skeletons/NativeInteger.c b/skeletons/NativeInteger.c
index 60321cc3..98fee965 100644
--- a/skeletons/NativeInteger.c
+++ b/skeletons/NativeInteger.c
@@ -28,7 +28,9 @@ asn1_TYPE_descriptor_t asn1_DEF_NativeInteger = {
NativeInteger_free,
0, /* Use generic outmost tag fetcher */
asn1_DEF_NativeInteger_tags,
- sizeof(asn1_DEF_NativeInteger_tags)/sizeof(asn1_DEF_NativeInteger_tags[0]),
+ sizeof(asn1_DEF_NativeInteger_tags) / sizeof(asn1_DEF_NativeInteger_tags[0]),
+ asn1_DEF_NativeInteger_tags, /* Same as above */
+ sizeof(asn1_DEF_NativeInteger_tags) / sizeof(asn1_DEF_NativeInteger_tags[0]),
0, /* Always in primitive form */
0, 0, /* No members */
0 /* No specifics */
diff --git a/skeletons/NumericString.c b/skeletons/NumericString.c
index a70bb5d7..a23e39f1 100644
--- a/skeletons/NumericString.c
+++ b/skeletons/NumericString.c
@@ -8,7 +8,8 @@
* NumericString basic type description.
*/
static ber_tlv_tag_t asn1_DEF_NumericString_tags[] = {
- (ASN_TAG_CLASS_UNIVERSAL | (18 << 2))
+ (ASN_TAG_CLASS_UNIVERSAL | (18 << 2)), /* [UNIVERSAL 18] IMPLICIT ...*/
+ (ASN_TAG_CLASS_UNIVERSAL | (4 << 2)) /* ... OCTET STRING */
};
asn1_TYPE_descriptor_t asn1_DEF_NumericString = {
"NumericString",
@@ -20,6 +21,9 @@ asn1_TYPE_descriptor_t asn1_DEF_NumericString = {
0, /* Use generic outmost tag fetcher */
asn1_DEF_NumericString_tags,
sizeof(asn1_DEF_NumericString_tags)
+ / sizeof(asn1_DEF_NumericString_tags[0]) - 1,
+ asn1_DEF_NumericString_tags,
+ sizeof(asn1_DEF_NumericString_tags)
/ sizeof(asn1_DEF_NumericString_tags[0]),
-1, /* Both ways are fine */
0, 0, /* No members */
diff --git a/skeletons/OBJECT_IDENTIFIER.c b/skeletons/OBJECT_IDENTIFIER.c
index a44349e2..c55410d5 100644
--- a/skeletons/OBJECT_IDENTIFIER.c
+++ b/skeletons/OBJECT_IDENTIFIER.c
@@ -24,6 +24,9 @@ asn1_TYPE_descriptor_t asn1_DEF_OBJECT_IDENTIFIER = {
asn1_DEF_OBJECT_IDENTIFIER_tags,
sizeof(asn1_DEF_OBJECT_IDENTIFIER_tags)
/ sizeof(asn1_DEF_OBJECT_IDENTIFIER_tags[0]),
+ asn1_DEF_OBJECT_IDENTIFIER_tags, /* Same as above */
+ sizeof(asn1_DEF_OBJECT_IDENTIFIER_tags)
+ / sizeof(asn1_DEF_OBJECT_IDENTIFIER_tags[0]),
0, /* Always in primitive form */
0, 0, /* No members */
0 /* No specifics */
@@ -98,7 +101,7 @@ OBJECT_IDENTIFIER_constraint(asn1_TYPE_descriptor_t *td, const void *sptr,
int
OBJECT_IDENTIFIER_get_single_arc(uint8_t *arcbuf, unsigned int arclen, signed int add, void *rvbuf, unsigned int rvsize) {
- unsigned LE = 1; /* Little endian (x86) */
+ unsigned LE __attribute__ ((unused)) = 1; /* Little endian (x86) */
uint8_t *arcend = arcbuf + arclen; /* End of arc */
void *rvstart = rvbuf; /* Original start of the value buffer */
unsigned int cache = 0; /* No more than 14 significant bits */
diff --git a/skeletons/OCTET_STRING.c b/skeletons/OCTET_STRING.c
index 65893347..e0af730a 100644
--- a/skeletons/OCTET_STRING.c
+++ b/skeletons/OCTET_STRING.c
@@ -1,5 +1,5 @@
/*-
- * Copyright (c) 2003 Lev Walkin <vlm@lionet.info>. All rights reserved.
+ * Copyright (c) 2003, 2004 Lev Walkin <vlm@lionet.info>. All rights reserved.
* Redistribution and modifications are permitted subject to BSD license.
*/
#include <OCTET_STRING.h>
@@ -23,6 +23,9 @@ asn1_TYPE_descriptor_t asn1_DEF_OCTET_STRING = {
asn1_DEF_OCTET_STRING_tags,
sizeof(asn1_DEF_OCTET_STRING_tags)
/ sizeof(asn1_DEF_OCTET_STRING_tags[0]),
+ asn1_DEF_OCTET_STRING_tags, /* Same as above */
+ sizeof(asn1_DEF_OCTET_STRING_tags)
+ / sizeof(asn1_DEF_OCTET_STRING_tags[0]),
-1, /* Both ways are fine (primitive and constructed) */
0, 0, /* No members */
0 /* No specifics */
@@ -54,6 +57,7 @@ asn1_TYPE_descriptor_t asn1_DEF_OCTET_STRING = {
size_t _ns = ctx->step; /* Allocated */ \
if(_ns <= (size_t)(st->size + _bs)) { \
void *ptr; \
+ /* Be nice and round to the memory allocator */ \
do { _ns = _ns ? _ns<<2 : 16; } \
while(_ns <= (size_t)(st->size + _bs)); \
ptr = REALLOC(st->buf, _ns); \
@@ -81,6 +85,7 @@ asn1_TYPE_descriptor_t asn1_DEF_OCTET_STRING = {
*/
struct _stack_el {
ber_tlv_len_t left; /* What's left to read */
+ int cont_level; /* Depth of subcontainment */
int want_nulls; /* Want null "end of content" octets? */
int bits_chopped; /* Flag in BIT STRING mode */
struct _stack_el *prev;
@@ -95,17 +100,23 @@ static struct _stack_el *
_add_stack_el(struct _stack *st) {
struct _stack_el *nel;
+ /*
+ * Reuse the old stack frame or allocate a new one.
+ */
if(st->cur_ptr && st->cur_ptr->next) {
nel = st->cur_ptr->next;
nel->left = 0;
nel->want_nulls = 0;
nel->bits_chopped = 0;
+ /* Retain nel->cont_level, it's correct. */
} else {
(void *)nel = CALLOC(1, sizeof(struct _stack_el));
if(nel == NULL)
return NULL;
if(st->tail) {
+ /* Increase a subcontainment depth */
+ nel->cont_level = st->tail->cont_level + 1;
st->tail->next = nel;
}
nel->prev = st->tail;
@@ -136,13 +147,16 @@ OCTET_STRING_decode_ber(asn1_TYPE_descriptor_t *td,
OCTET_STRING_t *st = (OCTET_STRING_t *)*os_structure;
ber_dec_rval_t rval;
ber_dec_ctx_t *ctx;
- ber_tlv_tag_t terminal_tag; /* Inner tag for constructed types */
ssize_t consumed_myself = 0;
struct _stack *stck; /* A stack structure */
struct _stack_el *sel; /* Stack element */
int tlv_constr;
- int is_bit_str = 0; /* See below under switch(td->specifics) */
- int is_ANY_type = 0; /* See below under switch(td->specifics) */
+ enum type_type_e {
+ _TT_GENERIC = 0, /* Just a random OCTET STRING */
+ _TT_BIT_STRING = -1, /* BIT STRING type, a special case */
+ _TT_ANY = 1, /* ANY type, a special case too */
+ } type_type
+ = (enum type_type_e)(int)td->specifics; /* An ugly hack */
ASN_DEBUG("Decoding %s as %s (%ld)",
td->name, "OCTET STRING", (long)size);
@@ -159,25 +173,6 @@ OCTET_STRING_decode_ber(asn1_TYPE_descriptor_t *td,
/* Restore parsing context */
ctx = &st->_ber_dec_ctx;
- switch((int)td->specifics) {
- case 0:
- terminal_tag = asn1_DEF_OCTET_STRING_tags[0]; /* [U4] */
- break;
- case -1: /* BIT STRING */
- /*
- * This is some sort of a hack.
- * The OCTET STRING decoder is being used in BIT STRING mode.
- */
- is_bit_str = 1;
- terminal_tag = ASN_TAG_CLASS_UNIVERSAL | (3 << 2);
- break;
- default: /* Just in case; fall through */
- case 1: /* ANY type */
- is_ANY_type = 1;
- terminal_tag = -1;
- break;
- }
-
switch(ctx->phase) {
case 0:
/*
@@ -212,7 +207,7 @@ OCTET_STRING_decode_ber(asn1_TYPE_descriptor_t *td,
stck->cur_ptr->left,
stck->cur_ptr->want_nulls);
#endif
- if(is_bit_str) {
+ if(type_type == _TT_BIT_STRING) {
/* Number of meaningless tail bits */
APPEND("\0", 1);
}
@@ -224,7 +219,8 @@ OCTET_STRING_decode_ber(asn1_TYPE_descriptor_t *td,
* Jump into stackless primitive decoding.
*/
_CH_PHASE(ctx, 3);
- if(is_ANY_type) APPEND(buf_ptr, rval.consumed);
+ if(type_type == _TT_ANY)
+ APPEND(buf_ptr, rval.consumed);
ADVANCE(rval.consumed);
goto phase3;
}
@@ -241,6 +237,7 @@ OCTET_STRING_decode_ber(asn1_TYPE_descriptor_t *td,
do {
ber_tlv_tag_t tlv_tag;
ber_tlv_len_t tlv_len;
+ ber_tlv_tag_t expected_tag;
ssize_t tl, ll;
ASN_DEBUG("fetch tag(size=%d), %sstack, left=%d, want0=%d",
@@ -271,7 +268,7 @@ OCTET_STRING_decode_ber(asn1_TYPE_descriptor_t *td,
&& ((uint8_t *)buf_ptr)[1] == 0)
{
ADVANCE(2);
- if(is_ANY_type) APPEND("\0\0", 2);
+ if(type_type == _TT_ANY) APPEND("\0\0", 2);
ASN_DEBUG("Eat EOC; wn=%d--", sel->want_nulls);
@@ -294,8 +291,38 @@ OCTET_STRING_decode_ber(asn1_TYPE_descriptor_t *td,
}
continue;
- } else if(tlv_tag != terminal_tag
- && terminal_tag != (ber_tlv_tag_t)-1) {
+ }
+
+ /*
+ * Set up expected tags,
+ * depending on ASN.1 type being decoded.
+ */
+ switch(type_type) {
+ case _TT_BIT_STRING:
+ /* X.690: 8.6.4.1, NOTE 2 */
+ /* Fall through */
+ case _TT_GENERIC:
+ default:
+ if(sel) {
+ int level = sel->cont_level;
+ if(level < td->all_tags_count) {
+ expected_tag = td->all_tags[level];
+ break;
+ } else if(td->all_tags_count) {
+ expected_tag = td->all_tags
+ [td->all_tags_count - 1];
+ break;
+ }
+ /* else, Fall through */
+ }
+ /* Fall through */
+ case _TT_ANY:
+ expected_tag = tlv_tag;
+ break;
+ }
+
+
+ if(tlv_tag != expected_tag) {
char buf[2][32];
ber_tlv_tag_snprint(tlv_tag,
buf[0], sizeof(buf[0]));
@@ -313,17 +340,18 @@ OCTET_STRING_decode_ber(asn1_TYPE_descriptor_t *td,
if(sel) {
sel->want_nulls = (tlv_len==-1);
sel->left = tlv_len;
- ASN_DEBUG("+EXPECT2 left=%d wn=%d",
- sel->left, sel->want_nulls);
+ ASN_DEBUG("+EXPECT2 left=%d wn=%d, clvl=%d",
+ sel->left, sel->want_nulls, sel->cont_level);
} else {
RETURN(RC_FAIL);
}
- if(is_ANY_type) APPEND(buf_ptr, tl + ll);
+ if(type_type == _TT_ANY) APPEND(buf_ptr, tl + ll);
ADVANCE(tl+ll);
} while(tlv_constr);
if(sel == NULL) {
/* Finished operation, "phase out" */
+ ASN_DEBUG("Phase out");
_CH_PHASE(ctx, +3);
break;
}
@@ -343,7 +371,8 @@ OCTET_STRING_decode_ber(asn1_TYPE_descriptor_t *td,
len = ((ber_tlv_len_t)size < sel->left)
? (ber_tlv_len_t)size : sel->left;
if(len > 0) {
- if(is_bit_str && sel->bits_chopped == 0) {
+ if(type_type == _TT_BIT_STRING
+ && sel->bits_chopped == 0) {
/*
* Finalize the previous chunk:
* strip down unused bits.
@@ -394,7 +423,7 @@ OCTET_STRING_decode_ber(asn1_TYPE_descriptor_t *td,
/*
* BIT STRING-specific processing.
*/
- if(is_bit_str && st->size >= 2) {
+ if(type_type == _TT_BIT_STRING && st->size >= 2) {
/* Finalize BIT STRING: zero out unused bits. */
st->buf[st->size-1] &= 0xff << st->buf[0];
}
diff --git a/skeletons/ObjectDescriptor.c b/skeletons/ObjectDescriptor.c
index 1f82e2b1..5017918e 100644
--- a/skeletons/ObjectDescriptor.c
+++ b/skeletons/ObjectDescriptor.c
@@ -8,7 +8,8 @@
* ObjectDescriptor basic type description.
*/
static ber_tlv_tag_t asn1_DEF_ObjectDescriptor_tags[] = {
- (ASN_TAG_CLASS_UNIVERSAL | (7 << 2))
+ (ASN_TAG_CLASS_UNIVERSAL | (7 << 2)), /* [UNIVERSAL 7] IMPLICIT ... */
+ (ASN_TAG_CLASS_UNIVERSAL | (4 << 2)) /* ... OCTET STRING */
};
asn1_TYPE_descriptor_t asn1_DEF_ObjectDescriptor = {
"ObjectDescriptor",
@@ -20,6 +21,9 @@ asn1_TYPE_descriptor_t asn1_DEF_ObjectDescriptor = {
0, /* Use generic outmost tag fetcher */
asn1_DEF_ObjectDescriptor_tags,
sizeof(asn1_DEF_ObjectDescriptor_tags)
+ / sizeof(asn1_DEF_ObjectDescriptor_tags[0]) - 1,
+ asn1_DEF_ObjectDescriptor_tags,
+ sizeof(asn1_DEF_ObjectDescriptor_tags)
/ sizeof(asn1_DEF_ObjectDescriptor_tags[0]),
-1, /* Both ways are fine */
0, 0, /* No members */
diff --git a/skeletons/PrintableString.c b/skeletons/PrintableString.c
index 89cbf8df..c37de497 100644
--- a/skeletons/PrintableString.c
+++ b/skeletons/PrintableString.c
@@ -8,7 +8,8 @@
* PrintableString basic type description.
*/
static ber_tlv_tag_t asn1_DEF_PrintableString_tags[] = {
- (ASN_TAG_CLASS_UNIVERSAL | (19 << 2))
+ (ASN_TAG_CLASS_UNIVERSAL | (19 << 2)), /* [UNIVERSAL 19] IMPLICIT ...*/
+ (ASN_TAG_CLASS_UNIVERSAL | (4 << 2)) /* ... OCTET STRING */
};
asn1_TYPE_descriptor_t asn1_DEF_PrintableString = {
"PrintableString",
@@ -20,6 +21,9 @@ asn1_TYPE_descriptor_t asn1_DEF_PrintableString = {
0, /* Use generic outmost tag fetcher */
asn1_DEF_PrintableString_tags,
sizeof(asn1_DEF_PrintableString_tags)
+ / sizeof(asn1_DEF_PrintableString_tags[0]) - 1,
+ asn1_DEF_PrintableString_tags,
+ sizeof(asn1_DEF_PrintableString_tags)
/ sizeof(asn1_DEF_PrintableString_tags[0]),
-1, /* Both ways are fine */
0, 0, /* No members */
diff --git a/skeletons/RELATIVE-OID.c b/skeletons/RELATIVE-OID.c
index f1948f86..bee795c4 100644
--- a/skeletons/RELATIVE-OID.c
+++ b/skeletons/RELATIVE-OID.c
@@ -24,6 +24,9 @@ asn1_TYPE_descriptor_t asn1_DEF_RELATIVE_OID = {
asn1_DEF_RELATIVE_OID_tags,
sizeof(asn1_DEF_RELATIVE_OID_tags)
/ sizeof(asn1_DEF_RELATIVE_OID_tags[0]),
+ asn1_DEF_RELATIVE_OID_tags, /* Same as above */
+ sizeof(asn1_DEF_RELATIVE_OID_tags)
+ / sizeof(asn1_DEF_RELATIVE_OID_tags[0]),
0, /* Always in primitive form */
0, 0, /* No members */
0 /* No specifics */
diff --git a/skeletons/T61String.c b/skeletons/T61String.c
index 52263744..b306a5ba 100644
--- a/skeletons/T61String.c
+++ b/skeletons/T61String.c
@@ -8,7 +8,8 @@
* T61String basic type description.
*/
static ber_tlv_tag_t asn1_DEF_T61String_tags[] = {
- (ASN_TAG_CLASS_UNIVERSAL | (20 << 2))
+ (ASN_TAG_CLASS_UNIVERSAL | (20 << 2)), /* [UNIVERSAL 20] IMPLICIT ...*/
+ (ASN_TAG_CLASS_UNIVERSAL | (4 << 2)) /* ... OCTET STRING */
};
asn1_TYPE_descriptor_t asn1_DEF_T61String = {
"T61String",
@@ -20,6 +21,9 @@ asn1_TYPE_descriptor_t asn1_DEF_T61String = {
0, /* Use generic outmost tag fetcher */
asn1_DEF_T61String_tags,
sizeof(asn1_DEF_T61String_tags)
+ / sizeof(asn1_DEF_T61String_tags[0]) - 1,
+ asn1_DEF_T61String_tags,
+ sizeof(asn1_DEF_T61String_tags)
/ sizeof(asn1_DEF_T61String_tags[0]),
-1, /* Both ways are fine */
0, 0, /* No members */
diff --git a/skeletons/TeletexString.c b/skeletons/TeletexString.c
index b46caed4..09f3eb6a 100644
--- a/skeletons/TeletexString.c
+++ b/skeletons/TeletexString.c
@@ -8,7 +8,8 @@
* TeletexString basic type description.
*/
static ber_tlv_tag_t asn1_DEF_TeletexString_tags[] = {
- (ASN_TAG_CLASS_UNIVERSAL | (20 << 2))
+ (ASN_TAG_CLASS_UNIVERSAL | (20 << 2)), /* [UNIVERSAL 20] IMPLICIT ...*/
+ (ASN_TAG_CLASS_UNIVERSAL | (4 << 2)), /* ... OCTET STRING */
};
asn1_TYPE_descriptor_t asn1_DEF_TeletexString = {
"TeletexString",
@@ -20,6 +21,9 @@ asn1_TYPE_descriptor_t asn1_DEF_TeletexString = {
0, /* Use generic outmost tag fetcher */
asn1_DEF_TeletexString_tags,
sizeof(asn1_DEF_TeletexString_tags)
+ / sizeof(asn1_DEF_TeletexString_tags[0]) - 1,
+ asn1_DEF_TeletexString_tags,
+ sizeof(asn1_DEF_TeletexString_tags)
/ sizeof(asn1_DEF_TeletexString_tags[0]),
-1, /* Both ways are fine */
0, 0, /* No members */
diff --git a/skeletons/UTCTime.c b/skeletons/UTCTime.c
index c574e4ea..029a43e4 100644
--- a/skeletons/UTCTime.c
+++ b/skeletons/UTCTime.c
@@ -27,6 +27,9 @@ asn1_TYPE_descriptor_t asn1_DEF_UTCTime = {
asn1_DEF_UTCTime_tags,
sizeof(asn1_DEF_UTCTime_tags)
/ sizeof(asn1_DEF_UTCTime_tags[0]),
+ asn1_DEF_UTCTime_tags, /* Same as above */
+ sizeof(asn1_DEF_UTCTime_tags)
+ / sizeof(asn1_DEF_UTCTime_tags[0]),
-1, /* Both ways are fine */
0, 0, /* No members */
0 /* No specifics */
diff --git a/skeletons/UTF8String.c b/skeletons/UTF8String.c
index 384600aa..40fef39b 100644
--- a/skeletons/UTF8String.c
+++ b/skeletons/UTF8String.c
@@ -8,7 +8,8 @@
* UTF8String basic type description.
*/
static ber_tlv_tag_t asn1_DEF_UTF8String_tags[] = {
- (ASN_TAG_CLASS_UNIVERSAL | (12 << 2))
+ (ASN_TAG_CLASS_UNIVERSAL | (12 << 2)), /* [UNIVERSAL 12] IMPLICIT ...*/
+ (ASN_TAG_CLASS_UNIVERSAL | (4 << 2)), /* ... OCTET STRING */
};
asn1_TYPE_descriptor_t asn1_DEF_UTF8String = {
"UTF8String",
@@ -20,6 +21,9 @@ asn1_TYPE_descriptor_t asn1_DEF_UTF8String = {
0, /* Use generic outmost tag fetcher */
asn1_DEF_UTF8String_tags,
sizeof(asn1_DEF_UTF8String_tags)
+ / sizeof(asn1_DEF_UTF8String_tags[0]) - 1,
+ asn1_DEF_UTF8String_tags,
+ sizeof(asn1_DEF_UTF8String_tags)
/ sizeof(asn1_DEF_UTF8String_tags[0]),
-1, /* Both ways are fine */
0, 0, /* No members */
diff --git a/skeletons/UniversalString.c b/skeletons/UniversalString.c
index 35e7bead..14988966 100644
--- a/skeletons/UniversalString.c
+++ b/skeletons/UniversalString.c
@@ -8,7 +8,8 @@
* UniversalString basic type description.
*/
static ber_tlv_tag_t asn1_DEF_UniversalString_tags[] = {
- (ASN_TAG_CLASS_UNIVERSAL | (28 << 2))
+ (ASN_TAG_CLASS_UNIVERSAL | (28 << 2)), /* [UNIVERSAL 28] IMPLICIT ...*/
+ (ASN_TAG_CLASS_UNIVERSAL | (4 << 2)) /* ... OCTET STRING */
};
asn1_TYPE_descriptor_t asn1_DEF_UniversalString = {
"UniversalString",
@@ -20,6 +21,9 @@ asn1_TYPE_descriptor_t asn1_DEF_UniversalString = {
0, /* Use generic outmost tag fetcher */
asn1_DEF_UniversalString_tags,
sizeof(asn1_DEF_UniversalString_tags)
+ / sizeof(asn1_DEF_UniversalString_tags[0]) - 1,
+ asn1_DEF_UniversalString_tags,
+ sizeof(asn1_DEF_UniversalString_tags)
/ sizeof(asn1_DEF_UniversalString_tags[0]),
-1, /* Both ways are fine */
0, 0, /* No members */
diff --git a/skeletons/VideotexString.c b/skeletons/VideotexString.c
index 772c66c6..6d2eaeb6 100644
--- a/skeletons/VideotexString.c
+++ b/skeletons/VideotexString.c
@@ -8,7 +8,8 @@
* VideotexString basic type description.
*/
static ber_tlv_tag_t asn1_DEF_VideotexString_tags[] = {
- (ASN_TAG_CLASS_UNIVERSAL | (21 << 2))
+ (ASN_TAG_CLASS_UNIVERSAL | (21 << 2)), /* [UNIVERSAL 21] IMPLICIT */
+ (ASN_TAG_CLASS_UNIVERSAL | (4 << 2)) /* ... OCTET STRING */
};
asn1_TYPE_descriptor_t asn1_DEF_VideotexString = {
"VideotexString",
@@ -20,6 +21,9 @@ asn1_TYPE_descriptor_t asn1_DEF_VideotexString = {
0, /* Use generic outmost tag fetcher */
asn1_DEF_VideotexString_tags,
sizeof(asn1_DEF_VideotexString_tags)
+ / sizeof(asn1_DEF_VideotexString_tags[0]) - 1,
+ asn1_DEF_VideotexString_tags,
+ sizeof(asn1_DEF_VideotexString_tags)
/ sizeof(asn1_DEF_VideotexString_tags[0]),
-1, /* Both ways are fine */
0, 0, /* No members */
diff --git a/skeletons/VisibleString.c b/skeletons/VisibleString.c
index 18a27faf..9ddb0f1c 100644
--- a/skeletons/VisibleString.c
+++ b/skeletons/VisibleString.c
@@ -8,7 +8,8 @@
* VisibleString basic type description.
*/
static ber_tlv_tag_t asn1_DEF_VisibleString_tags[] = {
- (ASN_TAG_CLASS_UNIVERSAL | (26 << 2))
+ (ASN_TAG_CLASS_UNIVERSAL | (26 << 2)), /* [UNIVERSAL 26] IMPLICIT ...*/
+ (ASN_TAG_CLASS_UNIVERSAL | (4 << 2)) /* ... OCTET STRING */
};
asn1_TYPE_descriptor_t asn1_DEF_VisibleString = {
"VisibleString",
@@ -20,6 +21,9 @@ asn1_TYPE_descriptor_t asn1_DEF_VisibleString = {
0, /* Use generic outmost tag fetcher */
asn1_DEF_VisibleString_tags,
sizeof(asn1_DEF_VisibleString_tags)
+ / sizeof(asn1_DEF_VisibleString_tags[0]) - 1,
+ asn1_DEF_VisibleString_tags,
+ sizeof(asn1_DEF_VisibleString_tags)
/ sizeof(asn1_DEF_VisibleString_tags[0]),
-1, /* Both ways are fine */
0, 0, /* No members */
diff --git a/skeletons/constr_TYPE.h b/skeletons/constr_TYPE.h
index 1918b5c1..15a67261 100644
--- a/skeletons/constr_TYPE.h
+++ b/skeletons/constr_TYPE.h
@@ -70,10 +70,13 @@ typedef struct asn1_TYPE_descriptor_s {
asn_outmost_tag_f *outmost_tag; /* <optional, internal> */
/*
- * Tags that are expected, with some of their vital properties.
+ * Tags that are expected to occur.
*/
- ber_tlv_tag_t *tags; /* At least one tag must be specified */
+ ber_tlv_tag_t *tags; /* Effective tags sequence for this type */
int tags_count; /* Number of tags which are expected */
+ ber_tlv_tag_t *all_tags;/* Every tag for BER/containment */
+ int all_tags_count; /* Number of tags */
+
int last_tag_form; /* Acceptable form of the tag (prim, constr) */
/*
@@ -92,12 +95,13 @@ typedef struct asn1_TYPE_descriptor_s {
/*
* An element of the constructed type, i.e. SEQUENCE, SET, CHOICE.
*/
+ enum asn1_TYPE_flags_e {
+ ATF_NOFLAGS,
+ ATF_POINTER = 0x01, /* Represented by the pointer */
+ ATF_OPEN_TYPE = 0x02, /* ANY type, without meaningful tag */
+ };
typedef struct asn1_TYPE_member_s {
- enum asn1_TYPE_flags_e {
- ATF_NOFLAGS,
- ATF_POINTER = 0x01, /* Represented by the pointer */
- ATF_OPEN_TYPE = 0x02, /* ANY type, without meaningful tag */
- } flags; /* Element's presentation flags */
+ enum asn1_TYPE_flags_e flags; /* Element's presentation flags */
int optional; /* Following optional members, including current */
int memb_offset; /* Offset of the element */
ber_tlv_tag_t tag; /* Outmost (most immediate) tag */