From 387710cab1e2fbea7ba99a07f4c67af5749929ef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Love=20H=C3=B6rnquist=20=C3=85strand?= Date: Sat, 7 Feb 2004 14:30:07 +0000 Subject: [PATCH] test for "der_length.c: Fix len_unsigned for certain negative integers, it got the length wrong" , from Panasas, Inc. git-svn-id: svn://svn.h5l.se/heimdal/trunk/heimdal@13317 ec53bebd-3082-4978-b11e-865c3cabbd6b --- lib/asn1/check-der.c | 84 +++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 79 insertions(+), 5 deletions(-) diff --git a/lib/asn1/check-der.c b/lib/asn1/check-der.c index 291f7ecf7..6808fd7f4 100644 --- a/lib/asn1/check-der.c +++ b/lib/asn1/check-der.c @@ -31,11 +31,7 @@ * SUCH DAMAGE. */ -#ifdef HAVE_CONFIG_H -#include -#endif -#include -#include +#include "der_locl.h" #include #include @@ -90,6 +86,83 @@ test_integer (void) cmp_integer); } +static int +test_one_int(int val) +{ + int len, ret, len_len, dval; + unsigned char *buf; + + len = _heim_len_int(val); + + buf = emalloc(len + 2); + + buf[0] = '\xff'; + buf[len + 1] = '\xff'; + memset(buf + 1, 0, len); + + ret = der_put_int(buf + 1 + len - 1, len, val, &len_len); + if (ret) { + printf("integer %d encode failed %d\n", val, ret); + return 1; + } + if (len != len_len) { + printf("integer %d encode fail with %d len %d, result len %d\n", + val, ret, len, len_len); + return 1; + } + + ret = der_get_int(buf + 1, len, &dval, &len_len); + if (ret) { + printf("integer %d decode failed %d\n", val, ret); + return 1; + } + if (len != len_len) { + printf("integer %d decoded diffrent len %d != %d", + val, len, len_len); + return 1; + } + if (val != dval) { + printf("decode decoded to diffrent value %d != %d", + val, dval); + return 1; + } + + if (buf[0] != (unsigned char)'\xff') { + printf("precanary dead %d\n", val); + return 1; + } + if (buf[len + 1] != (unsigned char)'\xff') { + printf("postecanary dead %d\n", val); + return 1; + } + free(buf); + return 0; +} + +static int +test_integer_more (void) +{ + int i, n1, n2, n3, n4, n5, n6; + + n2 = 0; + for (i = 0; i < (sizeof(int) * 8); i++) { + n1 = 0x01 << i; + n2 = n2 | n1; + n3 = ~n1; + n4 = ~n2; + n5 = (-1) & ~(0x3f << i); + n6 = (-1) & ~(0x7f << i); + + test_one_int(n1); + test_one_int(n2); + test_one_int(n3); + test_one_int(n4); + test_one_int(n5); + test_one_int(n6); + } + return 0; +} + static int cmp_unsigned (void *a, void *b) { @@ -226,6 +299,7 @@ main(int argc, char **argv) int ret = 0; ret += test_integer (); + ret += test_integer_more(); ret += test_unsigned (); ret += test_octet_string (); ret += test_general_string ();