From 72bdbe17e375fc418e733d24ccfe26a28a6b4328 Mon Sep 17 00:00:00 2001 From: Neal Probert Date: Sat, 6 Feb 2021 10:18:39 -0500 Subject: [PATCH] Fixed OER length encoding --- src/libasn1/oer_decode.c | 28 +++++++++++++++------------- src/libasn1/oer_encode.c | 13 ++++++++----- 2 files changed, 23 insertions(+), 18 deletions(-) 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; }