/*
- * Copyright (C) 2002, 2004, 2006, 2008-2012 Free Software Foundation,
- * Inc.
+ * Copyright (C) 2002-2012 Free Software Foundation, Inc.
*
* This file is part of LIBTASN1.
*
* The @ans buffer is pre-allocated and must have room for the output.
**/
void
-asn1_length_der (unsigned long int len, unsigned char *ans, int *ans_len)
+asn1_length_der (unsigned int len, unsigned char *ans, int *ans_len)
{
int k;
unsigned char temp[SIZEOF_UNSIGNED_LONG_INT];
{
int len_len;
int max_len;
+ int str_len = _asn1_strlen (str);
max_len = *der_len;
- asn1_length_der (strlen (str), (max_len > 0) ? der : NULL, &len_len);
+ asn1_length_der (str_len, (max_len > 0) ? der : NULL, &len_len);
- if ((len_len + (int) strlen (str)) <= max_len)
- memcpy (der + len_len, str, strlen (str));
- *der_len = len_len + strlen (str);
+ if ((len_len + str_len) <= max_len)
+ memcpy (der + len_len, str, str_len);
+ *der_len = len_len + str_len;
if ((*der_len) > max_len)
return ASN1_MEM_ERROR;
char *temp, *n_end, *n_start;
unsigned char bit7;
unsigned long val, val1 = 0;
- int str_len = strlen(str);
+ int str_len = _asn1_strlen(str);
max_len = *der_len;
}
-const char bit_mask[] = { 0xFF, 0xFE, 0xFC, 0xF8, 0xF0, 0xE0, 0xC0, 0x80 };
+static const unsigned char bit_mask[] =
+ { 0xFF, 0xFE, 0xFC, 0xF8, 0xF0, 0xE0, 0xC0, 0x80 };
/**
* asn1_bit_der:
int tag_len, is_tag_implicit;
unsigned char class, class_implicit = 0, temp[SIZEOF_UNSIGNED_INT * 3 + 1];
unsigned long tag_implicit = 0;
- char tag_der[MAX_TAG_LEN];
+ unsigned char tag_der[MAX_TAG_LEN];
is_tag_implicit = 0;
&tag_len);
else
_asn1_tag_der (class | ASN1_CLASS_STRUCTURED,
- strtoul (p->value, NULL, 10), tag_der,
- &tag_len);
+ _asn1_strtoul (p->value, NULL, 10),
+ tag_der, &tag_len);
*max_len -= tag_len;
if (*max_len >= 0)
memcpy (der + *counter, tag_der, tag_len);
*counter += tag_len;
- _asn1_ltostr (*counter, temp);
- _asn1_set_name (p, temp);
+ _asn1_ltostr (*counter, (char *) temp);
+ _asn1_set_name (p, (const char *) temp);
is_tag_implicit = 0;
}
(type_field (node->type) == TYPE_SET_OF))
class |= ASN1_CLASS_STRUCTURED;
class_implicit = class;
- tag_implicit = strtoul (p->value, NULL, 10);
+ tag_implicit = _asn1_strtoul (p->value, NULL, 10);
is_tag_implicit = 1;
}
}
char *ErrorDescription)
{
ASN1_TYPE node, p, p2;
- char temp[SIZEOF_UNSIGNED_LONG_INT * 3 + 1];
+ unsigned char temp[SIZEOF_UNSIGNED_LONG_INT * 3 + 1];
int counter, counter_old, len2, len3, tlen, move, max_len, max_len_old;
asn1_retCode err;
unsigned char *der = ider;
case TYPE_SET:
if (move != UP)
{
- _asn1_ltostr (counter, temp);
- tlen = strlen (temp);
+ _asn1_ltostr (counter, (char *) temp);
+ tlen = _asn1_strlen (temp);
if (tlen > 0)
_asn1_set_value (p, temp, tlen + 1);
if (p->down == NULL)
}
else
{ /* move==UP */
- len2 = strtol (p->value, NULL, 10);
+ len2 = _asn1_strtol (p->value, NULL, 10);
_asn1_set_value (p, NULL, 0);
if ((type_field (p->type) == TYPE_SET) && (max_len >= 0))
_asn1_ordering_set (der + len2, max_len - len2, p);
case TYPE_SET_OF:
if (move != UP)
{
- _asn1_ltostr (counter, temp);
- tlen = strlen (temp);
+ _asn1_ltostr (counter, (char *) temp);
+ tlen = _asn1_strlen (temp);
if (tlen > 0)
_asn1_set_value (p, temp, tlen + 1);
}
if (move == UP)
{
- len2 = strtol (p->value, NULL, 10);
+ len2 = _asn1_strtol (p->value, NULL, 10);
_asn1_set_value (p, NULL, 0);
if ((type_field (p->type) == TYPE_SET_OF)
&& (max_len - len2 > 0))
/*
- * Copyright (C) 2002, 2004, 2006, 2008-2012 Free Software Foundation,
- * Inc.
+ * Copyright (C) 2002-2012 Free Software Foundation, Inc.
*
* This file is part of LIBTASN1.
*
* Returns: Return the decoded length value, or -1 on indefinite
* length, or -2 when the value was too big.
**/
-signed long
+int
asn1_get_length_der (const unsigned char *der, int der_len, int *len)
{
- unsigned long ans;
+ int ans;
int k, punt;
*len = 0;
}
}
+/*-
+ * asn1_get_length_der_checked:
+ * @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.
+ -*/
+static int
+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);
+ if (ret < 0)
+ return ret;
+
+ tot = ret + *len;
+
+ if (tot < 0 || tot > der_len)
+ return -3;
+
+ return ret;
+}
+
/**
* asn1_get_tag_der:
* @der: DER data to decode.
*
* Since: 2.0
**/
-signed long
+int
asn1_get_length_ber (const unsigned char *ber, int ber_len, int *len)
{
int ret;
if (*(der - 1) & ASN1_CLASS_STRUCTURED)
{
tot_len = 0;
- indefinite = asn1_get_length_der (der, *len, &len3);
+ indefinite = asn1_get_length_der_checked (der, *len, &len3);
if (indefinite < -1)
return ASN1_DER_ERROR;
counter++;
- len2 = asn1_get_length_der (der + counter, *len - counter, &len3);
+ len2 = asn1_get_length_der_checked (der + counter, *len - counter, &len3);
if (len2 <= 0)
return ASN1_DER_ERROR;
}
else
{ /* NOT STRUCTURED */
- len2 = asn1_get_length_der (der, *len, &len3);
+ len2 = asn1_get_length_der_checked (der, *len, &len3);
if (len2 < 0)
return ASN1_DER_ERROR;
- if (len3 + len2 > *len)
- return ASN1_DER_ERROR;
if (node)
_asn1_set_value (node, der, len3 + len2);
counter = len3 + len2;
if (node->type & CONST_OPTION)
{
- asn1_delete_structure (element);
- return ASN1_GENERIC_ERROR;
+ result = ASN1_GENERIC_ERROR;
+ goto cleanup;
}
counter = 0;
if (p->type & CONST_SET)
{
p2 = _asn1_find_up (p);
- len2 = strtol (p2->value, NULL, 10);
+ len2 = _asn1_strtol (p2->value, NULL, 10);
if (len2 == -1)
{
if (!der[counter] && !der[counter + 1])
}
else if (counter > len2)
{
- asn1_delete_structure (element);
- return ASN1_DER_ERROR;
+ result = ASN1_DER_ERROR;
+ goto cleanup;
}
p2 = p2->down;
while (p2)
}
if (p2 == NULL)
{
- asn1_delete_structure (element);
- return ASN1_DER_ERROR;
+ result = ASN1_DER_ERROR;
+ goto cleanup;
}
}
if ((p->type & CONST_OPTION) || (p->type & CONST_DEFAULT))
{
p2 = _asn1_find_up (p);
- len2 = strtol (p2->value, NULL, 10);
+ len2 = _asn1_strtol (p2->value, NULL, 10);
if (counter == len2)
{
if (p->right)
}
else if (ris == ASN1_ERROR_TYPE_ANY)
{
- asn1_delete_structure (element);
- return ASN1_ERROR_TYPE_ANY;
+ result = ASN1_ERROR_TYPE_ANY;
+ goto cleanup;
}
else
{
{
if (!(p->type & CONST_OPTION))
{
- asn1_delete_structure (element);
- return ASN1_DER_ERROR;
+ result = ASN1_DER_ERROR;
+ goto cleanup;
}
}
else
if ((p->type & CONST_OPTION) || (p->type & CONST_DEFAULT))
{
p2 = _asn1_find_up (p);
- len2 = strtol (p2->value, NULL, 10);
+ len2 = _asn1_strtol (p2->value, NULL, 10);
if ((len2 != -1) && (counter > len2))
ris = ASN1_TAG_ERROR;
}
if (errorDescription != NULL)
_asn1_error_description_tag_error (p, errorDescription);
- asn1_delete_structure (element);
- return ASN1_TAG_ERROR;
+ result = ASN1_TAG_ERROR;
+ goto cleanup;
}
}
else
case TYPE_NULL:
if (der[counter])
{
- asn1_delete_structure (element);
- return ASN1_DER_ERROR;
+ result = ASN1_DER_ERROR;
+ goto cleanup;
}
counter++;
move = RIGHT;
case TYPE_BOOLEAN:
if (der[counter++] != 1)
{
- asn1_delete_structure (element);
- return ASN1_DER_ERROR;
+ result = ASN1_DER_ERROR;
+ goto cleanup;
}
if (der[counter++] == 0)
_asn1_set_value (p, "F", 1);
case TYPE_INTEGER:
case TYPE_ENUMERATED:
len2 =
- asn1_get_length_der (der + counter, len - counter, &len3);
+ asn1_get_length_der_checked (der + counter, len - counter, &len3);
if (len2 < 0)
- return ASN1_DER_ERROR;
- if (len2 + len3 > len - counter)
- return ASN1_DER_ERROR;
+ {
+ result = ASN1_DER_ERROR;
+ goto cleanup;
+ }
+
_asn1_set_value (p, der + counter, len3 + len2);
counter += len3 + len2;
move = RIGHT;
_asn1_get_objectid_der (der + counter, len - counter, &len2,
temp, sizeof (temp));
if (result != ASN1_SUCCESS)
- {
- asn1_delete_structure (element);
- return result;
- }
+ goto cleanup;
tlen = strlen (temp);
if (tlen > 0)
_asn1_get_time_der (der + counter, len - counter, &len2, temp,
sizeof (temp) - 1);
if (result != ASN1_SUCCESS)
- {
- asn1_delete_structure (element);
- return result;
- }
+ goto cleanup;
+
tlen = strlen (temp);
if (tlen > 0)
_asn1_set_value (p, temp, tlen + 1);
break;
case TYPE_OCTET_STRING:
len3 = len - counter;
- ris = _asn1_get_octet_string (der + counter, p, &len3);
- if (ris != ASN1_SUCCESS)
- return ris;
+ result = _asn1_get_octet_string (der + counter, p, &len3);
+ if (result != ASN1_SUCCESS)
+ goto cleanup;
+
counter += len3;
move = RIGHT;
break;
case TYPE_GENERALSTRING:
len2 =
- asn1_get_length_der (der + counter, len - counter, &len3);
+ asn1_get_length_der_checked (der + counter, len - counter, &len3);
if (len2 < 0)
- return ASN1_DER_ERROR;
- if (len3 + len2 > len - counter)
- return ASN1_DER_ERROR;
+ {
+ result = ASN1_DER_ERROR;
+ goto cleanup;
+ }
+
_asn1_set_value (p, der + counter, len3 + len2);
counter += len3 + len2;
move = RIGHT;
break;
case TYPE_BIT_STRING:
len2 =
- asn1_get_length_der (der + counter, len - counter, &len3);
+ asn1_get_length_der_checked (der + counter, len - counter, &len3);
if (len2 < 0)
- return ASN1_DER_ERROR;
- if (len3 + len2 > len - counter)
- return ASN1_DER_ERROR;
+ {
+ result = ASN1_DER_ERROR;
+ goto cleanup;
+ }
+
_asn1_set_value (p, der + counter, len3 + len2);
counter += len3 + len2;
move = RIGHT;
case TYPE_SET:
if (move == UP)
{
- len2 = strtol (p->value, NULL, 10);
+ len2 = _asn1_strtol (p->value, NULL, 10);
_asn1_set_value (p, NULL, 0);
if (len2 == -1)
{ /* indefinite length method */
{
if ((der[counter]) || der[counter + 1])
{
- asn1_delete_structure (element);
- return ASN1_DER_ERROR;
+ result = ASN1_DER_ERROR;
+ goto cleanup;
}
}
else
- return ASN1_DER_ERROR;
+ {
+ result = ASN1_DER_ERROR;
+ goto cleanup;
+ }
counter += 2;
}
else
{ /* definite length method */
if (len2 != counter)
{
- asn1_delete_structure (element);
- return ASN1_DER_ERROR;
+ result = ASN1_DER_ERROR;
+ goto cleanup;
}
}
move = RIGHT;
else
{ /* move==DOWN || move==RIGHT */
len3 =
- asn1_get_length_der (der + counter, len - counter, &len2);
+ asn1_get_length_der_checked (der + counter, len - counter, &len2);
if (len3 < -1)
- return ASN1_DER_ERROR;
+ {
+ result = ASN1_DER_ERROR;
+ goto cleanup;
+ }
counter += len2;
if (len3 > 0)
{
case TYPE_SET_OF:
if (move == UP)
{
- len2 = strtol (p->value, NULL, 10);
+ len2 = _asn1_strtol (p->value, NULL, 10);
if (len2 == -1)
{ /* indefinite length method */
if ((counter + 2) > len)
- return ASN1_DER_ERROR;
+ {
+ result = ASN1_DER_ERROR;
+ goto cleanup;
+ }
+
if ((der[counter]) || der[counter + 1])
{
_asn1_append_sequence_set (p);
_asn1_set_value (p, NULL, 0);
if (len2 != counter)
{
- asn1_delete_structure (element);
- return ASN1_DER_ERROR;
+ result = ASN1_DER_ERROR;
+ goto cleanup;
}
}
}
else
{ /* move==DOWN || move==RIGHT */
len3 =
- asn1_get_length_der (der + counter, len - counter, &len2);
+ asn1_get_length_der_checked (der + counter, len - counter, &len2);
if (len3 < -1)
- return ASN1_DER_ERROR;
+ {
+ result = ASN1_DER_ERROR;
+ goto cleanup;
+ }
counter += len2;
if (len3)
{
if (asn1_get_tag_der
(der + counter, len - counter, &class, &len2,
&tag) != ASN1_SUCCESS)
- return ASN1_DER_ERROR;
+ {
+ result = ASN1_DER_ERROR;
+ goto cleanup;
+ }
+
if (counter + len2 > len)
- return ASN1_DER_ERROR;
+ {
+ result = ASN1_DER_ERROR;
+ goto cleanup;
+ }
len4 =
- asn1_get_length_der (der + counter + len2,
+ asn1_get_length_der_checked (der + counter + len2,
len - counter - len2, &len3);
if (len4 < -1)
- return ASN1_DER_ERROR;
- if (len4 > len - counter + len2 + len3)
- return ASN1_DER_ERROR;
+ {
+ result = ASN1_DER_ERROR;
+ goto cleanup;
+ }
if (len4 != -1)
{
len2 += len4;
indefinite = 0;
len2 = len - counter;
- ris =
+ result =
_asn1_get_indefinite_length_string (der + counter, &len2);
- if (ris != ASN1_SUCCESS)
- {
- asn1_delete_structure (element);
- return ris;
- }
+ if (result != ASN1_SUCCESS)
+ goto cleanup;
_asn1_set_value_octet (p, der + counter, len2);
counter += len2;
}
else
{
- asn1_delete_structure (element);
- return ASN1_DER_ERROR;
- }
+ result = ASN1_DER_ERROR;
+ goto cleanup;
+ }
}
}
move = RIGHT;
if (counter != len)
{
- asn1_delete_structure (element);
- return ASN1_DER_ERROR;
+ result = ASN1_DER_ERROR;
+ goto cleanup;
}
return ASN1_SUCCESS;
+
+cleanup:
+ asn1_delete_structure (element);
+ return result;
}
#define FOUND 1
if (elementName == NULL)
{
- asn1_delete_structure (structure);
- return ASN1_ELEMENT_NOT_FOUND;
+ result = ASN1_ELEMENT_NOT_FOUND;
+ goto cleanup;
}
if (node->type & CONST_OPTION)
{
- asn1_delete_structure (structure);
- return ASN1_GENERIC_ERROR;
+ result = ASN1_GENERIC_ERROR;
+ goto cleanup;
}
if ((*structure)->name)
strcpy (currentName, (*structure)->name);
else
{
- asn1_delete_structure (structure);
- return ASN1_MEM_ERROR;
+ result = ASN1_MEM_ERROR;
+ goto cleanup;
}
if (!(strcmp (currentName, elementName)))
{
if (p->type & CONST_SET)
{
p2 = _asn1_find_up (p);
- len2 = strtol (p2->value, NULL, 10);
+ len2 = _asn1_strtol (p2->value, NULL, 10);
if (counter == len2)
{
p = p2;
}
else if (counter > len2)
{
- asn1_delete_structure (structure);
- return ASN1_DER_ERROR;
+ result = ASN1_DER_ERROR;
+ goto cleanup;
}
p2 = p2->down;
while (p2)
}
if (p2 == NULL)
{
- asn1_delete_structure (structure);
- return ASN1_DER_ERROR;
+ result = ASN1_DER_ERROR;
+ goto cleanup;
}
}
if ((p->type & CONST_OPTION) || (p->type & CONST_DEFAULT))
{
p2 = _asn1_find_up (p);
- len2 = strtol (p2->value, NULL, 10);
+ len2 = _asn1_strtol (p2->value, NULL, 10);
if (counter == len2)
{
if (p->right)
}
else if (ris == ASN1_ERROR_TYPE_ANY)
{
- asn1_delete_structure (structure);
- return ASN1_ERROR_TYPE_ANY;
+ result = ASN1_ERROR_TYPE_ANY;
+ goto cleanup;
}
else
{
{
if (!(p->type & CONST_OPTION))
{
- asn1_delete_structure (structure);
- return ASN1_DER_ERROR;
+ result = ASN1_DER_ERROR;
+ goto cleanup;
}
}
else
if ((p->type & CONST_OPTION) || (p->type & CONST_DEFAULT))
{
p2 = _asn1_find_up (p);
- len2 = strtol (p2->value, NULL, 10);
+ len2 = _asn1_strtol (p2->value, NULL, 10);
if (counter > len2)
ris = ASN1_TAG_ERROR;
}
if (errorDescription != NULL)
_asn1_error_description_tag_error (p, errorDescription);
- asn1_delete_structure (structure);
- return ASN1_TAG_ERROR;
+ result = ASN1_TAG_ERROR;
+ goto cleanup;
}
}
else
case TYPE_NULL:
if (der[counter])
{
- asn1_delete_structure (structure);
- return ASN1_DER_ERROR;
+ result = ASN1_DER_ERROR;
+ goto cleanup;
}
if (p == nodeFound)
case TYPE_BOOLEAN:
if (der[counter++] != 1)
{
- asn1_delete_structure (structure);
- return ASN1_DER_ERROR;
+ result = ASN1_DER_ERROR;
+ goto cleanup;
}
if (state == FOUND)
case TYPE_INTEGER:
case TYPE_ENUMERATED:
len2 =
- asn1_get_length_der (der + counter, len - counter, &len3);
+ asn1_get_length_der_checked (der + counter, len - counter, &len3);
if (len2 < 0)
- return ASN1_DER_ERROR;
+ {
+ result = ASN1_DER_ERROR;
+ goto cleanup;
+ }
+
if (state == FOUND)
{
if (len3 + len2 > len - counter)
- return ASN1_DER_ERROR;
+ {
+ result = ASN1_DER_ERROR;
+ goto cleanup;
+ }
_asn1_set_value (p, der + counter, len3 + len2);
if (p == nodeFound)
_asn1_get_objectid_der (der + counter, len - counter,
&len2, temp, sizeof (temp));
if (result != ASN1_SUCCESS)
- {
- return result;
- }
+ goto cleanup;
tlen = strlen (temp);
else
{
len2 =
- asn1_get_length_der (der + counter, len - counter, &len3);
+ asn1_get_length_der_checked (der + counter, len - counter, &len3);
if (len2 < 0)
- return ASN1_DER_ERROR;
+ {
+ result = ASN1_DER_ERROR;
+ goto cleanup;
+ }
len2 += len3;
}
_asn1_get_time_der (der + counter, len - counter, &len2,
temp, sizeof (temp) - 1);
if (result != ASN1_SUCCESS)
- {
- asn1_delete_structure (structure);
- return result;
- }
+ goto cleanup;
tlen = strlen (temp);
if (tlen > 0)
else
{
len2 =
- asn1_get_length_der (der + counter, len - counter, &len3);
+ asn1_get_length_der_checked (der + counter, len - counter, &len3);
if (len2 < 0)
- return ASN1_DER_ERROR;
+ {
+ result = ASN1_DER_ERROR;
+ goto cleanup;
+ }
len2 += len3;
}
len3 = len - counter;
if (state == FOUND)
{
- ris = _asn1_get_octet_string (der + counter, p, &len3);
+ result = _asn1_get_octet_string (der + counter, p, &len3);
if (p == nodeFound)
state = EXIT;
}
else
- ris = _asn1_get_octet_string (der + counter, NULL, &len3);
+ result = _asn1_get_octet_string (der + counter, NULL, &len3);
+
+ if (result != ASN1_SUCCESS)
+ goto cleanup;
- if (ris != ASN1_SUCCESS)
- return ris;
counter += len3;
move = RIGHT;
break;
case TYPE_GENERALSTRING:
len2 =
- asn1_get_length_der (der + counter, len - counter, &len3);
+ asn1_get_length_der_checked (der + counter, len - counter, &len3);
if (len2 < 0)
- return ASN1_DER_ERROR;
+ {
+ result = ASN1_DER_ERROR;
+ goto cleanup;
+ }
+
if (state == FOUND)
{
if (len3 + len2 > len - counter)
- return ASN1_DER_ERROR;
+ {
+ result = ASN1_DER_ERROR;
+ goto cleanup;
+ }
_asn1_set_value (p, der + counter, len3 + len2);
if (p == nodeFound)
break;
case TYPE_BIT_STRING:
len2 =
- asn1_get_length_der (der + counter, len - counter, &len3);
+ asn1_get_length_der_checked (der + counter, len - counter, &len3);
if (len2 < 0)
- return ASN1_DER_ERROR;
+ {
+ result = ASN1_DER_ERROR;
+ goto cleanup;
+ }
if (state == FOUND)
{
if (len3 + len2 > len - counter)
- return ASN1_DER_ERROR;
+ {
+ result = ASN1_DER_ERROR;
+ goto cleanup;
+ }
_asn1_set_value (p, der + counter, len3 + len2);
if (p == nodeFound)
case TYPE_SET:
if (move == UP)
{
- len2 = strtol (p->value, NULL, 10);
+ len2 = _asn1_strtol (p->value, NULL, 10);
_asn1_set_value (p, NULL, 0);
if (len2 == -1)
{ /* indefinite length method */
if ((der[counter]) || der[counter + 1])
{
- asn1_delete_structure (structure);
- return ASN1_DER_ERROR;
+ result = ASN1_DER_ERROR;
+ goto cleanup;
}
counter += 2;
}
{ /* definite length method */
if (len2 != counter)
{
- asn1_delete_structure (structure);
- return ASN1_DER_ERROR;
+ result = ASN1_DER_ERROR;
+ goto cleanup;
}
}
if (p == nodeFound)
if (state == OTHER_BRANCH)
{
len3 =
- asn1_get_length_der (der + counter, len - counter,
+ asn1_get_length_der_checked (der + counter, len - counter,
&len2);
if (len3 < 0)
- return ASN1_DER_ERROR;
+ {
+ result = ASN1_DER_ERROR;
+ goto cleanup;
+ }
counter += len2 + len3;
move = RIGHT;
}
else
{ /* state==SAME_BRANCH or state==FOUND */
len3 =
- asn1_get_length_der (der + counter, len - counter,
+ asn1_get_length_der_checked (der + counter, len - counter,
&len2);
if (len3 < 0)
- return ASN1_DER_ERROR;
+ {
+ result = ASN1_DER_ERROR;
+ goto cleanup;
+ }
counter += len2;
if (len3 > 0)
{
case TYPE_SET_OF:
if (move == UP)
{
- len2 = strtol (p->value, NULL, 10);
+ len2 = _asn1_strtol (p->value, NULL, 10);
if (len2 > counter)
{
_asn1_append_sequence_set (p);
_asn1_set_value (p, NULL, 0);
if (len2 != counter)
{
- asn1_delete_structure (structure);
- return ASN1_DER_ERROR;
+ result = ASN1_DER_ERROR;
+ goto cleanup;
}
if (p == nodeFound)
if (state == OTHER_BRANCH)
{
len3 =
- asn1_get_length_der (der + counter, len - counter,
+ asn1_get_length_der_checked (der + counter, len - counter,
&len2);
if (len3 < 0)
- return ASN1_DER_ERROR;
+ {
+ result = ASN1_DER_ERROR;
+ goto cleanup;
+ }
counter += len2 + len3;
move = RIGHT;
}
else
{ /* state==FOUND or state==SAME_BRANCH */
len3 =
- asn1_get_length_der (der + counter, len - counter,
+ asn1_get_length_der_checked (der + counter, len - counter,
&len2);
if (len3 < 0)
- return ASN1_DER_ERROR;
+ {
+ result = ASN1_DER_ERROR;
+ goto cleanup;
+ }
counter += len2;
if (len3)
{
if (asn1_get_tag_der
(der + counter, len - counter, &class, &len2,
&tag) != ASN1_SUCCESS)
- return ASN1_DER_ERROR;
+ {
+ result = ASN1_DER_ERROR;
+ goto cleanup;
+ }
+
if (counter + len2 > len)
- return ASN1_DER_ERROR;
+ {
+ result = ASN1_DER_ERROR;
+ goto cleanup;
+ }
len4 =
- asn1_get_length_der (der + counter + len2,
+ asn1_get_length_der_checked (der + counter + len2,
len - counter - len2, &len3);
if (len4 < -1)
- return ASN1_DER_ERROR;
+ {
+ result = ASN1_DER_ERROR;
+ goto cleanup;
+ }
if (len4 != -1)
{
indefinite = 0;
len2 = len - counter;
- ris =
+ result =
_asn1_get_indefinite_length_string (der + counter, &len2);
- if (ris != ASN1_SUCCESS)
- {
- asn1_delete_structure (structure);
- return ris;
- }
+ if (result != ASN1_SUCCESS)
+ goto cleanup;
if (state == FOUND)
{
}
else
{
- asn1_delete_structure (structure);
- return ASN1_DER_ERROR;
+ result = ASN1_DER_ERROR;
+ goto cleanup;
}
}
}
}
else
{
- asn1_delete_structure (structure);
- return ASN1_MEM_ERROR;
+ result = ASN1_MEM_ERROR;
+ goto cleanup;
}
if (!(strcmp (currentName, elementName)))
{
strcat (currentName, p->name);
else
{
- asn1_delete_structure (structure);
- return ASN1_MEM_ERROR;
+ result = ASN1_MEM_ERROR;
+ goto cleanup;
}
if (!(strcmp (currentName, elementName)))
if (counter > len)
{
- asn1_delete_structure (structure);
- return ASN1_DER_ERROR;
+ result = ASN1_DER_ERROR;
+ goto cleanup;
}
return ASN1_SUCCESS;
+
+cleanup:
+ asn1_delete_structure (structure);
+ return result;
}
/**
if (p->type & CONST_SET)
{
p2 = _asn1_find_up (p);
- len2 = strtol (p2->value, NULL, 10);
+ len2 = _asn1_strtol (p2->value, NULL, 10);
if (len2 == -1)
{
if (!der[counter] && !der[counter + 1])
case TYPE_INTEGER:
case TYPE_ENUMERATED:
len2 =
- asn1_get_length_der (der + counter, len - counter, &len3);
+ asn1_get_length_der_checked (der + counter, len - counter, &len3);
if (len2 < 0)
return ASN1_DER_ERROR;
counter += len3 + len2;
break;
case TYPE_OBJECT_ID:
len2 =
- asn1_get_length_der (der + counter, len - counter, &len3);
+ asn1_get_length_der_checked (der + counter, len - counter, &len3);
if (len2 < 0)
return ASN1_DER_ERROR;
counter += len2 + len3;
break;
case TYPE_TIME:
len2 =
- asn1_get_length_der (der + counter, len - counter, &len3);
+ asn1_get_length_der_checked (der + counter, len - counter, &len3);
if (len2 < 0)
return ASN1_DER_ERROR;
counter += len2 + len3;
break;
case TYPE_GENERALSTRING:
len2 =
- asn1_get_length_der (der + counter, len - counter, &len3);
+ asn1_get_length_der_checked (der + counter, len - counter, &len3);
if (len2 < 0)
return ASN1_DER_ERROR;
counter += len3 + len2;
break;
case TYPE_BIT_STRING:
len2 =
- asn1_get_length_der (der + counter, len - counter, &len3);
+ asn1_get_length_der_checked (der + counter, len - counter, &len3);
if (len2 < 0)
return ASN1_DER_ERROR;
counter += len3 + len2;
if (move != UP)
{
len3 =
- asn1_get_length_der (der + counter, len - counter, &len2);
+ asn1_get_length_der_checked (der + counter, len - counter, &len2);
if (len3 < -1)
return ASN1_DER_ERROR;
counter += len2;
if (move != UP)
{
len3 =
- asn1_get_length_der (der + counter, len - counter, &len2);
+ asn1_get_length_der_checked (der + counter, len - counter, &len2);
if (len3 < -1)
return ASN1_DER_ERROR;
counter += len2;
return ASN1_DER_ERROR;
len4 =
- asn1_get_length_der (der + counter + len2,
+ asn1_get_length_der_checked (der + counter + len2,
len - counter - len2, &len3);
if (len4 < -1)
return ASN1_DER_ERROR;
asn1_read_value (definitions, name, value, &len);
if ((result == ASN1_SUCCESS)
- && (!strcmp (p3->value, value)))
+ && (!_asn1_strcmp (p3->value, value)))
{
p2 = p2->right; /* pointer to the structure to
use for expansion */
result = asn1_read_value (definitions, name, value, &len);
if ((result == ASN1_SUCCESS)
- && (!strcmp (objectNode->value, value)))
+ && (!_asn1_strcmp (objectNode->value, value)))
{
p2 = p2->right; /* pointer to the structure to
/*
- * Copyright (C) 2000-2004, 2006, 2008-2012 Free Software Foundation,
- * Inc.
+ * Copyright (C) 2000-2012 Free Software Foundation, Inc.
*
* This file is part of LIBTASN1.
*
/* Return: ASN1_MEM_ERROR or ASN1_SUCCESS */
/******************************************************************/
asn1_retCode
-_asn1_convert_integer (const char *value, unsigned char *value_out,
+_asn1_convert_integer (const unsigned char *value, unsigned char *value_out,
int value_out_size, int *len)
{
char negative;
long valtmp;
int k, k2;
- valtmp = strtol (value, NULL, 10);
+ valtmp = _asn1_strtol (value, NULL, 10);
for (k = 0; k < SIZEOF_UNSIGNED_LONG_INT; k++)
{
switch (type_field (node->type))
{
case TYPE_BOOLEAN:
- if (!strcmp (value, "TRUE"))
+ if (!_asn1_strcmp (value, "TRUE"))
{
if (node->type & CONST_DEFAULT)
{
else
_asn1_set_value (node, "T", 1);
}
- else if (!strcmp (value, "FALSE"))
+ else if (!_asn1_strcmp (value, "FALSE"))
{
if (node->type & CONST_DEFAULT)
{
{
if (type_field (p->type) == TYPE_CONSTANT)
{
- if ((p->name) && (!strcmp (p->name, value)))
+ if ((p->name) && (!_asn1_strcmp (p->name, value)))
{
value_temp =
(unsigned char *)
{
if (type_field (p2->type) == TYPE_CONSTANT)
{
- if ((p2->name) && (!strcmp (p2->name, p->value)))
+ if ((p2->name) && (!_asn1_strcmp (p2->name, p->value)))
{
default_temp =
(unsigned char *)
_asn1_free (value_temp);
break;
case TYPE_OBJECT_ID:
- for (i = 0; i < strlen (value); i++)
+ for (i = 0; i < _asn1_strlen (value); i++)
if ((!isdigit (value[i])) && (value[i] != '.') && (value[i] != '+'))
return ASN1_VALUE_NOT_VALID;
if (node->type & CONST_DEFAULT)
p = node->down;
while (type_field (p->type) != TYPE_DEFAULT)
p = p->right;
- if (!strcmp (value, p->value))
+ if (!_asn1_strcmp (value, p->value))
{
_asn1_set_value (node, NULL, 0);
break;
}
}
- _asn1_set_value (node, value, strlen (value) + 1);
+ _asn1_set_value (node, value, _asn1_strlen (value) + 1);
break;
case TYPE_TIME:
if (node->type & CONST_UTC)
{
- if (strlen (value) < 11)
+ if (_asn1_strlen (value) < 11)
return ASN1_VALUE_NOT_VALID;
for (k = 0; k < 10; k++)
if (!isdigit (value[k]))
return ASN1_VALUE_NOT_VALID;
- switch (strlen (value))
+ switch (_asn1_strlen (value))
{
case 11:
if (value[10] != 'Z')
default:
return ASN1_VALUE_NOT_FOUND;
}
- _asn1_set_value (node, value, strlen (value) + 1);
+ _asn1_set_value (node, value, _asn1_strlen (value) + 1);
}
else
{ /* GENERALIZED TIME */
if (value)
- _asn1_set_value (node, value, strlen (value) + 1);
+ _asn1_set_value (node, value, _asn1_strlen (value) + 1);
}
break;
case TYPE_OCTET_STRING:
if (len == 0)
- len = strlen (value);
+ len = _asn1_strlen (value);
_asn1_set_value_octet (node, value, len);
break;
case TYPE_GENERALSTRING:
if (len == 0)
- len = strlen (value);
+ len = _asn1_strlen (value);
_asn1_set_value_octet (node, value, len);
break;
case TYPE_BIT_STRING:
if (len == 0)
- len = strlen (value);
+ len = _asn1_strlen (value);
asn1_length_der ((len >> 3) + 2, NULL, &len2);
temp = (unsigned char *) _asn1_malloc ((len >> 3) + 2 + len2);
if (temp == NULL)
p = node->down;
while (p)
{
- if (!strcmp (p->name, value))
+ if (!_asn1_strcmp (p->name, value))
{
p2 = node->down;
while (p2)
break;
case TYPE_SEQUENCE_OF:
case TYPE_SET_OF:
- if (strcmp (value, "NEW"))
+ if (_asn1_strcmp (value, "NEW"))
return ASN1_VALUE_NOT_VALID;
_asn1_append_sequence_set (node);
break;
}
#define PUT_STR_VALUE( ptr, ptr_size, data) \
- *len = strlen(data) + 1; \
+ *len = _asn1_strlen(data) + 1; \
if (ptr_size < *len) { \
return ASN1_MEM_ERROR; \
} else { \
/* this strcpy is checked */ \
- strcpy(ptr, data); \
+ _asn1_strcpy(ptr, data); \
}
#define ADD_STR_VALUE( ptr, ptr_size, data) \
- *len = (int) strlen(data) + 1; \
- if (ptr_size < (int) strlen(ptr)+(*len)) { \
+ *len = (int) _asn1_strlen(data) + 1; \
+ if (ptr_size < (int) _asn1_strlen(ptr)+(*len)) { \
return ASN1_MEM_ERROR; \
} else { \
/* this strcat is checked */ \
- strcat(ptr, data); \
+ _asn1_strcat(ptr, data); \
}
/**
{
if (type_field (p2->type) == TYPE_CONSTANT)
{
- if ((p2->name) && (!strcmp (p2->name, p->value)))
+ if ((p2->name) && (!_asn1_strcmp (p2->name, p->value)))
{
if (_asn1_convert_integer
(p2->value, value, value_size,
}
p = p->right;
}
- *len = strlen (value) + 1;
+ *len = _asn1_strlen (value) + 1;
}
else if ((node->type & CONST_DEFAULT) && (node->value == NULL))
{
if (pTag)
{
- *tagValue = strtoul (pTag->value, NULL, 10);
+ *tagValue = _asn1_strtoul (pTag->value, NULL, 10);
if (pTag->type & CONST_APPLICATION)
*classValue = ASN1_CLASS_APPLICATION;