diff --git a/src/libasn1/oer_decode.c b/src/libasn1/oer_decode.c index af0da2d..5187e8c 100644 --- a/src/libasn1/oer_decode.c +++ b/src/libasn1/oer_decode.c @@ -56,22 +56,24 @@ uint oer_get_length(OER_Stream *oer, uint *value) { if (!oer) return 0; - int len = *oer->ptr++; - int val = len & 0x7f; - int size = 1; - - // if length > 127 - if (len & 0x80) { - // slurp - val <<= 8; - val |= *oer->ptr++; - size = 2; - } + uint len = *oer->ptr++; + uint size = 1; + uint val = 0; + if (len & 0x80) { + len &= 0x7f; + size += len; + while (len--) { + val <<= 8; + val |= *oer->ptr++; + } + } + else + val = len & 0x7f; + if (value) *value = val; - size *= 8; - oer->consumed += size; + oer->consumed += (size*8); return val; } diff --git a/src/libasn1/oer_encode.c b/src/libasn1/oer_encode.c index af65b45..ff039e7 100644 --- a/src/libasn1/oer_encode.c +++ b/src/libasn1/oer_encode.c @@ -57,14 +57,17 @@ uint oer_put_length(OER_Stream *oer, uint value) if (!oer || !oer->ptr) return 0; - int size = 8; + int size = 1; if (value > 0x7f) { - *oer->ptr++ = (value >> 8) | 0x80; - size = 16; + *oer->ptr++ = 0x82; + *oer->ptr++ = value >> 8; + *oer->ptr++ = value; + size += 2; } - *oer->ptr++ = value & 0xff; + else + *oer->ptr++ = value & 0x7f; - oer->consumed += size; + oer->consumed += (size*8); return size; }