Fix encoding of "unsigned" integers. If MSB is set, we need to pad
with a zero byte. git-svn-id: svn://svn.h5l.se/heimdal/trunk/heimdal@12337 ec53bebd-3082-4978-b11e-865c3cabbd6b
This commit is contained in:
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 1997 - 2001 Kungliga Tekniska H<>gskolan
|
||||
* Copyright (c) 1997-2003 Kungliga Tekniska H<>gskolan
|
||||
* (Royal Institute of Technology, Stockholm, Sweden).
|
||||
* All rights reserved.
|
||||
*
|
||||
@@ -38,33 +38,33 @@ RCSID("$Id$");
|
||||
static size_t
|
||||
len_unsigned (unsigned val)
|
||||
{
|
||||
size_t ret = 0;
|
||||
size_t ret = 0;
|
||||
|
||||
do {
|
||||
++ret;
|
||||
val /= 256;
|
||||
} while (val);
|
||||
return ret;
|
||||
do {
|
||||
++ret;
|
||||
val /= 256;
|
||||
} while (val);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static size_t
|
||||
len_int (int val)
|
||||
{
|
||||
size_t ret = 0;
|
||||
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;
|
||||
}
|
||||
return ret;
|
||||
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;
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
static size_t
|
||||
@@ -89,66 +89,74 @@ len_oid (const oid *oid)
|
||||
size_t
|
||||
length_len (size_t len)
|
||||
{
|
||||
if (len < 128)
|
||||
return 1;
|
||||
else
|
||||
return len_unsigned (len) + 1;
|
||||
if (len < 128)
|
||||
return 1;
|
||||
else
|
||||
return len_unsigned (len) + 1;
|
||||
}
|
||||
|
||||
size_t
|
||||
length_integer (const int *data)
|
||||
{
|
||||
size_t len = len_int (*data);
|
||||
size_t len = len_int (*data);
|
||||
|
||||
return 1 + length_len(len) + len;
|
||||
return 1 + length_len(len) + len;
|
||||
}
|
||||
|
||||
size_t
|
||||
length_unsigned (const unsigned *data)
|
||||
{
|
||||
size_t len = len_unsigned (*data);
|
||||
|
||||
return 1 + length_len(len) + len;
|
||||
unsigned val = *data;
|
||||
size_t len = 0;
|
||||
|
||||
while (val > 255) {
|
||||
++len;
|
||||
val /= 256;
|
||||
}
|
||||
len++;
|
||||
if (val >= 128)
|
||||
len++;
|
||||
return 1 + length_len(len) + len;
|
||||
}
|
||||
|
||||
size_t
|
||||
length_enumerated (const unsigned *data)
|
||||
{
|
||||
size_t len = len_int (*data);
|
||||
size_t len = len_int (*data);
|
||||
|
||||
return 1 + length_len(len) + len;
|
||||
return 1 + length_len(len) + len;
|
||||
}
|
||||
|
||||
size_t
|
||||
length_general_string (const general_string *data)
|
||||
{
|
||||
char *str = *data;
|
||||
size_t len = strlen(str);
|
||||
return 1 + length_len(len) + len;
|
||||
char *str = *data;
|
||||
size_t len = strlen(str);
|
||||
return 1 + length_len(len) + len;
|
||||
}
|
||||
|
||||
size_t
|
||||
length_octet_string (const octet_string *k)
|
||||
{
|
||||
return 1 + length_len(k->length) + k->length;
|
||||
return 1 + length_len(k->length) + k->length;
|
||||
}
|
||||
|
||||
size_t
|
||||
length_oid (const oid *k)
|
||||
{
|
||||
size_t len = len_oid (k);
|
||||
size_t len = len_oid (k);
|
||||
|
||||
return 1 + length_len(len) + len;
|
||||
return 1 + length_len(len) + len;
|
||||
}
|
||||
|
||||
size_t
|
||||
length_generalized_time (const time_t *t)
|
||||
{
|
||||
octet_string k;
|
||||
size_t ret;
|
||||
octet_string k;
|
||||
size_t ret;
|
||||
|
||||
time2generalizedtime (*t, &k);
|
||||
ret = 1 + length_len(k.length) + k.length;
|
||||
free (k.data);
|
||||
return ret;
|
||||
time2generalizedtime (*t, &k);
|
||||
ret = 1 + length_len(k.length) + k.length;
|
||||
free (k.data);
|
||||
return ret;
|
||||
}
|
||||
|
Reference in New Issue
Block a user