From 044e371dae4cc6802017509980b2a10c1804259b Mon Sep 17 00:00:00 2001 From: Johan Danielsson Date: Thu, 25 Feb 1999 10:05:20 +0000 Subject: [PATCH] fix der_put_int git-svn-id: svn://svn.h5l.se/heimdal/trunk/heimdal@5419 ec53bebd-3082-4978-b11e-865c3cabbd6b --- lib/asn1/der_put.c | 51 ++++++++++++++++++++++++---------------------- 1 file changed, 27 insertions(+), 24 deletions(-) diff --git a/lib/asn1/der_put.c b/lib/asn1/der_put.c index c3dbab222..4ad5a9e96 100644 --- a/lib/asn1/der_put.c +++ b/lib/asn1/der_put.c @@ -78,38 +78,41 @@ 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) { + if(val >= 0) { + do { + if(len < 1) + return ASN1_OVERFLOW; *p-- = val % 256; + len--; val /= 256; - --len; + } while(val); + if(p[1] >= 128) { + if(len < 1) + return ASN1_OVERFLOW; + *p-- = 0; + 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; - } + } else { + val = ~val; + do { + if(len < 1) + return ASN1_OVERFLOW; + *p-- = ~(val % 256); + len--; val /= 256; + } while(val); + if(p[1] < 128) { + if(len < 1) + return ASN1_OVERFLOW; + *p++ = 0xff; + len--; } - if (val != 0) - return ASN1_OVERFLOW; - else { - *size = base - p; - return 0; - } - } else if (len < 1) - return ASN1_OVERFLOW; - else { - *p = 0; - *size = 1; - return 0; } + *size = base - p; + return 0; } + int der_put_length (unsigned char *p, size_t len, size_t val, size_t *size) {