15 #define LEFT ((size<(size_t)ctx->left)?size:(size_t)ctx->left) 28 #define SIZE_VIOLATION (ctx->left >= 0 && (size_t)ctx->left <= size) 35 #define ADVANCE(num_bytes) do { \ 36 size_t num = num_bytes; \ 37 ptr = ((const char *)ptr) + num; \ 41 consumed_myself += num; \ 49 #define NEXT_PHASE(ctx) do { \ 53 #define PHASE_OUT(ctx) do { ctx->phase = 10; } while(0) 59 #define RETURN(_code) do { \ 61 rval.consumed = consumed_myself;\ 68 #define IN_EXTENSION_GROUP(specs, memb_idx) \ 69 ( ((memb_idx) > (specs)->ext_after) \ 70 &&((memb_idx) < (specs)->ext_before)) 84 if(a_class == b_class) {
88 if(a_value == b_value) {
96 }
else if(a_value < b_value)
100 }
else if(a_class < b_class) {
113 void **struct_ptr,
const void *ptr,
size_t size,
int tag_mode) {
123 void *st = *struct_ptr;
129 ssize_t consumed_myself = 0;
161 tag_mode, 1, &ctx->left, 0);
162 if(rval.code !=
RC_OK) {
164 td->
name, rval.code);
169 ctx->left += rval.consumed;
174 ASN_DEBUG(
"Structure consumes %ld bytes, buffer %ld",
175 (
long)ctx->left, (
long)size);
189 for(edx = (ctx->step >> 1); edx < td->elements_count;
190 edx++, ctx->step = (ctx->step & ~1) + 2) {
204 ASN_DEBUG(
"In %s SEQUENCE left %d, edx=%d flags=%d" 206 td->
name, (
int)ctx->left, edx,
207 elements[edx].flags, elements[edx].optional,
213 (edx + elements[edx].optional
233 ASN_DEBUG(
"Current tag in %s SEQUENCE for element %d " 234 "(%s) is %s encoded in %d bytes, of frame %ld",
235 td->
name, edx, elements[edx].name,
243 if(ctx->left < 0 && ((
const uint8_t *)ptr)[0] == 0) {
249 }
else if(((
const uint8_t *)ptr)[1] == 0) {
251 edx, elements[edx].optional,
253 if((edx + elements[edx].optional
276 opt_edx_end = edx + elements[edx].optional + 1;
279 else if(opt_edx_end - edx > 8) {
281 opt_edx_end = edx + 8;
285 for(n = edx; n < opt_edx_end; n++) {
293 ctx->step = 1 + 2 * edx;
301 ctx->step = 1 + 2 * edx;
323 int edx_max = edx + elements[edx].optional;
330 for(t2m = t2m_f; t2m <= t2m_l; t2m++) {
331 if(t2m->
el_no > edx_max)
break;
332 if(t2m->
el_no < edx)
continue;
337 ctx->step = 1 + 2 * edx;
343 if(n == opt_edx_end) {
351 edx + elements[edx].optional)) {
357 elements[edx].optional
358 ?
" or alternatives":
"");
363 edx += elements[edx].optional;
365 ASN_DEBUG(
"Skipping unexpected %s (at %d)",
369 (
const char *)ptr + tag_len,
372 (
int)skip, td->
name);
400 memb_ptr2 = (
void **)((
char *)st + elements[edx].memb_offset);
406 memb_ptr = (
char *)st + elements[edx].memb_offset;
407 memb_ptr2 = &memb_ptr;
412 rval = elements[edx].type->ber_decoder(opt_codec_ctx,
414 memb_ptr2, ptr,
LEFT,
415 elements[edx].tag_mode);
416 ASN_DEBUG(
"In %s SEQUENCE decoded %d %s of %d " 417 "in %d bytes rval.code %d, size=%d",
418 td->
name, edx, elements[edx].type->name,
419 (
int)
LEFT, (
int)rval.consumed, rval.code, (
int)size);
428 ASN_DEBUG(
"Size violation (c->l=%ld <= s=%ld)",
429 (
long)ctx->left, (
long)size);
443 ASN_DEBUG(
"SEQUENCE %s Leftover: %ld, size = %ld",
444 td->
name, (
long)ctx->left, (
long)size);
463 && ((
const uint8_t *)ptr)[0] == 0) {
469 }
else if(((
const uint8_t *)ptr)[1] == 0) {
481 || ctx->phase == 4) {
483 "of a non-extensible type " 492 (
const char *)ptr + tl,
LEFT - tl);
516 size_t computed_size = 0;
522 cb?
"Encoding":
"Estimating", td->
name);
531 memb_ptr = *(
void **)((
char *)sptr + elm->
memb_offset);
538 memb_ptr = (
void *)((
char *)sptr + elm->
memb_offset);
545 computed_size += erval.
encoded;
546 ASN_DEBUG(
"Member %d %s estimated %ld bytes",
553 ret =
der_write_tags(td, computed_size, tag_mode, 1, tag, cb, app_key);
554 ASN_DEBUG(
"Wrote tags: %ld (+%ld)", (
long)ret, (
long)computed_size);
557 erval.
encoded = computed_size + ret;
570 memb_ptr = *(
void **)((
char *)sptr + elm->
memb_offset);
571 if(!memb_ptr)
continue;
573 memb_ptr = (
void *)((
char *)sptr + elm->
memb_offset);
580 computed_size -= tmperval.
encoded;
581 ASN_DEBUG(
"Member %d %s of SEQUENCE %s encoded in %ld bytes",
585 if(computed_size != 0)
596 #define XER_ADVANCE(num_bytes) do { \ 597 size_t num = num_bytes; \ 598 buf_ptr = ((const char *)buf_ptr) + num;\ 600 consumed_myself += num; \ 608 void **struct_ptr,
const char *opt_mname,
609 const void *buf_ptr,
size_t size) {
616 const char *xml_tag = opt_mname ? opt_mname : td->
xml_tag;
621 void *st = *struct_ptr;
625 ssize_t consumed_myself = 0;
651 for(edx = ctx->step; ctx->phase <= 3;) {
661 if(ctx->phase == 2) {
670 memb_ptr2 = (
void **)((
char *)st + elm->
memb_offset);
673 memb_ptr2 = &memb_ptr;
685 ASN_DEBUG(
"XER/SEQUENCE phase => %d, step => %d",
686 ctx->phase, ctx->step);
710 ASN_DEBUG(
"XER/SEQUENCE: tcv = %d, ph=%d [%s]",
711 tcv, ctx->phase, xml_tag);
714 if(ctx->phase == 3) {
734 if(ctx->phase == 0)
break;
738 if(ctx->phase == 0) {
742 (edx + elements[edx].optional
754 ASN_DEBUG(
"Premature end of XER SEQUENCE");
760 if(ctx->phase == 0) {
769 ASN_DEBUG(
"XER/SEQUENCE: tcv=%d, ph=%d, edx=%d",
770 tcv, ctx->phase, edx);
771 if(ctx->phase != 1) {
775 if(edx < td->elements_count) {
779 edx_end = edx + elements[edx].optional + 1;
782 for(n = edx; n < edx_end; n++) {
807 ASN_DEBUG(
"Out of defined members: %d/%d",
813 edx + (edx < td->elements_count
814 ? elements[edx].optional : 0))) {
815 ASN_DEBUG(
"Got anticipated extension at %d",
837 ASN_DEBUG(
"Unexpected XML tag in SEQUENCE [%c%c%c%c%c%c]",
838 size>0?((
const char *)buf_ptr)[0]:
'.',
839 size>1?((
const char *)buf_ptr)[1]:
'.',
840 size>2?((
const char *)buf_ptr)[2]:
'.',
841 size>3?((
const char *)buf_ptr)[3]:
'.',
842 size>4?((
const char *)buf_ptr)[4]:
'.',
843 size>5?((
const char *)buf_ptr)[5]:
'.');
868 const char *mname = elm->
name;
869 unsigned int mlen = strlen(mname);
872 memb_ptr = *(
void **)((
char *)sptr + elm->
memb_offset);
880 memb_ptr = (
void *)((
char *)sptr + elm->
memb_offset);
888 ilevel + 1, flags, cb, app_key);
889 if(tmper.
encoded == -1)
return tmper;
908 if(!sptr)
return (cb(
"<absent>", 8, app_key) < 0) ? -1 : 0;
911 if(cb(td->
name, strlen(td->
name), app_key) < 0
912 || cb(
" ::= {", 6, app_key) < 0)
917 const void *memb_ptr;
920 memb_ptr = *(
const void *
const *)((
const char *)sptr + elm->
memb_offset);
927 memb_ptr = (
const void *)((
const char *)sptr + elm->
memb_offset);
934 if(cb(elm->
name, strlen(elm->
name), app_key) < 0
935 || cb(
": ", 2, app_key) < 0)
947 return (cb(
"}", 1, app_key) < 0) ? -1 : 0;
963 memb_ptr = *(
void **)((
char *)sptr + elm->
memb_offset);
967 memb_ptr = (
void *)((
char *)sptr + elm->
memb_offset);
984 "%s: value not given (%s:%d)",
985 td->
name, __FILE__, __LINE__);
994 const void *memb_ptr;
997 memb_ptr = *(
const void *
const *)((
const char *)sptr + elm->
memb_offset);
1002 "%s: mandatory element %s absent (%s:%d)",
1003 td->
name, elm->
name, __FILE__, __LINE__);
1007 memb_ptr = (
const void *)((
const char *)sptr + elm->
memb_offset);
1016 memb_ptr, ctfailcb, app_key);
1061 memset(&opmd, 0,
sizeof(opmd));
1070 opmd.buffer = opres;
1072 ASN_DEBUG(
"Read in presence bitmap for %s of %d bits (%x..)",
1091 memb_ptr2 = (
void **)((
char *)st + elm->
memb_offset);
1094 memb_ptr2 = &memb_ptr;
1100 ASN_DEBUG(
"Member %s->%s is optional, p=%d (%d->%d)",
1102 (
int)opmd.nboff, (
int)opmd.nbits);
1123 if(rv.code !=
RC_OK) {
1145 ASN_DEBUG(
"Extensions %ld present in %s", (
long)bmlength, td->
name);
1147 epres = (uint8_t *)
MALLOC((bmlength + 15) >> 3);
1154 memset(&epmd, 0,
sizeof(epmd));
1156 epmd.
nbits = bmlength;
1157 ASN_DEBUG(
"Read in extensions bitmap for %s of %ld bits (%x..)",
1158 td->
name, (
long)bmlength, *epres);
1161 for(edx = specs->
ext_after + 1; edx < td->elements_count; edx++) {
1174 memb_ptr2 = (
void **)((
char *)st + elm->
memb_offset);
1176 memb_ptr = (
void *)((
char *)st + elm->
memb_offset);
1177 memb_ptr2 = &memb_ptr;
1182 if(present < 0)
break;
1189 if(rv.code !=
RC_OK) {
1198 ASN_DEBUG(
"Getting overflow extensions");
1215 for(edx = specs->
roms_count; edx < specs->roms_count
1224 memb_ptr2 = (
void **)((
char *)st
1226 if(*memb_ptr2)
continue;
1247 int exts_present = 0;
1255 for(edx = specs->
ext_after + 1; edx < td->elements_count; edx++) {
1268 memb_ptr2 = (
void **)((
char *)sptr + elm->
memb_offset);
1269 present = (*memb_ptr2 != 0);
1271 memb_ptr = (
void *)((
char *)sptr + elm->
memb_offset);
1272 memb_ptr2 = &memb_ptr;
1276 ASN_DEBUG(
"checking %s (@%d) present => %d",
1279 exts_present += present;
1291 return exts_present ? exts_count : 0;
1332 edx = specs->
oms[i];
1337 memb_ptr2 = (
void **)((
char *)sptr + elm->
memb_offset);
1338 present = (*memb_ptr2 != 0);
1340 memb_ptr = (
void *)((
char *)sptr + elm->
memb_offset);
1341 memb_ptr2 = &memb_ptr;
1353 td->
name, elm->
name, present ?
"present" :
"absent");
1362 for(edx = 0; edx < ((specs->
ext_after < 0)
1376 memb_ptr2 = (
void **)((
char *)sptr + elm->
memb_offset);
1386 memb_ptr = (
void *)((
char *)sptr + elm->
memb_offset);
1387 memb_ptr2 = &memb_ptr;
1397 if(er.encoded == -1)
1404 ASN_DEBUG(
"Length of %d bit-map", n_extensions);
1409 ASN_DEBUG(
"Bit-map of %d elements", n_extensions);
1415 ASN_DEBUG(
"Writing %d extensions", n_extensions);
int(* default_value)(int setval, void **sptr)
#define _i_ASN_TEXT_INDENT(nl, level)
ssize_t der_write_tags(struct asn_TYPE_descriptor_s *type_descriptor, size_t struct_length, int tag_mode, int last_tag_form, ber_tlv_tag_t tag, asn_app_consume_bytes_f *consume_bytes_cb, void *app_key)
ssize_t ber_fetch_tag(const void *bufptr, size_t size, ber_tlv_tag_t *tag_r)
#define BER_TLV_CONSTRUCTED(tagptr)
enum asn_TYPE_flags_e flags
#define _ASN_DECODE_STARVED
int per_put_few_bits(asn_per_outp_t *per_data, uint32_t bits, int obits)
char * ber_tlv_tag_string(ber_tlv_tag_t tag)
asn_dec_rval_t SEQUENCE_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void **sptr, asn_per_data_t *pd)
ssize_t ber_skip_length(struct asn_codec_ctx_s *opt_codec_ctx, int _is_constructed, const void *bufptr, size_t size)
static int SEQUENCE_handle_extensions(asn_TYPE_descriptor_t *td, void *sptr, asn_per_outp_t *po1, asn_per_outp_t *po2)
asn_constr_check_f * memb_constraints
asn_dec_rval_t SEQUENCE_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **struct_ptr, const void *ptr, size_t size, int tag_mode)
#define ASN_STRUCT_FREE_CONTENTS_ONLY(asn_DEF, ptr)
#define CALLOC(nmemb, size)
asn_per_constraints_t * per_constraints
#define BER_TAG_VALUE(tag)
static int _ASN_STACK_OVERFLOW_CHECK(asn_codec_ctx_t *ctx)
#define XER_ADVANCE(num_bytes)
#define _ASN_ENCODED_OK(rval)
asn_constr_check_f * check_constraints
asn_dec_rval_t ber_check_tags(struct asn_codec_ctx_s *opt_codec_ctx, struct asn_TYPE_descriptor_s *type_descriptor, asn_struct_ctx_t *opt_ctx, const void *ptr, size_t size, int tag_mode, int last_tag_form, ber_tlv_len_t *last_length, int *opt_tlv_form)
#define ASN_STRUCT_FREE(asn_DEF, ptr)
#define _ASN_ENCODE_FAILED
ssize_t xer_next_token(int *stateContext, const void *buffer, size_t size, pxer_chunk_type_e *_ch_type)
asn_struct_print_f * print_struct
enum xer_check_tag xer_check_tag_e
struct asn_TYPE_member_s * elements
int per_get_many_bits(asn_per_data_t *pd, uint8_t *dst, int right_align, int get_nbits)
#define ADVANCE(num_bytes)
int() asn_app_consume_bytes_f(const void *buffer, size_t size, void *application_specific_key)
xer_type_decoder_f * xer_decoder
#define BER_TAG_CLASS(tag)
#define _ASN_CALLBACK3(buf1, size1, buf2, size2, buf3, size3)
int32_t per_get_few_bits(asn_per_data_t *per_data, int get_nbits)
int uper_put_nslength(asn_per_outp_t *po, size_t length)
int uper_open_type_put(asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void *sptr, asn_per_outp_t *po)
der_type_encoder_f * der_encoder
void() asn_app_constraint_failed_f(void *application_specific_key, struct asn_TYPE_descriptor_s *type_descriptor_which_failed, const void *structure_which_failed_ptr, const char *error_message_format,...) GCC_PRINTFLIKE(4
#define IN_EXTENSION_GROUP(specs, memb_idx)
asn_enc_rval_t SEQUENCE_encode_der(asn_TYPE_descriptor_t *td, void *sptr, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key)
enum asn_dec_rval_code_e code
asn_TYPE_descriptor_t * type
#define BER_TAGS_EQUAL(tag1, tag2)
int SEQUENCE_constraint(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key)
asn_TYPE_tag2member_t * tag2el
per_type_encoder_f * uper_encoder
static void ASN_DEBUG(const char *fmt,...)
per_type_decoder_f * uper_decoder
int uper_open_type_skip(asn_codec_ctx_t *opt_codec_ctx, asn_per_data_t *pd)
static int _t2e_cmp(const void *ap, const void *bp)
asn_enc_rval_t SEQUENCE_encode_uper(asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void *sptr, asn_per_outp_t *po)
int xer_skip_unknown(xer_check_tag_e tcv, ber_tlv_len_t *depth)
void SEQUENCE_free(asn_TYPE_descriptor_t *td, void *sptr, int contents_only)
ssize_t uper_get_nslength(asn_per_data_t *pd)
int SEQUENCE_print(asn_TYPE_descriptor_t *td, const void *sptr, int ilevel, asn_app_consume_bytes_f *cb, void *app_key)
asn_dec_rval_t SEQUENCE_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **struct_ptr, const char *opt_mname, const void *buf_ptr, size_t size)
asn_enc_rval_t SEQUENCE_encode_xer(asn_TYPE_descriptor_t *td, void *sptr, int ilevel, enum xer_encoder_flags_e flags, asn_app_consume_bytes_f *cb, void *app_key)
enum pxer_chunk_type pxer_chunk_type_e
#define _ASN_DECODE_FAILED
xer_type_encoder_f * xer_encoder
asn_dec_rval_t uper_open_type_get(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void **sptr, asn_per_data_t *pd)