Commit c4676a80 authored by Lev Walkin's avatar Lev Walkin

der_encode_to_buffer()

parent b54577ae
...@@ -15,6 +15,7 @@ ...@@ -15,6 +15,7 @@
* ber_dec_rval_t renamed into asn_dec_rval_t: more generality. * ber_dec_rval_t renamed into asn_dec_rval_t: more generality.
* Removed order dependency in DEFAULT references to ENUMERATED * Removed order dependency in DEFAULT references to ENUMERATED
identifiers (./tests/68-*-OK.asn1). identifiers (./tests/68-*-OK.asn1).
* Implemented der_encode_to_buffer() procedure.
0.9.7.1: 2004-Oct-12 0.9.7.1: 2004-Oct-12
......
...@@ -28,6 +28,50 @@ der_encode(asn_TYPE_descriptor_t *type_descriptor, void *struct_ptr, ...@@ -28,6 +28,50 @@ der_encode(asn_TYPE_descriptor_t *type_descriptor, void *struct_ptr,
consume_bytes, app_key); consume_bytes, app_key);
} }
/*
* Argument type and callback necessary for der_encode_to_buffer().
*/
typedef struct enc_to_buf_arg {
void *buffer;
size_t left;
} enc_to_buf_arg;
static int encode_to_buffer_cb(const void *buffer, size_t size, void *key) {
enc_to_buf_arg *arg = key;
if(arg->left < size)
return -1; /* Data exceeds the available buffer size */
memcpy(arg->buffer, buffer, size);
arg->buffer = ((char *)arg->buffer) + size;
arg->left -= size;
return 0;
}
/*
* A variant of the der_encode() which encodes the data into the provided buffer
*/
asn_enc_rval_t
der_encode_to_buffer(asn_TYPE_descriptor_t *type_descriptor, void *struct_ptr,
void *buffer, size_t *buffer_size) {
enc_to_buf_arg arg;
asn_enc_rval_t ec;
arg.buffer = buffer;
arg.left = *buffer_size;
ec = type_descriptor->der_encoder(type_descriptor,
struct_ptr, /* Pointer to the destination structure */
0, 0, encode_to_buffer_cb, &arg);
if(ec.encoded != -1) {
assert(ec.encoded == (*buffer_size - arg.left));
/* Return the encoded contents size */
*buffer_size = ec.encoded;
}
return ec;
}
/* /*
* Write out leading TL[v] sequence according to the type definition. * Write out leading TL[v] sequence according to the type definition.
*/ */
......
...@@ -18,6 +18,14 @@ asn_enc_rval_t der_encode(struct asn_TYPE_descriptor_s *type_descriptor, ...@@ -18,6 +18,14 @@ asn_enc_rval_t der_encode(struct asn_TYPE_descriptor_s *type_descriptor,
void *app_key /* Arbitrary callback argument */ void *app_key /* Arbitrary callback argument */
); );
/* A variant of der_encode() which encodes data into the pre-allocated buffer */
asn_enc_rval_t der_encode_to_buffer(
struct asn_TYPE_descriptor_s *type_descriptor,
void *struct_ptr, /* Structure to be encoded */
void *buffer, /* Pre-allocated buffer */
size_t *buffer_size /* Initial buffer size (max) */
);
/* /*
* Type of the generic DER encoder. * Type of the generic DER encoder.
*/ */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment