return ASN1_SUCCESS;
}
+
static int
_asn1_extract_tag_der (asn1_node node, const unsigned char *der, int der_len,
int *ret_len)
}
static int
+extract_tag_der_recursive(asn1_node node, const unsigned char *der, int der_len,
+ int *ret_len)
+{
+asn1_node p;
+int ris;
+
+ if (type_field (node->type) == ASN1_ETYPE_CHOICE)
+ {
+ p = node->down;
+ while (p)
+ {
+ ris = _asn1_extract_tag_der (p, der, der_len, ret_len);
+ if (ris == ASN1_SUCCESS)
+ break;
+ p = p->right;
+ }
+ return ris;
+ }
+ else
+ return _asn1_extract_tag_der (node, der, der_len, ret_len);
+}
+
+static int
_asn1_delete_not_used (asn1_node node)
{
asn1_node p, p2;
}
+static void delete_unneeded_choice_fields(asn1_node p)
+{
+ if (p->right)
+ {
+ asn1_delete_structure (&p->right);
+ }
+}
+
/**
* asn1_der_decoding:
* @element: pointer to an ASN1 structure.
{
if ((p2->type & CONST_SET) && (p2->type & CONST_NOT_USED))
{
- if (type_field (p2->type) != ASN1_ETYPE_CHOICE)
- ris =
- _asn1_extract_tag_der (p2, der + counter,
+ ris =
+ extract_tag_der_recursive (p2, der + counter,
len - counter, &len2);
- else
- {
- p3 = p2->down;
- while (p3)
- {
- ris =
- _asn1_extract_tag_der (p3, der + counter,
- len - counter, &len2);
- if (ris == ASN1_SUCCESS)
- break;
- p3 = p3->right;
- }
- }
if (ris == ASN1_SUCCESS)
{
p2->type &= ~CONST_NOT_USED;
{
if (counter < len)
ris =
- _asn1_extract_tag_der (p->down, der + counter,
+ extract_tag_der_recursive (p->down, der + counter,
len - counter, &len2);
else
ris = ASN1_DER_ERROR;
if (ris == ASN1_SUCCESS)
{
- while (p->down->right)
- {
- p2 = p->down->right;
- asn1_delete_structure (&p2);
- }
+ delete_unneeded_choice_fields(p->down);
break;
}
else if (ris == ASN1_ERROR_TYPE_ANY)
{
if ((p2->type & CONST_SET) && (p2->type & CONST_NOT_USED))
{
- if (type_field (p2->type) != ASN1_ETYPE_CHOICE)
- ris =
- _asn1_extract_tag_der (p2, der + counter,
+ ris =
+ extract_tag_der_recursive (p2, der + counter,
len - counter, &len2);
- else
- {
- p3 = p2->down;
- while (p3)
- {
- ris =
- _asn1_extract_tag_der (p3, der + counter,
- len - counter, &len2);
- if (ris == ASN1_SUCCESS)
- break;
- p3 = p3->right;
- }
- }
if (ris == ASN1_SUCCESS)
{
p2->type &= ~CONST_NOT_USED;
ris = ASN1_DER_ERROR;
if (ris == ASN1_SUCCESS)
{
- while (p->down->right)
- {
- p2 = p->down->right;
- asn1_delete_structure (&p2);
- }
+ delete_unneeded_choice_fields(p->down);
break;
}
else if (ris == ASN1_ERROR_TYPE_ANY)
{
if ((p2->type & CONST_SET) && (p2->type & CONST_NOT_USED))
{ /* CONTROLLARE */
- if (type_field (p2->type) != ASN1_ETYPE_CHOICE)
- ris =
- _asn1_extract_tag_der (p2, der + counter,
+ ris =
+ extract_tag_der_recursive (p2, der + counter,
len - counter, &len2);
- else
- {
- p3 = p2->down;
- if (p3 == NULL)
- return ASN1_DER_ERROR;
-
- ris =
- _asn1_extract_tag_der (p3, der + counter,
- len - counter, &len2);
- }
if (ris == ASN1_SUCCESS)
{
p2->type &= ~CONST_NOT_USED;