From bd157c7efd284af47559e50a518a38be11c3edba Mon Sep 17 00:00:00 2001 From: Assar Westerlund Date: Sat, 13 Feb 1999 16:15:18 +0000 Subject: [PATCH] (length_unsigned): new function (length_int): handle signed integers git-svn-id: svn://svn.h5l.se/heimdal/trunk/heimdal@5349 ec53bebd-3082-4978-b11e-865c3cabbd6b --- lib/asn1/der_length.c | 28 ++++++++++++++++++++++++---- 1 file changed, 24 insertions(+), 4 deletions(-) diff --git a/lib/asn1/der_length.c b/lib/asn1/der_length.c index 1caea77f2..ebe65dbbe 100644 --- a/lib/asn1/der_length.c +++ b/lib/asn1/der_length.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997 Kungliga Tekniska Högskolan + * Copyright (c) 1997, 1998, 1999 Kungliga Tekniska Högskolan * (Royal Institute of Technology, Stockholm, Sweden). * All rights reserved. * @@ -41,7 +41,7 @@ RCSID("$Id$"); static size_t -length_int (unsigned val) +length_unsigned (unsigned val) { size_t ret = 0; @@ -52,17 +52,37 @@ length_int (unsigned val) return ret; } +static size_t +length_int (int val) +{ + size_t ret = 0; + + if (val == 0) + return 1; + while (abs(val) > 255) { + ++ret; + val /= 256; + } + if (abs(val) > 0) { + ++ret; + if ((signed char)val != val) + ++ret; + val /= 256; + } + return ret; +} + size_t length_len (size_t len) { if (len < 128) return 1; else - return length_int (len) + 1; + return length_unsigned (len) + 1; } size_t -length_integer (unsigned *data) +length_integer (int *data) { size_t len = length_int (*data);