mirror of https://gerrit.osmocom.org/asn1c
clean-up; removed unnecessary field from type descriptor
git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@400 59561ff5-6e30-0410-9f3c-9617f08c8826
This commit is contained in:
parent
b21cfd41d0
commit
6678cb11c1
|
@ -18,9 +18,8 @@ asn1_TYPE_descriptor_t asn1_DEF_ANY = {
|
|||
ANY_encode_xer,
|
||||
0, /* Use generic outmost tag fetcher */
|
||||
0, 0, 0, 0,
|
||||
-1, /* Both ways are fine (primitive and constructed) */
|
||||
0, 0, /* No members */
|
||||
(void *)1 /* Special indicator that this is an ANY type */
|
||||
(void *)2 /* Special indicator that this is an ANY type */
|
||||
};
|
||||
|
||||
|
||||
|
@ -139,7 +138,7 @@ static int ANY__consume_bytes(const void *buffer, size_t size, void *key) {
|
|||
size_t nsize = (arg->size ? arg->size << 2 : 16) + size;
|
||||
void *p = REALLOC(arg->buffer, nsize);
|
||||
if(!p) return -1;
|
||||
(void *)arg->buffer = p;
|
||||
arg->buffer = (uint8_t *)p;
|
||||
arg->size = nsize;
|
||||
}
|
||||
|
||||
|
|
|
@ -4,6 +4,7 @@
|
|||
*/
|
||||
#include <asn_internal.h>
|
||||
#include <BIT_STRING.h>
|
||||
#include <asn_internal.h>
|
||||
|
||||
/*
|
||||
* BIT STRING basic type description.
|
||||
|
@ -27,9 +28,8 @@ asn1_TYPE_descriptor_t asn1_DEF_BIT_STRING = {
|
|||
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 */
|
||||
(void *)1 /* Special indicator that this is a BIT STRING */
|
||||
};
|
||||
|
||||
/*
|
||||
|
@ -144,9 +144,10 @@ BIT_STRING_print(asn1_TYPE_descriptor_t *td, const void *sptr, int ilevel,
|
|||
|
||||
(void)td; /* Unused argument */
|
||||
|
||||
if(!st || !st->buf) return cb("<absent>", 8, app_key);
|
||||
if(!st || !st->buf)
|
||||
return (cb("<absent>", 8, app_key) < 0) ? -1 : 0;
|
||||
|
||||
ilevel += 4;
|
||||
ilevel++;
|
||||
buf = st->buf;
|
||||
end = buf + st->size;
|
||||
|
||||
|
@ -156,12 +157,9 @@ BIT_STRING_print(asn1_TYPE_descriptor_t *td, const void *sptr, int ilevel,
|
|||
for(buf++; buf < end; buf++) {
|
||||
if(((buf - st->buf) - 1) % 16 == 0 && (st->size > 17)
|
||||
&& buf != st->buf+1) {
|
||||
int i;
|
||||
/* Indentation */
|
||||
if(cb("\n", 1, app_key)) return -1;
|
||||
for(i = 0; i < ilevel; i++) cb(" ", 1, app_key);
|
||||
_i_INDENT(1);
|
||||
/* Dump the string */
|
||||
if(cb(scratch, p - scratch, app_key)) return -1;
|
||||
if(cb(scratch, p - scratch, app_key) < 0) return -1;
|
||||
p = scratch;
|
||||
}
|
||||
*p++ = h2c[*buf >> 4];
|
||||
|
@ -173,13 +171,11 @@ BIT_STRING_print(asn1_TYPE_descriptor_t *td, const void *sptr, int ilevel,
|
|||
p--; /* Eat the tailing space */
|
||||
|
||||
if((st->size > 17)) {
|
||||
int i;
|
||||
if(cb("\n", 1, app_key)) return -1;
|
||||
for(i = 0; i < ilevel; i++) cb(" ", 1, app_key);
|
||||
_i_INDENT(1);
|
||||
}
|
||||
|
||||
/* Dump the incomplete 16-bytes row */
|
||||
if(cb(scratch, p - scratch, app_key))
|
||||
if(cb(scratch, p - scratch, app_key) < 0)
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
|
|
@ -28,7 +28,6 @@ asn1_TYPE_descriptor_t asn1_DEF_BMPString = {
|
|||
asn1_DEF_BMPString_tags,
|
||||
sizeof(asn1_DEF_BMPString_tags)
|
||||
/ sizeof(asn1_DEF_BMPString_tags[0]),
|
||||
-1, /* Both ways are fine */
|
||||
0, 0, /* No members */
|
||||
0 /* No specifics */
|
||||
};
|
||||
|
@ -101,7 +100,8 @@ BMPString_print(asn1_TYPE_descriptor_t *td, const void *sptr, int ilevel,
|
|||
(void)td; /* Unused argument */
|
||||
(void)ilevel; /* Unused argument */
|
||||
|
||||
if(!st || !st->buf) return cb("<absent>", 8, app_key);
|
||||
if(!st || !st->buf)
|
||||
return (cb("<absent>", 8, app_key) < 0) ? -1 : 0;
|
||||
|
||||
if(BMPString__dump(st, cb, app_key) < 0)
|
||||
return -1;
|
||||
|
|
|
@ -25,7 +25,6 @@ asn1_TYPE_descriptor_t asn1_DEF_BOOLEAN = {
|
|||
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 */
|
||||
};
|
||||
|
@ -43,7 +42,7 @@ BOOLEAN_decode_ber(asn1_TYPE_descriptor_t *td,
|
|||
ber_tlv_len_t lidx;
|
||||
|
||||
if(st == NULL) {
|
||||
(void *)st = *bool_value = CALLOC(1, sizeof(*st));
|
||||
st = (BOOLEAN_t *)(*bool_value = CALLOC(1, sizeof(*st)));
|
||||
if(st == NULL) {
|
||||
rval.code = RC_FAIL;
|
||||
rval.consumed = 0;
|
||||
|
@ -57,7 +56,7 @@ BOOLEAN_decode_ber(asn1_TYPE_descriptor_t *td,
|
|||
/*
|
||||
* Check tags.
|
||||
*/
|
||||
rval = ber_check_tags(td, 0, buf_ptr, size, tag_mode, &length, 0);
|
||||
rval = ber_check_tags(td, 0, buf_ptr, size, tag_mode, 0, &length, 0);
|
||||
if(rval.code != RC_OK)
|
||||
return rval;
|
||||
|
||||
|
@ -101,7 +100,7 @@ BOOLEAN_encode_der(asn1_TYPE_descriptor_t *td, void *sptr,
|
|||
asn_enc_rval_t erval;
|
||||
BOOLEAN_t *st = (BOOLEAN_t *)sptr;
|
||||
|
||||
erval.encoded = der_write_tags(td, 1, tag_mode, tag, cb, app_key);
|
||||
erval.encoded = der_write_tags(td, 1, tag_mode, 0, tag, cb, app_key);
|
||||
if(erval.encoded == -1) {
|
||||
erval.failed_type = td;
|
||||
erval.structure_ptr = sptr;
|
||||
|
@ -110,11 +109,10 @@ BOOLEAN_encode_der(asn1_TYPE_descriptor_t *td, void *sptr,
|
|||
|
||||
if(cb) {
|
||||
uint8_t bool_value;
|
||||
ssize_t ret;
|
||||
|
||||
bool_value = *st?0xff:0; /* 0xff mandated by DER */
|
||||
ret = cb(&bool_value, 1, app_key);
|
||||
if(ret == -1) {
|
||||
bool_value = *st ? 0xff : 0; /* 0xff mandated by DER */
|
||||
|
||||
if(cb(&bool_value, 1, app_key) < 0) {
|
||||
erval.encoded = -1;
|
||||
erval.failed_type = td;
|
||||
erval.structure_ptr = sptr;
|
||||
|
@ -154,18 +152,26 @@ int
|
|||
BOOLEAN_print(asn1_TYPE_descriptor_t *td, const void *sptr, int ilevel,
|
||||
asn_app_consume_bytes_f *cb, void *app_key) {
|
||||
const BOOLEAN_t *st = (const BOOLEAN_t *)sptr;
|
||||
const char *buf;
|
||||
size_t buflen;
|
||||
|
||||
(void)td; /* Unused argument */
|
||||
(void)ilevel; /* Unused argument */
|
||||
|
||||
if(st) {
|
||||
if(*st)
|
||||
return cb("TRUE", 4, app_key);
|
||||
else
|
||||
return cb("FALSE", 5, app_key);
|
||||
if(*st) {
|
||||
buf = "TRUE";
|
||||
buflen = 4;
|
||||
} else {
|
||||
buf = "FALSE";
|
||||
buflen = 5;
|
||||
}
|
||||
} else {
|
||||
return cb("<absent>", 8, app_key);
|
||||
buf = "<absent>";
|
||||
buflen = 8;
|
||||
}
|
||||
|
||||
return (cb(buf, buflen, app_key) < 0) ? -1 : 0;
|
||||
}
|
||||
|
||||
void
|
||||
|
|
|
@ -4,6 +4,7 @@
|
|||
*/
|
||||
#include <asn_internal.h>
|
||||
#include <ENUMERATED.h>
|
||||
#include <ber_codec_prim.h>
|
||||
|
||||
/*
|
||||
* ENUMERATED basic type description.
|
||||
|
@ -13,10 +14,10 @@ static ber_tlv_tag_t asn1_DEF_ENUMERATED_tags[] = {
|
|||
};
|
||||
asn1_TYPE_descriptor_t asn1_DEF_ENUMERATED = {
|
||||
"ENUMERATED",
|
||||
INTEGER_free, /* Implemented in terms of INTEGER */
|
||||
ASN__PRIMITIVE_TYPE_free,
|
||||
INTEGER_print, /* Implemented in terms of INTEGER */
|
||||
asn_generic_no_constraint,
|
||||
INTEGER_decode_ber, /* Implemented in terms of INTEGER */
|
||||
ber_decode_primitive,
|
||||
INTEGER_encode_der, /* Implemented in terms of INTEGER */
|
||||
0, /* Not implemented yet */
|
||||
INTEGER_encode_xer, /* Implemented in terms of INTEGER */
|
||||
|
@ -25,7 +26,6 @@ asn1_TYPE_descriptor_t asn1_DEF_ENUMERATED = {
|
|||
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 */
|
||||
};
|
||||
|
|
|
@ -28,7 +28,6 @@ asn1_TYPE_descriptor_t asn1_DEF_GeneralString = {
|
|||
asn1_DEF_GeneralString_tags,
|
||||
sizeof(asn1_DEF_GeneralString_tags)
|
||||
/ sizeof(asn1_DEF_GeneralString_tags[0]),
|
||||
-1, /* Both ways are fine */
|
||||
0, 0, /* No members */
|
||||
0 /* No specifics */
|
||||
};
|
||||
|
|
|
@ -110,7 +110,9 @@ static time_t timegm(struct tm *tm) {
|
|||
* GeneralizedTime basic type description.
|
||||
*/
|
||||
static ber_tlv_tag_t asn1_DEF_GeneralizedTime_tags[] = {
|
||||
(ASN_TAG_CLASS_UNIVERSAL | (24 << 2))
|
||||
(ASN_TAG_CLASS_UNIVERSAL | (24 << 2)), /* [UNIVERSAL 24] IMPLICIT ...*/
|
||||
(ASN_TAG_CLASS_UNIVERSAL | (26 << 2)), /* [UNIVERSAL 26] IMPLICIT ...*/
|
||||
(ASN_TAG_CLASS_UNIVERSAL | (4 << 2)) /* ... OCTET STRING */
|
||||
};
|
||||
asn1_TYPE_descriptor_t asn1_DEF_GeneralizedTime = {
|
||||
"GeneralizedTime",
|
||||
|
@ -124,11 +126,10 @@ asn1_TYPE_descriptor_t asn1_DEF_GeneralizedTime = {
|
|||
0, /* Use generic outmost tag fetcher */
|
||||
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[0]) - 2,
|
||||
asn1_DEF_GeneralizedTime_tags,
|
||||
sizeof(asn1_DEF_GeneralizedTime_tags)
|
||||
/ sizeof(asn1_DEF_GeneralizedTime_tags[0]),
|
||||
-1, /* Both ways are fine */
|
||||
0, 0, /* No members */
|
||||
0 /* No specifics */
|
||||
};
|
||||
|
@ -242,16 +243,16 @@ GeneralizedTime_print(asn1_TYPE_descriptor_t *td, const void *sptr, int ilevel,
|
|||
|
||||
errno = EPERM;
|
||||
if(asn_GT2time(st, &tm, 1) == -1 && errno != EPERM)
|
||||
return cb("<bad-value>", 11, app_key);
|
||||
return (cb("<bad-value>", 11, app_key) < 0) ? -1 : 0;
|
||||
|
||||
ret = snprintf(buf, sizeof(buf),
|
||||
"%04d-%02d-%02d %02d:%02d%02d (GMT)",
|
||||
tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday,
|
||||
tm.tm_hour, tm.tm_min, tm.tm_sec);
|
||||
assert(ret > 0 && ret < (int)sizeof(buf));
|
||||
return cb(buf, ret, app_key);
|
||||
return (cb(buf, ret, app_key) < 0) ? -1 : 0;
|
||||
} else {
|
||||
return cb("<absent>", 8, app_key);
|
||||
return (cb("<absent>", 8, app_key) < 0) ? -1 : 0;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -493,7 +494,7 @@ asn_time2GT(GeneralizedTime_t *opt_gt, const struct tm *tm, int force_gmt) {
|
|||
}
|
||||
|
||||
/* Pre-allocate a buffer of sufficient yet small length */
|
||||
(void *)buf = MALLOC(buf_size);
|
||||
buf = (char *)MALLOC(buf_size);
|
||||
if(!buf) return 0;
|
||||
|
||||
gmtoff = GMTOFF(*tm);
|
||||
|
@ -536,7 +537,7 @@ asn_time2GT(GeneralizedTime_t *opt_gt, const struct tm *tm, int force_gmt) {
|
|||
if(opt_gt->buf)
|
||||
FREEMEM(opt_gt->buf);
|
||||
} else {
|
||||
(void *)opt_gt = CALLOC(1, sizeof *opt_gt);
|
||||
opt_gt = (GeneralizedTime_t *)CALLOC(1, sizeof *opt_gt);
|
||||
if(!opt_gt) { free(buf); return 0; }
|
||||
}
|
||||
|
||||
|
|
|
@ -28,7 +28,6 @@ asn1_TYPE_descriptor_t asn1_DEF_GraphicString = {
|
|||
asn1_DEF_GraphicString_tags,
|
||||
sizeof(asn1_DEF_GraphicString_tags)
|
||||
/ sizeof(asn1_DEF_GraphicString_tags[0]),
|
||||
-1, /* Both ways are fine */
|
||||
0, 0, /* No members */
|
||||
0 /* No specifics */
|
||||
};
|
||||
|
|
|
@ -28,7 +28,6 @@ asn1_TYPE_descriptor_t asn1_DEF_IA5String = {
|
|||
asn1_DEF_IA5String_tags,
|
||||
sizeof(asn1_DEF_IA5String_tags)
|
||||
/ sizeof(asn1_DEF_IA5String_tags[0]),
|
||||
-1, /* Both ways are fine */
|
||||
0, 0, /* No members */
|
||||
0 /* No specifics */
|
||||
};
|
||||
|
|
|
@ -4,6 +4,7 @@
|
|||
*/
|
||||
#include <asn_internal.h>
|
||||
#include <INTEGER.h>
|
||||
#include <ber_codec_prim.h> /* Encoder and decoder of a primitive */
|
||||
#include <assert.h>
|
||||
#include <errno.h>
|
||||
|
||||
|
@ -15,10 +16,10 @@ static ber_tlv_tag_t asn1_DEF_INTEGER_tags[] = {
|
|||
};
|
||||
asn1_TYPE_descriptor_t asn1_DEF_INTEGER = {
|
||||
"INTEGER",
|
||||
INTEGER_free,
|
||||
ASN__PRIMITIVE_TYPE_free,
|
||||
INTEGER_print,
|
||||
asn_generic_no_constraint,
|
||||
INTEGER_decode_ber,
|
||||
ber_decode_primitive,
|
||||
INTEGER_encode_der,
|
||||
0, /* Not implemented yet */
|
||||
INTEGER_encode_xer,
|
||||
|
@ -27,89 +28,21 @@ asn1_TYPE_descriptor_t asn1_DEF_INTEGER = {
|
|||
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 */
|
||||
};
|
||||
|
||||
/*
|
||||
* Decode INTEGER type.
|
||||
*/
|
||||
ber_dec_rval_t
|
||||
INTEGER_decode_ber(asn1_TYPE_descriptor_t *td,
|
||||
void **int_structure, void *buf_ptr, size_t size, int tag_mode) {
|
||||
INTEGER_t *st = (INTEGER_t *)*int_structure;
|
||||
ber_dec_rval_t rval;
|
||||
ber_tlv_len_t length;
|
||||
|
||||
/*
|
||||
* If the structure is not there, allocate it.
|
||||
*/
|
||||
if(st == NULL) {
|
||||
(void *)st = *int_structure = CALLOC(1, sizeof(*st));
|
||||
if(st == NULL) {
|
||||
rval.code = RC_FAIL;
|
||||
rval.consumed = 0;
|
||||
return rval;
|
||||
}
|
||||
}
|
||||
|
||||
ASN_DEBUG("Decoding %s as INTEGER (tm=%d)",
|
||||
td->name, tag_mode);
|
||||
|
||||
/*
|
||||
* Check tags.
|
||||
*/
|
||||
rval = ber_check_tags(td, 0, buf_ptr, size, tag_mode, &length, 0);
|
||||
if(rval.code != RC_OK)
|
||||
return rval;
|
||||
|
||||
ASN_DEBUG("%s length is %d bytes", td->name, (int)length);
|
||||
|
||||
/*
|
||||
* Make sure we have this length.
|
||||
*/
|
||||
buf_ptr = ((char *)buf_ptr) + rval.consumed;
|
||||
size -= rval.consumed;
|
||||
if(length > (ber_tlv_len_t)size) {
|
||||
rval.code = RC_WMORE;
|
||||
rval.consumed = 0;
|
||||
return rval;
|
||||
}
|
||||
|
||||
st->buf = (uint8_t *)MALLOC(length);
|
||||
if(st->buf) {
|
||||
st->size = length;
|
||||
} else {
|
||||
rval.code = RC_FAIL;
|
||||
rval.consumed = 0;
|
||||
return rval;
|
||||
}
|
||||
|
||||
memcpy(st->buf, buf_ptr, st->size);
|
||||
|
||||
rval.code = RC_OK;
|
||||
rval.consumed += length;
|
||||
|
||||
ASN_DEBUG("Took %ld/%ld bytes to encode %s",
|
||||
(long)rval.consumed,
|
||||
(long)length, td->name);
|
||||
|
||||
return rval;
|
||||
}
|
||||
|
||||
/*
|
||||
* Encode INTEGER type using DER.
|
||||
*/
|
||||
asn_enc_rval_t
|
||||
INTEGER_encode_der(asn1_TYPE_descriptor_t *sd, void *ptr,
|
||||
INTEGER_encode_der(asn1_TYPE_descriptor_t *td, void *sptr,
|
||||
int tag_mode, ber_tlv_tag_t tag,
|
||||
asn_app_consume_bytes_f *cb, void *app_key) {
|
||||
asn_enc_rval_t erval;
|
||||
INTEGER_t *st = (INTEGER_t *)ptr;
|
||||
INTEGER_t *st = (INTEGER_t *)sptr;
|
||||
|
||||
ASN_DEBUG("%s %s as INTEGER (tm=%d)",
|
||||
cb?"Encoding":"Estimating", sd->name, tag_mode);
|
||||
cb?"Encoding":"Estimating", td->name, tag_mode);
|
||||
|
||||
/*
|
||||
* Canonicalize integer in the buffer.
|
||||
|
@ -155,32 +88,7 @@ INTEGER_encode_der(asn1_TYPE_descriptor_t *sd, void *ptr,
|
|||
|
||||
} /* if(1) */
|
||||
|
||||
erval.encoded = der_write_tags(sd, st->size, tag_mode, tag,
|
||||
cb, app_key);
|
||||
ASN_DEBUG("INTEGER %s wrote tags %d", sd->name, (int)erval.encoded);
|
||||
if(erval.encoded == -1) {
|
||||
erval.failed_type = sd;
|
||||
erval.structure_ptr = ptr;
|
||||
return erval;
|
||||
}
|
||||
|
||||
if(cb && st->buf) {
|
||||
ssize_t ret;
|
||||
|
||||
ret = cb(st->buf, st->size, app_key);
|
||||
if(ret == -1) {
|
||||
erval.encoded = -1;
|
||||
erval.failed_type = sd;
|
||||
erval.structure_ptr = ptr;
|
||||
return erval;
|
||||
}
|
||||
} else {
|
||||
assert(st->buf || st->size == 0);
|
||||
}
|
||||
|
||||
erval.encoded += st->size;
|
||||
|
||||
return erval;
|
||||
return der_encode_primitive(td, sptr, tag_mode, tag, cb, app_key);
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -254,13 +162,17 @@ int
|
|||
INTEGER_print(asn1_TYPE_descriptor_t *td, const void *sptr, int ilevel,
|
||||
asn_app_consume_bytes_f *cb, void *app_key) {
|
||||
const INTEGER_t *st = (const INTEGER_t *)sptr;
|
||||
ssize_t ret;
|
||||
|
||||
(void)td;
|
||||
(void)ilevel;
|
||||
|
||||
if(!st && !st->buf) return cb("<absent>", 8, app_key);
|
||||
if(!st && !st->buf)
|
||||
ret = cb("<absent>", 8, app_key);
|
||||
else
|
||||
ret = INTEGER__dump(st, cb, app_key);
|
||||
|
||||
return (INTEGER__dump(st, cb, app_key) < 0) ? -1 : 0;
|
||||
return (ret < 0) ? -1 : 0;
|
||||
}
|
||||
|
||||
asn_enc_rval_t
|
||||
|
@ -282,25 +194,6 @@ INTEGER_encode_xer(asn1_TYPE_descriptor_t *td, void *sptr,
|
|||
return er;
|
||||
}
|
||||
|
||||
void
|
||||
INTEGER_free(asn1_TYPE_descriptor_t *td, void *ptr, int contents_only) {
|
||||
INTEGER_t *st = (INTEGER_t *)ptr;
|
||||
|
||||
if(!td || !st)
|
||||
return;
|
||||
|
||||
ASN_DEBUG("Freeing %s as INTEGER (%d, %p, %p)",
|
||||
td->name, contents_only, st, st->buf);
|
||||
|
||||
if(st->buf) {
|
||||
FREEMEM(st->buf);
|
||||
}
|
||||
|
||||
if(!contents_only) {
|
||||
FREEMEM(st);
|
||||
}
|
||||
}
|
||||
|
||||
int
|
||||
asn1_INTEGER2long(const INTEGER_t *iptr, long *lptr) {
|
||||
uint8_t *b, *end;
|
||||
|
|
|
@ -6,15 +6,12 @@
|
|||
#define _INTEGER_H_
|
||||
|
||||
#include <asn_application.h>
|
||||
#include <ber_codec_prim.h>
|
||||
|
||||
typedef struct INTEGER {
|
||||
uint8_t *buf; /* Buffer with consecutive INTEGER bits (big-endian) */
|
||||
int size; /* Size of the buffer */
|
||||
} INTEGER_t;
|
||||
typedef ASN__PRIMITIVE_TYPE_t INTEGER_t;
|
||||
|
||||
extern asn1_TYPE_descriptor_t asn1_DEF_INTEGER;
|
||||
|
||||
asn_struct_free_f INTEGER_free;
|
||||
asn_struct_print_f INTEGER_print;
|
||||
ber_type_decoder_f INTEGER_decode_ber;
|
||||
der_type_encoder_f INTEGER_encode_der;
|
||||
|
|
|
@ -28,7 +28,6 @@ asn1_TYPE_descriptor_t asn1_DEF_ISO646String = {
|
|||
asn1_DEF_ISO646String_tags,
|
||||
sizeof(asn1_DEF_ISO646String_tags)
|
||||
/ sizeof(asn1_DEF_ISO646String_tags[0]),
|
||||
-1, /* Both ways are fine */
|
||||
0, 0, /* No members */
|
||||
0 /* No specifics */
|
||||
};
|
||||
|
|
|
@ -26,7 +26,6 @@ asn1_TYPE_descriptor_t asn1_DEF_NULL = {
|
|||
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 */
|
||||
};
|
||||
|
@ -37,7 +36,7 @@ NULL_encode_der(asn1_TYPE_descriptor_t *td, void *ptr,
|
|||
asn_app_consume_bytes_f *cb, void *app_key) {
|
||||
asn_enc_rval_t erval;
|
||||
|
||||
erval.encoded = der_write_tags(td, 0, tag_mode, tag, cb, app_key);
|
||||
erval.encoded = der_write_tags(td, 0, tag_mode, 0, tag, cb, app_key);
|
||||
if(erval.encoded == -1) {
|
||||
erval.failed_type = td;
|
||||
erval.structure_ptr = ptr;
|
||||
|
@ -73,8 +72,8 @@ NULL_print(asn1_TYPE_descriptor_t *td, const void *sptr, int ilevel,
|
|||
(void)ilevel; /* Unused argument */
|
||||
|
||||
if(sptr) {
|
||||
return cb("<present>", 9, app_key);
|
||||
return (cb("<present>", 9, app_key) < 0) ? -1 : 0;
|
||||
} else {
|
||||
return cb("<absent>", 8, app_key);
|
||||
return (cb("<absent>", 8, app_key) < 0) ? -1 : 0;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -32,7 +32,6 @@ asn1_TYPE_descriptor_t asn1_DEF_NativeEnumerated = {
|
|||
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 */
|
||||
};
|
||||
|
|
|
@ -34,7 +34,6 @@ asn1_TYPE_descriptor_t asn1_DEF_NativeInteger = {
|
|||
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 */
|
||||
};
|
||||
|
@ -53,7 +52,7 @@ NativeInteger_decode_ber(asn1_TYPE_descriptor_t *td,
|
|||
* If the structure is not there, allocate it.
|
||||
*/
|
||||
if(Int == NULL) {
|
||||
(void *)Int = *int_ptr = CALLOC(1, sizeof(*Int));
|
||||
Int = (int *)(*int_ptr = CALLOC(1, sizeof(*Int)));
|
||||
if(Int == NULL) {
|
||||
rval.code = RC_FAIL;
|
||||
rval.consumed = 0;
|
||||
|
@ -67,7 +66,7 @@ NativeInteger_decode_ber(asn1_TYPE_descriptor_t *td,
|
|||
/*
|
||||
* Check tags.
|
||||
*/
|
||||
rval = ber_check_tags(td, 0, buf_ptr, size, tag_mode, &length, 0);
|
||||
rval = ber_check_tags(td, 0, buf_ptr, size, tag_mode, 0, &length, 0);
|
||||
if(rval.code != RC_OK)
|
||||
return rval;
|
||||
|
||||
|
@ -199,9 +198,9 @@ NativeInteger_print(asn1_TYPE_descriptor_t *td, const void *sptr, int ilevel,
|
|||
if(Int) {
|
||||
ret = snprintf(scratch, sizeof(scratch), "%d", *Int);
|
||||
assert(ret > 0 && ret < (int)sizeof(scratch));
|
||||
return cb(scratch, ret, app_key);
|
||||
return (cb(scratch, ret, app_key) < 0) ? -1 : 0;
|
||||
} else {
|
||||
return cb("<absent>", 8, app_key);
|
||||
return (cb("<absent>", 8, app_key) < 0) ? -1 : 0;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -11,7 +11,6 @@
|
|||
*/
|
||||
#include <asn_internal.h>
|
||||
#include <NativeReal.h>
|
||||
#include <INTEGER.h>
|
||||
#include <REAL.h>
|
||||
#include <assert.h>
|
||||
|
||||
|
@ -35,7 +34,6 @@ asn1_TYPE_descriptor_t asn1_DEF_NativeReal = {
|
|||
sizeof(asn1_DEF_NativeReal_tags) / sizeof(asn1_DEF_NativeReal_tags[0]),
|
||||
asn1_DEF_NativeReal_tags, /* Same as above */
|
||||
sizeof(asn1_DEF_NativeReal_tags) / sizeof(asn1_DEF_NativeReal_tags[0]),
|
||||
0, /* Always in primitive form */
|
||||
0, 0, /* No members */
|
||||
0 /* No specifics */
|
||||
};
|
||||
|
@ -68,7 +66,7 @@ NativeReal_decode_ber(asn1_TYPE_descriptor_t *td,
|
|||
/*
|
||||
* Check tags.
|
||||
*/
|
||||
rval = ber_check_tags(td, 0, buf_ptr, size, tag_mode, &length, 0);
|
||||
rval = ber_check_tags(td, 0, buf_ptr, size, tag_mode, 0, &length, 0);
|
||||
if(rval.code != RC_OK)
|
||||
return rval;
|
||||
|
||||
|
@ -132,8 +130,8 @@ NativeReal_encode_der(asn1_TYPE_descriptor_t *td, void *ptr,
|
|||
return erval;
|
||||
}
|
||||
|
||||
/* Encode fake REAL */
|
||||
erval = INTEGER_encode_der(td, &tmp, tag_mode, tag, cb, app_key);
|
||||
/* Encode a fake REAL */
|
||||
erval = der_encode_primitive(td, &tmp, tag_mode, tag, cb, app_key);
|
||||
if(erval.encoded == -1) {
|
||||
assert(erval.structure_ptr == &tmp);
|
||||
erval.structure_ptr = ptr;
|
||||
|
@ -148,13 +146,12 @@ NativeReal_encode_xer(asn1_TYPE_descriptor_t *td, void *sptr,
|
|||
asn_app_consume_bytes_f *cb, void *app_key) {
|
||||
const double *Dbl = (const double *)sptr;
|
||||
asn_enc_rval_t er;
|
||||
double d;
|
||||
|
||||
(void)ilevel;
|
||||
|
||||
if(!Dbl) _ASN_ENCODE_FAILED;
|
||||
|
||||
er.encoded = REAL__dump(d, flags & XER_F_CANONICAL, cb, app_key);
|
||||
er.encoded = REAL__dump(*Dbl, flags & XER_F_CANONICAL, cb, app_key);
|
||||
if(er.encoded < 0) _ASN_ENCODE_FAILED;
|
||||
|
||||
return er;
|
||||
|
@ -171,7 +168,7 @@ NativeReal_print(asn1_TYPE_descriptor_t *td, const void *sptr, int ilevel,
|
|||
(void)td; /* Unused argument */
|
||||
(void)ilevel; /* Unused argument */
|
||||
|
||||
if(!Dbl) return cb("<absent>", 8, app_key);
|
||||
if(!Dbl) return (cb("<absent>", 8, app_key) < 0) ? -1 : 0;
|
||||
|
||||
return (REAL__dump(*Dbl, 0, cb, app_key) < 0) ? -1 : 0;
|
||||
}
|
||||
|
|
|
@ -28,7 +28,6 @@ asn1_TYPE_descriptor_t asn1_DEF_NumericString = {
|
|||
asn1_DEF_NumericString_tags,
|
||||
sizeof(asn1_DEF_NumericString_tags)
|
||||
/ sizeof(asn1_DEF_NumericString_tags[0]),
|
||||
-1, /* Both ways are fine */
|
||||
0, 0, /* No members */
|
||||
0 /* No specifics */
|
||||
};
|
||||
|
|
|
@ -16,11 +16,11 @@ static ber_tlv_tag_t asn1_DEF_OBJECT_IDENTIFIER_tags[] = {
|
|||
};
|
||||
asn1_TYPE_descriptor_t asn1_DEF_OBJECT_IDENTIFIER = {
|
||||
"OBJECT IDENTIFIER",
|
||||
INTEGER_free,
|
||||
ASN__PRIMITIVE_TYPE_free,
|
||||
OBJECT_IDENTIFIER_print,
|
||||
OBJECT_IDENTIFIER_constraint,
|
||||
INTEGER_decode_ber, /* Implemented in terms of INTEGER type */
|
||||
OBJECT_IDENTIFIER_encode_der,
|
||||
ber_decode_primitive,
|
||||
der_encode_primitive,
|
||||
0, /* Not implemented yet */
|
||||
OBJECT_IDENTIFIER_encode_xer,
|
||||
0, /* Use generic outmost tag fetcher */
|
||||
|
@ -30,52 +30,11 @@ asn1_TYPE_descriptor_t asn1_DEF_OBJECT_IDENTIFIER = {
|
|||
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 */
|
||||
};
|
||||
|
||||
|
||||
/*
|
||||
* Encode OBJECT IDENTIFIER type using DER.
|
||||
*/
|
||||
asn_enc_rval_t
|
||||
OBJECT_IDENTIFIER_encode_der(asn1_TYPE_descriptor_t *sd, void *ptr,
|
||||
int tag_mode, ber_tlv_tag_t tag,
|
||||
asn_app_consume_bytes_f *cb, void *app_key) {
|
||||
asn_enc_rval_t erval;
|
||||
OBJECT_IDENTIFIER_t *st = (OBJECT_IDENTIFIER_t *)ptr;
|
||||
|
||||
ASN_DEBUG("%s %s as OBJECT IDENTIFIER (tm=%d)",
|
||||
cb?"Encoding":"Estimating", sd->name, tag_mode);
|
||||
|
||||
erval.encoded = der_write_tags(sd, st->size, tag_mode, tag,
|
||||
cb, app_key);
|
||||
ASN_DEBUG("OBJECT IDENTIFIER %s wrote tags %d",
|
||||
sd->name, (int)erval.encoded);
|
||||
if(erval.encoded == -1) {
|
||||
erval.failed_type = sd;
|
||||
erval.structure_ptr = ptr;
|
||||
return erval;
|
||||
}
|
||||
|
||||
if(cb && st->buf) {
|
||||
int ret = cb(st->buf, st->size, app_key);
|
||||
if(ret < 0) {
|
||||
erval.encoded = -1;
|
||||
erval.failed_type = sd;
|
||||
erval.structure_ptr = ptr;
|
||||
return erval;
|
||||
}
|
||||
} else {
|
||||
assert(st->buf || st->size == 0);
|
||||
}
|
||||
|
||||
erval.encoded += st->size;
|
||||
|
||||
return erval;
|
||||
}
|
||||
|
||||
int
|
||||
OBJECT_IDENTIFIER_constraint(asn1_TYPE_descriptor_t *td, const void *sptr,
|
||||
asn_app_consume_bytes_f *app_errlog, void *app_key) {
|
||||
|
@ -101,11 +60,12 @@ 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) {
|
||||
OBJECT_IDENTIFIER_get_single_arc(uint8_t *arcbuf, unsigned int arclen, signed int add, void *rvbufp, unsigned int rvsize) {
|
||||
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 */
|
||||
unsigned char *rvbuf = (unsigned char *)rvbufp;
|
||||
unsigned char *rvstart = rvbuf; /* Original start of the value buffer */
|
||||
int inc; /* Return value growth direction */
|
||||
|
||||
rvsize *= CHAR_BIT; /* bytes to bits */
|
||||
|
@ -155,15 +115,15 @@ OBJECT_IDENTIFIER_get_single_arc(uint8_t *arcbuf, unsigned int arclen, signed in
|
|||
errno = ERANGE; /* Overflow */
|
||||
return -1;
|
||||
}
|
||||
*(unsigned long *)rvbuf = accum + add;
|
||||
*(unsigned long *)rvbuf = accum + add; /* alignment OK! */
|
||||
return 0;
|
||||
}
|
||||
|
||||
#ifndef WORDS_BIGENDIAN
|
||||
if(*(unsigned char *)&LE) { /* Little endian (x86) */
|
||||
/* "Convert" to big endian */
|
||||
(unsigned char *)rvbuf += rvsize / CHAR_BIT - 1;
|
||||
((unsigned char *)rvstart)--;
|
||||
rvbuf += rvsize / CHAR_BIT - 1;
|
||||
rvstart--;
|
||||
inc = -1; /* Descending */
|
||||
} else
|
||||
#endif /* !WORDS_BIGENDIAN */
|
||||
|
@ -175,8 +135,8 @@ OBJECT_IDENTIFIER_get_single_arc(uint8_t *arcbuf, unsigned int arclen, signed in
|
|||
/* Clear the high unused bits */
|
||||
for(bits = rvsize - arclen;
|
||||
bits > CHAR_BIT;
|
||||
(unsigned char *)rvbuf += inc, bits -= CHAR_BIT)
|
||||
*(unsigned char *)rvbuf = 0;
|
||||
rvbuf += inc, bits -= CHAR_BIT)
|
||||
*rvbuf = 0;
|
||||
|
||||
/* Fill the body of a value */
|
||||
for(; arcbuf < arcend; arcbuf++) {
|
||||
|
@ -184,25 +144,24 @@ OBJECT_IDENTIFIER_get_single_arc(uint8_t *arcbuf, unsigned int arclen, signed in
|
|||
bits += 7;
|
||||
if(bits >= CHAR_BIT) {
|
||||
bits -= CHAR_BIT;
|
||||
*(unsigned char *)rvbuf = (cache >> bits);
|
||||
(unsigned char *)rvbuf += inc;
|
||||
*rvbuf = (cache >> bits);
|
||||
rvbuf += inc;
|
||||
}
|
||||
}
|
||||
if(bits) {
|
||||
*(unsigned char *)rvbuf = cache;
|
||||
(unsigned char *)rvbuf += inc;
|
||||
*rvbuf = cache;
|
||||
rvbuf += inc;
|
||||
}
|
||||
}
|
||||
|
||||
if(add) {
|
||||
for((unsigned char *)rvbuf -= inc; rvbuf != rvstart; (unsigned char *)rvbuf -= inc) {
|
||||
int v = add + *(unsigned char *)rvbuf;
|
||||
for(rvbuf -= inc; rvbuf != rvstart; rvbuf -= inc) {
|
||||
int v = add + *rvbuf;
|
||||
if(v & (-1 << CHAR_BIT)) {
|
||||
*(unsigned char *)rvbuf
|
||||
= (unsigned char)(v + (1 << CHAR_BIT));
|
||||
*rvbuf = (unsigned char)(v + (1 << CHAR_BIT));
|
||||
add = -1;
|
||||
} else {
|
||||
*(unsigned char *)rvbuf = v;
|
||||
*rvbuf = v;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
@ -331,16 +290,16 @@ OBJECT_IDENTIFIER_print(asn1_TYPE_descriptor_t *td, const void *sptr,
|
|||
(void)ilevel; /* Unused argument */
|
||||
|
||||
if(!st || !st->buf)
|
||||
return cb("<absent>", 8, app_key);
|
||||
return (cb("<absent>", 8, app_key) < 0) ? -1 : 0;
|
||||
|
||||
/* Dump preamble */
|
||||
if(cb("{ ", 2, app_key))
|
||||
if(cb("{ ", 2, app_key) < 0)
|
||||
return -1;
|
||||
|
||||
if(OBJECT_IDENTIFIER__dump_body(st, cb, app_key) < 0)
|
||||
return -1;
|
||||
|
||||
return cb(" }", 2, app_key);
|
||||
return (cb(" }", 2, app_key) < 0) ? -1 : 0;
|
||||
}
|
||||
|
||||
int
|
||||
|
|
|
@ -5,9 +5,10 @@
|
|||
#ifndef _OBJECT_IDENTIFIER_H_
|
||||
#define _OBJECT_IDENTIFIER_H_
|
||||
|
||||
#include <INTEGER.h>
|
||||
#include <asn_application.h>
|
||||
#include <ber_codec_prim.h>
|
||||
|
||||
typedef INTEGER_t OBJECT_IDENTIFIER_t; /* Implemented via INTEGER */
|
||||
typedef ASN__PRIMITIVE_TYPE_t OBJECT_IDENTIFIER_t;
|
||||
|
||||
extern asn1_TYPE_descriptor_t asn1_DEF_OBJECT_IDENTIFIER;
|
||||
|
||||
|
|
|
@ -29,7 +29,6 @@ asn1_TYPE_descriptor_t asn1_DEF_OCTET_STRING = {
|
|||
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 */
|
||||
};
|
||||
|
@ -161,10 +160,9 @@ OCTET_STRING_decode_ber(asn1_TYPE_descriptor_t *td,
|
|||
int tlv_constr;
|
||||
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 */
|
||||
_TT_BIT_STRING = 1, /* BIT STRING type, a special case */
|
||||
_TT_ANY = 2, /* ANY type, a special case too */
|
||||
} type_type = (enum type_type_e)(int)td->specifics;
|
||||
|
||||
ASN_DEBUG("Decoding %s as %s (frame %ld)",
|
||||
td->name,
|
||||
|
@ -189,7 +187,7 @@ OCTET_STRING_decode_ber(asn1_TYPE_descriptor_t *td,
|
|||
* Check tags.
|
||||
*/
|
||||
rval = ber_check_tags(td, ctx,
|
||||
buf_ptr, size, tag_mode,
|
||||
buf_ptr, size, tag_mode, -1,
|
||||
&ctx->left, &tlv_constr);
|
||||
if(rval.code != RC_OK) {
|
||||
RETURN(rval.code);
|
||||
|
@ -234,8 +232,9 @@ OCTET_STRING_decode_ber(asn1_TYPE_descriptor_t *td,
|
|||
ber_tlv_len_t tlv_len;
|
||||
ber_tlv_tag_t expected_tag;
|
||||
ssize_t tl, ll;
|
||||
ssize_t Left = ((!sel||sel->left==-1||sel->left >= size)
|
||||
?size:sel->left);
|
||||
/* This one works even if (sel->left == -1) */
|
||||
ssize_t Left = ((!sel||(size_t)sel->left >= size)
|
||||
?size:(size_t)sel->left);
|
||||
|
||||
|
||||
ASN_DEBUG("fetch tag(size=%d,L=%d), %sstack, left=%d, want0=%d",
|
||||
|
@ -475,8 +474,8 @@ OCTET_STRING_encode_der(asn1_TYPE_descriptor_t *td, void *ptr,
|
|||
asn_enc_rval_t erval;
|
||||
OCTET_STRING_t *st = (OCTET_STRING_t *)ptr;
|
||||
int add_byte = 0;
|
||||
int is_bit_str = (td->specifics == (void *)-1);
|
||||
int is_ANY_type = (td->specifics == (void *)1);
|
||||
int is_bit_str = (td->specifics == (void *)1);
|
||||
int is_ANY_type = (td->specifics == (void *)2);
|
||||
|
||||
ASN_DEBUG("%s %s as OCTET STRING",
|
||||
cb?"Estimating":"Encoding", td->name);
|
||||
|
@ -498,7 +497,7 @@ OCTET_STRING_encode_der(asn1_TYPE_descriptor_t *td, void *ptr,
|
|||
erval.encoded = 0;
|
||||
} else {
|
||||
erval.encoded = der_write_tags(td, st->size + add_byte,
|
||||
tag_mode, tag, cb, app_key);
|
||||
tag_mode, 0, tag, cb, app_key);
|
||||
if(erval.encoded == -1) {
|
||||
erval.failed_type = td;
|
||||
erval.structure_ptr = ptr;
|
||||
|
@ -510,7 +509,6 @@ OCTET_STRING_encode_der(asn1_TYPE_descriptor_t *td, void *ptr,
|
|||
uint8_t zero;
|
||||
uint8_t *buf;
|
||||
int size;
|
||||
ssize_t ret;
|
||||
|
||||
/* BIT STRING-aware handling */
|
||||
if(add_byte) {
|
||||
|
@ -527,8 +525,7 @@ OCTET_STRING_encode_der(asn1_TYPE_descriptor_t *td, void *ptr,
|
|||
}
|
||||
|
||||
if(size) {
|
||||
ret = cb(buf, size, app_key);
|
||||
if(ret == -1) {
|
||||
if(cb(buf, size, app_key) < 0) {
|
||||
erval.encoded = -1;
|
||||
erval.failed_type = td;
|
||||
erval.structure_ptr = ptr;
|
||||
|
@ -636,11 +633,10 @@ OCTET_STRING_print(asn1_TYPE_descriptor_t *td, const void *sptr, int ilevel,
|
|||
uint8_t *buf;
|
||||
uint8_t *end;
|
||||
size_t i;
|
||||
int lvl;
|
||||
|
||||
(void)td; /* Unused argument */
|
||||
|
||||
if(!st || !st->buf) return cb("<absent>", 8, app_key);
|
||||
if(!st || !st->buf) return (cb("<absent>", 8, app_key) < 0) ? -1 : 0;
|
||||
|
||||
/*
|
||||
* Dump the contents of the buffer in hexadecimal.
|
||||
|
@ -649,11 +645,9 @@ OCTET_STRING_print(asn1_TYPE_descriptor_t *td, const void *sptr, int ilevel,
|
|||
end = buf + st->size;
|
||||
for(i = 0; buf < end; buf++, i++) {
|
||||
if(!(i % 16) && (i || st->size > 16)) {
|
||||
if(cb(scratch, p - scratch, app_key)
|
||||
|| cb("\n", 1, app_key))
|
||||
if(cb(scratch, p - scratch, app_key) < 0)
|
||||
return -1;
|
||||
for(lvl = 0; lvl < ilevel; lvl++)
|
||||
cb(" ", 1, app_key);
|
||||
_i_INDENT(1);
|
||||
p = scratch;
|
||||
}
|
||||
*p++ = h2c[(*buf >> 4) & 0x0F];
|
||||
|
@ -663,7 +657,7 @@ OCTET_STRING_print(asn1_TYPE_descriptor_t *td, const void *sptr, int ilevel,
|
|||
|
||||
if(p > scratch) {
|
||||
p--; /* Remove the tail space */
|
||||
if(cb(scratch, p - scratch, app_key))
|
||||
if(cb(scratch, p - scratch, app_key) < 0)
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
@ -679,9 +673,9 @@ OCTET_STRING_print_ascii(asn1_TYPE_descriptor_t *td, const void *sptr,
|
|||
(void)ilevel; /* Unused argument */
|
||||
|
||||
if(st && st->buf) {
|
||||
return cb(st->buf, st->size, app_key);
|
||||
return (cb(st->buf, st->size, app_key) < 0) ? -1 : 0;
|
||||
} else {
|
||||
return cb("<absent>", 8, app_key);
|
||||
return (cb("<absent>", 8, app_key) < 0) ? -1 : 0;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -28,7 +28,6 @@ asn1_TYPE_descriptor_t asn1_DEF_ObjectDescriptor = {
|
|||
asn1_DEF_ObjectDescriptor_tags,
|
||||
sizeof(asn1_DEF_ObjectDescriptor_tags)
|
||||
/ sizeof(asn1_DEF_ObjectDescriptor_tags[0]),
|
||||
-1, /* Both ways are fine */
|
||||
0, 0, /* No members */
|
||||
0 /* No specifics */
|
||||
};
|
||||
|
|
|
@ -28,7 +28,6 @@ asn1_TYPE_descriptor_t asn1_DEF_PrintableString = {
|
|||
asn1_DEF_PrintableString_tags,
|
||||
sizeof(asn1_DEF_PrintableString_tags)
|
||||
/ sizeof(asn1_DEF_PrintableString_tags[0]),
|
||||
-1, /* Both ways are fine */
|
||||
0, 0, /* No members */
|
||||
0 /* No specifics */
|
||||
};
|
||||
|
|
|
@ -4,7 +4,6 @@
|
|||
*/
|
||||
#include <asn_internal.h>
|
||||
#include <REAL.h>
|
||||
#include <INTEGER.h>
|
||||
#include <stdlib.h> /* for strtod(3) */
|
||||
#include <math.h>
|
||||
#include <errno.h>
|
||||
|
@ -30,11 +29,11 @@ static ber_tlv_tag_t asn1_DEF_REAL_tags[] = {
|
|||
};
|
||||
asn1_TYPE_descriptor_t asn1_DEF_REAL = {
|
||||
"REAL",
|
||||
INTEGER_free,
|
||||
ASN__PRIMITIVE_TYPE_free,
|
||||
REAL_print,
|
||||
asn_generic_no_constraint,
|
||||
INTEGER_decode_ber, /* Implemented in terms of INTEGER type */
|
||||
INTEGER_encode_der,
|
||||
ber_decode_primitive,
|
||||
der_encode_primitive,
|
||||
0, /* Not implemented yet */
|
||||
REAL_encode_xer,
|
||||
0, /* Use generic outmost tag fetcher */
|
||||
|
@ -42,7 +41,6 @@ asn1_TYPE_descriptor_t asn1_DEF_REAL = {
|
|||
sizeof(asn1_DEF_REAL_tags) / sizeof(asn1_DEF_REAL_tags[0]),
|
||||
asn1_DEF_REAL_tags, /* Same as above */
|
||||
sizeof(asn1_DEF_REAL_tags) / sizeof(asn1_DEF_REAL_tags[0]),
|
||||
0, /* Always in primitive form */
|
||||
0, 0, /* No members */
|
||||
0 /* No specifics */
|
||||
};
|
||||
|
@ -55,6 +53,28 @@ REAL__dump(double d, int canonical, asn_app_consume_bytes_f *cb, void *app_key)
|
|||
const char *fmt = canonical?"%15E":"f";
|
||||
ssize_t ret;
|
||||
|
||||
/*
|
||||
* Check whether it is a special value.
|
||||
*/
|
||||
if(finite(d) == 0) {
|
||||
if(isinf(d)) {
|
||||
if(copysign(1.0, d) < 0.0) {
|
||||
buf = "<MINUS-INFINITY/>";
|
||||
buflen = 17;
|
||||
} else {
|
||||
buf = "<PLUS-INFINITY/>";
|
||||
buflen = 16;
|
||||
}
|
||||
} else {
|
||||
buf = "<NOT-A-NUMBER/>";
|
||||
buflen = 15;
|
||||
}
|
||||
return (cb(buf, buflen, app_key) < 0) ? -1 : buflen;
|
||||
}
|
||||
|
||||
/*
|
||||
* Use the libc's double printing, hopefully they got it right.
|
||||
*/
|
||||
do {
|
||||
ret = snprintf(buf, buflen, fmt, d);
|
||||
if(ret < 0) {
|
||||
|
@ -66,7 +86,7 @@ REAL__dump(double d, int canonical, asn_app_consume_bytes_f *cb, void *app_key)
|
|||
break;
|
||||
}
|
||||
if(buf != local_buf) free(buf);
|
||||
(void *)buf = MALLOC(buflen);
|
||||
buf = (char *)MALLOC(buflen);
|
||||
if(!buf) return -1;
|
||||
} while(1);
|
||||
|
||||
|
@ -118,18 +138,20 @@ int
|
|||
REAL_print(asn1_TYPE_descriptor_t *td, const void *sptr, int ilevel,
|
||||
asn_app_consume_bytes_f *cb, void *app_key) {
|
||||
const REAL_t *st = (const REAL_t *)sptr;
|
||||
ssize_t ret;
|
||||
double d;
|
||||
|
||||
(void)td; /* Unused argument */
|
||||
(void)ilevel; /* Unused argument */
|
||||
|
||||
if(!st || !st->buf)
|
||||
return cb("<absent>", 8, app_key);
|
||||
ret = cb("<absent>", 8, app_key);
|
||||
else if(asn1_REAL2double(st, &d))
|
||||
ret = cb("<error>", 7, app_key);
|
||||
else
|
||||
ret = REAL__dump(d, 0, cb, app_key);
|
||||
|
||||
if(asn1_REAL2double(st, &d))
|
||||
return cb("<error>", 7, app_key);
|
||||
|
||||
return (REAL__dump(d, 0, cb, app_key) < 0) ? -1 : 0;
|
||||
return (ret < 0) ? -1 : 0;
|
||||
}
|
||||
|
||||
asn_enc_rval_t
|
||||
|
@ -338,7 +360,7 @@ asn1_double2REAL(REAL_t *st, double dbl_value) {
|
|||
|| expval == INT_MAX /* catches finite() which catches isnan() */
|
||||
) {
|
||||
if(!st->buf || st->size < 2) {
|
||||
(void *)ptr = MALLOC(2);
|
||||
ptr = (uint8_t *)MALLOC(2);
|
||||
if(!ptr) return -1;
|
||||
st->buf = ptr;
|
||||
}
|
||||
|
|
|
@ -6,11 +6,9 @@
|
|||
#define ASN_TYPE_REAL_H
|
||||
|
||||
#include <asn_application.h>
|
||||
#include <ber_codec_prim.h>
|
||||
|
||||
typedef struct REAL {
|
||||
uint8_t *buf; /* Buffer with REAL type encoding */
|
||||
int size; /* Size of the buffer */
|
||||
} REAL_t;
|
||||
typedef ASN__PRIMITIVE_TYPE_t REAL_t;
|
||||
|
||||
extern asn1_TYPE_descriptor_t asn1_DEF_REAL;
|
||||
|
||||
|
|
|
@ -4,6 +4,7 @@
|
|||
*/
|
||||
#include <asn_internal.h>
|
||||
#include <RELATIVE-OID.h>
|
||||
#include <ber_codec_prim.h> /* Encoder and decoder of a primitive */
|
||||
#include <limits.h> /* for CHAR_BIT */
|
||||
#include <assert.h>
|
||||
#include <errno.h>
|
||||
|
@ -16,11 +17,11 @@ static ber_tlv_tag_t asn1_DEF_RELATIVE_OID_tags[] = {
|
|||
};
|
||||
asn1_TYPE_descriptor_t asn1_DEF_RELATIVE_OID = {
|
||||
"RELATIVE-OID",
|
||||
INTEGER_free,
|
||||
ASN__PRIMITIVE_TYPE_free,
|
||||
RELATIVE_OID_print,
|
||||
asn_generic_no_constraint,
|
||||
INTEGER_decode_ber, /* Implemented in terms of INTEGER type */
|
||||
OBJECT_IDENTIFIER_encode_der,
|
||||
ber_decode_primitive,
|
||||
der_encode_primitive,
|
||||
0, /* Not implemented yet */
|
||||
RELATIVE_OID_encode_xer,
|
||||
0, /* Use generic outmost tag fetcher */
|
||||
|
@ -30,7 +31,6 @@ asn1_TYPE_descriptor_t asn1_DEF_RELATIVE_OID = {
|
|||
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 */
|
||||
};
|
||||
|
@ -73,16 +73,16 @@ RELATIVE_OID_print(asn1_TYPE_descriptor_t *td, const void *sptr, int ilevel,
|
|||
(void)ilevel; /* Unused argument */
|
||||
|
||||
if(!st || !st->buf)
|
||||
return cb("<absent>", 8, app_key);
|
||||
return (cb("<absent>", 8, app_key) < 0) ? -1 : 0;
|
||||
|
||||
/* Dump preamble */
|
||||
if(cb("{ ", 2, app_key))
|
||||
if(cb("{ ", 2, app_key) < 0)
|
||||
return -1;
|
||||
|
||||
if(RELATIVE_OID__dump_body(st, cb, app_key) < 0)
|
||||
return -1;
|
||||
|
||||
return cb(" }", 2, app_key);
|
||||
return (cb(" }", 2, app_key) < 0) ? -1 : 0;
|
||||
}
|
||||
|
||||
asn_enc_rval_t
|
||||
|
|
|
@ -28,7 +28,6 @@ asn1_TYPE_descriptor_t asn1_DEF_T61String = {
|
|||
asn1_DEF_T61String_tags,
|
||||
sizeof(asn1_DEF_T61String_tags)
|
||||
/ sizeof(asn1_DEF_T61String_tags[0]),
|
||||
-1, /* Both ways are fine */
|
||||
0, 0, /* No members */
|
||||
0 /* No specifics */
|
||||
};
|
||||
|
|
|
@ -28,7 +28,6 @@ asn1_TYPE_descriptor_t asn1_DEF_TeletexString = {
|
|||
asn1_DEF_TeletexString_tags,
|
||||
sizeof(asn1_DEF_TeletexString_tags)
|
||||
/ sizeof(asn1_DEF_TeletexString_tags[0]),
|
||||
-1, /* Both ways are fine */
|
||||
0, 0, /* No members */
|
||||
0 /* No specifics */
|
||||
};
|
||||
|
|
|
@ -15,7 +15,9 @@
|
|||
* UTCTime basic type description.
|
||||
*/
|
||||
static ber_tlv_tag_t asn1_DEF_UTCTime_tags[] = {
|
||||
(ASN_TAG_CLASS_UNIVERSAL | (23 << 2))
|
||||
(ASN_TAG_CLASS_UNIVERSAL | (23 << 2)), /* [UNIVERSAL 23] IMPLICIT ...*/
|
||||
(ASN_TAG_CLASS_UNIVERSAL | (26 << 2)), /* [UNIVERSAL 26] IMPLICIT ...*/
|
||||
(ASN_TAG_CLASS_UNIVERSAL | (4 << 2)) /* ... OCTET STRING */
|
||||
};
|
||||
asn1_TYPE_descriptor_t asn1_DEF_UTCTime = {
|
||||
"UTCTime",
|
||||
|
@ -29,11 +31,10 @@ asn1_TYPE_descriptor_t asn1_DEF_UTCTime = {
|
|||
0, /* Use generic outmost tag fetcher */
|
||||
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[0]) - 2,
|
||||
asn1_DEF_UTCTime_tags,
|
||||
sizeof(asn1_DEF_UTCTime_tags)
|
||||
/ sizeof(asn1_DEF_UTCTime_tags[0]),
|
||||
-1, /* Both ways are fine */
|
||||
0, 0, /* No members */
|
||||
0 /* No specifics */
|
||||
};
|
||||
|
@ -106,16 +107,16 @@ UTCTime_print(asn1_TYPE_descriptor_t *td, const void *sptr, int ilevel,
|
|||
|
||||
errno = EPERM;
|
||||
if(asn_UT2time(st, &tm, 1) == -1 && errno != EPERM)
|
||||
return cb("<bad-value>", 11, app_key);
|
||||
return (cb("<bad-value>", 11, app_key) < 0) ? -1 : 0;
|
||||
|
||||
ret = snprintf(buf, sizeof(buf),
|
||||
"%04d-%02d-%02d %02d:%02d%02d (GMT)",
|
||||
tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday,
|
||||
tm.tm_hour, tm.tm_min, tm.tm_sec);
|
||||
assert(ret > 0 && ret < (int)sizeof(buf));
|
||||
return cb(buf, ret, app_key);
|
||||
return (cb(buf, ret, app_key) < 0) ? -1 : 0;
|
||||
} else {
|
||||
return cb("<absent>", 8, app_key);
|
||||
return (cb("<absent>", 8, app_key) < 0) ? -1 : 0;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -28,7 +28,6 @@ asn1_TYPE_descriptor_t asn1_DEF_UTF8String = {
|
|||
asn1_DEF_UTF8String_tags,
|
||||
sizeof(asn1_DEF_UTF8String_tags)
|
||||
/ sizeof(asn1_DEF_UTF8String_tags[0]),
|
||||
-1, /* Both ways are fine */
|
||||
0, 0, /* No members */
|
||||
0 /* No specifics */
|
||||
};
|
||||
|
@ -122,8 +121,8 @@ UTF8String_print(asn1_TYPE_descriptor_t *td, const void *sptr, int ilevel,
|
|||
(void)ilevel; /* Unused argument */
|
||||
|
||||
if(st && st->buf) {
|
||||
return cb(st->buf, st->size, app_key);
|
||||
return (cb(st->buf, st->size, app_key) < 0) ? -1 : 0;
|
||||
} else {
|
||||
return cb("<absent>", 8, app_key);
|
||||
return (cb("<absent>", 8, app_key) < 0) ? -1 : 0;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -28,7 +28,6 @@ asn1_TYPE_descriptor_t asn1_DEF_UniversalString = {
|
|||
asn1_DEF_UniversalString_tags,
|
||||
sizeof(asn1_DEF_UniversalString_tags)
|
||||
/ sizeof(asn1_DEF_UniversalString_tags[0]),
|
||||
-1, /* Both ways are fine */
|
||||
0, 0, /* No members */
|
||||
0 /* No specifics */
|
||||
};
|
||||
|
@ -120,7 +119,7 @@ UniversalString_print(asn1_TYPE_descriptor_t *td, const void *sptr, int ilevel,
|
|||
(void)td; /* Unused argument */
|
||||
(void)ilevel; /* Unused argument */
|
||||
|
||||
if(!st || !st->buf) return cb("<absent>", 8, app_key);
|
||||
if(!st || !st->buf) return (cb("<absent>", 8, app_key) < 0) ? -1 : 0;
|
||||
|
||||
if(UniversalString__dump(st, cb, app_key) < 0)
|
||||
return -1;
|
||||
|
|
|
@ -28,7 +28,6 @@ asn1_TYPE_descriptor_t asn1_DEF_VideotexString = {
|
|||
asn1_DEF_VideotexString_tags,
|
||||
sizeof(asn1_DEF_VideotexString_tags)
|
||||
/ sizeof(asn1_DEF_VideotexString_tags[0]),
|
||||
-1, /* Both ways are fine */
|
||||
0, 0, /* No members */
|
||||
0 /* No specifics */
|
||||
};
|
||||
|
|
|
@ -28,7 +28,6 @@ asn1_TYPE_descriptor_t asn1_DEF_VisibleString = {
|
|||
asn1_DEF_VisibleString_tags,
|
||||
sizeof(asn1_DEF_VisibleString_tags)
|
||||
/ sizeof(asn1_DEF_VisibleString_tags[0]),
|
||||
-1, /* Both ways are fine */
|
||||
0, 0, /* No members */
|
||||
0 /* No specifics */
|
||||
};
|
||||
|
|
|
@ -31,7 +31,7 @@ int get_asn1c_environment_version(void); /* Run-time version */
|
|||
__FILE__, __LINE__); \
|
||||
} while(0)
|
||||
#else /* !__GNUC__ */
|
||||
extern void ASN_DEBUG_f(const char *fmt, ...);
|
||||
void ASN_DEBUG_f(const char *fmt, ...);
|
||||
#define ASN_DEBUG ASN_DEBUG_f
|
||||
#endif /* __GNUC__ */
|
||||
#else /* EMIT_ASN_DEBUG != 1 */
|
||||
|
@ -60,13 +60,20 @@ static void ASN_DEBUG(const char *fmt, ...) { (void)fmt; };
|
|||
|| __ASN_E_cbc(buf3, size3))
|
||||
|
||||
#define _i_ASN_TEXT_INDENT(nl, level) do { \
|
||||
int __level = (level); \
|
||||
int __nl = ((nl) != 0); \
|
||||
int __i; \
|
||||
if(__nl) _ASN_CALLBACK("\n", 1); \
|
||||
for(__i = 0; __i < __level; __i++) \
|
||||
_ASN_CALLBACK(" ", 4); \
|
||||
er.encoded += __nl + 4 * __level; \
|
||||
int __level = (level); \
|
||||
int __nl = ((nl) != 0); \
|
||||
int __i; \
|
||||
if(__nl) _ASN_CALLBACK("\n", 1); \
|
||||
for(__i = 0; __i < __level; __i++) \
|
||||
_ASN_CALLBACK(" ", 4); \
|
||||
er.encoded += __nl + 4 * __level; \
|
||||
} while(0)
|
||||
|
||||
#define _i_INDENT(nl) do { \
|
||||
int __i; \
|
||||
if((nl) && cb("\n", 1, app_key) < 0) return -1; \
|
||||
for(__i = 0; __i < ilevel; __i++) \
|
||||
if(cb(" ", 4, app_key) < 0) return -1; \
|
||||
} while(0)
|
||||
|
||||
#endif /* _ASN_INTERNAL_H_ */
|
||||
|
|
|
@ -46,7 +46,7 @@ ber_decode(asn1_TYPE_descriptor_t *type_descriptor,
|
|||
*/
|
||||
ber_dec_rval_t
|
||||
ber_check_tags(asn1_TYPE_descriptor_t *td, ber_dec_ctx_t *opt_ctx,
|
||||
void *ptr, size_t size, int tag_mode,
|
||||
void *ptr, size_t size, int tag_mode, int last_tag_form,
|
||||
ber_tlv_len_t *last_length, int *opt_tlv_form) {
|
||||
ssize_t consumed_myself = 0;
|
||||
ssize_t tag_len;
|
||||
|
@ -169,10 +169,10 @@ ber_check_tags(asn1_TYPE_descriptor_t *td, ber_dec_ctx_t *opt_ctx,
|
|||
RETURN(RC_FAIL);
|
||||
}
|
||||
} else {
|
||||
if(td->last_tag_form != tlv_constr
|
||||
&& td->last_tag_form != -1) {
|
||||
if(last_tag_form != tlv_constr
|
||||
&& last_tag_form != -1) {
|
||||
ASN_DEBUG("last_tag_form %d != %d",
|
||||
td->last_tag_form, tlv_constr);
|
||||
last_tag_form, tlv_constr);
|
||||
RETURN(RC_FAIL);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -21,7 +21,7 @@ struct asn1_TYPE_descriptor_s; /* Forward declaration */
|
|||
enum ber_dec_rval_code_e {
|
||||
RC_OK, /* Decoded successfully */
|
||||
RC_WMORE, /* More data expected, call again */
|
||||
RC_FAIL, /* Failure to decode data */
|
||||
RC_FAIL /* Failure to decode data */
|
||||
};
|
||||
typedef struct ber_dec_rval_s {
|
||||
enum ber_dec_rval_code_e code; /* Result code */
|
||||
|
@ -71,6 +71,7 @@ ber_dec_rval_t ber_check_tags(struct asn1_TYPE_descriptor_s *type_dsc,
|
|||
ber_dec_ctx_t *opt_ctx, /* saved context */
|
||||
void *ptr, size_t size,
|
||||
int tag_mode, /* {-1,0,1}: IMPLICIT, no, EXPLICIT */
|
||||
int last_tag_form, /* {-1,0:1}: any, primitive, constr */
|
||||
ber_tlv_len_t *last_length,
|
||||
int *opt_tlv_form);
|
||||
|
||||
|
|
|
@ -9,7 +9,7 @@ enum asn_tag_class {
|
|||
ASN_TAG_CLASS_UNIVERSAL = 0, /* 0b00 */
|
||||
ASN_TAG_CLASS_APPLICATION = 1, /* 0b01 */
|
||||
ASN_TAG_CLASS_CONTEXT = 2, /* 0b10 */
|
||||
ASN_TAG_CLASS_PRIVATE = 3, /* 0b11 */
|
||||
ASN_TAG_CLASS_PRIVATE = 3 /* 0b11 */
|
||||
};
|
||||
typedef unsigned ber_tlv_tag_t; /* BER TAG from Tag-Length-Value */
|
||||
|
||||
|
|
|
@ -148,7 +148,7 @@ CHOICE_decode_ber(asn1_TYPE_descriptor_t *td,
|
|||
|
||||
if(tag_mode || td->tags_count) {
|
||||
rval = ber_check_tags(td, ctx, ptr, size,
|
||||
tag_mode, &ctx->left, 0);
|
||||
tag_mode, -1, &ctx->left, 0);
|
||||
if(rval.code != RC_OK) {
|
||||
ASN_DEBUG("%s tagging check failed: %d",
|
||||
td->name, rval.code);
|
||||
|
@ -425,7 +425,7 @@ CHOICE_encode_der(asn1_TYPE_descriptor_t *td,
|
|||
return erval;
|
||||
|
||||
/* Encode CHOICE with parent or my own tag */
|
||||
ret = der_write_tags(td, erval.encoded, tag_mode, tag,
|
||||
ret = der_write_tags(td, erval.encoded, tag_mode, 1, tag,
|
||||
cb, app_key);
|
||||
if(ret == -1) {
|
||||
erval.encoded = -1;
|
||||
|
@ -597,7 +597,7 @@ CHOICE_print(asn1_TYPE_descriptor_t *td, const void *sptr, int ilevel,
|
|||
asn1_CHOICE_specifics_t *specs = (asn1_CHOICE_specifics_t *)td->specifics;
|
||||
int present;
|
||||
|
||||
if(!sptr) return cb("<absent>", 8, app_key);
|
||||
if(!sptr) return (cb("<absent>", 8, app_key) < 0) ? -1 : 0;
|
||||
|
||||
/*
|
||||
* Figure out which CHOICE element is encoded.
|
||||
|
@ -613,22 +613,22 @@ CHOICE_print(asn1_TYPE_descriptor_t *td, const void *sptr, int ilevel,
|
|||
|
||||
if(elm->flags & ATF_POINTER) {
|
||||
memb_ptr = *(const void * const *)((const char *)sptr + elm->memb_offset);
|
||||
if(!memb_ptr) return cb("<absent>", 8, app_key);
|
||||
if(!memb_ptr) return (cb("<absent>", 8, app_key) < 0) ? -1 : 0;
|
||||
} else {
|
||||
memb_ptr = (const void *)((const char *)sptr + elm->memb_offset);
|
||||
}
|
||||
|
||||
/* Print member's name and stuff */
|
||||
if(0) {
|
||||
if(cb(elm->name, strlen(elm->name), app_key)
|
||||
|| cb(": ", 2, app_key))
|
||||
if(cb(elm->name, strlen(elm->name), app_key) < 0
|
||||
|| cb(": ", 2, app_key) < 0)
|
||||
return -1;
|
||||
}
|
||||
|
||||
return elm->type->print_struct(elm->type, memb_ptr, ilevel,
|
||||
cb, app_key);
|
||||
} else {
|
||||
return cb("<absent>", 8, app_key);
|
||||
return (cb("<absent>", 8, app_key) < 0) ? -1 : 0;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -158,7 +158,7 @@ SEQUENCE_decode_ber(asn1_TYPE_descriptor_t *td,
|
|||
*/
|
||||
|
||||
rval = ber_check_tags(td, ctx, ptr, size,
|
||||
tag_mode, &ctx->left, 0);
|
||||
tag_mode, 1, &ctx->left, 0);
|
||||
if(rval.code != RC_OK) {
|
||||
ASN_DEBUG("%s tagging check failed: %d",
|
||||
td->name, rval.code);
|
||||
|
@ -534,7 +534,7 @@ SEQUENCE_encode_der(asn1_TYPE_descriptor_t *td,
|
|||
/*
|
||||
* Encode the TLV for the sequence itself.
|
||||
*/
|
||||
ret = der_write_tags(td, computed_size, tag_mode, tag, cb, app_key);
|
||||
ret = der_write_tags(td, computed_size, tag_mode, 1, tag, cb, app_key);
|
||||
ASN_DEBUG("Wrote tags: %ld (+%ld)", (long)ret, (long)computed_size);
|
||||
if(ret == -1) {
|
||||
erval.encoded = -1;
|
||||
|
@ -632,11 +632,11 @@ SEQUENCE_print(asn1_TYPE_descriptor_t *td, const void *sptr, int ilevel,
|
|||
int edx;
|
||||
int ret;
|
||||
|
||||
if(!sptr) return cb("<absent>", 8, app_key);
|
||||
if(!sptr) return (cb("<absent>", 8, app_key) < 0) ? -1 : 0;
|
||||
|
||||
/* Dump preamble */
|
||||
if(cb(td->name, strlen(td->name), app_key)
|
||||
|| cb(" ::= {\n", 7, app_key))
|
||||
if(cb(td->name, strlen(td->name), app_key) < 0
|
||||
|| cb(" ::= {", 6, app_key) < 0)
|
||||
return -1;
|
||||
|
||||
for(edx = 0; edx < td->elements_count; edx++) {
|
||||
|
@ -651,27 +651,23 @@ SEQUENCE_print(asn1_TYPE_descriptor_t *td, const void *sptr, int ilevel,
|
|||
}
|
||||
|
||||
/* Indentation */
|
||||
for(ret = 0; ret < ilevel; ret++) cb(" ", 1, app_key);
|
||||
_i_INDENT(1);
|
||||
|
||||
/* Print the member's name and stuff */
|
||||
if(cb(elm->name, strlen(elm->name), app_key)
|
||||
|| cb(": ", 2, app_key))
|
||||
if(cb(elm->name, strlen(elm->name), app_key) < 0
|
||||
|| cb(": ", 2, app_key) < 0)
|
||||
return -1;
|
||||
|
||||
/* Print the member itself */
|
||||
ret = elm->type->print_struct(elm->type, memb_ptr, ilevel + 4,
|
||||
ret = elm->type->print_struct(elm->type, memb_ptr, ilevel + 1,
|
||||
cb, app_key);
|
||||
if(ret) return ret;
|
||||
|
||||
/* Print out the terminator */
|
||||
ret = cb("\n", 1, app_key);
|
||||
if(ret) return ret;
|
||||
}
|
||||
|
||||
/* Indentation */
|
||||
for(ret = 0; ret < ilevel - 4; ret++) cb(" ", 1, app_key);
|
||||
ilevel--;
|
||||
_i_INDENT(1);
|
||||
|
||||
return cb("}", 1, app_key);
|
||||
return (cb("}", 1, app_key) < 0) ? -1 : 0;
|
||||
}
|
||||
|
||||
void
|
||||
|
|
|
@ -39,7 +39,7 @@ SEQUENCE_OF_encode_der(asn1_TYPE_descriptor_t *td, void *ptr,
|
|||
/*
|
||||
* Encode the TLV for the sequence itself.
|
||||
*/
|
||||
encoding_size = der_write_tags(td, computed_size, tag_mode, tag,
|
||||
encoding_size = der_write_tags(td, computed_size, tag_mode, 1, tag,
|
||||
cb, app_key);
|
||||
if(encoding_size == -1) {
|
||||
erval.encoded = -1;
|
||||
|
|
|
@ -147,7 +147,7 @@ SET_decode_ber(asn1_TYPE_descriptor_t *td,
|
|||
*/
|
||||
|
||||
rval = ber_check_tags(td, ctx, ptr, size,
|
||||
tag_mode, &ctx->left, 0);
|
||||
tag_mode, 1, &ctx->left, 0);
|
||||
if(rval.code != RC_OK) {
|
||||
ASN_DEBUG("%s tagging check failed: %d",
|
||||
td->name, rval.code);
|
||||
|
@ -533,7 +533,7 @@ SET_encode_der(asn1_TYPE_descriptor_t *td,
|
|||
/*
|
||||
* Encode the TLV for the sequence itself.
|
||||
*/
|
||||
ret = der_write_tags(td, computed_size, tag_mode, tag, cb, app_key);
|
||||
ret = der_write_tags(td, computed_size, tag_mode, 1, tag, cb, app_key);
|
||||
if(ret == -1) {
|
||||
my_erval.encoded = -1;
|
||||
my_erval.failed_type = td;
|
||||
|
@ -633,11 +633,11 @@ SET_print(asn1_TYPE_descriptor_t *td, const void *sptr, int ilevel,
|
|||
int edx;
|
||||
int ret;
|
||||
|
||||
if(!sptr) return cb("<absent>", 8, app_key);
|
||||
if(!sptr) return (cb("<absent>", 8, app_key) < 0) ? -1 : 0;
|
||||
|
||||
/* Dump preamble */
|
||||
if(cb(td->name, strlen(td->name), app_key)
|
||||
|| cb(" ::= {\n", 7, app_key))
|
||||
if(cb(td->name, strlen(td->name), app_key) < 0
|
||||
|| cb(" ::= {", 6, app_key) < 0)
|
||||
return -1;
|
||||
|
||||
for(edx = 0; edx < td->elements_count; edx++) {
|
||||
|
@ -651,27 +651,23 @@ SET_print(asn1_TYPE_descriptor_t *td, const void *sptr, int ilevel,
|
|||
memb_ptr = (const void *)((const char *)sptr + elm->memb_offset);
|
||||
}
|
||||
|
||||
/* Indentation */
|
||||
for(ret = 0; ret < ilevel; ret++) cb(" ", 1, app_key);
|
||||
_i_INDENT(1);
|
||||
|
||||
/* Print the member's name and stuff */
|
||||
if(cb(elm->name, strlen(elm->name), app_key)
|
||||
|| cb(": ", 2, app_key))
|
||||
if(cb(elm->name, strlen(elm->name), app_key) < 0
|
||||
|| cb(": ", 2, app_key) < 0)
|
||||
return -1;
|
||||
|
||||
/* Print the member itself */
|
||||
ret = elm->type->print_struct(elm->type, memb_ptr, ilevel + 4,
|
||||
ret = elm->type->print_struct(elm->type, memb_ptr, ilevel + 1,
|
||||
cb, app_key);
|
||||
if(ret) return ret;
|
||||
|
||||
ret = cb("\n", 1, app_key);
|
||||
if(ret) return ret;
|
||||
}
|
||||
|
||||
/* Indentation */
|
||||
for(ret = 0; ret < ilevel - 4; ret++) cb(" ", 1, app_key);
|
||||
ilevel--;
|
||||
_i_INDENT(1);
|
||||
|
||||
return cb("}", 1, app_key);
|
||||
return (cb("}", 1, app_key) < 0) ? -1 : 0;
|
||||
}
|
||||
|
||||
void
|
||||
|
|
|
@ -114,7 +114,7 @@ SET_OF_decode_ber(asn1_TYPE_descriptor_t *td,
|
|||
*/
|
||||
|
||||
rval = ber_check_tags(td, ctx, ptr, size,
|
||||
tag_mode, &ctx->left, 0);
|
||||
tag_mode, 1, &ctx->left, 0);
|
||||
if(rval.code != RC_OK) {
|
||||
ASN_DEBUG("%s tagging check failed: %d",
|
||||
td->name, rval.code);
|
||||
|
@ -346,7 +346,7 @@ SET_OF_encode_der(asn1_TYPE_descriptor_t *td, void *ptr,
|
|||
/*
|
||||
* Encode the TLV for the sequence itself.
|
||||
*/
|
||||
encoding_size = der_write_tags(td, computed_size, tag_mode, tag,
|
||||
encoding_size = der_write_tags(td, computed_size, tag_mode, 1, tag,
|
||||
cb, app_key);
|
||||
if(encoding_size == -1) {
|
||||
erval.encoded = -1;
|
||||
|
@ -366,7 +366,8 @@ SET_OF_encode_der(asn1_TYPE_descriptor_t *td, void *ptr,
|
|||
* according to their encodings. Build an array of the
|
||||
* encoded elements.
|
||||
*/
|
||||
(void *)encoded_els = MALLOC(list->count * sizeof(encoded_els[0]));
|
||||
encoded_els = (struct _el_buffer *)MALLOC(
|
||||
list->count * sizeof(encoded_els[0]));
|
||||
if(encoded_els == NULL) {
|
||||
erval.encoded = -1;
|
||||
erval.failed_type = td;
|
||||
|
@ -428,7 +429,7 @@ SET_OF_encode_der(asn1_TYPE_descriptor_t *td, void *ptr,
|
|||
struct _el_buffer *encoded_el = &encoded_els[edx];
|
||||
/* Report encoded chunks to the application */
|
||||
if(ret == 0
|
||||
&& cb(encoded_el->buf, encoded_el->length, app_key) == -1)
|
||||
&& cb(encoded_el->buf, encoded_el->length, app_key) < 0)
|
||||
ret = -1;
|
||||
FREEMEM(encoded_el->buf);
|
||||
}
|
||||
|
@ -504,11 +505,11 @@ SET_OF_print(asn1_TYPE_descriptor_t *td, const void *sptr, int ilevel,
|
|||
int ret;
|
||||
int i;
|
||||
|
||||
if(!sptr) return cb("<absent>", 8, app_key);
|
||||
if(!sptr) return (cb("<absent>", 8, app_key) < 0) ? -1 : 0;
|
||||
|
||||
/* Dump preamble */
|
||||
if(cb(td->name, strlen(td->name), app_key)
|
||||
|| cb(" ::= {\n", 7, app_key))
|
||||
if(cb(td->name, strlen(td->name), app_key) < 0
|
||||
|| cb(" ::= {", 6, app_key) < 0)
|
||||
return -1;
|
||||
|
||||
(const void *)list = sptr;
|
||||
|
@ -516,21 +517,17 @@ SET_OF_print(asn1_TYPE_descriptor_t *td, const void *sptr, int ilevel,
|
|||
const void *memb_ptr = list->array[i];
|
||||
if(!memb_ptr) continue;
|
||||
|
||||
/* Indentation */
|
||||
for(ret = 0; ret < ilevel; ret++) cb(" ", 1, app_key);
|
||||
_i_INDENT(1);
|
||||
|
||||
ret = element->type->print_struct(element->type, memb_ptr,
|
||||
ilevel + 4, cb, app_key);
|
||||
if(ret) return ret;
|
||||
|
||||
ret = cb("\n", 1, app_key);
|
||||
ilevel + 1, cb, app_key);
|
||||
if(ret) return ret;
|
||||
}
|
||||
|
||||
/* Indentation */
|
||||
for(ret = 0; ret < ilevel - 4; ret++) cb(" ", 1, app_key);
|
||||
ilevel--;
|
||||
_i_INDENT(1);
|
||||
|
||||
return cb("}", 1, app_key);
|
||||
return (cb("}", 1, app_key) < 0) ? -1 : 0;
|
||||
}
|
||||
|
||||
void
|
||||
|
|
|
@ -41,7 +41,7 @@ asn_fprint(FILE *stream, asn1_TYPE_descriptor_t *td, const void *struct_ptr) {
|
|||
}
|
||||
|
||||
/* Invoke type-specific printer */
|
||||
if(td->print_struct(td, struct_ptr, 4, _print2fp, stream))
|
||||
if(td->print_struct(td, struct_ptr, 1, _print2fp, stream))
|
||||
return -1;
|
||||
|
||||
/* Terminate the output */
|
||||
|
|
|
@ -111,8 +111,6 @@ typedef struct asn1_TYPE_descriptor_s {
|
|||
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) */
|
||||
|
||||
/*
|
||||
* An ASN.1 production type members (members of SEQUENCE, SET, CHOICE).
|
||||
*/
|
||||
|
@ -132,7 +130,7 @@ typedef struct asn1_TYPE_descriptor_s {
|
|||
enum asn1_TYPE_flags_e {
|
||||
ATF_NOFLAGS,
|
||||
ATF_POINTER = 0x01, /* Represented by the pointer */
|
||||
ATF_OPEN_TYPE = 0x02, /* ANY type, without meaningful tag */
|
||||
ATF_OPEN_TYPE = 0x02 /* ANY type, without meaningful tag */
|
||||
};
|
||||
typedef struct asn1_TYPE_member_s {
|
||||
enum asn1_TYPE_flags_e flags; /* Element's presentation flags */
|
||||
|
|
|
@ -99,7 +99,7 @@ _asn_i_log_error(asn_app_consume_bytes_f *cb, void *key, const char *fmt, ...) {
|
|||
}
|
||||
|
||||
if(ret < (ssize_t)sizeof(buf)) {
|
||||
cb(buf, ret, key);
|
||||
(void)cb(buf, ret, key);
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -120,5 +120,5 @@ _asn_i_log_error(asn_app_consume_bytes_f *cb, void *key, const char *fmt, ...) {
|
|||
p = buf;
|
||||
}
|
||||
|
||||
cb(p, ret, key);
|
||||
(void)cb(p, ret, key);
|
||||
}
|
||||
|
|
|
@ -45,17 +45,10 @@ asn_constr_check_f asn_generic_unknown_constraint; /* Not fully supported */
|
|||
/*
|
||||
* Invoke the callback with a complete error message.
|
||||
*/
|
||||
#ifdef __GNUC__
|
||||
#define _ASN_ERRLOG(app_errlog, app_key, fmt, args...) do { \
|
||||
if(app_errlog) \
|
||||
_asn_i_log_error(app_errlog, \
|
||||
app_key, fmt, ##args); \
|
||||
} while(0);
|
||||
#else /* Preprocessor does not support variable args macros */
|
||||
/* Preprocessor may not support variable args macros, so act strangely */
|
||||
#define _ASN_ERRLOG if(app_errlog) _asn_i_log_error
|
||||
#endif
|
||||
|
||||
extern void _asn_i_log_error(asn_app_consume_bytes_f *, void *key,
|
||||
void _asn_i_log_error(asn_app_consume_bytes_f *, void *key,
|
||||
const char *fmt, ...) __attribute__ ((format(printf, 3, 4)));
|
||||
|
||||
#endif /* _ASN1_CONSTRAINTS_VALIDATOR_H_ */
|
||||
|
|
|
@ -34,7 +34,7 @@ der_encode(asn1_TYPE_descriptor_t *type_descriptor, void *struct_ptr,
|
|||
ssize_t
|
||||
der_write_tags(asn1_TYPE_descriptor_t *sd,
|
||||
size_t struct_length,
|
||||
int tag_mode,
|
||||
int tag_mode, int last_tag_form,
|
||||
ber_tlv_tag_t tag, /* EXPLICIT or IMPLICIT tag */
|
||||
asn_app_consume_bytes_f *cb,
|
||||
void *app_key) {
|
||||
|
@ -112,10 +112,8 @@ der_write_tags(asn1_TYPE_descriptor_t *sd,
|
|||
ssize_t len;
|
||||
int _constr;
|
||||
|
||||
/* If this one happens to be constructed, do it. */
|
||||
if(i < (tags_count - 1) || sd->last_tag_form == 1)
|
||||
_constr = 1;
|
||||
else _constr = 0;
|
||||
/* Check if this tag happens to be constructed */
|
||||
_constr = (last_tag_form || i < (tags_count - 1));
|
||||
|
||||
len = der_write_TL(tags[i], lens[i], cb, app_key, _constr);
|
||||
if(len == -1) return -1;
|
||||
|
@ -151,9 +149,8 @@ der_write_TL(ber_tlv_tag_t tag, ber_tlv_len_t len,
|
|||
*/
|
||||
if(cb) {
|
||||
if(constructed) *buf |= 0x20;
|
||||
if(cb(buf, size, app_key) == -1) {
|
||||
if(cb(buf, size, app_key) < 0)
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
return size;
|
||||
|
|
|
@ -42,6 +42,7 @@ ssize_t der_write_tags(
|
|||
struct asn1_TYPE_descriptor_s *type_descriptor,
|
||||
size_t struct_length,
|
||||
int tag_mode, /* {-1,0,1}: IMPLICIT, no, EXPLICIT */
|
||||
int last_tag_form, /* {0,!0}: prim, constructed */
|
||||
ber_tlv_tag_t tag,
|
||||
asn_app_consume_bytes_f *consume_bytes_cb,
|
||||
void *app_key
|
||||
|
|
|
@ -48,6 +48,7 @@ asn_internal.h
|
|||
asn_types.h
|
||||
OCTET_STRING.h OCTET_STRING.c # This one is used too widely
|
||||
ber_decoder.h ber_decoder.c
|
||||
ber_codec_prim.c ber_codec_prim.h
|
||||
ber_tlv_length.h ber_tlv_length.c
|
||||
ber_tlv_tag.h ber_tlv_tag.c
|
||||
constr_TYPE.h constr_TYPE.c
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
#include <INTEGER.c>
|
||||
#include <ber_codec_prim.c>
|
||||
#include <ber_decoder.c>
|
||||
#include <ber_tlv_length.c>
|
||||
#include <ber_tlv_tag.c>
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
#include <OBJECT_IDENTIFIER.c>
|
||||
#include <RELATIVE-OID.c>
|
||||
#include <INTEGER.c>
|
||||
#include <ber_codec_prim.c>
|
||||
#include <ber_decoder.c>
|
||||
#include <ber_tlv_length.c>
|
||||
#include <ber_tlv_tag.c>
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
#define EMIT_ASN_DEBUG 1
|
||||
#include <INTEGER.c>
|
||||
#include <REAL.c>
|
||||
#include <ber_codec_prim.c>
|
||||
#include <ber_decoder.c>
|
||||
#include <ber_tlv_length.c>
|
||||
#include <ber_tlv_tag.c>
|
||||
|
|
|
@ -13,7 +13,7 @@ struct asn1_TYPE_descriptor_s; /* Forward declaration */
|
|||
enum xer_encoder_flags_e {
|
||||
/* Mode of encoding */
|
||||
XER_F_BASIC = 0x01, /* BASIC-XER (pretty-printing) */
|
||||
XER_F_CANONICAL = 0x02, /* Canonical XER (strict rules, unreadable) */
|
||||
XER_F_CANONICAL = 0x02 /* Canonical XER (strict rules, unreadable) */
|
||||
};
|
||||
|
||||
/*
|
||||
|
|
Loading…
Reference in New Issue