From a96b2640505ec63079d7e048acfadbd8cd3c422a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Love=20H=C3=B6rnquist=20=C3=85strand?= Date: Sat, 7 Feb 2004 14:27:59 +0000 Subject: [PATCH] Fix len_unsigned for certain negative integers, it got the length wrong, fix from Panasas, Inc. rename len_int and len_unsigned to _heim_\& git-svn-id: svn://svn.h5l.se/heimdal/trunk/heimdal@13316 ec53bebd-3082-4978-b11e-865c3cabbd6b --- lib/asn1/der_length.c | 43 +++++++++++++++++++++++++------------------ 1 file changed, 25 insertions(+), 18 deletions(-) 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; }