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:
Johan Danielsson
2003-05-27 21:59:52 +00:00
parent ca77d81243
commit 5ce268bf83
3 changed files with 100 additions and 45 deletions

View File

@@ -90,6 +90,43 @@ test_integer (void)
cmp_integer); cmp_integer);
} }
static int
cmp_unsigned (void *a, void *b)
{
return *(unsigned int*)b - *(unsigned int*)a;
}
static int
test_unsigned (void)
{
struct test_case tests[] = {
{NULL, 3, "\x02\x01\x00"},
{NULL, 3, "\x02\x01\x7f"},
{NULL, 4, "\x02\x02\x00\x80"},
{NULL, 4, "\x02\x02\x01\x00"},
{NULL, 4, "\x02\x02\x02\x00"},
{NULL, 5, "\x02\x03\x00\x80\x00"},
{NULL, 7, "\x02\x05\x00\x80\x00\x00\x00"},
{NULL, 6, "\x02\x04\x7f\xff\xff\xff"}
};
unsigned int values[] = {0, 127, 128, 256, 512, 32768,
0x80000000, 0x7fffffff};
int i;
int ntests = sizeof(tests) / sizeof(*tests);
for (i = 0; i < ntests; ++i) {
tests[i].val = &values[i];
asprintf (&tests[i].name, "unsigned %u", values[i]);
}
return generic_test (tests, ntests, sizeof(int),
(generic_encode)encode_unsigned,
(generic_length) length_unsigned,
(generic_decode)decode_unsigned,
cmp_unsigned);
}
static int static int
cmp_octet_string (void *a, void *b) cmp_octet_string (void *a, void *b)
{ {
@@ -189,6 +226,7 @@ main(int argc, char **argv)
int ret = 0; int ret = 0;
ret += test_integer (); ret += test_integer ();
ret += test_unsigned ();
ret += test_octet_string (); ret += test_octet_string ();
ret += test_general_string (); ret += test_general_string ();
ret += test_generalized_time (); ret += test_generalized_time ();

View File

@@ -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). * (Royal Institute of Technology, Stockholm, Sweden).
* All rights reserved. * All rights reserved.
* *
@@ -106,8 +106,16 @@ length_integer (const int *data)
size_t size_t
length_unsigned (const unsigned *data) length_unsigned (const unsigned *data)
{ {
size_t len = len_unsigned (*data); unsigned val = *data;
size_t len = 0;
while (val > 255) {
++len;
val /= 256;
}
len++;
if (val >= 128)
len++;
return 1 + length_len(len) + len; return 1 + length_len(len) + len;
} }

View File

@@ -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). * (Royal Institute of Technology, Stockholm, Sweden).
* All rights reserved. * All rights reserved.
* *
@@ -264,6 +264,15 @@ encode_unsigned (unsigned char *p, size_t len, const unsigned *data,
p -= l; p -= l;
len -= l; len -= l;
ret += l; ret += l;
/* if first octet has msb set, we need to pad with a zero byte */
if(p[1] >= 128) {
if(len == 0)
return ASN1_OVERFLOW;
*p-- = 0;
len--;
ret++;
l++;
}
e = der_put_length_and_tag (p, len, l, UNIV, PRIM, UT_Integer, &l); e = der_put_length_and_tag (p, len, l, UNIV, PRIM, UT_Integer, &l);
if (e) if (e)
return e; return e;