summaryrefslogtreecommitdiff
path: root/lib/minitasn1
diff options
context:
space:
mode:
authorNikos Mavrogiannopoulos <nmav@gnutls.org>2012-03-13 21:32:22 +0100
committerNikos Mavrogiannopoulos <nmav@gnutls.org>2012-03-13 21:32:22 +0100
commita737805640a8d362db34e0176d19441cba7bb08f (patch)
tree35f8e28fe2f8a689c4e18e09dea777f983e46645 /lib/minitasn1
parented47ba432db398246edceacd37374973fcf59495 (diff)
downloadgnutls-a737805640a8d362db34e0176d19441cba7bb08f.tar.gz
more recent libtasn1
Diffstat (limited to 'lib/minitasn1')
-rw-r--r--lib/minitasn1/coding.c2
-rw-r--r--lib/minitasn1/decoding.c125
-rw-r--r--lib/minitasn1/libtasn1.h6
3 files changed, 73 insertions, 60 deletions
diff --git a/lib/minitasn1/coding.c b/lib/minitasn1/coding.c
index a1896d58df..ab430fcee0 100644
--- a/lib/minitasn1/coding.c
+++ b/lib/minitasn1/coding.c
@@ -68,7 +68,7 @@ _asn1_error_description_value_not_found (ASN1_TYPE node,
* The @ans buffer is pre-allocated and must have room for the output.
**/
void
-asn1_length_der (unsigned int len, unsigned char *ans, int *ans_len)
+asn1_length_der (unsigned long len, unsigned char *ans, int *ans_len)
{
int k;
unsigned char temp[SIZEOF_UNSIGNED_LONG_INT];
diff --git a/lib/minitasn1/decoding.c b/lib/minitasn1/decoding.c
index 32888a3bee..57e7b2b3b8 100644
--- a/lib/minitasn1/decoding.c
+++ b/lib/minitasn1/decoding.c
@@ -45,19 +45,8 @@ _asn1_error_description_tag_error (ASN1_TYPE node, char *ErrorDescription)
}
-/**
- * asn1_get_length_der:
- * @der: DER data to decode.
- * @der_len: Length of DER data to decode.
- * @len: Output variable containing the length of the DER length field.
- *
- * Extract a length field from DER data.
- *
- * Returns: Return the decoded length value, or -1 on indefinite
- * length, or -2 when the value was too big.
- **/
-int
-asn1_get_length_der (const unsigned char *der, int der_len, int *len)
+static int
+_asn1_get_length_der (const unsigned char *der, int der_len, int *len)
{
int ans;
int k, punt;
@@ -117,7 +106,7 @@ asn1_get_length_der_checked (const unsigned char *der, int der_len, int *len)
{
int ret, tot;
- ret = asn1_get_length_der(der, der_len, len);
+ ret = _asn1_get_length_der(der, der_len, len);
if (ret < 0)
return ret;
@@ -130,6 +119,24 @@ int ret, tot;
}
/**
+ * asn1_get_length_der:
+ * @der: DER data to decode.
+ * @der_len: Length of DER data to decode.
+ * @len: Output variable containing the length of the DER length field.
+ *
+ * Extract a length field from DER data.
+ *
+ * Returns: Return the decoded length value, or -1 on indefinite
+ * length, -2 when the value was too big or -3 when the value
+ * and the size of length exceed the @der_len.
+ **/
+long
+asn1_get_length_der (const unsigned char *der, int der_len, int *len)
+{
+ return asn1_get_length_der_checked(der, der_len, len);
+}
+
+/**
* asn1_get_tag_der:
* @der: DER data to decode.
* @der_len: Length of DER data to decode.
@@ -186,6 +193,24 @@ asn1_get_tag_der (const unsigned char *der, int der_len,
return ASN1_SUCCESS;
}
+static int
+_asn1_get_length_ber (const unsigned char *ber, int ber_len, int *len)
+{
+ int ret;
+ long err;
+
+ ret = _asn1_get_length_der (ber, ber_len, len);
+ if (ret == -1)
+ { /* indefinite length method */
+ ret = ber_len;
+ err = _asn1_get_indefinite_length_string (ber + 1, &ret);
+ if (err != ASN1_SUCCESS)
+ return -3;
+ }
+
+ return ret;
+}
+
/**
* asn1_get_length_ber:
* @ber: BER data to decode.
@@ -201,22 +226,10 @@ asn1_get_tag_der (const unsigned char *der, int der_len,
*
* Since: 2.0
**/
-int
+long
asn1_get_length_ber (const unsigned char *ber, int ber_len, int *len)
{
- int ret;
- long err;
-
- ret = asn1_get_length_der (ber, ber_len, len);
- if (ret == -1)
- { /* indefinite length method */
- ret = ber_len;
- err = _asn1_get_indefinite_length_string (ber + 1, &ret);
- if (err != ASN1_SUCCESS)
- return -3;
- }
-
- return ret;
+ return _asn1_get_length_ber(ber, ber_len, len);
}
/**
@@ -421,7 +434,7 @@ _asn1_extract_tag_der (ASN1_TYPE node, const unsigned char *der, int der_len,
counter += len2;
len3 =
- asn1_get_length_ber (der + counter, der_len - counter,
+ _asn1_get_length_ber (der + counter, der_len - counter,
&len2);
if (len3 < 0)
return ASN1_DER_ERROR;
@@ -691,7 +704,7 @@ _asn1_get_octet_string (const unsigned char *der, ASN1_TYPE node, int *len)
if (*(der - 1) & ASN1_CLASS_STRUCTURED)
{
tot_len = 0;
- indefinite = asn1_get_length_der_checked (der, *len, &len3);
+ indefinite = asn1_get_length_der (der, *len, &len3);
if (indefinite < -1)
return ASN1_DER_ERROR;
@@ -720,7 +733,7 @@ _asn1_get_octet_string (const unsigned char *der, ASN1_TYPE node, int *len)
counter++;
- len2 = asn1_get_length_der_checked (der + counter, *len - counter, &len3);
+ len2 = asn1_get_length_der (der + counter, *len - counter, &len3);
if (len2 <= 0)
return ASN1_DER_ERROR;
@@ -749,7 +762,7 @@ _asn1_get_octet_string (const unsigned char *der, ASN1_TYPE node, int *len)
}
else
{ /* NOT STRUCTURED */
- len2 = asn1_get_length_der_checked (der, *len, &len3);
+ len2 = asn1_get_length_der (der, *len, &len3);
if (len2 < 0)
return ASN1_DER_ERROR;
if (node)
@@ -1054,7 +1067,7 @@ asn1_der_decoding (ASN1_TYPE * element, const void *ider, int len,
case TYPE_INTEGER:
case TYPE_ENUMERATED:
len2 =
- asn1_get_length_der_checked (der + counter, len - counter, &len3);
+ asn1_get_length_der (der + counter, len - counter, &len3);
if (len2 < 0)
{
result = ASN1_DER_ERROR;
@@ -1102,7 +1115,7 @@ asn1_der_decoding (ASN1_TYPE * element, const void *ider, int len,
break;
case TYPE_GENERALSTRING:
len2 =
- asn1_get_length_der_checked (der + counter, len - counter, &len3);
+ asn1_get_length_der (der + counter, len - counter, &len3);
if (len2 < 0)
{
result = ASN1_DER_ERROR;
@@ -1115,7 +1128,7 @@ asn1_der_decoding (ASN1_TYPE * element, const void *ider, int len,
break;
case TYPE_BIT_STRING:
len2 =
- asn1_get_length_der_checked (der + counter, len - counter, &len3);
+ asn1_get_length_der (der + counter, len - counter, &len3);
if (len2 < 0)
{
result = ASN1_DER_ERROR;
@@ -1162,7 +1175,7 @@ asn1_der_decoding (ASN1_TYPE * element, const void *ider, int len,
else
{ /* move==DOWN || move==RIGHT */
len3 =
- asn1_get_length_der_checked (der + counter, len - counter, &len2);
+ asn1_get_length_der (der + counter, len - counter, &len2);
if (len3 < -1)
{
result = ASN1_DER_ERROR;
@@ -1247,7 +1260,7 @@ asn1_der_decoding (ASN1_TYPE * element, const void *ider, int len,
else
{ /* move==DOWN || move==RIGHT */
len3 =
- asn1_get_length_der_checked (der + counter, len - counter, &len2);
+ asn1_get_length_der (der + counter, len - counter, &len2);
if (len3 < -1)
{
result = ASN1_DER_ERROR;
@@ -1294,7 +1307,7 @@ asn1_der_decoding (ASN1_TYPE * element, const void *ider, int len,
goto cleanup;
}
len4 =
- asn1_get_length_der_checked (der + counter + len2,
+ asn1_get_length_der (der + counter + len2,
len - counter - len2, &len3);
if (len4 < -1)
{
@@ -1680,7 +1693,7 @@ asn1_der_decoding_element (ASN1_TYPE * structure, const char *elementName,
case TYPE_INTEGER:
case TYPE_ENUMERATED:
len2 =
- asn1_get_length_der_checked (der + counter, len - counter, &len3);
+ asn1_get_length_der (der + counter, len - counter, &len3);
if (len2 < 0)
{
result = ASN1_DER_ERROR;
@@ -1722,7 +1735,7 @@ asn1_der_decoding_element (ASN1_TYPE * structure, const char *elementName,
else
{
len2 =
- asn1_get_length_der_checked (der + counter, len - counter, &len3);
+ asn1_get_length_der (der + counter, len - counter, &len3);
if (len2 < 0)
{
result = ASN1_DER_ERROR;
@@ -1753,7 +1766,7 @@ asn1_der_decoding_element (ASN1_TYPE * structure, const char *elementName,
else
{
len2 =
- asn1_get_length_der_checked (der + counter, len - counter, &len3);
+ asn1_get_length_der (der + counter, len - counter, &len3);
if (len2 < 0)
{
result = ASN1_DER_ERROR;
@@ -1784,7 +1797,7 @@ asn1_der_decoding_element (ASN1_TYPE * structure, const char *elementName,
break;
case TYPE_GENERALSTRING:
len2 =
- asn1_get_length_der_checked (der + counter, len - counter, &len3);
+ asn1_get_length_der (der + counter, len - counter, &len3);
if (len2 < 0)
{
result = ASN1_DER_ERROR;
@@ -1808,7 +1821,7 @@ asn1_der_decoding_element (ASN1_TYPE * structure, const char *elementName,
break;
case TYPE_BIT_STRING:
len2 =
- asn1_get_length_der_checked (der + counter, len - counter, &len3);
+ asn1_get_length_der (der + counter, len - counter, &len3);
if (len2 < 0)
{
result = ASN1_DER_ERROR;
@@ -1861,7 +1874,7 @@ asn1_der_decoding_element (ASN1_TYPE * structure, const char *elementName,
if (state == OTHER_BRANCH)
{
len3 =
- asn1_get_length_der_checked (der + counter, len - counter,
+ asn1_get_length_der (der + counter, len - counter,
&len2);
if (len3 < 0)
{
@@ -1874,7 +1887,7 @@ asn1_der_decoding_element (ASN1_TYPE * structure, const char *elementName,
else
{ /* state==SAME_BRANCH or state==FOUND */
len3 =
- asn1_get_length_der_checked (der + counter, len - counter,
+ asn1_get_length_der (der + counter, len - counter,
&len2);
if (len3 < 0)
{
@@ -1944,7 +1957,7 @@ asn1_der_decoding_element (ASN1_TYPE * structure, const char *elementName,
if (state == OTHER_BRANCH)
{
len3 =
- asn1_get_length_der_checked (der + counter, len - counter,
+ asn1_get_length_der (der + counter, len - counter,
&len2);
if (len3 < 0)
{
@@ -1957,7 +1970,7 @@ asn1_der_decoding_element (ASN1_TYPE * structure, const char *elementName,
else
{ /* state==FOUND or state==SAME_BRANCH */
len3 =
- asn1_get_length_der_checked (der + counter, len - counter,
+ asn1_get_length_der (der + counter, len - counter,
&len2);
if (len3 < 0)
{
@@ -2001,7 +2014,7 @@ asn1_der_decoding_element (ASN1_TYPE * structure, const char *elementName,
}
len4 =
- asn1_get_length_der_checked (der + counter + len2,
+ asn1_get_length_der (der + counter + len2,
len - counter - len2, &len3);
if (len4 < -1)
{
@@ -2369,7 +2382,7 @@ asn1_der_decoding_startEnd (ASN1_TYPE element, const void *ider, int len,
case TYPE_INTEGER:
case TYPE_ENUMERATED:
len2 =
- asn1_get_length_der_checked (der + counter, len - counter, &len3);
+ asn1_get_length_der (der + counter, len - counter, &len3);
if (len2 < 0)
return ASN1_DER_ERROR;
counter += len3 + len2;
@@ -2377,7 +2390,7 @@ asn1_der_decoding_startEnd (ASN1_TYPE element, const void *ider, int len,
break;
case TYPE_OBJECT_ID:
len2 =
- asn1_get_length_der_checked (der + counter, len - counter, &len3);
+ asn1_get_length_der (der + counter, len - counter, &len3);
if (len2 < 0)
return ASN1_DER_ERROR;
counter += len2 + len3;
@@ -2385,7 +2398,7 @@ asn1_der_decoding_startEnd (ASN1_TYPE element, const void *ider, int len,
break;
case TYPE_TIME:
len2 =
- asn1_get_length_der_checked (der + counter, len - counter, &len3);
+ asn1_get_length_der (der + counter, len - counter, &len3);
if (len2 < 0)
return ASN1_DER_ERROR;
counter += len2 + len3;
@@ -2401,7 +2414,7 @@ asn1_der_decoding_startEnd (ASN1_TYPE element, const void *ider, int len,
break;
case TYPE_GENERALSTRING:
len2 =
- asn1_get_length_der_checked (der + counter, len - counter, &len3);
+ asn1_get_length_der (der + counter, len - counter, &len3);
if (len2 < 0)
return ASN1_DER_ERROR;
counter += len3 + len2;
@@ -2409,7 +2422,7 @@ asn1_der_decoding_startEnd (ASN1_TYPE element, const void *ider, int len,
break;
case TYPE_BIT_STRING:
len2 =
- asn1_get_length_der_checked (der + counter, len - counter, &len3);
+ asn1_get_length_der (der + counter, len - counter, &len3);
if (len2 < 0)
return ASN1_DER_ERROR;
counter += len3 + len2;
@@ -2420,7 +2433,7 @@ asn1_der_decoding_startEnd (ASN1_TYPE element, const void *ider, int len,
if (move != UP)
{
len3 =
- asn1_get_length_der_checked (der + counter, len - counter, &len2);
+ asn1_get_length_der (der + counter, len - counter, &len2);
if (len3 < -1)
return ASN1_DER_ERROR;
counter += len2;
@@ -2441,7 +2454,7 @@ asn1_der_decoding_startEnd (ASN1_TYPE element, const void *ider, int len,
if (move != UP)
{
len3 =
- asn1_get_length_der_checked (der + counter, len - counter, &len2);
+ asn1_get_length_der (der + counter, len - counter, &len2);
if (len3 < -1)
return ASN1_DER_ERROR;
counter += len2;
@@ -2472,7 +2485,7 @@ asn1_der_decoding_startEnd (ASN1_TYPE element, const void *ider, int len,
return ASN1_DER_ERROR;
len4 =
- asn1_get_length_der_checked (der + counter + len2,
+ asn1_get_length_der (der + counter + len2,
len - counter - len2, &len3);
if (len4 < -1)
return ASN1_DER_ERROR;
diff --git a/lib/minitasn1/libtasn1.h b/lib/minitasn1/libtasn1.h
index ac9fafe150..ed8ba87e4c 100644
--- a/lib/minitasn1/libtasn1.h
+++ b/lib/minitasn1/libtasn1.h
@@ -261,14 +261,14 @@ extern "C"
int *ret_len, unsigned char *str,
int str_size, int *bit_len);
- extern ASN1_API int
+ extern ASN1_API long
asn1_get_length_der (const unsigned char *der, int der_len, int *len);
- extern ASN1_API int
+ extern ASN1_API long
asn1_get_length_ber (const unsigned char *ber, int ber_len, int *len);
extern ASN1_API void
- asn1_length_der (unsigned int len, unsigned char *ans, int *ans_len);
+ asn1_length_der (unsigned long len, unsigned char *ans, int *ans_len);
/* Other utility functions. */