diff --git a/lib/asn1/der_length.c b/lib/asn1/der_length.c index 88d652786..1166a7984 100644 --- a/lib/asn1/der_length.c +++ b/lib/asn1/der_length.c @@ -35,8 +35,8 @@ RCSID("$Id$"); -static size_t -len_unsigned (unsigned val) +size_t +_heim_len_unsigned (unsigned val) { size_t ret = 0; @@ -47,22 +47,29 @@ len_unsigned (unsigned val) return ret; } -static size_t -len_int (int val) +size_t +_heim_len_int (int val) { + unsigned char q; size_t ret = 0; - if (val == 0) - return 1; - while (val > 255 || val < -255) { - ++ret; - val /= 256; - } - if (val != 0) { - ++ret; - if ((signed char)val != val) - ++ret; - val /= 256; + if (val >= 0) { + do { + q = val % 256; + ret++; + val /= 256; + } while(val); + if(q >= 128) + ret++; + } else { + val = ~val; + do { + q = ~(val % 256); + ret++; + val /= 256; + } while(val); + if(q < 128) + ret++; } return ret; } @@ -92,7 +99,7 @@ length_len (size_t len) if (len < 128) return 1; else - return len_unsigned (len) + 1; + return _heim_len_unsigned (len) + 1; } size_t @@ -104,7 +111,7 @@ length_boolean (const int *data) size_t length_integer (const int *data) { - size_t len = len_int (*data); + size_t len = _heim_len_int (*data); return 1 + length_len(len) + len; } @@ -128,7 +135,7 @@ length_unsigned (const unsigned *data) size_t length_enumerated (const unsigned *data) { - size_t len = len_int (*data); + size_t len = _heim_len_int (*data); return 1 + length_len(len) + len; }