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;\ 70 void **struct_ptr,
const void *ptr,
size_t size,
int tag_mode) {
80 void *st = *struct_ptr;
86 ssize_t consumed_myself = 0;
117 tag_mode, 1, &ctx->left, 0);
118 if(rval.code !=
RC_OK) {
120 td->
name, rval.code);
125 ctx->left += rval.consumed;
128 ASN_DEBUG(
"Structure consumes %ld bytes, " 129 "buffer %ld", (
long)ctx->left, (
long)size);
139 for(;; ctx->step = 0) {
169 if(ctx->left < 0 && ((
const uint8_t *)ptr)[0] == 0) {
175 }
else if(((
const uint8_t *)ptr)[1] == 0) {
191 ASN_DEBUG(
"Unexpected tag %s fixed SET OF %s",
208 rval = elm->type->ber_decoder(opt_codec_ctx,
209 elm->type, &ctx->ptr, ptr,
LEFT, 0);
210 ASN_DEBUG(
"In %s SET OF %s code %d consumed %d",
211 td->
name, elm->type->name,
212 rval.code, (
int)rval.consumed);
243 while(ctx->left < 0) {
245 if(
LEFT > 0 && ((
const char *)ptr)[0] != 0) {
252 if(((
const char *)ptr)[0] == 0
253 && ((
const char *)ptr)[1] == 0) {
276 static int _el_addbytes(
const void *buffer,
size_t size,
void *el_buf_ptr) {
298 ret = memcmp(a->
buf, b->
buf, common_len);
320 size_t computed_size = 0;
321 ssize_t encoding_size = 0;
323 ssize_t eels_count = 0;
324 size_t max_encoded_len = 1;
334 for(edx = 0; edx < list->count; edx++) {
335 void *memb_ptr = list->array[edx];
336 if(!memb_ptr)
continue;
337 erval = der_encoder(elm_type, memb_ptr, 0, elm->
tag, 0, 0);
340 computed_size += erval.
encoded;
343 if(max_encoded_len < (
size_t)erval.
encoded)
344 max_encoded_len = erval.
encoded;
350 encoding_size =
der_write_tags(td, computed_size, tag_mode, 1, tag,
352 if(encoding_size == -1) {
358 computed_size += encoding_size;
360 if(!cb || list->count == 0) {
371 list->count *
sizeof(encoded_els[0]));
372 if(encoded_els == NULL) {
384 for(edx = 0; edx < list->count; edx++) {
385 void *memb_ptr = list->array[edx];
386 struct _el_buffer *encoded_el = &encoded_els[eels_count];
388 if(!memb_ptr)
continue;
393 encoded_el->
buf = (uint8_t *)
MALLOC(max_encoded_len);
394 if(encoded_el->
buf) {
396 encoded_el->
size = max_encoded_len;
398 for(edx--; edx >= 0; edx--)
410 erval = der_encoder(elm_type, memb_ptr, 0, elm->
tag,
413 for(; edx >= 0; edx--)
418 encoding_size += erval.
encoded;
425 qsort(encoded_els, eels_count,
sizeof(encoded_els[0]),
_el_buf_cmp);
432 for(edx = 0; edx < eels_count; edx++) {
433 struct _el_buffer *encoded_el = &encoded_els[edx];
436 && cb(encoded_el->
buf, encoded_el->
length, app_key) < 0)
442 if(ret || computed_size != (
size_t)encoding_size) {
458 #define XER_ADVANCE(num_bytes) do { \ 459 size_t num = num_bytes; \ 460 buf_ptr = ((const char *)buf_ptr) + num;\ 462 consumed_myself += num; \ 470 void **struct_ptr,
const char *opt_mname,
471 const void *buf_ptr,
size_t size) {
478 const char *xml_tag = opt_mname ? opt_mname : td->
xml_tag;
483 void *st = *struct_ptr;
487 ssize_t consumed_myself = 0;
501 elm_tag = (*element->name)
502 ? element->name : element->type->xml_tag;
516 for(; ctx->phase <= 2;) {
524 if(ctx->phase == 2) {
528 ASN_DEBUG(
"XER/SET OF element [%s]", elm_tag);
529 tmprval = element->type->xer_decoder(opt_codec_ctx,
530 element->type, &ctx->ptr, elm_tag,
543 ASN_DEBUG(
"XER/SET OF phase => %d", ctx->phase);
551 buf_ptr,
size, &ch_type);
567 ASN_DEBUG(
"XER/SET OF: tcv = %d, ph=%d t=%s",
568 tcv, ctx->phase, xml_tag);
571 if(ctx->phase == 0)
break;
575 if(ctx->phase == 0) {
583 if(ctx->phase == 0) {
592 ASN_DEBUG(
"XER/SET OF: tcv=%d, ph=%d", tcv, ctx->phase);
593 if(ctx->phase == 1) {
605 ASN_DEBUG(
"Unexpected XML tag in SET OF");
624 size_t newsize = (t->
size << 2) + size;
638 size_t minlen = a->
offset;
643 if(ret != 0)
return ret;
661 ? 0 : ((*elm->name) ? elm->name : elm->type->xml_tag);
662 size_t mlen = mname ? strlen(mname) : 0;
665 size_t encs_count = 0;
666 void *original_app_key = app_key;
680 for(i = 0; i < list->count; i++) {
683 void *memb_ptr = list->array[i];
684 if(!memb_ptr)
continue;
687 memset(&encs[encs_count], 0,
sizeof(encs[0]));
688 app_key = &encs[encs_count];
699 tmper = elm->type->xer_encoder(elm->type, memb_ptr,
708 const char *name = elm->type->xml_tag;
709 size_t len = strlen(name);
726 ssize_t control_size = 0;
729 app_key = original_app_key;
732 for(; enc < end; enc++) {
736 control_size += enc->
offset;
738 assert(control_size == er.
encoded);
748 while(encs_count-- > 0) {
749 if(encs[encs_count].buffer)
750 FREEMEM(encs[encs_count].buffer);
765 if(!sptr)
return (cb(
"<absent>", 8, app_key) < 0) ? -1 : 0;
768 if(cb(td->
name, strlen(td->
name), app_key) < 0
769 || cb(
" ::= {", 6, app_key) < 0)
772 for(i = 0; i < list->count; i++) {
773 const void *memb_ptr = list->array[i];
774 if(!memb_ptr)
continue;
779 ilevel + 1, cb, app_key);
786 return (cb(
"}", 1, app_key) < 0) ? -1 : 0;
802 for(i = 0; i < list->count; i++) {
803 void *memb_ptr = list->array[i];
834 "%s: value not given (%s:%d)",
835 td->
name, __FILE__, __LINE__);
846 for(i = 0; i < list->count; i++) {
847 const void *memb_ptr = list->array[i];
850 if(!memb_ptr)
continue;
852 ret = constr(elm->
type, memb_ptr, ctfailcb, app_key);
873 asn_anonymous_set_ *list;
891 if(constraints) ct = &constraints->
size;
895 if(ct && ct->flags & APC_EXTENSIBLE) {
901 if(ct && ct->effective_bits >= 0) {
904 ASN_DEBUG(
"Preparing to fetch %ld+%ld elements from %s",
905 (
long)nelems, ct->lower_bound, td->
name);
907 nelems += ct->lower_bound;
916 ct ? ct->effective_bits : -1, &repeat);
917 ASN_DEBUG(
"Got to decode %d elements (eff %d)",
918 (
int)nelems, (
int)(ct ? ct->effective_bits : -1));
922 for(i = 0; i < nelems; i++) {
924 ASN_DEBUG(
"SET OF %s decoding", elm->type->name);
925 rv = elm->type->uper_decoder(opt_codec_ctx, elm->type,
926 elm->per_constraints, &ptr, pd);
928 td->
name, elm->type->name, rv.
code, ptr);
932 ASN_DEBUG(
"Failed to add element into %s",
937 ASN_DEBUG(
"Failed decoding %s of %s (SET OF)",
938 elm->type->name, td->
name);
#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)
int SET_OF_print(asn_TYPE_descriptor_t *td, const void *sptr, int ilevel, asn_app_consume_bytes_f *cb, void *app_key)
static int SET_OF_encode_xer_callback(const void *buffer, size_t size, void *key)
struct asn_TYPE_descriptor_s * failed_type
ssize_t ber_fetch_tag(const void *bufptr, size_t size, ber_tlv_tag_t *tag_r)
#define XER_ADVANCE(num_bytes)
static int _el_buf_cmp(const void *ap, const void *bp)
asn_per_constraint_t size
#define _ASN_DECODE_STARVED
struct xer_tmp_enc_s xer_tmp_enc_t
static int _el_addbytes(const void *buffer, size_t size, void *el_buf_ptr)
#define REALLOC(oldptr, size)
void asn_set_empty(void *asn_set_of_x)
char * ber_tlv_tag_string(ber_tlv_tag_t tag)
#define ASN_SET_ADD(headptr, ptr)
asn_constr_check_f * memb_constraints
asn_dec_rval_t SET_OF_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)
#define CALLOC(nmemb, size)
static int _ASN_STACK_OVERFLOW_CHECK(asn_codec_ctx_t *ctx)
asn_enc_rval_t SET_OF_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)
#define _ASN_CALLBACK(buf, size)
#define _ASN_ENCODED_OK(rval)
int() asn_constr_check_f(struct asn_TYPE_descriptor_s *type_descriptor, const void *struct_ptr, asn_app_constraint_failed_f *optional_callback, void *optional_app_key)
#define _A_CSET_FROM_VOID(ptr)
asn_constr_check_f * check_constraints
asn_enc_rval_t() der_type_encoder_f(struct asn_TYPE_descriptor_s *type_descriptor, void *struct_ptr, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *consume_bytes_cb, void *app_key)
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 ADVANCE(num_bytes)
#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
void SET_OF_free(asn_TYPE_descriptor_t *td, void *ptr, int contents_only)
int SET_OF_constraint(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key)
int() asn_app_consume_bytes_f(const void *buffer, size_t size, void *application_specific_key)
asn_dec_rval_t SET_OF_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)
#define _ASN_CALLBACK3(buf1, size1, buf2, size2, buf3, size3)
int32_t per_get_few_bits(asn_per_data_t *per_data, int get_nbits)
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
ssize_t uper_get_length(asn_per_data_t *pd, int effective_bound_bits, int *repeat)
enum asn_dec_rval_code_e code
asn_TYPE_descriptor_t * type
#define BER_TAGS_EQUAL(tag1, tag2)
static void ASN_DEBUG(const char *fmt,...)
asn_enc_rval_t SET_OF_encode_der(asn_TYPE_descriptor_t *td, void *ptr, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key)
#define _A_SET_FROM_VOID(ptr)
asn_dec_rval_t SET_OF_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)
asn_per_constraints_t * per_constraints
static int SET_OF_xer_order(const void *aptr, const void *bptr)
enum pxer_chunk_type pxer_chunk_type_e
#define _ASN_DECODE_FAILED