Skip to content

Commit

Permalink
Add support for BIT STRING in uper c (#150)
Browse files Browse the repository at this point in the history
* Add support for BIT STRING in uper c

* Add test for BIT STRING

* Fixed OER code generator for bit string types

Co-authored-by: Florian Fetz <florian.fetz@googlemail.com>
  • Loading branch information
mstmob and Futsch1 committed May 5, 2022
1 parent 9552e0b commit 05a0d47
Show file tree
Hide file tree
Showing 9 changed files with 271 additions and 7 deletions.
2 changes: 2 additions & 0 deletions asn1tools/source/c/oer.py
Original file line number Diff line number Diff line change
Expand Up @@ -1077,6 +1077,8 @@ def generate_definition_inner_process(self, type_, checker):
return self.format_choice_inner(type_, checker)
elif isinstance(type_, oer.OctetString):
return self.format_octet_string_inner(checker)
elif isinstance(type_, oer.BitString):
return self.format_bit_string_inner(checker)
elif isinstance(type_, oer.Enumerated):
return self.format_enumerated_inner(type_)
elif isinstance(type_, oer.Null):
Expand Down
5 changes: 5 additions & 0 deletions asn1tools/source/c/uper.py
Original file line number Diff line number Diff line change
Expand Up @@ -90,6 +90,9 @@ def generate_type_declaration_process(self, type_, checker):
elif isinstance(type_, uper.OctetString):
lines = self.format_octet_string(checker)[1:-1]
lines = dedent_lines(lines)
elif isinstance(type_, uper.BitString):
lines = self.format_bit_string(type_, checker)
lines[0] += ' value;'
elif isinstance(type_, uper.Null):
lines = []
else:
Expand All @@ -113,6 +116,8 @@ def generate_definition_inner_process(self, type_, checker):
return self.format_choice_inner(type_, checker)
elif isinstance(type_, uper.OctetString):
return self.format_octet_string_inner(type_, checker)
elif isinstance(type_, uper.BitString):
return self.format_bit_string_inner(type_)
elif isinstance(type_, uper.Enumerated):
return self.format_enumerated_inner(type_)
elif isinstance(type_, uper.Null):
Expand Down
4 changes: 3 additions & 1 deletion tests/files/c_source/c_source.asn
Original file line number Diff line number Diff line change
Expand Up @@ -526,4 +526,6 @@ REFERENCED-ENUM ::= ENUMERATED {

REFERENCED-INT ::= INTEGER (0..255)

END
AT ::= BIT STRING (SIZE(2))

END
42 changes: 41 additions & 1 deletion tests/files/c_source/oer.c
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@
*/

/**
* This file was generated by asn1tools version 0.160.0 Wed Dec 1 15:17:38 2021.
* This file was generated by asn1tools version 0.162.0 Thu May 5 20:47:02 2022.
*/

#include <string.h>
Expand Down Expand Up @@ -4863,6 +4863,20 @@ static void oer_c_source_as_decode_inner(
}
}

static void oer_c_ref_at_encode_inner(
struct encoder_t *encoder_p,
const struct oer_c_ref_at_t *src_p)
{
encoder_append_uint(encoder_p, (uint32_t)src_p->value, 1);
}

static void oer_c_ref_at_decode_inner(
struct decoder_t *decoder_p,
struct oer_c_ref_at_t *dst_p)
{
dst_p->value = (uint8_t)decoder_read_uint(decoder_p, 1);
}

static void oer_c_source_b_encode_inner(
struct encoder_t *encoder_p,
const struct oer_c_source_b_t *src_p)
Expand Down Expand Up @@ -6345,6 +6359,32 @@ ssize_t oer_c_source_as_decode(
return (decoder_get_result(&decoder));
}

ssize_t oer_c_ref_at_encode(
uint8_t *dst_p,
size_t size,
const struct oer_c_ref_at_t *src_p)
{
struct encoder_t encoder;

encoder_init(&encoder, dst_p, size);
oer_c_ref_at_encode_inner(&encoder, src_p);

return (encoder_get_result(&encoder));
}

ssize_t oer_c_ref_at_decode(
struct oer_c_ref_at_t *dst_p,
const uint8_t *src_p,
size_t size)
{
struct decoder_t decoder;

decoder_init(&decoder, src_p, size);
oer_c_ref_at_decode_inner(&decoder, dst_p);

return (decoder_get_result(&decoder));
}

ssize_t oer_c_source_b_encode(
uint8_t *dst_p,
size_t size,
Expand Down
37 changes: 36 additions & 1 deletion tests/files/c_source/oer.h
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@
*/

/**
* This file was generated by asn1tools version 0.160.0 Wed Dec 1 15:17:38 2021.
* This file was generated by asn1tools version 0.162.0 Thu May 5 07:21:29 2022.
*/

#ifndef OER_H
Expand Down Expand Up @@ -939,6 +939,13 @@ struct oer_c_source_as_t {
bool a_c;
};

/**
* Type AT in module CRef.
*/
struct oer_c_ref_at_t {
uint8_t value;
};

/**
* Type B in module CSource.
*/
Expand Down Expand Up @@ -1889,6 +1896,34 @@ ssize_t oer_c_source_as_decode(
const uint8_t *src_p,
size_t size);

/**
* Encode type AT defined in module CRef.
*
* @param[out] dst_p Buffer to encode into.
* @param[in] size Size of dst_p.
* @param[in] src_p Data to encode.
*
* @return Encoded data length or negative error code.
*/
ssize_t oer_c_ref_at_encode(
uint8_t *dst_p,
size_t size,
const struct oer_c_ref_at_t *src_p);

/**
* Decode type AT defined in module CRef.
*
* @param[out] dst_p Decoded data.
* @param[in] src_p Data to decode.
* @param[in] size Size of src_p.
*
* @return Number of bytes decoded or negative error code.
*/
ssize_t oer_c_ref_at_decode(
struct oer_c_ref_at_t *dst_p,
const uint8_t *src_p,
size_t size);

/**
* Encode type B defined in module CSource.
*
Expand Down
52 changes: 51 additions & 1 deletion tests/files/c_source/oer_fuzzer.c
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@
*/

/**
* This file was generated by asn1tools version 0.160.0 Wed Dec 1 15:19:31 2021.
* This file was generated by asn1tools version 0.162.0 Thu May 5 07:13:05 2022.
*/

#include <stdint.h>
Expand Down Expand Up @@ -89,6 +89,55 @@ static void assert_second_encode_data(const uint8_t *encoded_p,
}


static void test_oer_c_ref_at(
const uint8_t *encoded_p,
size_t size)
{
ssize_t res;
ssize_t res2;
ssize_t i;
uint8_t encoded[size];
uint8_t encoded2[size];
struct oer_c_ref_at_t decoded;
struct oer_c_ref_at_t decoded2;

memset(&decoded, 0, sizeof(decoded));

res = oer_c_ref_at_decode(
&decoded,
encoded_p,
size);

if (res >= 0) {
res = oer_c_ref_at_encode(
&encoded[0],
sizeof(encoded),
&decoded);

assert_first_encode(res);

memset(&decoded2, 0, sizeof(decoded2));

res2 = oer_c_ref_at_decode(
&decoded2,
&encoded[0],
res);

assert_second_decode(res2);
assert_second_decode_data(&decoded,
&decoded2,
sizeof(decoded));

res2 = oer_c_ref_at_encode(
&encoded2[0],
sizeof(encoded2),
&decoded);

assert_second_encode(res, res2);
assert_second_encode_data(&encoded[0], &encoded2[0], res);
}
}

static void test_oer_c_ref_referenced_enum(
const uint8_t *encoded_p,
size_t size)
Expand Down Expand Up @@ -2933,6 +2982,7 @@ static void test_oer_programming_types_uint8(

int LLVMFuzzerTestOneInput(const uint8_t *data_p, size_t size)
{
test_oer_c_ref_at(data_p, size);
test_oer_c_ref_referenced_enum(data_p, size);
test_oer_c_ref_referenced_int(data_p, size);
test_oer_c_ref_referenced_sequence(data_p, size);
Expand Down
47 changes: 46 additions & 1 deletion tests/files/c_source/uper.c
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@
*/

/**
* This file was generated by asn1tools version 0.160.0 Wed Dec 1 15:17:39 2021.
* This file was generated by asn1tools version 0.162.0 Thu May 5 07:13:05 2022.
*/

#include <string.h>
Expand Down Expand Up @@ -3952,6 +3952,25 @@ static void uper_c_source_as_decode_inner(
}
}

static void uper_c_ref_at_encode_inner(
struct encoder_t *encoder_p,
const struct uper_c_ref_at_t *src_p)
{
encoder_append_non_negative_binary_integer(
encoder_p,
(uint64_t)(src_p->value),
2);
}

static void uper_c_ref_at_decode_inner(
struct decoder_t *decoder_p,
struct uper_c_ref_at_t *dst_p)
{
dst_p->value = decoder_read_non_negative_binary_integer(
decoder_p,
2);
}

static void uper_c_source_b_encode_inner(
struct encoder_t *encoder_p,
const struct uper_c_source_b_t *src_p)
Expand Down Expand Up @@ -5233,6 +5252,32 @@ ssize_t uper_c_source_as_decode(
return (decoder_get_result(&decoder));
}

ssize_t uper_c_ref_at_encode(
uint8_t *dst_p,
size_t size,
const struct uper_c_ref_at_t *src_p)
{
struct encoder_t encoder;

encoder_init(&encoder, dst_p, size);
uper_c_ref_at_encode_inner(&encoder, src_p);

return (encoder_get_result(&encoder));
}

ssize_t uper_c_ref_at_decode(
struct uper_c_ref_at_t *dst_p,
const uint8_t *src_p,
size_t size)
{
struct decoder_t decoder;

decoder_init(&decoder, src_p, size);
uper_c_ref_at_decode_inner(&decoder, dst_p);

return (decoder_get_result(&decoder));
}

ssize_t uper_c_source_b_encode(
uint8_t *dst_p,
size_t size,
Expand Down
37 changes: 36 additions & 1 deletion tests/files/c_source/uper.h
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@
*/

/**
* This file was generated by asn1tools version 0.160.0 Wed Dec 1 15:17:39 2021.
* This file was generated by asn1tools version 0.162.0 Thu May 5 07:21:30 2022.
*/

#ifndef UPER_H
Expand Down Expand Up @@ -938,6 +938,13 @@ struct uper_c_source_as_t {
bool a_c;
};

/**
* Type AT in module CRef.
*/
struct uper_c_ref_at_t {
uint8_t value;
};

/**
* Type B in module CSource.
*/
Expand Down Expand Up @@ -1811,6 +1818,34 @@ ssize_t uper_c_source_as_decode(
const uint8_t *src_p,
size_t size);

/**
* Encode type AT defined in module CRef.
*
* @param[out] dst_p Buffer to encode into.
* @param[in] size Size of dst_p.
* @param[in] src_p Data to encode.
*
* @return Encoded data length or negative error code.
*/
ssize_t uper_c_ref_at_encode(
uint8_t *dst_p,
size_t size,
const struct uper_c_ref_at_t *src_p);

/**
* Decode type AT defined in module CRef.
*
* @param[out] dst_p Decoded data.
* @param[in] src_p Data to decode.
* @param[in] size Size of src_p.
*
* @return Number of bytes decoded or negative error code.
*/
ssize_t uper_c_ref_at_decode(
struct uper_c_ref_at_t *dst_p,
const uint8_t *src_p,
size_t size);

/**
* Encode type B defined in module CSource.
*
Expand Down
Loading

0 comments on commit 05a0d47

Please sign in to comment.