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
This commit is contained in:
@@ -31,11 +31,7 @@
|
|||||||
* SUCH DAMAGE.
|
* SUCH DAMAGE.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifdef HAVE_CONFIG_H
|
#include "der_locl.h"
|
||||||
#include <config.h>
|
|
||||||
#endif
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <err.h>
|
#include <err.h>
|
||||||
#include <roken.h>
|
#include <roken.h>
|
||||||
|
|
||||||
@@ -90,6 +86,83 @@ test_integer (void)
|
|||||||
cmp_integer);
|
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
|
static int
|
||||||
cmp_unsigned (void *a, void *b)
|
cmp_unsigned (void *a, void *b)
|
||||||
{
|
{
|
||||||
@@ -226,6 +299,7 @@ main(int argc, char **argv)
|
|||||||
int ret = 0;
|
int ret = 0;
|
||||||
|
|
||||||
ret += test_integer ();
|
ret += test_integer ();
|
||||||
|
ret += test_integer_more();
|
||||||
ret += test_unsigned ();
|
ret += test_unsigned ();
|
||||||
ret += test_octet_string ();
|
ret += test_octet_string ();
|
||||||
ret += test_general_string ();
|
ret += test_general_string ();
|
||||||
|
Reference in New Issue
Block a user