(der_put_unsigned): new function
(der_put_int): handle signed integers git-svn-id: svn://svn.h5l.se/heimdal/trunk/heimdal@5348 ec53bebd-3082-4978-b11e-865c3cabbd6b
This commit is contained in:
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 1997 Kungliga Tekniska H<>gskolan
|
* Copyright (c) 1997, 1998, 1999 Kungliga Tekniska H<>gskolan
|
||||||
* (Royal Institute of Technology, Stockholm, Sweden).
|
* (Royal Institute of Technology, Stockholm, Sweden).
|
||||||
* All rights reserved.
|
* All rights reserved.
|
||||||
*
|
*
|
||||||
@@ -47,8 +47,8 @@ RCSID("$Id$");
|
|||||||
* indicating how many actually got written, or <0 in case of errors.
|
* indicating how many actually got written, or <0 in case of errors.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
int
|
static int
|
||||||
der_put_int (unsigned char *p, size_t len, unsigned val, size_t *size)
|
der_put_unsigned (unsigned char *p, size_t len, unsigned val, size_t *size)
|
||||||
{
|
{
|
||||||
unsigned char *base = p;
|
unsigned char *base = p;
|
||||||
|
|
||||||
@@ -58,7 +58,7 @@ der_put_int (unsigned char *p, size_t len, unsigned val, size_t *size)
|
|||||||
val /= 256;
|
val /= 256;
|
||||||
--len;
|
--len;
|
||||||
}
|
}
|
||||||
if (val)
|
if (val != 0)
|
||||||
return ASN1_OVERFLOW;
|
return ASN1_OVERFLOW;
|
||||||
else {
|
else {
|
||||||
*size = base - p;
|
*size = base - p;
|
||||||
@@ -67,7 +67,44 @@ der_put_int (unsigned char *p, size_t len, unsigned val, size_t *size)
|
|||||||
} else if (len < 1)
|
} else if (len < 1)
|
||||||
return ASN1_OVERFLOW;
|
return ASN1_OVERFLOW;
|
||||||
else {
|
else {
|
||||||
*p = 0;
|
*p = 0;
|
||||||
|
*size = 1;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
der_put_int (unsigned char *p, size_t len, int val, size_t *size)
|
||||||
|
{
|
||||||
|
unsigned char *base = p;
|
||||||
|
|
||||||
|
if (val) {
|
||||||
|
while (len > 0 && abs(val) > 255) {
|
||||||
|
*p-- = val % 256;
|
||||||
|
val /= 256;
|
||||||
|
--len;
|
||||||
|
}
|
||||||
|
if (len > 0 && abs(val) > 0) {
|
||||||
|
*p-- = val;
|
||||||
|
--len;
|
||||||
|
if ((signed char)val != val) {
|
||||||
|
if (len < 1)
|
||||||
|
return ASN1_OVERFLOW;
|
||||||
|
*p-- = (val < 0) ? 0xff: 0;
|
||||||
|
--len;
|
||||||
|
}
|
||||||
|
val /= 256;
|
||||||
|
}
|
||||||
|
if (val != 0)
|
||||||
|
return ASN1_OVERFLOW;
|
||||||
|
else {
|
||||||
|
*size = base - p;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
} else if (len < 1)
|
||||||
|
return ASN1_OVERFLOW;
|
||||||
|
else {
|
||||||
|
*p = 0;
|
||||||
*size = 1;
|
*size = 1;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@@ -88,7 +125,7 @@ der_put_length (unsigned char *p, size_t len, size_t val, size_t *size)
|
|||||||
size_t l;
|
size_t l;
|
||||||
int e;
|
int e;
|
||||||
|
|
||||||
e = der_put_int (p, len - 1, val, &l);
|
e = der_put_unsigned (p, len - 1, val, &l);
|
||||||
if (e)
|
if (e)
|
||||||
return e;
|
return e;
|
||||||
p -= l;
|
p -= l;
|
||||||
@@ -173,9 +210,9 @@ der_put_length_and_tag (unsigned char *p, size_t len, size_t len_val,
|
|||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
encode_integer (unsigned char *p, size_t len, unsigned *data, size_t *size)
|
encode_integer (unsigned char *p, size_t len, int *data, size_t *size)
|
||||||
{
|
{
|
||||||
unsigned num = *data;
|
int num = *data;
|
||||||
size_t ret = 0;
|
size_t ret = 0;
|
||||||
size_t l;
|
size_t l;
|
||||||
int e;
|
int e;
|
||||||
|
Reference in New Issue
Block a user