diff --git a/src/libasn1/oer_decode.c b/src/libasn1/oer_decode.c index 5187e8c..e09023f 100644 --- a/src/libasn1/oer_decode.c +++ b/src/libasn1/oer_decode.c @@ -62,19 +62,19 @@ uint oer_get_length(OER_Stream *oer, uint *value) { if (len & 0x80) { len &= 0x7f; - size += len; while (len--) { val <<= 8; val |= *oer->ptr++; + size++; } } else val = len & 0x7f; - + if (value) *value = val; oer->consumed += (size*8); - return val; + return size; } uint64_t oer_get_value(OER_Stream *oer, uint size) diff --git a/src/libasn1/oer_encode.c b/src/libasn1/oer_encode.c index ff039e7..d0d8fcb 100644 --- a/src/libasn1/oer_encode.c +++ b/src/libasn1/oer_encode.c @@ -57,7 +57,7 @@ uint oer_put_length(OER_Stream *oer, uint value) if (!oer || !oer->ptr) return 0; - int size = 1; + uint size = 1; if (value > 0x7f) { *oer->ptr++ = 0x82; *oer->ptr++ = value >> 8; diff --git a/src/libasn1/oer_get_ext.c b/src/libasn1/oer_get_ext.c index 019737b..f91beb8 100644 --- a/src/libasn1/oer_get_ext.c +++ b/src/libasn1/oer_get_ext.c @@ -78,7 +78,9 @@ uint oer_get_extension(OER_Stream *oer, OER_Extension *ext, uint noptions, uint if (ellipses) { ext->ellipses = (ext->value >> noptions) & 1; - ext->length = oer_get_length(oer, NULL); + uint length; + oer_get_length(oer, &length); + ext->length = length; if (_asn1_debug_on_) printf("\tEXT_LEN = %d\n", ext->length); @@ -100,8 +102,9 @@ uint oer_get_ext_length(OER_Stream *oer, OER_Extension *ext) if (!ext->ellipses) return 0; - uint len; - ext->length = oer_get_length(oer, &len); + uint length; + oer_get_length(oer, &length); + ext->length = length; return ext->length; } diff --git a/src/libasn1/test_asn1_oer b/src/libasn1/test_asn1_oer index db631fa..222a243 100755 Binary files a/src/libasn1/test_asn1_oer and b/src/libasn1/test_asn1_oer differ diff --git a/src/libasn1/test_asn1_oer.c b/src/libasn1/test_asn1_oer.c index 103b549..2180f6f 100644 --- a/src/libasn1/test_asn1_oer.c +++ b/src/libasn1/test_asn1_oer.c @@ -210,6 +210,28 @@ void bitstream_test(void) printf("\tFAILED\n"); } +void length_test(void) +{ + memset(buffer, 0, sizeof(buffer)); + + OER_Stream len_enc, len_dec; + oer_init_stream(&len_enc, buffer, sizeof(buffer)); + oer_init_stream(&len_dec, buffer, sizeof(buffer)); + + printf("Length test:\n"); + int n = oer_put_length(&len_enc, 749); + buffer_print(&len_enc, buffer); + + uint value = 0; + int x = oer_get_length(&len_dec, &value); + printf("\t%d -> %d\n", n, x); + + if (n == x && value == 749) + printf("\tPASSED\n"); + else + printf("\tFAILED\n"); +} + int main(int argc, char **argv) { asn1_set_debug(2); @@ -229,5 +251,8 @@ int main(int argc, char **argv) // bitstream test bitstream_test(); + // length test + length_test(); + return 0; }