(der_get_heim_integer): handle negative integers.

git-svn-id: svn://svn.h5l.se/heimdal/trunk/heimdal@16635 ec53bebd-3082-4978-b11e-865c3cabbd6b
This commit is contained in:
Love Hörnquist Åstrand
2006-01-20 10:03:50 +00:00
parent 483d00b945
commit b8c2cec844

View File

@@ -241,14 +241,13 @@ der_get_heim_integer (const unsigned char *p, size_t len,
return 0;
}
if (p[0] & 0x80) {
unsigned char *q;
int carry = 1;
data->negative = 1;
return ASN1_OVERRUN;
} else {
data->negative = 0;
data->length = len;
if (p[0] == 0 && data->length != 1) {
if (p[0] == 0xff) {
p++;
data->length--;
}
@@ -257,6 +256,28 @@ der_get_heim_integer (const unsigned char *p, size_t len,
data->length = 0;
return ENOMEM;
}
q = &((unsigned char*)data->data)[data->length - 1];
p += data->length - 1;
while (q >= (unsigned char*)data->data) {
*q = *p ^ 0xff;
if (carry)
carry = !++*q;
p--;
q--;
}
} else {
data->negative = 0;
data->length = len;
if (p[0] == 0) {
p++;
data->length--;
}
data->data = malloc(data->length);
if (data->data == NULL && data->length != 0) {
data->length = 0;
return ENOMEM;
}
memcpy(data->data, p, data->length);
}
if (size)