From 01959cb37644f2413a82c9cb0ceacb4d88b733f5 Mon Sep 17 00:00:00 2001 From: Assar Westerlund Date: Mon, 20 Sep 1999 22:37:43 +0000 Subject: [PATCH] make functions more consistent git-svn-id: svn://svn.h5l.se/heimdal/trunk/heimdal@6994 ec53bebd-3082-4978-b11e-865c3cabbd6b --- lib/asn1/der_get.c | 67 +++++++++++++++++++++++++++------------------- lib/asn1/der_put.c | 27 ++++++++++--------- 2 files changed, 53 insertions(+), 41 deletions(-) diff --git a/lib/asn1/der_get.c b/lib/asn1/der_get.c index 77d060cec..702fa6c2b 100644 --- a/lib/asn1/der_get.c +++ b/lib/asn1/der_get.c @@ -115,23 +115,15 @@ int der_get_general_string (unsigned char *p, size_t len, general_string *str, size_t *size) { - size_t l, slen; char *s; - int e; - e = der_get_length (p, len, &slen, &l); - if (e) return e; - p += l; - len -= l; - if (len < slen) - return ASN1_OVERRUN; - s = malloc (slen + 1); + s = malloc (len + 1); if (s == NULL) return ENOMEM; - memcpy (s, p, slen); - s[slen] = '\0'; + memcpy (s, p, len); + s[len] = '\0'; *str = s; - if(size) *size = slen + l; + if(size) *size = len; return 0; } @@ -139,21 +131,12 @@ int der_get_octet_string (unsigned char *p, size_t len, octet_string *data, size_t *size) { - size_t l, slen; - int e; - - e = der_get_length (p, len, &slen, &l); - if (e) return e; - p += l; - len -= l; - if (len < slen) - return ASN1_OVERRUN; - data->length = slen; - data->data = malloc(slen); + data->length = len; + data->data = malloc(len); if (data->data == NULL && data->length != 0) return ENOMEM; - memcpy (data->data, p, slen); - if(size) *size = slen + l; + memcpy (data->data, p, len); + if(size) *size = len; return 0; } @@ -247,13 +230,23 @@ decode_general_string (unsigned char *p, size_t len, size_t ret = 0; size_t l; int e; + size_t slen; e = der_match_tag (p, len, UNIV, PRIM, UT_GeneralString, &l); if (e) return e; p += l; len -= l; ret += l; - e = der_get_general_string (p, len, str, &l); + + e = der_get_length (p, len, &slen, &l); + if (e) return e; + p += l; + len -= l; + ret += l; + if (len < slen) + return ASN1_OVERRUN; + + e = der_get_general_string (p, slen, str, &l); if (e) return e; p += l; len -= l; @@ -269,13 +262,23 @@ decode_octet_string (unsigned char *p, size_t len, size_t ret = 0; size_t l; int e; + size_t slen; e = der_match_tag (p, len, UNIV, PRIM, UT_OctetString, &l); if (e) return e; p += l; len -= l; ret += l; - e = der_get_octet_string (p, len, k, &l); + + e = der_get_length (p, len, &slen, &l); + if (e) return e; + p += l; + len -= l; + ret += l; + if (len < slen) + return ASN1_OVERRUN; + + e = der_get_octet_string (p, slen, k, &l); if (e) return e; p += l; len -= l; @@ -306,13 +309,21 @@ decode_generalized_time (unsigned char *p, size_t len, time_t *t, size_t *size) size_t ret = 0; size_t l; int e; + size_t slen; e = der_match_tag (p, len, UNIV, PRIM, UT_GeneralizedTime, &l); if (e) return e; p += l; len -= l; ret += l; - e = der_get_octet_string (p, len, &k, &l); + + e = der_get_length (p, len, &slen, &l); + if (e) return e; + p += l; + len -= l; + if (len < slen) + return ASN1_OVERRUN; + e = der_get_octet_string (p, slen, &k, &l); if (e) return e; p += l; len -= l; diff --git a/lib/asn1/der_put.c b/lib/asn1/der_put.c index 4433f539f..85b672b60 100644 --- a/lib/asn1/der_put.c +++ b/lib/asn1/der_put.c @@ -143,18 +143,13 @@ der_put_general_string (unsigned char *p, size_t len, general_string *str, size_t *size) { size_t slen = strlen(*str); - size_t l; - int e; if (len < slen) return ASN1_OVERFLOW; p -= slen; len -= slen; memcpy (p+1, *str, slen); - e = der_put_length (p, len, slen, &l); - if(e) - return e; - *size = slen + l; + *size = slen; return 0; } @@ -162,18 +157,12 @@ int der_put_octet_string (unsigned char *p, size_t len, octet_string *data, size_t *size) { - size_t l; - int e; - if (len < data->length) return ASN1_OVERFLOW; p -= data->length; len -= data->length; memcpy (p+1, data->data, data->length); - e = der_put_length (p, len, data->length, &l); - if(e) - return e; - *size = l + data->length; + *size = data->length; return 0; } @@ -256,6 +245,12 @@ encode_general_string (unsigned char *p, size_t len, p -= l; len -= l; ret += l; + e = der_put_length (p, len, l, &l); + if (e) + return e; + p -= l; + len -= l; + ret += l; e = der_put_tag (p, len, UNIV, PRIM, UT_GeneralString, &l); if (e) return e; @@ -280,6 +275,12 @@ encode_octet_string (unsigned char *p, size_t len, p -= l; len -= l; ret += l; + e = der_put_length (p, len, l, &l); + if (e) + return e; + p -= l; + len -= l; + ret += l; e = der_put_tag (p, len, UNIV, PRIM, UT_OctetString, &l); if (e) return e;