19 type_descriptor->
name);
24 return type_descriptor->
der_encoder(type_descriptor,
27 consume_bytes, app_key);
43 memcpy(arg->
buffer, buffer, size);
55 void *buffer,
size_t buffer_size) {
60 arg.
left = buffer_size;
66 assert(ec.
encoded == (ssize_t)(buffer_size - arg.
left));
79 int tag_mode,
int last_tag_form,
85 size_t overall_length;
89 ASN_DEBUG(
"Writing tags (%s, tm=%d, tc=%d, tag=%s, mtc=%d)",
115 stag_offset = -1 + ((tag_mode == -1) && sd->
tags_count);
116 for(i = 1; i < tags_count; i++)
117 tags[i] = sd->
tags[i + stag_offset];
127 lens = (ssize_t *)alloca(tags_count *
sizeof(lens[0]));
137 overall_length = struct_length;
138 for(i = tags_count - 1; i >= 0; --i) {
139 lens[i] =
der_write_TL(tags[i], overall_length, 0, 0, 0);
140 if(lens[i] == -1)
return -1;
141 overall_length += lens[i];
142 lens[i] = overall_length - lens[i];
145 if(!cb)
return overall_length - struct_length;
147 ASN_DEBUG(
"%s %s TL sequence (%d elements)",
148 cb?
"Encoding":
"Estimating", sd->
name, tags_count);
153 for(i = 0; i < tags_count; i++) {
158 _constr = (last_tag_form || i < (tags_count - 1));
160 len =
der_write_TL(tags[i], lens[i], cb, app_key, _constr);
161 if(len == -1)
return -1;
164 return overall_length - struct_length;
173 int buf_size = cb?
sizeof(buf):0;
178 if(tmp == -1 || tmp > (ssize_t)
sizeof(buf))
return -1;
183 if(tmp == -1)
return -1;
186 if(size >
sizeof(buf))
193 if(constructed) *buf |= 0x20;
194 if(cb(buf, size, app_key) < 0)
static ssize_t der_write_TL(ber_tlv_tag_t tag, ber_tlv_len_t len, asn_app_consume_bytes_f *cb, void *app_key, int constructed)
size_t der_tlv_length_serialize(ber_tlv_len_t len, void *bufptr, size_t size)
char * ber_tlv_tag_string(ber_tlv_tag_t tag)
asn_enc_rval_t der_encode_to_buffer(asn_TYPE_descriptor_t *type_descriptor, void *struct_ptr, void *buffer, size_t buffer_size)
ssize_t der_write_tags(asn_TYPE_descriptor_t *sd, size_t struct_length, int tag_mode, int last_tag_form, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key)
static int encode_to_buffer_cb(const void *buffer, size_t size, void *key)
asn_enc_rval_t der_encode(asn_TYPE_descriptor_t *type_descriptor, void *struct_ptr, asn_app_consume_bytes_f *consume_bytes, void *app_key)
int() asn_app_consume_bytes_f(const void *buffer, size_t size, void *application_specific_key)
der_type_encoder_f * der_encoder
struct enc_to_buf_arg enc_to_buf_arg
static void ASN_DEBUG(const char *fmt,...)
size_t ber_tlv_tag_serialize(ber_tlv_tag_t tag, void *bufptr, size_t size)