--- /dev/null
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html401/loose.dtd">
+<html>
+<!-- Generated by gnulib's pmccabe2html at 1236177370 -->
+<head>
+<title>Cyclomatic Complexity report for libtasn1</title>
+
+<meta name="description" content="Cyclomatic Complexity report for libtasn1">
+<meta name="keywords" content="Cyclomatic Complexity report for libtasn1">
+<meta name="resource-type" content="document">
+<meta name="distribution" content="global">
+<meta name="Generator" content="pmccabe2html">
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+<script language="javascript" type="text/javascript">
+function show_hide(idCapa, idButton, fuerzaVisibilidad){ var button = document.getElementById(idButton); var capa = document.getElementById(idCapa); if (capa) { if (fuerzaVisibilidad && fuerzaVisibilidad!="") { if (fuerzaVisibilidad=="visible") capa.style.display=""; else capa.style.display="none"; } else { if (capa.style.display == "none") { capa.style.display = ""; button.innerHTML = "↑"; } else { capa.style.display = "none"; button.innerHTML = "↓"; } } }}
+</script>
+<style type ="text/css" media="screen">
+<!--
+body {
+
+ font-family: Helvetica, sans-serif;
+
+}
+
+.page_title {
+
+ font: 18pt Georgia, serif;
+/* font-size: 1.5em;
+ font-weight: bold; */
+ color: darkred;
+ border-bottom: 2px solid darkred;
+}
+
+.section_title {
+
+ font: 14pt Georgia, serif;
+ color: darkred;
+ border-bottom: 2px dashed darkred;
+}
+
+.report_timestamp {
+
+ color: darkred;
+ font-weight: bold;
+
+}
+
+.function_src {
+
+ text-align: left;
+ background: white;
+}
+
+.resume_table {
+
+}
+
+.resume_header_entry {
+
+ color: black;
+}
+
+.resume_number_entry {
+
+ color: darkred;
+ font-weight: bold;
+ text-align: right;
+}
+
+.ranges_table {
+
+ border-spacing: 0px;
+ border-bottom: solid 2px black;
+ border-top: solid 2px black;
+ border-left: solid 2px black;
+ border-right: solid 2px black;
+}
+
+.ranges_header_entry {
+
+ padding: 5px;
+ border-bottom: solid 1px black;
+ font-size: 1em;
+ font-weight: bold;
+ color: darkred;
+ text-align: left;
+}
+
+.ranges_entry {
+
+}
+
+.ranges_entry_simple {
+
+ background: #87ff75;
+
+}
+
+.ranges_entry_moderate {
+
+ background: #fffc60;
+
+}
+
+.ranges_entry_high {
+
+ background: #ff5a5d;
+
+}
+
+.ranges_entry_untestable {
+
+ background: #993300
+
+}
+
+
+.function_table {
+
+ border-spacing: 0px;
+ border-bottom: solid 2px black;
+ border-top: solid 2px black;
+ border-left: solid 2px black;
+ border-right: solid 2px black;
+}
+
+.function_table_caption {
+
+ font-size: 1.1em;
+ font-weight: bold;
+ color: black;
+ padding: 5px;
+}
+
+.function_table_header {
+
+}
+
+
+.function_table_header_entry {
+
+ padding: 5px;
+ border-bottom: solid 1px black;
+ font-size: 1em;
+ font-weight: bold;
+ color: darkred;
+ text-align: left;
+}
+
+.function_entry {
+
+
+}
+
+
+.function_entry_simple {
+
+ background: #87ff75;
+
+}
+
+.function_entry_moderate {
+
+ background: #fffc60;
+
+}
+
+.function_entry_high {
+
+ background: #ff5a5d;
+
+}
+
+.function_entry_untestable {
+
+ background: #993300
+
+}
+
+
+.function_entry_name {
+
+ font-size: 1em;
+ text-align: left;
+ font-weight: bold;
+ text-valign: top;
+
+ border-top: solid 1px black;
+ padding: 3px;
+}
+
+.function_entry_cyclo {
+
+ font-size: 1em;
+ text-align: right;
+ text-valign: top;
+
+ border-top: solid 1px black;
+ padding: 3px;
+}
+
+.function_entry_number {
+
+ font-size: 1em;
+ text-align: right;
+ text-valign: top;
+
+ border-top: solid 1px black;
+ padding: 3px;
+}
+
+.function_entry_filename {
+
+ font-size: 1em;
+ text-align: left;
+ text-valign: top;
+
+ border-top: solid 1px black;
+ padding: 3px;
+}
+
+.sidemenu {
+
+ border: 1px black solid;
+ padding: 5px;
+
+}
+
+.sidemenuheader {
+
+ color: darkred;
+ font-size: 1.1em;
+ font-weight: bold;
+ border-bottom: 1px dashed darkred;
+}
+
+.sidemenuentry {
+
+
+}
+
+.menu {
+
+}
+
+-->
+</style />
+</head>
+<body lang="en" bgcolor="#FFFFFF" text="#000000" link="#0000FF" vlink="#800080" alink="#FF0000">
+<a href="http://josefsson.org/libtasn1/">Back to libtasn1 Homepage</a><br/><br/>
+<div class="page_title">libtasn1 Cyclomatic Complexity Report</div>
+<p>Report generated at: <span class="report_timestamp">Wed Mar 04 15:36:10 CET 2009</div></p>
+<div class="section_title">Resume</div>
+<br/>
+<table class="resume_table">
+<tr>
+<td class="resume_header_entry">
+Total number of functions
+</td>
+<td class="resume_number_entry">
+98
+</td>
+</tr>
+<tr>
+<td class="resume_header_entry">
+Number of low risk functions
+</td>
+<td class="resume_number_entry">
+64
+</td>
+</tr>
+<tr>
+<td class="resume_header_entry">
+Number of moderate risk functions
+</td>
+<td class="resume_number_entry">
+17
+</td>
+</tr>
+<tr>
+<td class="resume_header_entry">
+Number of high risk functions
+</td>
+<td class="resume_number_entry">
+9
+</td>
+</tr>
+<tr>
+<td class="resume_header_entry">
+Number of untestable functions
+</td>
+<td class="resume_number_entry">
+8
+</td>
+</tr>
+</table>
+<br/>
+<div class="section_title">Details for all functions</div>
+<p>Used ranges:</p>
+<table class="ranges_table">
+<tr>
+<td class="ranges_header_entry">
+
+</td>
+<td class="ranges_header_entry">
+Cyclomatic Complexity
+</td>
+<td class="ranges_header_entry">
+Risk Evaluation
+</td>
+</tr>
+<tr>
+<td class="ranges_entry_simple">
+
+</td>
+<td class="ranges_entry">
+0 - 10
+</td>
+<td class="ranges_entry">
+Simple module, without much risk
+</td>
+</tr>
+<tr>
+<td class="ranges_entry_moderate">
+
+</td>
+<td class="ranges_entry">
+11 - 20
+</td>
+<td class="ranges_entry">
+More complex module, moderate risk
+</td>
+</tr>
+<tr>
+<td class="ranges_entry_high">
+
+</td>
+<td class="ranges_entry">
+21 - 50
+</td>
+<td class="ranges_entry">
+Complex module, high risk
+</td>
+</tr>
+<tr>
+<td class="ranges_entry_untestable">
+
+</td>
+<td class="ranges_entry">
+greater than 50
+</td>
+<td class="ranges_entry">
+Untestable module, very high risk
+</td>
+</tr>
+</table>
+<br/>
+<table width="90%" class="function_table" cellpadding="0" cellspacing="0">
+<tr class="function_table_header">
+<td class="function_table_header_entry">
+
+</td>
+<td class="function_table_header_entry">
+Function Name
+</td>
+<td class="function_table_header_entry">
+Cyclomatic
+<br/>
+Complexity
+</td>
+<td class="function_table_header_entry">
+Number of
+<br/>
+Statements
+</td>
+<td class="function_table_header_entry">
+Number of
+<br/>
+Lines
+</td>
+<td class="function_table_header_entry">
+Source File
+</td>
+</tr>
+<tr class="function_entry_untestable">
+<td class="function_entry_filename">
+<a href="javascript:void(0);" title="show/hide function source" onClick="javascript:show_hide('asn1_der_decoding_element_src', 'asn1_der_decoding_element_button')"><span id="asn1_der_decoding_element_button">↓</span></a>
+</td>
+<td class="function_entry_name">
+asn1_der_decoding_element
+</td>
+<td class="function_entry_cyclo">
+154
+</td>
+<td class="function_entry_number">
+399
+</td>
+<td class="function_entry_number">
+738
+</td>
+<td class="function_entry_filename">
+<a href="http://git.savannah.gnu.org/gitweb/?p=libtasn1.git;a=blob;f=lib/decoding.c;hb=HEAD">lib/decoding.c</a>
+</td>
+</tr>
+<tr>
+<td colspan="6" height="0">
+<div id="asn1_der_decoding_element_src" class="function_src" style="position: relative; display: none;">
+<pre class="function_src">
+asn1_retCode
+asn1_der_decoding_element (ASN1_TYPE * structure, const char *elementName,
+ const void *ider, int len, char *errorDescription)
+{
+ ASN1_TYPE node, p, p2, p3, nodeFound = ASN1_TYPE_EMPTY;
+ char temp[128], currentName[ASN1_MAX_NAME_SIZE * 10], *dot_p, *char_p;
+ int nameLen = ASN1_MAX_NAME_SIZE * 10 - 1, state;
+ int counter, len2, len3, len4, move, ris, tlen;
+ unsigned char class, *temp2;
+ unsigned long tag;
+ int indefinite, result;
+ const unsigned char *der = ider;
+
+ node = *structure;
+
+ if (node == ASN1_TYPE_EMPTY)
+ return ASN1_ELEMENT_NOT_FOUND;
+
+ if (elementName == NULL)
+ {
+ asn1_delete_structure (structure);
+ return ASN1_ELEMENT_NOT_FOUND;
+ }
+
+ if (node->type & CONST_OPTION)
+ {
+ asn1_delete_structure (structure);
+ return ASN1_GENERIC_ERROR;
+ }
+
+ if ((*structure)->name)
+ { /* Has *structure got a name? */
+ nameLen -= strlen ((*structure)->name);
+ if (nameLen > 0)
+ strcpy (currentName, (*structure)->name);
+ else
+ {
+ asn1_delete_structure (structure);
+ return ASN1_MEM_ERROR;
+ }
+ if (!(strcmp (currentName, elementName)))
+ {
+ state = FOUND;
+ nodeFound = *structure;
+ }
+ else if (!memcmp (currentName, elementName, strlen (currentName)))
+ state = SAME_BRANCH;
+ else
+ state = OTHER_BRANCH;
+ }
+ else
+ { /* *structure doesn't have a name? */
+ currentName[0] = 0;
+ if (elementName[0] == 0)
+ {
+ state = FOUND;
+ nodeFound = *structure;
+ }
+ else
+ {
+ state = SAME_BRANCH;
+ }
+ }
+
+ counter = 0;
+ move = DOWN;
+ p = node;
+ while (1)
+ {
+
+ ris = ASN1_SUCCESS;
+
+ if (move != UP)
+ {
+ if (p->type & CONST_SET)
+ {
+ p2 = _asn1_find_up (p);
+ len2 = strtol (p2->value, NULL, 10);
+ if (counter == len2)
+ {
+ p = p2;
+ move = UP;
+ continue;
+ }
+ else if (counter > len2)
+ {
+ asn1_delete_structure (structure);
+ return ASN1_DER_ERROR;
+ }
+ p2 = p2->down;
+ while (p2)
+ {
+ if ((p2->type & CONST_SET) && (p2->type & CONST_NOT_USED))
+ {
+ if (type_field (p2->type) != TYPE_CHOICE)
+ ris =
+ _asn1_extract_tag_der (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;
+ p = p2;
+ break;
+ }
+ }
+ p2 = p2->right;
+ }
+ if (p2 == NULL)
+ {
+ asn1_delete_structure (structure);
+ return ASN1_DER_ERROR;
+ }
+ }
+
+ if ((p->type & CONST_OPTION) || (p->type & CONST_DEFAULT))
+ {
+ p2 = _asn1_find_up (p);
+ len2 = strtol (p2->value, NULL, 10);
+ if (counter == len2)
+ {
+ if (p->right)
+ {
+ p2 = p->right;
+ move = RIGHT;
+ }
+ else
+ move = UP;
+
+ if (p->type & CONST_OPTION)
+ asn1_delete_structure (&p);
+
+ p = p2;
+ continue;
+ }
+ }
+
+ if (type_field (p->type) == TYPE_CHOICE)
+ {
+ while (p->down)
+ {
+ if (counter < len)
+ ris =
+ _asn1_extract_tag_der (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);
+ }
+ break;
+ }
+ else if (ris == ASN1_ERROR_TYPE_ANY)
+ {
+ asn1_delete_structure (structure);
+ return ASN1_ERROR_TYPE_ANY;
+ }
+ else
+ {
+ p2 = p->down;
+ asn1_delete_structure (&p2);
+ }
+ }
+
+ if (p->down == NULL)
+ {
+ if (!(p->type & CONST_OPTION))
+ {
+ asn1_delete_structure (structure);
+ return ASN1_DER_ERROR;
+ }
+ }
+ else
+ p = p->down;
+ }
+
+ if ((p->type & CONST_OPTION) || (p->type & CONST_DEFAULT))
+ {
+ p2 = _asn1_find_up (p);
+ len2 = strtol (p2->value, NULL, 10);
+ if (counter > len2)
+ ris = ASN1_TAG_ERROR;
+ }
+
+ if (ris == ASN1_SUCCESS)
+ ris =
+ _asn1_extract_tag_der (p, der + counter, len - counter, &len2);
+ if (ris != ASN1_SUCCESS)
+ {
+ if (p->type & CONST_OPTION)
+ {
+ p->type |= CONST_NOT_USED;
+ move = RIGHT;
+ }
+ else if (p->type & CONST_DEFAULT)
+ {
+ _asn1_set_value (p, NULL, 0);
+ move = RIGHT;
+ }
+ else
+ {
+ if (errorDescription != NULL)
+ _asn1_error_description_tag_error (p, errorDescription);
+
+ asn1_delete_structure (structure);
+ return ASN1_TAG_ERROR;
+ }
+ }
+ else
+ counter += len2;
+ }
+
+ if (ris == ASN1_SUCCESS)
+ {
+ switch (type_field (p->type))
+ {
+ case TYPE_NULL:
+ if (der[counter])
+ {
+ asn1_delete_structure (structure);
+ return ASN1_DER_ERROR;
+ }
+
+ if (p == nodeFound)
+ state = EXIT;
+
+ counter++;
+ move = RIGHT;
+ break;
+ case TYPE_BOOLEAN:
+ if (der[counter++] != 1)
+ {
+ asn1_delete_structure (structure);
+ return ASN1_DER_ERROR;
+ }
+
+ if (state == FOUND)
+ {
+ if (der[counter++] == 0)
+ _asn1_set_value (p, "F", 1);
+ else
+ _asn1_set_value (p, "T", 1);
+
+ if (p == nodeFound)
+ state = EXIT;
+
+ }
+ else
+ counter++;
+
+ move = RIGHT;
+ break;
+ case TYPE_INTEGER:
+ case TYPE_ENUMERATED:
+ len2 =
+ asn1_get_length_der (der + counter, len - counter, &len3);
+ if (len2 < 0)
+ return ASN1_DER_ERROR;
+ if (state == FOUND)
+ {
+ if (len3 + len2 > len - counter)
+ return ASN1_DER_ERROR;
+ _asn1_set_value (p, der + counter, len3 + len2);
+
+ if (p == nodeFound)
+ state = EXIT;
+ }
+ counter += len3 + len2;
+ move = RIGHT;
+ break;
+ case TYPE_OBJECT_ID:
+ if (state == FOUND)
+ {
+ _asn1_get_objectid_der (der + counter, len - counter, &len2,
+ temp, sizeof (temp));
+ tlen = strlen (temp);
+
+ if (tlen > 0)
+ _asn1_set_value (p, temp, tlen + 1);
+
+ if (p == nodeFound)
+ state = EXIT;
+ }
+ else
+ {
+ len2 =
+ asn1_get_length_der (der + counter, len - counter, &len3);
+ if (len2 < 0)
+ return ASN1_DER_ERROR;
+ len2 += len3;
+ }
+
+ counter += len2;
+ move = RIGHT;
+ break;
+ case TYPE_TIME:
+ if (state == FOUND)
+ {
+ result =
+ _asn1_get_time_der (der + counter, len - counter, &len2,
+ temp, sizeof (temp) - 1);
+ if (result != ASN1_SUCCESS)
+ {
+ asn1_delete_structure (structure);
+ return result;
+ }
+
+ tlen = strlen (temp);
+ if (tlen > 0)
+ _asn1_set_value (p, temp, tlen + 1);
+
+ if (p == nodeFound)
+ state = EXIT;
+ }
+ else
+ {
+ len2 =
+ asn1_get_length_der (der + counter, len - counter, &len3);
+ if (len2 < 0)
+ return ASN1_DER_ERROR;
+ len2 += len3;
+ }
+
+ counter += len2;
+ move = RIGHT;
+ break;
+ case TYPE_OCTET_STRING:
+ len3 = len - counter;
+ if (state == FOUND)
+ {
+ ris = _asn1_get_octet_string (der + counter, p, &len3);
+ if (p == nodeFound)
+ state = EXIT;
+ }
+ else
+ ris = _asn1_get_octet_string (der + counter, NULL, &len3);
+
+ if (ris != ASN1_SUCCESS)
+ return ris;
+ counter += len3;
+ move = RIGHT;
+ break;
+ case TYPE_GENERALSTRING:
+ len2 =
+ asn1_get_length_der (der + counter, len - counter, &len3);
+ if (len2 < 0)
+ return ASN1_DER_ERROR;
+ if (state == FOUND)
+ {
+ if (len3 + len2 > len - counter)
+ return ASN1_DER_ERROR;
+ _asn1_set_value (p, der + counter, len3 + len2);
+
+ if (p == nodeFound)
+ state = EXIT;
+ }
+ counter += len3 + len2;
+ move = RIGHT;
+ break;
+ case TYPE_BIT_STRING:
+ len2 =
+ asn1_get_length_der (der + counter, len - counter, &len3);
+ if (len2 < 0)
+ return ASN1_DER_ERROR;
+ if (state == FOUND)
+ {
+ if (len3 + len2 > len - counter)
+ return ASN1_DER_ERROR;
+ _asn1_set_value (p, der + counter, len3 + len2);
+
+ if (p == nodeFound)
+ state = EXIT;
+ }
+ counter += len3 + len2;
+ move = RIGHT;
+ break;
+ case TYPE_SEQUENCE:
+ case TYPE_SET:
+ if (move == UP)
+ {
+ len2 = 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;
+ }
+ counter += 2;
+ }
+ else
+ { /* definite length method */
+ if (len2 != counter)
+ {
+ asn1_delete_structure (structure);
+ return ASN1_DER_ERROR;
+ }
+ }
+ if (p == nodeFound)
+ state = EXIT;
+ move = RIGHT;
+ }
+ else
+ { /* move==DOWN || move==RIGHT */
+ if (state == OTHER_BRANCH)
+ {
+ len3 =
+ asn1_get_length_der (der + counter, len - counter,
+ &len2);
+ if (len3 < 0)
+ return ASN1_DER_ERROR;
+ counter += len2 + len3;
+ move = RIGHT;
+ }
+ else
+ { /* state==SAME_BRANCH or state==FOUND */
+ len3 =
+ asn1_get_length_der (der + counter, len - counter,
+ &len2);
+ if (len3 < 0)
+ return ASN1_DER_ERROR;
+ counter += len2;
+ if (len3 > 0)
+ {
+ _asn1_ltostr (counter + len3, temp);
+ tlen = strlen (temp);
+
+ if (tlen > 0)
+ _asn1_set_value (p, temp, tlen + 1);
+ move = DOWN;
+ }
+ else if (len3 == 0)
+ {
+ p2 = p->down;
+ while (p2)
+ {
+ if (type_field (p2->type) != TYPE_TAG)
+ {
+ p3 = p2->right;
+ asn1_delete_structure (&p2);
+ p2 = p3;
+ }
+ else
+ p2 = p2->right;
+ }
+ move = RIGHT;
+ }
+ else
+ { /* indefinite length method */
+ _asn1_set_value (p, "-1", 3);
+ move = DOWN;
+ }
+ }
+ }
+ break;
+ case TYPE_SEQUENCE_OF:
+ case TYPE_SET_OF:
+ if (move == UP)
+ {
+ len2 = strtol (p->value, NULL, 10);
+ if (len2 > counter)
+ {
+ _asn1_append_sequence_set (p);
+ p = p->down;
+ while (p->right)
+ p = p->right;
+ move = RIGHT;
+ continue;
+ }
+ _asn1_set_value (p, NULL, 0);
+ if (len2 != counter)
+ {
+ asn1_delete_structure (structure);
+ return ASN1_DER_ERROR;
+ }
+
+ if (p == nodeFound)
+ state = EXIT;
+ }
+ else
+ { /* move==DOWN || move==RIGHT */
+ if (state == OTHER_BRANCH)
+ {
+ len3 =
+ asn1_get_length_der (der + counter, len - counter,
+ &len2);
+ if (len3 < 0)
+ return ASN1_DER_ERROR;
+ counter += len2 + len3;
+ move = RIGHT;
+ }
+ else
+ { /* state==FOUND or state==SAME_BRANCH */
+ len3 =
+ asn1_get_length_der (der + counter, len - counter,
+ &len2);
+ if (len3 < 0)
+ return ASN1_DER_ERROR;
+ counter += len2;
+ if (len3)
+ {
+ _asn1_ltostr (counter + len3, temp);
+ tlen = strlen (temp);
+
+ if (tlen > 0)
+ _asn1_set_value (p, temp, tlen + 1);
+ p2 = p->down;
+ while ((type_field (p2->type) == TYPE_TAG)
+ || (type_field (p2->type) == TYPE_SIZE))
+ p2 = p2->right;
+ if (p2->right == NULL)
+ _asn1_append_sequence_set (p);
+ p = p2;
+ state = FOUND;
+ }
+ }
+ }
+
+ break;
+ case TYPE_ANY:
+ if (asn1_get_tag_der
+ (der + counter, len - counter, &class, &len2,
+ &tag) != ASN1_SUCCESS)
+ return ASN1_DER_ERROR;
+ if (counter + len2 > len)
+ return ASN1_DER_ERROR;
+
+ len4 =
+ asn1_get_length_der (der + counter + len2,
+ len - counter - len2, &len3);
+ if (len4 < -1)
+ return ASN1_DER_ERROR;
+
+ if (len4 != -1)
+ {
+ len2 += len4;
+ if (state == FOUND)
+ {
+ _asn1_set_value_octet (p, der+counter, len2+len3);
+ temp2 = NULL;
+
+ if (p == nodeFound)
+ state = EXIT;
+ }
+ counter += len2 + len3;
+ }
+ else
+ { /* indefinite length */
+ /* Check indefinite lenth method in an EXPLICIT TAG */
+ if ((p->type & CONST_TAG) && (der[counter - 1] == 0x80))
+ indefinite = 1;
+ else
+ indefinite = 0;
+
+ len2 = len - counter;
+ ris =
+ _asn1_get_indefinite_length_string (der + counter, &len2);
+ if (ris != ASN1_SUCCESS)
+ {
+ asn1_delete_structure (structure);
+ return ris;
+ }
+
+ if (state == FOUND)
+ {
+ _asn1_set_value_octet (p, der+counter, len2);
+
+ if (p == nodeFound)
+ state = EXIT;
+ }
+
+ counter += len2;
+
+ /* Check if a couple of 0x00 are present due to an EXPLICIT TAG with
+ an indefinite length method. */
+ if (indefinite)
+ {
+ if (!der[counter] && !der[counter + 1])
+ {
+ counter += 2;
+ }
+ else
+ {
+ asn1_delete_structure (structure);
+ return ASN1_DER_ERROR;
+ }
+ }
+ }
+ move = RIGHT;
+ break;
+
+ default:
+ move = (move == UP) ? RIGHT : DOWN;
+ break;
+ }
+ }
+
+ if ((p == node && move != DOWN) || (state == EXIT))
+ break;
+
+ if (move == DOWN)
+ {
+ if (p->down)
+ {
+ p = p->down;
+
+ if (state != FOUND)
+ {
+ nameLen -= strlen (p->name) + 1;
+ if (nameLen > 0)
+ {
+ if (currentName[0])
+ strcat (currentName, ".");
+ strcat (currentName, p->name);
+ }
+ else
+ {
+ asn1_delete_structure (structure);
+ return ASN1_MEM_ERROR;
+ }
+ if (!(strcmp (currentName, elementName)))
+ {
+ state = FOUND;
+ nodeFound = p;
+ }
+ else
+ if (!memcmp
+ (currentName, elementName, strlen (currentName)))
+ state = SAME_BRANCH;
+ else
+ state = OTHER_BRANCH;
+ }
+ }
+ else
+ move = RIGHT;
+ }
+
+ if ((move == RIGHT) && !(p->type & CONST_SET))
+ {
+ if (p->right)
+ {
+ p = p->right;
+
+ if (state != FOUND)
+ {
+ dot_p = char_p = currentName;
+ while ((char_p = strchr (char_p, '.')))
+ {
+ dot_p = char_p++;
+ dot_p++;
+ }
+
+ nameLen += strlen (currentName) - (dot_p - currentName);
+ *dot_p = 0;
+
+ nameLen -= strlen (p->name);
+ if (nameLen > 0)
+ strcat (currentName, p->name);
+ else
+ {
+ asn1_delete_structure (structure);
+ return ASN1_MEM_ERROR;
+ }
+
+ if (!(strcmp (currentName, elementName)))
+ {
+ state = FOUND;
+ nodeFound = p;
+ }
+ else
+ if (!memcmp
+ (currentName, elementName, strlen (currentName)))
+ state = SAME_BRANCH;
+ else
+ state = OTHER_BRANCH;
+ }
+ }
+ else
+ move = UP;
+ }
+
+ if (move == UP)
+ {
+ p = _asn1_find_up (p);
+
+ if (state != FOUND)
+ {
+ dot_p = char_p = currentName;
+ while ((char_p = strchr (char_p, '.')))
+ {
+ dot_p = char_p++;
+ dot_p++;
+ }
+
+ nameLen += strlen (currentName) - (dot_p - currentName);
+ *dot_p = 0;
+
+ if (!(strcmp (currentName, elementName)))
+ {
+ state = FOUND;
+ nodeFound = p;
+ }
+ else
+ if (!memcmp (currentName, elementName, strlen (currentName)))
+ state = SAME_BRANCH;
+ else
+ state = OTHER_BRANCH;
+ }
+ }
+ }
+
+ _asn1_delete_not_used (*structure);
+
+ if (counter > len)
+ {
+ asn1_delete_structure (structure);
+ return ASN1_DER_ERROR;
+ }
+
+ return ASN1_SUCCESS;
+}
+</pre>
+</div>
+</td>
+</tr>
+<tr class="function_entry_untestable">
+<td class="function_entry_filename">
+<a href="javascript:void(0);" title="show/hide function source" onClick="javascript:show_hide('asn1_der_decoding_src', 'asn1_der_decoding_button')"><span id="asn1_der_decoding_button">↓</span></a>
+</td>
+<td class="function_entry_name">
+asn1_der_decoding
+</td>
+<td class="function_entry_cyclo">
+118
+</td>
+<td class="function_entry_number">
+301
+</td>
+<td class="function_entry_number">
+520
+</td>
+<td class="function_entry_filename">
+<a href="http://git.savannah.gnu.org/gitweb/?p=libtasn1.git;a=blob;f=lib/decoding.c;hb=HEAD">lib/decoding.c</a>
+</td>
+</tr>
+<tr>
+<td colspan="6" height="0">
+<div id="asn1_der_decoding_src" class="function_src" style="position: relative; display: none;">
+<pre class="function_src">
+asn1_retCode
+asn1_der_decoding (ASN1_TYPE * element, const void *ider, int len,
+ char *errorDescription)
+{
+ ASN1_TYPE node, p, p2, p3;
+ char temp[128];
+ int counter, len2, len3, len4, move, ris, tlen;
+ unsigned char class;
+ unsigned long tag;
+ int indefinite, result;
+ const unsigned char *der = ider;
+
+ node = *element;
+
+ if (node == ASN1_TYPE_EMPTY)
+ return ASN1_ELEMENT_NOT_FOUND;
+
+ if (node->type & CONST_OPTION)
+ {
+ asn1_delete_structure (element);
+ return ASN1_GENERIC_ERROR;
+ }
+
+ counter = 0;
+ move = DOWN;
+ p = node;
+ while (1)
+ {
+ ris = ASN1_SUCCESS;
+ if (move != UP)
+ {
+ if (p->type & CONST_SET)
+ {
+ p2 = _asn1_find_up (p);
+ len2 = strtol (p2->value, NULL, 10);
+ if (len2 == -1)
+ {
+ if (!der[counter] && !der[counter + 1])
+ {
+ p = p2;
+ move = UP;
+ counter += 2;
+ continue;
+ }
+ }
+ else if (counter == len2)
+ {
+ p = p2;
+ move = UP;
+ continue;
+ }
+ else if (counter > len2)
+ {
+ asn1_delete_structure (element);
+ return ASN1_DER_ERROR;
+ }
+ p2 = p2->down;
+ while (p2)
+ {
+ if ((p2->type & CONST_SET) && (p2->type & CONST_NOT_USED))
+ {
+ if (type_field (p2->type) != TYPE_CHOICE)
+ ris =
+ _asn1_extract_tag_der (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;
+ p = p2;
+ break;
+ }
+ }
+ p2 = p2->right;
+ }
+ if (p2 == NULL)
+ {
+ asn1_delete_structure (element);
+ return ASN1_DER_ERROR;
+ }
+ }
+
+ if ((p->type & CONST_OPTION) || (p->type & CONST_DEFAULT))
+ {
+ p2 = _asn1_find_up (p);
+ len2 = strtol (p2->value, NULL, 10);
+ if (counter == len2)
+ {
+ if (p->right)
+ {
+ p2 = p->right;
+ move = RIGHT;
+ }
+ else
+ move = UP;
+
+ if (p->type & CONST_OPTION)
+ asn1_delete_structure (&p);
+
+ p = p2;
+ continue;
+ }
+ }
+
+ if (type_field (p->type) == TYPE_CHOICE)
+ {
+ while (p->down)
+ {
+ if (counter < len)
+ ris =
+ _asn1_extract_tag_der (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);
+ }
+ break;
+ }
+ else if (ris == ASN1_ERROR_TYPE_ANY)
+ {
+ asn1_delete_structure (element);
+ return ASN1_ERROR_TYPE_ANY;
+ }
+ else
+ {
+ p2 = p->down;
+ asn1_delete_structure (&p2);
+ }
+ }
+
+ if (p->down == NULL)
+ {
+ if (!(p->type & CONST_OPTION))
+ {
+ asn1_delete_structure (element);
+ return ASN1_DER_ERROR;
+ }
+ }
+ else
+ p = p->down;
+ }
+
+ if ((p->type & CONST_OPTION) || (p->type & CONST_DEFAULT))
+ {
+ p2 = _asn1_find_up (p);
+ len2 = strtol (p2->value, NULL, 10);
+ if ((len2 != -1) && (counter > len2))
+ ris = ASN1_TAG_ERROR;
+ }
+
+ if (ris == ASN1_SUCCESS)
+ ris =
+ _asn1_extract_tag_der (p, der + counter, len - counter, &len2);
+ if (ris != ASN1_SUCCESS)
+ {
+ if (p->type & CONST_OPTION)
+ {
+ p->type |= CONST_NOT_USED;
+ move = RIGHT;
+ }
+ else if (p->type & CONST_DEFAULT)
+ {
+ _asn1_set_value (p, NULL, 0);
+ move = RIGHT;
+ }
+ else
+ {
+ if (errorDescription != NULL)
+ _asn1_error_description_tag_error (p, errorDescription);
+
+ asn1_delete_structure (element);
+ return ASN1_TAG_ERROR;
+ }
+ }
+ else
+ counter += len2;
+ }
+
+ if (ris == ASN1_SUCCESS)
+ {
+ switch (type_field (p->type))
+ {
+ case TYPE_NULL:
+ if (der[counter])
+ {
+ asn1_delete_structure (element);
+ return ASN1_DER_ERROR;
+ }
+ counter++;
+ move = RIGHT;
+ break;
+ case TYPE_BOOLEAN:
+ if (der[counter++] != 1)
+ {
+ asn1_delete_structure (element);
+ return ASN1_DER_ERROR;
+ }
+ if (der[counter++] == 0)
+ _asn1_set_value (p, "F", 1);
+ else
+ _asn1_set_value (p, "T", 1);
+ move = RIGHT;
+ break;
+ case TYPE_INTEGER:
+ case TYPE_ENUMERATED:
+ len2 =
+ asn1_get_length_der (der + counter, len - counter, &len3);
+ if (len2 < 0)
+ return ASN1_DER_ERROR;
+ if (len2 + len3 > len - counter)
+ return ASN1_DER_ERROR;
+ _asn1_set_value (p, der + counter, len3 + len2);
+ counter += len3 + len2;
+ move = RIGHT;
+ break;
+ case TYPE_OBJECT_ID:
+ _asn1_get_objectid_der (der + counter, len - counter, &len2,
+ temp, sizeof (temp));
+ tlen = strlen (temp);
+ if (tlen > 0)
+ _asn1_set_value (p, temp, tlen + 1);
+ counter += len2;
+ move = RIGHT;
+ break;
+ case TYPE_TIME:
+ result =
+ _asn1_get_time_der (der + counter, len - counter, &len2, temp,
+ sizeof (temp) - 1);
+ if (result != ASN1_SUCCESS)
+ {
+ asn1_delete_structure (element);
+ return result;
+ }
+ tlen = strlen (temp);
+ if (tlen > 0)
+ _asn1_set_value (p, temp, tlen + 1);
+ counter += len2;
+ move = RIGHT;
+ break;
+ case TYPE_OCTET_STRING:
+ len3 = len - counter;
+ ris = _asn1_get_octet_string (der + counter, p, &len3);
+ if (ris != ASN1_SUCCESS)
+ return ris;
+ counter += len3;
+ move = RIGHT;
+ break;
+ case TYPE_GENERALSTRING:
+ len2 =
+ asn1_get_length_der (der + counter, len - counter, &len3);
+ if (len2 < 0)
+ return ASN1_DER_ERROR;
+ if (len3 + len2 > len - counter)
+ return ASN1_DER_ERROR;
+ _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);
+ if (len2 < 0)
+ return ASN1_DER_ERROR;
+ if (len3 + len2 > len - counter)
+ return ASN1_DER_ERROR;
+ _asn1_set_value (p, der + counter, len3 + len2);
+ counter += len3 + len2;
+ move = RIGHT;
+ break;
+ case TYPE_SEQUENCE:
+ case TYPE_SET:
+ if (move == UP)
+ {
+ len2 = strtol (p->value, NULL, 10);
+ _asn1_set_value (p, NULL, 0);
+ if (len2 == -1)
+ { /* indefinite length method */
+ if (len - counter + 1 > 0)
+ {
+ if ((der[counter]) || der[counter + 1])
+ {
+ asn1_delete_structure (element);
+ return ASN1_DER_ERROR;
+ }
+ }
+ else
+ return ASN1_DER_ERROR;
+ counter += 2;
+ }
+ else
+ { /* definite length method */
+ if (len2 != counter)
+ {
+ asn1_delete_structure (element);
+ return ASN1_DER_ERROR;
+ }
+ }
+ move = RIGHT;
+ }
+ else
+ { /* move==DOWN || move==RIGHT */
+ len3 =
+ asn1_get_length_der (der + counter, len - counter, &len2);
+ if (len3 < -1)
+ return ASN1_DER_ERROR;
+ counter += len2;
+ if (len3 > 0)
+ {
+ _asn1_ltostr (counter + len3, temp);
+ tlen = strlen (temp);
+ if (tlen > 0)
+ _asn1_set_value (p, temp, tlen + 1);
+ move = DOWN;
+ }
+ else if (len3 == 0)
+ {
+ p2 = p->down;
+ while (p2)
+ {
+ if (type_field (p2->type) != TYPE_TAG)
+ {
+ p3 = p2->right;
+ asn1_delete_structure (&p2);
+ p2 = p3;
+ }
+ else
+ p2 = p2->right;
+ }
+ move = RIGHT;
+ }
+ else
+ { /* indefinite length method */
+ _asn1_set_value (p, "-1", 3);
+ move = DOWN;
+ }
+ }
+ break;
+ case TYPE_SEQUENCE_OF:
+ case TYPE_SET_OF:
+ if (move == UP)
+ {
+ len2 = strtol (p->value, NULL, 10);
+ if (len2 == -1)
+ { /* indefinite length method */
+ if ((counter + 2) > len)
+ return ASN1_DER_ERROR;
+ if ((der[counter]) || der[counter + 1])
+ {
+ _asn1_append_sequence_set (p);
+ p = p->down;
+ while (p->right)
+ p = p->right;
+ move = RIGHT;
+ continue;
+ }
+ _asn1_set_value (p, NULL, 0);
+ counter += 2;
+ }
+ else
+ { /* definite length method */
+ if (len2 > counter)
+ {
+ _asn1_append_sequence_set (p);
+ p = p->down;
+ while (p->right)
+ p = p->right;
+ move = RIGHT;
+ continue;
+ }
+ _asn1_set_value (p, NULL, 0);
+ if (len2 != counter)
+ {
+ asn1_delete_structure (element);
+ return ASN1_DER_ERROR;
+ }
+ }
+ }
+ else
+ { /* move==DOWN || move==RIGHT */
+ len3 =
+ asn1_get_length_der (der + counter, len - counter, &len2);
+ if (len3 < -1)
+ return ASN1_DER_ERROR;
+ counter += len2;
+ if (len3)
+ {
+ if (len3 > 0)
+ { /* definite length method */
+ _asn1_ltostr (counter + len3, temp);
+ tlen = strlen (temp);
+
+ if (tlen > 0)
+ _asn1_set_value (p, temp, tlen + 1);
+ }
+ else
+ { /* indefinite length method */
+ _asn1_set_value (p, "-1", 3);
+ }
+ p2 = p->down;
+ while ((type_field (p2->type) == TYPE_TAG)
+ || (type_field (p2->type) == TYPE_SIZE))
+ p2 = p2->right;
+ if (p2->right == NULL)
+ _asn1_append_sequence_set (p);
+ p = p2;
+ }
+ }
+ move = RIGHT;
+ break;
+ case TYPE_ANY:
+ if (asn1_get_tag_der
+ (der + counter, len - counter, &class, &len2,
+ &tag) != ASN1_SUCCESS)
+ return ASN1_DER_ERROR;
+ if (counter + len2 > len)
+ return ASN1_DER_ERROR;
+ len4 =
+ asn1_get_length_der (der + counter + len2,
+ len - counter - len2, &len3);
+ if (len4 < -1)
+ return ASN1_DER_ERROR;
+ if (len4 > len - counter + len2 + len3)
+ return ASN1_DER_ERROR;
+ if (len4 != -1)
+ {
+ len2 += len4;
+ _asn1_set_value_octet (p, der+counter, len2+len3);
+ counter += len2 + len3;
+ }
+ else
+ { /* indefinite length */
+ /* Check indefinite lenth method in an EXPLICIT TAG */
+ if ((p->type & CONST_TAG) && (der[counter - 1] == 0x80))
+ indefinite = 1;
+ else
+ indefinite = 0;
+
+ len2 = len - counter;
+ ris =
+ _asn1_get_indefinite_length_string (der + counter, &len2);
+ if (ris != ASN1_SUCCESS)
+ {
+ asn1_delete_structure (element);
+ return ris;
+ }
+
+ _asn1_set_value_octet (p, der+counter, len2);
+ counter += len2;
+
+ /* Check if a couple of 0x00 are present due to an EXPLICIT TAG with
+ an indefinite length method. */
+ if (indefinite)
+ {
+ if (!der[counter] && !der[counter + 1])
+ {
+ counter += 2;
+ }
+ else
+ {
+ asn1_delete_structure (element);
+ return ASN1_DER_ERROR;
+ }
+ }
+ }
+ move = RIGHT;
+ break;
+ default:
+ move = (move == UP) ? RIGHT : DOWN;
+ break;
+ }
+ }
+
+ if (p == node && move != DOWN)
+ break;
+
+ if (move == DOWN)
+ {
+ if (p->down)
+ p = p->down;
+ else
+ move = RIGHT;
+ }
+ if ((move == RIGHT) && !(p->type & CONST_SET))
+ {
+ if (p->right)
+ p = p->right;
+ else
+ move = UP;
+ }
+ if (move == UP)
+ p = _asn1_find_up (p);
+ }
+
+ _asn1_delete_not_used (*element);
+
+ if (counter != len)
+ {
+ asn1_delete_structure (element);
+ return ASN1_DER_ERROR;
+ }
+
+ return ASN1_SUCCESS;
+}
+</pre>
+</div>
+</td>
+</tr>
+<tr class="function_entry_untestable">
+<td class="function_entry_filename">
+<a href="javascript:void(0);" title="show/hide function source" onClick="javascript:show_hide('asn1_write_value_src', 'asn1_write_value_button')"><span id="asn1_write_value_button">↓</span></a>
+</td>
+<td class="function_entry_name">
+asn1_write_value
+</td>
+<td class="function_entry_cyclo">
+111
+</td>
+<td class="function_entry_number">
+208
+</td>
+<td class="function_entry_number">
+343
+</td>
+<td class="function_entry_filename">
+<a href="http://git.savannah.gnu.org/gitweb/?p=libtasn1.git;a=blob;f=lib/element.c;hb=HEAD">lib/element.c</a>
+</td>
+</tr>
+<tr>
+<td colspan="6" height="0">
+<div id="asn1_write_value_src" class="function_src" style="position: relative; display: none;">
+<pre class="function_src">
+asn1_retCode
+asn1_write_value (ASN1_TYPE node_root, const char *name,
+ const void *ivalue, int len)
+{
+ ASN1_TYPE node, p, p2;
+ unsigned char *temp, *value_temp = NULL, *default_temp = NULL;
+ int len2, k, k2, negative;
+ size_t i;
+ const unsigned char *value = ivalue;
+
+ node = asn1_find_node (node_root, name);
+ if (node == NULL)
+ return ASN1_ELEMENT_NOT_FOUND;
+
+ if ((node->type & CONST_OPTION) && (value == NULL) && (len == 0))
+ {
+ asn1_delete_structure (&node);
+ return ASN1_SUCCESS;
+ }
+
+ if ((type_field (node->type) == TYPE_SEQUENCE_OF) && (value == NULL)
+ && (len == 0))
+ {
+ p = node->down;
+ while ((type_field (p->type) == TYPE_TAG)
+ || (type_field (p->type) == TYPE_SIZE))
+ p = p->right;
+
+ while (p->right)
+ asn1_delete_structure (&p->right);
+
+ return ASN1_SUCCESS;
+ }
+
+ switch (type_field (node->type))
+ {
+ case TYPE_BOOLEAN:
+ if (!strcmp (value, "TRUE"))
+ {
+ if (node->type & CONST_DEFAULT)
+ {
+ p = node->down;
+ while (type_field (p->type) != TYPE_DEFAULT)
+ p = p->right;
+ if (p->type & CONST_TRUE)
+ _asn1_set_value (node, NULL, 0);
+ else
+ _asn1_set_value (node, "T", 1);
+ }
+ else
+ _asn1_set_value (node, "T", 1);
+ }
+ else if (!strcmp (value, "FALSE"))
+ {
+ if (node->type & CONST_DEFAULT)
+ {
+ p = node->down;
+ while (type_field (p->type) != TYPE_DEFAULT)
+ p = p->right;
+ if (p->type & CONST_FALSE)
+ _asn1_set_value (node, NULL, 0);
+ else
+ _asn1_set_value (node, "F", 1);
+ }
+ else
+ _asn1_set_value (node, "F", 1);
+ }
+ else
+ return ASN1_VALUE_NOT_VALID;
+ break;
+ case TYPE_INTEGER:
+ case TYPE_ENUMERATED:
+ if (len == 0)
+ {
+ if ((isdigit (value[0])) || (value[0] == '-'))
+ {
+ value_temp =
+ (unsigned char *) _asn1_malloc (SIZEOF_UNSIGNED_LONG_INT);
+ if (value_temp == NULL)
+ return ASN1_MEM_ALLOC_ERROR;
+
+ _asn1_convert_integer (value, value_temp,
+ SIZEOF_UNSIGNED_LONG_INT, &len);
+ }
+ else
+ { /* is an identifier like v1 */
+ if (!(node->type & CONST_LIST))
+ return ASN1_VALUE_NOT_VALID;
+ p = node->down;
+ while (p)
+ {
+ if (type_field (p->type) == TYPE_CONSTANT)
+ {
+ if ((p->name) && (!strcmp (p->name, value)))
+ {
+ value_temp =
+ (unsigned char *)
+ _asn1_malloc (SIZEOF_UNSIGNED_LONG_INT);
+ if (value_temp == NULL)
+ return ASN1_MEM_ALLOC_ERROR;
+
+ _asn1_convert_integer (p->value,
+ value_temp,
+ SIZEOF_UNSIGNED_LONG_INT,
+ &len);
+ break;
+ }
+ }
+ p = p->right;
+ }
+ if (p == NULL)
+ return ASN1_VALUE_NOT_VALID;
+ }
+ }
+ else
+ { /* len != 0 */
+ value_temp = (unsigned char *) _asn1_malloc (len);
+ if (value_temp == NULL)
+ return ASN1_MEM_ALLOC_ERROR;
+ memcpy (value_temp, value, len);
+ }
+
+
+ if (value_temp[0] & 0x80)
+ negative = 1;
+ else
+ negative = 0;
+
+ if (negative && (type_field (node->type) == TYPE_ENUMERATED))
+ {
+ _asn1_free (value_temp);
+ return ASN1_VALUE_NOT_VALID;
+ }
+
+ for (k = 0; k < len - 1; k++)
+ if (negative && (value_temp[k] != 0xFF))
+ break;
+ else if (!negative && value_temp[k])
+ break;
+
+ if ((negative && !(value_temp[k] & 0x80)) ||
+ (!negative && (value_temp[k] & 0x80)))
+ k--;
+
+ _asn1_set_value_octet (node, value_temp+k, len-k);
+
+ if (node->type & CONST_DEFAULT)
+ {
+ p = node->down;
+ while (type_field (p->type) != TYPE_DEFAULT)
+ p = p->right;
+ if ((isdigit (p->value[0])) || (p->value[0] == '-'))
+ {
+ default_temp =
+ (unsigned char *) _asn1_malloc (SIZEOF_UNSIGNED_LONG_INT);
+ if (default_temp == NULL)
+ {
+ _asn1_free (value_temp);
+ return ASN1_MEM_ALLOC_ERROR;
+ }
+
+ _asn1_convert_integer (p->value, default_temp,
+ SIZEOF_UNSIGNED_LONG_INT, &len2);
+ }
+ else
+ { /* is an identifier like v1 */
+ if (!(node->type & CONST_LIST))
+ {
+ _asn1_free (value_temp);
+ return ASN1_VALUE_NOT_VALID;
+ }
+ p2 = node->down;
+ while (p2)
+ {
+ if (type_field (p2->type) == TYPE_CONSTANT)
+ {
+ if ((p2->name) && (!strcmp (p2->name, p->value)))
+ {
+ default_temp =
+ (unsigned char *)
+ _asn1_malloc (SIZEOF_UNSIGNED_LONG_INT);
+ if (default_temp == NULL)
+ {
+ _asn1_free (value_temp);
+ return ASN1_MEM_ALLOC_ERROR;
+ }
+
+ _asn1_convert_integer (p2->value,
+ default_temp,
+ SIZEOF_UNSIGNED_LONG_INT,
+ &len2);
+ break;
+ }
+ }
+ p2 = p2->right;
+ }
+ if (p2 == NULL)
+ {
+ _asn1_free (value_temp);
+ return ASN1_VALUE_NOT_VALID;
+ }
+ }
+
+
+ if ((len - k) == len2)
+ {
+ for (k2 = 0; k2 < len2; k2++)
+ if (value_temp[k + k2] != default_temp[k2])
+ {
+ break;
+ }
+ if (k2 == len2)
+ _asn1_set_value (node, NULL, 0);
+ }
+ _asn1_free (default_temp);
+ }
+ _asn1_free (value_temp);
+ break;
+ case TYPE_OBJECT_ID:
+ for (i = 0; i < 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))
+ {
+ _asn1_set_value (node, NULL, 0);
+ break;
+ }
+ }
+ _asn1_set_value (node, value, strlen (value) + 1);
+ break;
+ case TYPE_TIME:
+ if (node->type & CONST_UTC)
+ {
+ if (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))
+ {
+ case 11:
+ if (value[10] != 'Z')
+ return ASN1_VALUE_NOT_VALID;
+ break;
+ case 13:
+ if ((!isdigit (value[10])) || (!isdigit (value[11])) ||
+ (value[12] != 'Z'))
+ return ASN1_VALUE_NOT_VALID;
+ break;
+ case 15:
+ if ((value[10] != '+') && (value[10] != '-'))
+ return ASN1_VALUE_NOT_VALID;
+ for (k = 11; k < 15; k++)
+ if (!isdigit (value[k]))
+ return ASN1_VALUE_NOT_VALID;
+ break;
+ case 17:
+ if ((!isdigit (value[10])) || (!isdigit (value[11])))
+ return ASN1_VALUE_NOT_VALID;
+ if ((value[12] != '+') && (value[12] != '-'))
+ return ASN1_VALUE_NOT_VALID;
+ for (k = 13; k < 17; k++)
+ if (!isdigit (value[k]))
+ return ASN1_VALUE_NOT_VALID;
+ break;
+ default:
+ return ASN1_VALUE_NOT_FOUND;
+ }
+ _asn1_set_value (node, value, strlen (value) + 1);
+ }
+ else
+ { /* GENERALIZED TIME */
+ if (value)
+ _asn1_set_value (node, value, strlen (value) + 1);
+ }
+ break;
+ case TYPE_OCTET_STRING:
+ if (len == 0)
+ len = strlen (value);
+ _asn1_set_value_octet (node, value, len);
+ break;
+ case TYPE_GENERALSTRING:
+ if (len == 0)
+ len = strlen (value);
+ _asn1_set_value_octet (node, value, len);
+ break;
+ case TYPE_BIT_STRING:
+ if (len == 0)
+ len = strlen (value);
+ asn1_length_der ((len >> 3) + 2, NULL, &len2);
+ temp = (unsigned char *) _asn1_malloc ((len >> 3) + 2 + len2);
+ if (temp == NULL)
+ return ASN1_MEM_ALLOC_ERROR;
+
+ asn1_bit_der (value, len, temp, &len2);
+ _asn1_set_value_m (node, temp, len2);
+ temp = NULL;
+ break;
+ case TYPE_CHOICE:
+ p = node->down;
+ while (p)
+ {
+ if (!strcmp (p->name, value))
+ {
+ p2 = node->down;
+ while (p2)
+ {
+ if (p2 != p)
+ {
+ asn1_delete_structure (&p2);
+ p2 = node->down;
+ }
+ else
+ p2 = p2->right;
+ }
+ break;
+ }
+ p = p->right;
+ }
+ if (!p)
+ return ASN1_ELEMENT_NOT_FOUND;
+ break;
+ case TYPE_ANY:
+ _asn1_set_value_octet (node, value, len);
+ break;
+ case TYPE_SEQUENCE_OF:
+ case TYPE_SET_OF:
+ if (strcmp (value, "NEW"))
+ return ASN1_VALUE_NOT_VALID;
+ _asn1_append_sequence_set (node);
+ break;
+ default:
+ return ASN1_ELEMENT_NOT_FOUND;
+ break;
+ }
+
+ return ASN1_SUCCESS;
+}
+</pre>
+</div>
+</td>
+</tr>
+<tr class="function_entry_untestable">
+<td class="function_entry_filename">
+<a href="javascript:void(0);" title="show/hide function source" onClick="javascript:show_hide('asn1_print_structure_src', 'asn1_print_structure_button')"><span id="asn1_print_structure_button">↓</span></a>
+</td>
+<td class="function_entry_name">
+asn1_print_structure
+</td>
+<td class="function_entry_cyclo">
+125
+</td>
+<td class="function_entry_number">
+235
+</td>
+<td class="function_entry_number">
+349
+</td>
+<td class="function_entry_filename">
+<a href="http://git.savannah.gnu.org/gitweb/?p=libtasn1.git;a=blob;f=lib/structure.c;hb=HEAD">lib/structure.c</a>
+</td>
+</tr>
+<tr>
+<td colspan="6" height="0">
+<div id="asn1_print_structure_src" class="function_src" style="position: relative; display: none;">
+<pre class="function_src">
+void
+asn1_print_structure (FILE * out, ASN1_TYPE structure, const char *name,
+ int mode)
+{
+ ASN1_TYPE p, root;
+ int k, indent = 0, len, len2, len3;
+
+ if (out == NULL)
+ return;
+
+ root = asn1_find_node (structure, name);
+
+ if (root == NULL)
+ return;
+
+ p = root;
+ while (p)
+ {
+ if (mode == ASN1_PRINT_ALL)
+ {
+ for (k = 0; k < indent; k++)
+ fprintf (out, " ");
+ fprintf (out, "name:");
+ if (p->name)
+ fprintf (out, "%s ", p->name);
+ else
+ fprintf (out, "NULL ");
+ }
+ else
+ {
+ switch (type_field (p->type))
+ {
+ case TYPE_CONSTANT:
+ case TYPE_TAG:
+ case TYPE_SIZE:
+ break;
+ default:
+ for (k = 0; k < indent; k++)
+ fprintf (out, " ");
+ fprintf (out, "name:");
+ if (p->name)
+ fprintf (out, "%s ", p->name);
+ else
+ fprintf (out, "NULL ");
+ }
+ }
+
+ if (mode != ASN1_PRINT_NAME)
+ {
+ switch (type_field (p->type))
+ {
+ case TYPE_CONSTANT:
+ if (mode == ASN1_PRINT_ALL)
+ fprintf (out, "type:CONST");
+ break;
+ case TYPE_TAG:
+ if (mode == ASN1_PRINT_ALL)
+ fprintf (out, "type:TAG");
+ break;
+ case TYPE_SIZE:
+ if (mode == ASN1_PRINT_ALL)
+ fprintf (out, "type:SIZE");
+ break;
+ case TYPE_DEFAULT:
+ fprintf (out, "type:DEFAULT");
+ break;
+ case TYPE_NULL:
+ fprintf (out, "type:NULL");
+ break;
+ case TYPE_IDENTIFIER:
+ fprintf (out, "type:IDENTIFIER");
+ break;
+ case TYPE_INTEGER:
+ fprintf (out, "type:INTEGER");
+ break;
+ case TYPE_ENUMERATED:
+ fprintf (out, "type:ENUMERATED");
+ break;
+ case TYPE_TIME:
+ fprintf (out, "type:TIME");
+ break;
+ case TYPE_BOOLEAN:
+ fprintf (out, "type:BOOLEAN");
+ break;
+ case TYPE_SEQUENCE:
+ fprintf (out, "type:SEQUENCE");
+ break;
+ case TYPE_BIT_STRING:
+ fprintf (out, "type:BIT_STR");
+ break;
+ case TYPE_OCTET_STRING:
+ fprintf (out, "type:OCT_STR");
+ break;
+ case TYPE_GENERALSTRING:
+ fprintf (out, "type:GENERALSTRING");
+ break;
+ case TYPE_SEQUENCE_OF:
+ fprintf (out, "type:SEQ_OF");
+ break;
+ case TYPE_OBJECT_ID:
+ fprintf (out, "type:OBJ_ID");
+ break;
+ case TYPE_ANY:
+ fprintf (out, "type:ANY");
+ break;
+ case TYPE_SET:
+ fprintf (out, "type:SET");
+ break;
+ case TYPE_SET_OF:
+ fprintf (out, "type:SET_OF");
+ break;
+ case TYPE_CHOICE:
+ fprintf (out, "type:CHOICE");
+ break;
+ case TYPE_DEFINITIONS:
+ fprintf (out, "type:DEFINITIONS");
+ break;
+ default:
+ break;
+ }
+ }
+
+ if ((mode == ASN1_PRINT_NAME_TYPE_VALUE) || (mode == ASN1_PRINT_ALL))
+ {
+ switch (type_field (p->type))
+ {
+ case TYPE_CONSTANT:
+ if (mode == ASN1_PRINT_ALL)
+ if (p->value)
+ fprintf (out, " value:%s", p->value);
+ break;
+ case TYPE_TAG:
+ if (mode == ASN1_PRINT_ALL)
+ if (p->value)
+ fprintf (out, " value:%s", p->value);
+ break;
+ case TYPE_SIZE:
+ if (mode == ASN1_PRINT_ALL)
+ if (p->value)
+ fprintf (out, " value:%s", p->value);
+ break;
+ case TYPE_DEFAULT:
+ if (p->value)
+ fprintf (out, " value:%s", p->value);
+ else if (p->type & CONST_TRUE)
+ fprintf (out, " value:TRUE");
+ else if (p->type & CONST_FALSE)
+ fprintf (out, " value:FALSE");
+ break;
+ case TYPE_IDENTIFIER:
+ if (p->value)
+ fprintf (out, " value:%s", p->value);
+ break;
+ case TYPE_INTEGER:
+ if (p->value)
+ {
+ len2 = -1;
+ len = asn1_get_length_der (p->value, p->value_len, &len2);
+ fprintf (out, " value:0x");
+ if (len > 0)
+ for (k = 0; k < len; k++)
+ fprintf (out, "%02x", (p->value)[k + len2]);
+ }
+ break;
+ case TYPE_ENUMERATED:
+ if (p->value)
+ {
+ len2 = -1;
+ len = asn1_get_length_der (p->value, p->value_len, &len2);
+ fprintf (out, " value:0x");
+ if (len > 0)
+ for (k = 0; k < len; k++)
+ fprintf (out, "%02x", (p->value)[k + len2]);
+ }
+ break;
+ case TYPE_TIME:
+ if (p->value)
+ fprintf (out, " value:%s", p->value);
+ break;
+ case TYPE_BOOLEAN:
+ if (p->value)
+ {
+ if (p->value[0] == 'T')
+ fprintf (out, " value:TRUE");
+ else if (p->value[0] == 'F')
+ fprintf (out, " value:FALSE");
+ }
+ break;
+ case TYPE_BIT_STRING:
+ if (p->value)
+ {
+ len2 = -1;
+ len = asn1_get_length_der (p->value, p->value_len, &len2);
+ if (len > 0)
+ {
+ fprintf (out, " value(%i):",
+ (len - 1) * 8 - (p->value[len2]));
+ for (k = 1; k < len; k++)
+ fprintf (out, "%02x", (p->value)[k + len2]);
+ }
+ }
+ break;
+ case TYPE_OCTET_STRING:
+ if (p->value)
+ {
+ len2 = -1;
+ len = asn1_get_length_der (p->value, p->value_len, &len2);
+ fprintf (out, " value:");
+ if (len > 0)
+ for (k = 0; k < len; k++)
+ fprintf (out, "%02x", (p->value)[k + len2]);
+ }
+ break;
+ case TYPE_GENERALSTRING:
+ if (p->value)
+ {
+ len2 = -1;
+ len = asn1_get_length_der (p->value, p->value_len, &len2);
+ fprintf (out, " value:");
+ if (len > 0)
+ for (k = 0; k < len; k++)
+ fprintf (out, "%02x", (p->value)[k + len2]);
+ }
+ break;
+ case TYPE_OBJECT_ID:
+ if (p->value)
+ fprintf (out, " value:%s", p->value);
+ break;
+ case TYPE_ANY:
+ if (p->value)
+ {
+ len3 = -1;
+ len2 = asn1_get_length_der (p->value, p->value_len, &len3);
+ fprintf (out, " value:");
+ if (len2 > 0)
+ for (k = 0; k < len2; k++)
+ fprintf (out, "%02x", (p->value)[k + len3]);
+ }
+ break;
+ case TYPE_SET:
+ case TYPE_SET_OF:
+ case TYPE_CHOICE:
+ case TYPE_DEFINITIONS:
+ case TYPE_SEQUENCE_OF:
+ case TYPE_SEQUENCE:
+ case TYPE_NULL:
+ break;
+ default:
+ break;
+ }
+ }
+
+ if (mode == ASN1_PRINT_ALL)
+ {
+ if (p->type & 0x1FFFFF00)
+ {
+ fprintf (out, " attr:");
+ if (p->type & CONST_UNIVERSAL)
+ fprintf (out, "UNIVERSAL,");
+ if (p->type & CONST_PRIVATE)
+ fprintf (out, "PRIVATE,");
+ if (p->type & CONST_APPLICATION)
+ fprintf (out, "APPLICATION,");
+ if (p->type & CONST_EXPLICIT)
+ fprintf (out, "EXPLICIT,");
+ if (p->type & CONST_IMPLICIT)
+ fprintf (out, "IMPLICIT,");
+ if (p->type & CONST_TAG)
+ fprintf (out, "TAG,");
+ if (p->type & CONST_DEFAULT)
+ fprintf (out, "DEFAULT,");
+ if (p->type & CONST_TRUE)
+ fprintf (out, "TRUE,");
+ if (p->type & CONST_FALSE)
+ fprintf (out, "FALSE,");
+ if (p->type & CONST_LIST)
+ fprintf (out, "LIST,");
+ if (p->type & CONST_MIN_MAX)
+ fprintf (out, "MIN_MAX,");
+ if (p->type & CONST_OPTION)
+ fprintf (out, "OPTION,");
+ if (p->type & CONST_1_PARAM)
+ fprintf (out, "1_PARAM,");
+ if (p->type & CONST_SIZE)
+ fprintf (out, "SIZE,");
+ if (p->type & CONST_DEFINED_BY)
+ fprintf (out, "DEF_BY,");
+ if (p->type & CONST_GENERALIZED)
+ fprintf (out, "GENERALIZED,");
+ if (p->type & CONST_UTC)
+ fprintf (out, "UTC,");
+ if (p->type & CONST_SET)
+ fprintf (out, "SET,");
+ if (p->type & CONST_NOT_USED)
+ fprintf (out, "NOT_USED,");
+ if (p->type & CONST_ASSIGN)
+ fprintf (out, "ASSIGNMENT,");
+ }
+ }
+
+ if (mode == ASN1_PRINT_ALL)
+ {
+ fprintf (out, "\n");
+ }
+ else
+ {
+ switch (type_field (p->type))
+ {
+ case TYPE_CONSTANT:
+ case TYPE_TAG:
+ case TYPE_SIZE:
+ break;
+ default:
+ fprintf (out, "\n");
+ }
+ }
+
+ if (p->down)
+ {
+ p = p->down;
+ indent += 2;
+ }
+ else if (p == root)
+ {
+ p = NULL;
+ break;
+ }
+ else if (p->right)
+ p = p->right;
+ else
+ {
+ while (1)
+ {
+ p = _asn1_find_up (p);
+ if (p == root)
+ {
+ p = NULL;
+ break;
+ }
+ indent -= 2;
+ if (p->right)
+ {
+ p = p->right;
+ break;
+ }
+ }
+ }
+ }
+}
+</pre>
+</div>
+</td>
+</tr>
+<tr class="function_entry_untestable">
+<td class="function_entry_filename">
+<a href="javascript:void(0);" title="show/hide function source" onClick="javascript:show_hide('asn1_der_decoding_startEnd_src', 'asn1_der_decoding_startEnd_button')"><span id="asn1_der_decoding_startEnd_button">↓</span></a>
+</td>
+<td class="function_entry_name">
+asn1_der_decoding_startEnd
+</td>
+<td class="function_entry_cyclo">
+85
+</td>
+<td class="function_entry_number">
+188
+</td>
+<td class="function_entry_number">
+320
+</td>
+<td class="function_entry_filename">
+<a href="http://git.savannah.gnu.org/gitweb/?p=libtasn1.git;a=blob;f=lib/decoding.c;hb=HEAD">lib/decoding.c</a>
+</td>
+</tr>
+<tr>
+<td colspan="6" height="0">
+<div id="asn1_der_decoding_startEnd_src" class="function_src" style="position: relative; display: none;">
+<pre class="function_src">
+asn1_retCode
+asn1_der_decoding_startEnd (ASN1_TYPE element, const void *ider, int len,
+ const char *name_element, int *start, int *end)
+{
+ ASN1_TYPE node, node_to_find, p, p2, p3;
+ int counter, len2, len3, len4, move, ris;
+ unsigned char class;
+ unsigned long tag;
+ int indefinite;
+ const unsigned char *der = ider;
+
+ node = element;
+
+ if (node == ASN1_TYPE_EMPTY)
+ return ASN1_ELEMENT_NOT_FOUND;
+
+ node_to_find = asn1_find_node (node, name_element);
+
+ if (node_to_find == NULL)
+ return ASN1_ELEMENT_NOT_FOUND;
+
+ if (node_to_find == node)
+ {
+ *start = 0;
+ *end = len - 1;
+ return ASN1_SUCCESS;
+ }
+
+ if (node->type & CONST_OPTION)
+ return ASN1_GENERIC_ERROR;
+
+ counter = 0;
+ move = DOWN;
+ p = node;
+ while (1)
+ {
+ ris = ASN1_SUCCESS;
+
+ if (move != UP)
+ {
+ if (p->type & CONST_SET)
+ {
+ p2 = _asn1_find_up (p);
+ len2 = strtol (p2->value, NULL, 10);
+ if (len2 == -1)
+ {
+ if (!der[counter] && !der[counter + 1])
+ {
+ p = p2;
+ move = UP;
+ counter += 2;
+ continue;
+ }
+ }
+ else if (counter == len2)
+ {
+ p = p2;
+ move = UP;
+ continue;
+ }
+ else if (counter > len2)
+ return ASN1_DER_ERROR;
+ p2 = p2->down;
+ while (p2)
+ {
+ if ((p2->type & CONST_SET) && (p2->type & CONST_NOT_USED))
+ { /* CONTROLLARE */
+ if (type_field (p2->type) != TYPE_CHOICE)
+ ris =
+ _asn1_extract_tag_der (p2, der + counter,
+ len - counter, &len2);
+ else
+ {
+ p3 = p2->down;
+ ris =
+ _asn1_extract_tag_der (p3, der + counter,
+ len - counter, &len2);
+ }
+ if (ris == ASN1_SUCCESS)
+ {
+ p2->type &= ~CONST_NOT_USED;
+ p = p2;
+ break;
+ }
+ }
+ p2 = p2->right;
+ }
+ if (p2 == NULL)
+ return ASN1_DER_ERROR;
+ }
+
+ if (p == node_to_find)
+ *start = counter;
+
+ if (type_field (p->type) == TYPE_CHOICE)
+ {
+ p = p->down;
+ ris =
+ _asn1_extract_tag_der (p, der + counter, len - counter,
+ &len2);
+ if (p == node_to_find)
+ *start = counter;
+ }
+
+ if (ris == ASN1_SUCCESS)
+ ris =
+ _asn1_extract_tag_der (p, der + counter, len - counter, &len2);
+ if (ris != ASN1_SUCCESS)
+ {
+ if (p->type & CONST_OPTION)
+ {
+ p->type |= CONST_NOT_USED;
+ move = RIGHT;
+ }
+ else if (p->type & CONST_DEFAULT)
+ {
+ move = RIGHT;
+ }
+ else
+ {
+ return ASN1_TAG_ERROR;
+ }
+ }
+ else
+ counter += len2;
+ }
+
+ if (ris == ASN1_SUCCESS)
+ {
+ switch (type_field (p->type))
+ {
+ case TYPE_NULL:
+ if (der[counter])
+ return ASN1_DER_ERROR;
+ counter++;
+ move = RIGHT;
+ break;
+ case TYPE_BOOLEAN:
+ if (der[counter++] != 1)
+ return ASN1_DER_ERROR;
+ counter++;
+ move = RIGHT;
+ break;
+ case TYPE_INTEGER:
+ case TYPE_ENUMERATED:
+ len2 =
+ asn1_get_length_der (der + counter, len - counter, &len3);
+ if (len2 < 0)
+ return ASN1_DER_ERROR;
+ counter += len3 + len2;
+ move = RIGHT;
+ break;
+ case TYPE_OBJECT_ID:
+ len2 =
+ asn1_get_length_der (der + counter, len - counter, &len3);
+ if (len2 < 0)
+ return ASN1_DER_ERROR;
+ counter += len2 + len3;
+ move = RIGHT;
+ break;
+ case TYPE_TIME:
+ len2 =
+ asn1_get_length_der (der + counter, len - counter, &len3);
+ if (len2 < 0)
+ return ASN1_DER_ERROR;
+ counter += len2 + len3;
+ move = RIGHT;
+ break;
+ case TYPE_OCTET_STRING:
+ len3 = len - counter;
+ ris = _asn1_get_octet_string (der + counter, NULL, &len3);
+ if (ris != ASN1_SUCCESS)
+ return ris;
+ counter += len3;
+ move = RIGHT;
+ break;
+ case TYPE_GENERALSTRING:
+ len2 =
+ asn1_get_length_der (der + counter, len - counter, &len3);
+ if (len2 < 0)
+ return ASN1_DER_ERROR;
+ counter += len3 + len2;
+ move = RIGHT;
+ break;
+ case TYPE_BIT_STRING:
+ len2 =
+ asn1_get_length_der (der + counter, len - counter, &len3);
+ if (len2 < 0)
+ return ASN1_DER_ERROR;
+ counter += len3 + len2;
+ move = RIGHT;
+ break;
+ case TYPE_SEQUENCE:
+ case TYPE_SET:
+ if (move != UP)
+ {
+ len3 =
+ asn1_get_length_der (der + counter, len - counter, &len2);
+ if (len3 < -1)
+ return ASN1_DER_ERROR;
+ counter += len2;
+ if (len3 == 0)
+ move = RIGHT;
+ else
+ move = DOWN;
+ }
+ else
+ {
+ if (!der[counter] && !der[counter + 1]) /* indefinite length method */
+ counter += 2;
+ move = RIGHT;
+ }
+ break;
+ case TYPE_SEQUENCE_OF:
+ case TYPE_SET_OF:
+ if (move != UP)
+ {
+ len3 =
+ asn1_get_length_der (der + counter, len - counter, &len2);
+ if (len3 < -1)
+ return ASN1_DER_ERROR;
+ counter += len2;
+ if ((len3 == -1) && !der[counter] && !der[counter + 1])
+ counter += 2;
+ else if (len3)
+ {
+ p2 = p->down;
+ while ((type_field (p2->type) == TYPE_TAG) ||
+ (type_field (p2->type) == TYPE_SIZE))
+ p2 = p2->right;
+ p = p2;
+ }
+ }
+ else
+ {
+ if (!der[counter] && !der[counter + 1]) /* indefinite length method */
+ counter += 2;
+ }
+ move = RIGHT;
+ break;
+ case TYPE_ANY:
+ if (asn1_get_tag_der
+ (der + counter, len - counter, &class, &len2,
+ &tag) != ASN1_SUCCESS)
+ return ASN1_DER_ERROR;
+ if (counter + len2 > len)
+ return ASN1_DER_ERROR;
+
+ len4 =
+ asn1_get_length_der (der + counter + len2,
+ len - counter - len2, &len3);
+ if (len4 < -1)
+ return ASN1_DER_ERROR;
+
+ if (len4 != -1)
+ {
+ counter += len2 + len4 + len3;
+ }
+ else
+ { /* indefinite length */
+ /* Check indefinite lenth method in an EXPLICIT TAG */
+ if ((p->type & CONST_TAG) && (der[counter - 1] == 0x80))
+ indefinite = 1;
+ else
+ indefinite = 0;
+
+ len2 = len - counter;
+ ris =
+ _asn1_get_indefinite_length_string (der + counter, &len2);
+ if (ris != ASN1_SUCCESS)
+ return ris;
+ counter += len2;
+
+ /* Check if a couple of 0x00 are present due to an EXPLICIT TAG with
+ an indefinite length method. */
+ if (indefinite)
+ {
+ if (!der[counter] && !der[counter + 1])
+ counter += 2;
+ else
+ return ASN1_DER_ERROR;
+ }
+ }
+ move = RIGHT;
+ break;
+ default:
+ move = (move == UP) ? RIGHT : DOWN;
+ break;
+ }
+ }
+
+ if ((p == node_to_find) && (move == RIGHT))
+ {
+ *end = counter - 1;
+ return ASN1_SUCCESS;
+ }
+
+ if (p == node && move != DOWN)
+ break;
+
+ if (move == DOWN)
+ {
+ if (p->down)
+ p = p->down;
+ else
+ move = RIGHT;
+ }
+ if ((move == RIGHT) && !(p->type & CONST_SET))
+ {
+ if (p->right)
+ p = p->right;
+ else
+ move = UP;
+ }
+ if (move == UP)
+ p = _asn1_find_up (p);
+ }
+
+ return ASN1_ELEMENT_NOT_FOUND;
+}
+</pre>
+</div>
+</td>
+</tr>
+<tr class="function_entry_untestable">
+<td class="function_entry_filename">
+<a href="javascript:void(0);" title="show/hide function source" onClick="javascript:show_hide('asn1_der_coding_src', 'asn1_der_coding_button')"><span id="asn1_der_coding_button">↓</span></a>
+</td>
+<td class="function_entry_name">
+asn1_der_coding
+</td>
+<td class="function_entry_cyclo">
+83
+</td>
+<td class="function_entry_number">
+226
+</td>
+<td class="function_entry_number">
+357
+</td>
+<td class="function_entry_filename">
+<a href="http://git.savannah.gnu.org/gitweb/?p=libtasn1.git;a=blob;f=lib/coding.c;hb=HEAD">lib/coding.c</a>
+</td>
+</tr>
+<tr>
+<td colspan="6" height="0">
+<div id="asn1_der_coding_src" class="function_src" style="position: relative; display: none;">
+<pre class="function_src">
+asn1_retCode
+asn1_der_coding (ASN1_TYPE element, const char *name, void *ider, int *len,
+ char *ErrorDescription)
+{
+ ASN1_TYPE node, p, p2;
+ 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;
+
+ node = asn1_find_node (element, name);
+ if (node == NULL)
+ return ASN1_ELEMENT_NOT_FOUND;
+
+ /* Node is now a locally allocated variable.
+ * That is because in some point we modify the
+ * structure, and I don't know why! --nmav
+ */
+ node = _asn1_copy_structure3 (node);
+ if (node == NULL)
+ return ASN1_ELEMENT_NOT_FOUND;
+
+ max_len = *len;
+
+ counter = 0;
+ move = DOWN;
+ p = node;
+ while (1)
+ {
+
+ counter_old = counter;
+ max_len_old = max_len;
+ if (move != UP)
+ {
+ err = _asn1_insert_tag_der (p, der, &counter, &max_len);
+ if (err != ASN1_SUCCESS && err != ASN1_MEM_ERROR)
+ goto error;
+ }
+ switch (type_field (p->type))
+ {
+ case TYPE_NULL:
+ max_len--;
+ if (max_len >= 0)
+ der[counter] = 0;
+ counter++;
+ move = RIGHT;
+ break;
+ case TYPE_BOOLEAN:
+ if ((p->type & CONST_DEFAULT) && (p->value == NULL))
+ {
+ counter = counter_old;
+ max_len = max_len_old;
+ }
+ else
+ {
+ if (p->value == NULL)
+ {
+ _asn1_error_description_value_not_found (p,
+ ErrorDescription);
+ err = ASN1_VALUE_NOT_FOUND;
+ goto error;
+ }
+ max_len -= 2;
+ if (max_len >= 0)
+ {
+ der[counter++] = 1;
+ if (p->value[0] == 'F')
+ der[counter++] = 0;
+ else
+ der[counter++] = 0xFF;
+ }
+ else
+ counter += 2;
+ }
+ move = RIGHT;
+ break;
+ case TYPE_INTEGER:
+ case TYPE_ENUMERATED:
+ if ((p->type & CONST_DEFAULT) && (p->value == NULL))
+ {
+ counter = counter_old;
+ max_len = max_len_old;
+ }
+ else
+ {
+ if (p->value == NULL)
+ {
+ _asn1_error_description_value_not_found (p,
+ ErrorDescription);
+ err = ASN1_VALUE_NOT_FOUND;
+ goto error;
+ }
+ len2 = asn1_get_length_der (p->value, p->value_len, &len3);
+ if (len2 < 0)
+ {
+ err = ASN1_DER_ERROR;
+ goto error;
+ }
+ max_len -= len2 + len3;
+ if (max_len >= 0)
+ memcpy (der + counter, p->value, len3 + len2);
+ counter += len3 + len2;
+ }
+ move = RIGHT;
+ break;
+ case TYPE_OBJECT_ID:
+ if ((p->type & CONST_DEFAULT) && (p->value == NULL))
+ {
+ counter = counter_old;
+ max_len = max_len_old;
+ }
+ else
+ {
+ if (p->value == NULL)
+ {
+ _asn1_error_description_value_not_found (p,
+ ErrorDescription);
+ err = ASN1_VALUE_NOT_FOUND;
+ goto error;
+ }
+ len2 = max_len;
+ err = _asn1_objectid_der (p->value, der + counter, &len2);
+ if (err != ASN1_SUCCESS && err != ASN1_MEM_ERROR)
+ goto error;
+
+ max_len -= len2;
+ counter += len2;
+ }
+ move = RIGHT;
+ break;
+ case TYPE_TIME:
+ if (p->value == NULL)
+ {
+ _asn1_error_description_value_not_found (p, ErrorDescription);
+ err = ASN1_VALUE_NOT_FOUND;
+ goto error;
+ }
+ len2 = max_len;
+ err = _asn1_time_der (p->value, der + counter, &len2);
+ if (err != ASN1_SUCCESS && err != ASN1_MEM_ERROR)
+ goto error;
+
+ max_len -= len2;
+ counter += len2;
+ move = RIGHT;
+ break;
+ case TYPE_OCTET_STRING:
+ if (p->value == NULL)
+ {
+ _asn1_error_description_value_not_found (p, ErrorDescription);
+ err = ASN1_VALUE_NOT_FOUND;
+ goto error;
+ }
+ len2 = asn1_get_length_der (p->value, p->value_len, &len3);
+ if (len2 < 0)
+ {
+ err = ASN1_DER_ERROR;
+ goto error;
+ }
+ max_len -= len2 + len3;
+ if (max_len >= 0)
+ memcpy (der + counter, p->value, len3 + len2);
+ counter += len3 + len2;
+ move = RIGHT;
+ break;
+ case TYPE_GENERALSTRING:
+ if (p->value == NULL)
+ {
+ _asn1_error_description_value_not_found (p, ErrorDescription);
+ err = ASN1_VALUE_NOT_FOUND;
+ goto error;
+ }
+ len2 = asn1_get_length_der (p->value, p->value_len, &len3);
+ if (len2 < 0)
+ {
+ err = ASN1_DER_ERROR;
+ goto error;
+ }
+ max_len -= len2 + len3;
+ if (max_len >= 0)
+ memcpy (der + counter, p->value, len3 + len2);
+ counter += len3 + len2;
+ move = RIGHT;
+ break;
+ case TYPE_BIT_STRING:
+ if (p->value == NULL)
+ {
+ _asn1_error_description_value_not_found (p, ErrorDescription);
+ err = ASN1_VALUE_NOT_FOUND;
+ goto error;
+ }
+ len2 = asn1_get_length_der (p->value, p->value_len, &len3);
+ if (len2 < 0)
+ {
+ err = ASN1_DER_ERROR;
+ goto error;
+ }
+ max_len -= len2 + len3;
+ if (max_len >= 0)
+ memcpy (der + counter, p->value, len3 + len2);
+ counter += len3 + len2;
+ move = RIGHT;
+ break;
+ case TYPE_SEQUENCE:
+ case TYPE_SET:
+ if (move != UP)
+ {
+ _asn1_ltostr (counter, temp);
+ tlen = strlen (temp);
+ if (tlen > 0)
+ _asn1_set_value (p, temp, tlen + 1);
+ if (p->down == NULL)
+ {
+ move = UP;
+ continue;
+ }
+ else
+ {
+ p2 = p->down;
+ while (p2 && (type_field (p2->type) == TYPE_TAG))
+ p2 = p2->right;
+ if (p2)
+ {
+ p = p2;
+ move = RIGHT;
+ continue;
+ }
+ move = UP;
+ continue;
+ }
+ }
+ else
+ { /* move==UP */
+ len2 = 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);
+ asn1_length_der (counter - len2, temp, &len3);
+ max_len -= len3;
+ if (max_len >= 0)
+ {
+ memmove (der + len2 + len3, der + len2, counter - len2);
+ memcpy (der + len2, temp, len3);
+ }
+ counter += len3;
+ move = RIGHT;
+ }
+ break;
+ case TYPE_SEQUENCE_OF:
+ case TYPE_SET_OF:
+ if (move != UP)
+ {
+ _asn1_ltostr (counter, temp);
+ tlen = strlen (temp);
+
+ if (tlen > 0)
+ _asn1_set_value (p, temp, tlen + 1);
+ p = p->down;
+ while ((type_field (p->type) == TYPE_TAG)
+ || (type_field (p->type) == TYPE_SIZE))
+ p = p->right;
+ if (p->right)
+ {
+ p = p->right;
+ move = RIGHT;
+ continue;
+ }
+ else
+ p = _asn1_find_up (p);
+ move = UP;
+ }
+ if (move == UP)
+ {
+ len2 = strtol (p->value, NULL, 10);
+ _asn1_set_value (p, NULL, 0);
+ if ((type_field (p->type) == TYPE_SET_OF)
+ && (max_len - len2 > 0))
+ {
+ _asn1_ordering_set_of (der + len2, max_len - len2, p);
+ }
+ asn1_length_der (counter - len2, temp, &len3);
+ max_len -= len3;
+ if (max_len >= 0)
+ {
+ memmove (der + len2 + len3, der + len2, counter - len2);
+ memcpy (der + len2, temp, len3);
+ }
+ counter += len3;
+ move = RIGHT;
+ }
+ break;
+ case TYPE_ANY:
+ if (p->value == NULL)
+ {
+ _asn1_error_description_value_not_found (p, ErrorDescription);
+ err = ASN1_VALUE_NOT_FOUND;
+ goto error;
+ }
+ len2 = asn1_get_length_der (p->value, p->value_len, &len3);
+ if (len2 < 0)
+ {
+ err = ASN1_DER_ERROR;
+ goto error;
+ }
+ max_len -= len2;
+ if (max_len >= 0)
+ memcpy (der + counter, p->value + len3, len2);
+ counter += len2;
+ move = RIGHT;
+ break;
+ default:
+ move = (move == UP) ? RIGHT : DOWN;
+ break;
+ }
+
+ if ((move != DOWN) && (counter != counter_old))
+ {
+ err = _asn1_complete_explicit_tag (p, der, &counter, &max_len);
+ if (err != ASN1_SUCCESS && err != ASN1_MEM_ERROR)
+ goto error;
+ }
+
+ if (p == node && move != DOWN)
+ break;
+
+ if (move == DOWN)
+ {
+ if (p->down)
+ p = p->down;
+ else
+ move = RIGHT;
+ }
+ if (move == RIGHT)
+ {
+ if (p->right)
+ p = p->right;
+ else
+ move = UP;
+ }
+ if (move == UP)
+ p = _asn1_find_up (p);
+ }
+
+ *len = counter;
+
+ if (max_len < 0)
+ {
+ err = ASN1_MEM_ERROR;
+ goto error;
+ }
+
+ err = ASN1_SUCCESS;
+
+error:
+ asn1_delete_structure (&node);
+ return err;
+}
+</pre>
+</div>
+</td>
+</tr>
+<tr class="function_entry_untestable">
+<td class="function_entry_filename">
+<a href="javascript:void(0);" title="show/hide function source" onClick="javascript:show_hide('_asn1_extract_tag_der_src', '_asn1_extract_tag_der_button')"><span id="_asn1_extract_tag_der_button">↓</span></a>
+</td>
+<td class="function_entry_name">
+_asn1_extract_tag_der
+</td>
+<td class="function_entry_cyclo">
+74
+</td>
+<td class="function_entry_number">
+105
+</td>
+<td class="function_entry_number">
+197
+</td>
+<td class="function_entry_filename">
+<a href="http://git.savannah.gnu.org/gitweb/?p=libtasn1.git;a=blob;f=lib/decoding.c;hb=HEAD">lib/decoding.c</a>
+</td>
+</tr>
+<tr>
+<td colspan="6" height="0">
+<div id="_asn1_extract_tag_der_src" class="function_src" style="position: relative; display: none;">
+<pre class="function_src">
+static int
+_asn1_extract_tag_der (ASN1_TYPE node, const unsigned char *der, int der_len,
+ int *ret_len)
+{
+ ASN1_TYPE p;
+ int counter, len2, len3, is_tag_implicit;
+ unsigned long tag, tag_implicit = 0;
+ unsigned char class, class2, class_implicit = 0;
+
+ if (der_len <= 0)
+ return ASN1_GENERIC_ERROR;
+
+ counter = is_tag_implicit = 0;
+
+ if (node->type & CONST_TAG)
+ {
+ p = node->down;
+ while (p)
+ {
+ if (type_field (p->type) == TYPE_TAG)
+ {
+ if (p->type & CONST_APPLICATION)
+ class2 = ASN1_CLASS_APPLICATION;
+ else if (p->type & CONST_UNIVERSAL)
+ class2 = ASN1_CLASS_UNIVERSAL;
+ else if (p->type & CONST_PRIVATE)
+ class2 = ASN1_CLASS_PRIVATE;
+ else
+ class2 = ASN1_CLASS_CONTEXT_SPECIFIC;
+
+ if (p->type & CONST_EXPLICIT)
+ {
+ if (asn1_get_tag_der
+ (der + counter, der_len - counter, &class, &len2,
+ &tag) != ASN1_SUCCESS)
+ return ASN1_DER_ERROR;
+
+ if (counter + len2 > der_len)
+ return ASN1_DER_ERROR;
+ counter += len2;
+
+ len3 =
+ asn1_get_length_ber (der + counter, der_len - counter,
+ &len2);
+ if (len3 < 0)
+ return ASN1_DER_ERROR;
+
+ counter += len2;
+ if (counter > der_len)
+ return ASN1_DER_ERROR;
+
+ if (!is_tag_implicit)
+ {
+ if ((class != (class2 | ASN1_CLASS_STRUCTURED)) ||
+ (tag != strtoul ((char *) p->value, NULL, 10)))
+ return ASN1_TAG_ERROR;
+ }
+ else
+ { /* ASN1_TAG_IMPLICIT */
+ if ((class != class_implicit) || (tag != tag_implicit))
+ return ASN1_TAG_ERROR;
+ }
+ is_tag_implicit = 0;
+ }
+ else
+ { /* ASN1_TAG_IMPLICIT */
+ if (!is_tag_implicit)
+ {
+ if ((type_field (node->type) == TYPE_SEQUENCE) ||
+ (type_field (node->type) == TYPE_SEQUENCE_OF) ||
+ (type_field (node->type) == TYPE_SET) ||
+ (type_field (node->type) == TYPE_SET_OF))
+ class2 |= ASN1_CLASS_STRUCTURED;
+ class_implicit = class2;
+ tag_implicit = strtoul ((char *) p->value, NULL, 10);
+ is_tag_implicit = 1;
+ }
+ }
+ }
+ p = p->right;
+ }
+ }
+
+ if (is_tag_implicit)
+ {
+ if (asn1_get_tag_der
+ (der + counter, der_len - counter, &class, &len2,
+ &tag) != ASN1_SUCCESS)
+ return ASN1_DER_ERROR;
+ if (counter + len2 > der_len)
+ return ASN1_DER_ERROR;
+
+ if ((class != class_implicit) || (tag != tag_implicit))
+ {
+ if (type_field (node->type) == TYPE_OCTET_STRING)
+ {
+ class_implicit |= ASN1_CLASS_STRUCTURED;
+ if ((class != class_implicit) || (tag != tag_implicit))
+ return ASN1_TAG_ERROR;
+ }
+ else
+ return ASN1_TAG_ERROR;
+ }
+ }
+ else
+ {
+ if (type_field (node->type) == TYPE_TAG)
+ {
+ counter = 0;
+ *ret_len = counter;
+ return ASN1_SUCCESS;
+ }
+
+ if (asn1_get_tag_der
+ (der + counter, der_len - counter, &class, &len2,
+ &tag) != ASN1_SUCCESS)
+ return ASN1_DER_ERROR;
+
+ if (counter + len2 > der_len)
+ return ASN1_DER_ERROR;
+
+ switch (type_field (node->type))
+ {
+ case TYPE_NULL:
+ if ((class != ASN1_CLASS_UNIVERSAL) || (tag != ASN1_TAG_NULL))
+ return ASN1_DER_ERROR;
+ break;
+ case TYPE_BOOLEAN:
+ if ((class != ASN1_CLASS_UNIVERSAL) || (tag != ASN1_TAG_BOOLEAN))
+ return ASN1_DER_ERROR;
+ break;
+ case TYPE_INTEGER:
+ if ((class != ASN1_CLASS_UNIVERSAL) || (tag != ASN1_TAG_INTEGER))
+ return ASN1_DER_ERROR;
+ break;
+ case TYPE_ENUMERATED:
+ if ((class != ASN1_CLASS_UNIVERSAL) || (tag != ASN1_TAG_ENUMERATED))
+ return ASN1_DER_ERROR;
+ break;
+ case TYPE_OBJECT_ID:
+ if ((class != ASN1_CLASS_UNIVERSAL) || (tag != ASN1_TAG_OBJECT_ID))
+ return ASN1_DER_ERROR;
+ break;
+ case TYPE_TIME:
+ if (node->type & CONST_UTC)
+ {
+ if ((class != ASN1_CLASS_UNIVERSAL)
+ || (tag != ASN1_TAG_UTCTime))
+ return ASN1_DER_ERROR;
+ }
+ else
+ {
+ if ((class != ASN1_CLASS_UNIVERSAL)
+ || (tag != ASN1_TAG_GENERALIZEDTime))
+ return ASN1_DER_ERROR;
+ }
+ break;
+ case TYPE_OCTET_STRING:
+ if (((class != ASN1_CLASS_UNIVERSAL)
+ && (class != (ASN1_CLASS_UNIVERSAL | ASN1_CLASS_STRUCTURED)))
+ || (tag != ASN1_TAG_OCTET_STRING))
+ return ASN1_DER_ERROR;
+ break;
+ case TYPE_GENERALSTRING:
+ if ((class != ASN1_CLASS_UNIVERSAL)
+ || (tag != ASN1_TAG_GENERALSTRING))
+ return ASN1_DER_ERROR;
+ break;
+ case TYPE_BIT_STRING:
+ if ((class != ASN1_CLASS_UNIVERSAL) || (tag != ASN1_TAG_BIT_STRING))
+ return ASN1_DER_ERROR;
+ break;
+ case TYPE_SEQUENCE:
+ case TYPE_SEQUENCE_OF:
+ if ((class != (ASN1_CLASS_UNIVERSAL | ASN1_CLASS_STRUCTURED))
+ || (tag != ASN1_TAG_SEQUENCE))
+ return ASN1_DER_ERROR;
+ break;
+ case TYPE_SET:
+ case TYPE_SET_OF:
+ if ((class != (ASN1_CLASS_UNIVERSAL | ASN1_CLASS_STRUCTURED))
+ || (tag != ASN1_TAG_SET))
+ return ASN1_DER_ERROR;
+ break;
+ case TYPE_ANY:
+ counter -= len2;
+ break;
+ default:
+ return ASN1_DER_ERROR;
+ break;
+ }
+ }
+
+ counter += len2;
+ *ret_len = counter;
+ return ASN1_SUCCESS;
+}
+</pre>
+</div>
+</td>
+</tr>
+<tr class="function_entry_untestable">
+<td class="function_entry_filename">
+<a href="javascript:void(0);" title="show/hide function source" onClick="javascript:show_hide('yyparse_src', 'yyparse_button')"><span id="yyparse_button">↓</span></a>
+</td>
+<td class="function_entry_name">
+yyparse
+</td>
+<td class="function_entry_cyclo">
+145
+</td>
+<td class="function_entry_number">
+431
+</td>
+<td class="function_entry_number">
+1015
+</td>
+<td class="function_entry_filename">
+<a href="http://git.savannah.gnu.org/gitweb/?p=libtasn1.git;a=blob;f=lib/ASN1.c;hb=HEAD">lib/ASN1.c</a>
+</td>
+</tr>
+<tr>
+<td colspan="6" height="0">
+<div id="yyparse_src" class="function_src" style="position: relative; display: none;">
+<pre class="function_src">
+int
+yyparse (void *YYPARSE_PARAM)
+#else
+int
+yyparse (YYPARSE_PARAM)
+ void *YYPARSE_PARAM;
+#endif
+#else /* ! YYPARSE_PARAM */
+#if (defined __STDC__ || defined __C99__FUNC__ \
+ || defined __cplusplus || defined _MSC_VER)
+int
+yyparse (void)
+#else
+int
+yyparse ()
+
+#endif
+#endif
+{
+
+ int yystate;
+ int yyn;
+ int yyresult;
+ /* Number of tokens to shift before error messages enabled. */
+ int yyerrstatus;
+ /* Look-ahead token as an internal (translated) token number. */
+ int yytoken = 0;
+#if YYERROR_VERBOSE
+ /* Buffer for error messages, and its allocated size. */
+ char yymsgbuf[128];
+ char *yymsg = yymsgbuf;
+ YYSIZE_T yymsg_alloc = sizeof yymsgbuf;
+#endif
+
+ /* Three stacks and their tools:
+ `yyss': related to states,
+ `yyvs': related to semantic values,
+ `yyls': related to locations.
+
+ Refer to the stacks thru separate pointers, to allow yyoverflow
+ to reallocate them elsewhere. */
+
+ /* The state stack. */
+ yytype_int16 yyssa[YYINITDEPTH];
+ yytype_int16 *yyss = yyssa;
+ yytype_int16 *yyssp;
+
+ /* The semantic value stack. */
+ YYSTYPE yyvsa[YYINITDEPTH];
+ YYSTYPE *yyvs = yyvsa;
+ YYSTYPE *yyvsp;
+
+
+
+#define YYPOPSTACK(N) (yyvsp -= (N), yyssp -= (N))
+
+ YYSIZE_T yystacksize = YYINITDEPTH;
+
+ /* The variables used to return semantic value and location from the
+ action routines. */
+ YYSTYPE yyval;
+
+
+ /* The number of symbols on the RHS of the reduced rule.
+ Keep to zero when no symbol should be popped. */
+ int yylen = 0;
+
+ YYDPRINTF ((stderr, "Starting parse\n"));
+
+ yystate = 0;
+ yyerrstatus = 0;
+ yynerrs = 0;
+ yychar = YYEMPTY; /* Cause a token to be read. */
+
+ /* Initialize stack pointers.
+ Waste one element of value and location stack
+ so that they stay on the same level as the state stack.
+ The wasted elements are never initialized. */
+
+ yyssp = yyss;
+ yyvsp = yyvs;
+
+ goto yysetstate;
+
+/*------------------------------------------------------------.
+| yynewstate -- Push a new state, which is found in yystate. |
+`------------------------------------------------------------*/
+ yynewstate:
+ /* In all cases, when you get here, the value and location stacks
+ have just been pushed. So pushing a state here evens the stacks. */
+ yyssp++;
+
+ yysetstate:
+ *yyssp = yystate;
+
+ if (yyss + yystacksize - 1 <= yyssp)
+ {
+ /* Get the current used size of the three stacks, in elements. */
+ YYSIZE_T yysize = yyssp - yyss + 1;
+
+#ifdef yyoverflow
+ {
+ /* Give user a chance to reallocate the stack. Use copies of
+ these so that the &'s don't force the real ones into
+ memory. */
+ YYSTYPE *yyvs1 = yyvs;
+ yytype_int16 *yyss1 = yyss;
+
+
+ /* Each stack pointer address is followed by the size of the
+ data in use in that stack, in bytes. This used to be a
+ conditional around just the two extra args, but that might
+ be undefined if yyoverflow is a macro. */
+ yyoverflow (YY_("memory exhausted"),
+ &yyss1, yysize * sizeof (*yyssp),
+ &yyvs1, yysize * sizeof (*yyvsp),
+
+ &yystacksize);
+
+ yyss = yyss1;
+ yyvs = yyvs1;
+ }
+#else /* no yyoverflow */
+# ifndef YYSTACK_RELOCATE
+ goto yyexhaustedlab;
+# else
+ /* Extend the stack our own way. */
+ if (YYMAXDEPTH <= yystacksize)
+ goto yyexhaustedlab;
+ yystacksize *= 2;
+ if (YYMAXDEPTH < yystacksize)
+ yystacksize = YYMAXDEPTH;
+
+ {
+ yytype_int16 *yyss1 = yyss;
+ union yyalloc *yyptr =
+ (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize));
+ if (! yyptr)
+ goto yyexhaustedlab;
+ YYSTACK_RELOCATE (yyss);
+ YYSTACK_RELOCATE (yyvs);
+
+# undef YYSTACK_RELOCATE
+ if (yyss1 != yyssa)
+ YYSTACK_FREE (yyss1);
+ }
+# endif
+#endif /* no yyoverflow */
+
+ yyssp = yyss + yysize - 1;
+ yyvsp = yyvs + yysize - 1;
+
+
+ YYDPRINTF ((stderr, "Stack size increased to %lu\n",
+ (unsigned long int) yystacksize));
+
+ if (yyss + yystacksize - 1 <= yyssp)
+ YYABORT;
+ }
+
+ YYDPRINTF ((stderr, "Entering state %d\n", yystate));
+
+ goto yybackup;
+
+/*-----------.
+| yybackup. |
+`-----------*/
+yybackup:
+
+ /* Do appropriate processing given the current state. Read a
+ look-ahead token if we need one and don't already have one. */
+
+ /* First try to decide what to do without reference to look-ahead token. */
+ yyn = yypact[yystate];
+ if (yyn == YYPACT_NINF)
+ goto yydefault;
+
+ /* Not known => get a look-ahead token if don't already have one. */
+
+ /* YYCHAR is either YYEMPTY or YYEOF or a valid look-ahead symbol. */
+ if (yychar == YYEMPTY)
+ {
+ YYDPRINTF ((stderr, "Reading a token: "));
+ yychar = YYLEX;
+ }
+
+ if (yychar <= YYEOF)
+ {
+ yychar = yytoken = YYEOF;
+ YYDPRINTF ((stderr, "Now at end of input.\n"));
+ }
+ else
+ {
+ yytoken = YYTRANSLATE (yychar);
+ YY_SYMBOL_PRINT ("Next token is", yytoken, &yylval, &yylloc);
+ }
+
+ /* If the proper action on seeing token YYTOKEN is to reduce or to
+ detect an error, take that action. */
+ yyn += yytoken;
+ if (yyn < 0 || YYLAST < yyn || yycheck[yyn] != yytoken)
+ goto yydefault;
+ yyn = yytable[yyn];
+ if (yyn <= 0)
+ {
+ if (yyn == 0 || yyn == YYTABLE_NINF)
+ goto yyerrlab;
+ yyn = -yyn;
+ goto yyreduce;
+ }
+
+ if (yyn == YYFINAL)
+ YYACCEPT;
+
+ /* Count tokens shifted since error; after three, turn off error
+ status. */
+ if (yyerrstatus)
+ yyerrstatus--;
+
+ /* Shift the look-ahead token. */
+ YY_SYMBOL_PRINT ("Shifting", yytoken, &yylval, &yylloc);
+
+ /* Discard the shifted token unless it is eof. */
+ if (yychar != YYEOF)
+ yychar = YYEMPTY;
+
+ yystate = yyn;
+ *++yyvsp = yylval;
+
+ goto yynewstate;
+
+
+/*-----------------------------------------------------------.
+| yydefault -- do the default action for the current state. |
+`-----------------------------------------------------------*/
+yydefault:
+ yyn = yydefact[yystate];
+ if (yyn == 0)
+ goto yyerrlab;
+ goto yyreduce;
+
+
+/*-----------------------------.
+| yyreduce -- Do a reduction. |
+`-----------------------------*/
+yyreduce:
+ /* yyn is the number of a rule to reduce with. */
+ yylen = yyr2[yyn];
+
+ /* If YYLEN is nonzero, implement the default value of the action:
+ `$$ = $1'.
+
+ Otherwise, the following line sets YYVAL to garbage.
+ This behavior is undocumented and Bison
+ users should not rely upon it. Assigning to YYVAL
+ unconditionally makes the parser a bit smaller, and it avoids a
+ GCC warning that YYVAL may be used uninitialized. */
+ yyval = yyvsp[1-yylen];
+
+
+ YY_REDUCE_PRINT (yyn);
+ switch (yyn)
+ {
+ case 2:
+#line 127 "ASN1.y"
+ {(yyval.node)=_asn1_add_node(TYPE_DEFINITIONS|(yyvsp[(3) - (8)].constant));
+ _asn1_set_name((yyval.node),_asn1_get_name((yyvsp[(1) - (8)].node)));
+ _asn1_set_name((yyvsp[(1) - (8)].node),"");
+ _asn1_set_right((yyvsp[(1) - (8)].node),(yyvsp[(7) - (8)].node));
+ _asn1_set_down((yyval.node),(yyvsp[(1) - (8)].node));
+
+ p_tree=(yyval.node);
+ }
+ break;
+
+ case 3:
+#line 137 "ASN1.y"
+ {strcpy((yyval.str),(yyvsp[(1) - (1)].str));}
+ break;
+
+ case 4:
+#line 138 "ASN1.y"
+ {strcpy((yyval.str),(yyvsp[(2) - (2)].str));}
+ break;
+
+ case 5:
+#line 141 "ASN1.y"
+ {strcpy((yyval.str),"-");
+ strcat((yyval.str),(yyvsp[(2) - (2)].str));}
+ break;
+
+ case 6:
+#line 145 "ASN1.y"
+ {strcpy((yyval.str),(yyvsp[(1) - (1)].str));}
+ break;
+
+ case 7:
+#line 146 "ASN1.y"
+ {strcpy((yyval.str),(yyvsp[(1) - (1)].str));}
+ break;
+
+ case 8:
+#line 149 "ASN1.y"
+ {strcpy((yyval.str),(yyvsp[(1) - (1)].str));}
+ break;
+
+ case 9:
+#line 150 "ASN1.y"
+ {strcpy((yyval.str),(yyvsp[(1) - (1)].str));}
+ break;
+
+ case 10:
+#line 153 "ASN1.y"
+ {strcpy((yyval.str),(yyvsp[(1) - (1)].str));}
+ break;
+
+ case 11:
+#line 154 "ASN1.y"
+ {strcpy((yyval.str),(yyvsp[(1) - (1)].str));}
+ break;
+
+ case 12:
+#line 157 "ASN1.y"
+ {(yyval.node)=_asn1_add_node(TYPE_CONSTANT);
+ _asn1_set_value((yyval.node),(yyvsp[(2) - (3)].str),strlen((yyvsp[(2) - (3)].str))+1);}
+ break;
+
+ case 13:
+#line 159 "ASN1.y"
+ {(yyval.node)=_asn1_add_node(TYPE_CONSTANT);
+ _asn1_set_name((yyval.node),(yyvsp[(1) - (4)].str));
+ _asn1_set_value((yyval.node),(yyvsp[(3) - (4)].str),strlen((yyvsp[(3) - (4)].str))+1);}
+ break;
+
+ case 14:
+#line 164 "ASN1.y"
+ {(yyval.node)=(yyvsp[(1) - (1)].node);}
+ break;
+
+ case 15:
+#line 165 "ASN1.y"
+ {(yyval.node)=(yyvsp[(1) - (3)].node);
+ _asn1_set_right(_asn1_get_last_right((yyvsp[(1) - (3)].node)),(yyvsp[(3) - (3)].node));}
+ break;
+
+ case 16:
+#line 169 "ASN1.y"
+ {(yyval.node)=_asn1_add_node(TYPE_CONSTANT);
+ _asn1_set_value((yyval.node),(yyvsp[(1) - (1)].str),strlen((yyvsp[(1) - (1)].str))+1);}
+ break;
+
+ case 17:
+#line 171 "ASN1.y"
+ {(yyval.node)=_asn1_add_node(TYPE_CONSTANT);
+ _asn1_set_name((yyval.node),(yyvsp[(1) - (4)].str));
+ _asn1_set_value((yyval.node),(yyvsp[(3) - (4)].str),strlen((yyvsp[(3) - (4)].str))+1);}
+ break;
+
+ case 18:
+#line 176 "ASN1.y"
+ {(yyval.node)=(yyvsp[(1) - (1)].node);}
+ break;
+
+ case 19:
+#line 177 "ASN1.y"
+ {(yyval.node)=(yyvsp[(1) - (2)].node);
+ _asn1_set_right(_asn1_get_last_right((yyvsp[(1) - (2)].node)),(yyvsp[(2) - (2)].node));}
+ break;
+
+ case 20:
+#line 181 "ASN1.y"
+ {(yyval.constant)=CONST_UNIVERSAL;}
+ break;
+
+ case 21:
+#line 182 "ASN1.y"
+ {(yyval.constant)=CONST_PRIVATE;}
+ break;
+
+ case 22:
+#line 183 "ASN1.y"
+ {(yyval.constant)=CONST_APPLICATION;}
+ break;
+
+ case 23:
+#line 186 "ASN1.y"
+ {(yyval.node)=_asn1_add_node(TYPE_TAG);
+ _asn1_set_value((yyval.node),(yyvsp[(2) - (3)].str),strlen((yyvsp[(2) - (3)].str))+1);}
+ break;
+
+ case 24:
+#line 188 "ASN1.y"
+ {(yyval.node)=_asn1_add_node(TYPE_TAG | (yyvsp[(2) - (4)].constant));
+ _asn1_set_value((yyval.node),(yyvsp[(3) - (4)].str),strlen((yyvsp[(3) - (4)].str))+1);}
+ break;
+
+ case 25:
+#line 192 "ASN1.y"
+ {(yyval.node)=(yyvsp[(1) - (1)].node);}
+ break;
+
+ case 26:
+#line 193 "ASN1.y"
+ {(yyval.node)=_asn1_mod_type((yyvsp[(1) - (2)].node),CONST_EXPLICIT);}
+ break;
+
+ case 27:
+#line 194 "ASN1.y"
+ {(yyval.node)=_asn1_mod_type((yyvsp[(1) - (2)].node),CONST_IMPLICIT);}
+ break;
+
+ case 28:
+#line 197 "ASN1.y"
+ {(yyval.node)=_asn1_add_node(TYPE_DEFAULT);
+ _asn1_set_value((yyval.node),(yyvsp[(2) - (2)].str),strlen((yyvsp[(2) - (2)].str))+1);}
+ break;
+
+ case 29:
+#line 199 "ASN1.y"
+ {(yyval.node)=_asn1_add_node(TYPE_DEFAULT|CONST_TRUE);}
+ break;
+
+ case 30:
+#line 200 "ASN1.y"
+ {(yyval.node)=_asn1_add_node(TYPE_DEFAULT|CONST_FALSE);}
+ break;
+
+ case 33:
+#line 209 "ASN1.y"
+ {(yyval.node)=_asn1_add_node(TYPE_INTEGER);}
+ break;
+
+ case 34:
+#line 210 "ASN1.y"
+ {(yyval.node)=_asn1_add_node(TYPE_INTEGER|CONST_LIST);
+ _asn1_set_down((yyval.node),(yyvsp[(3) - (4)].node));}
+ break;
+
+ case 35:
+#line 212 "ASN1.y"
+ {(yyval.node)=_asn1_add_node(TYPE_INTEGER);}
+ break;
+
+ case 36:
+#line 214 "ASN1.y"
+ {(yyval.node)=_asn1_add_node(TYPE_INTEGER|CONST_MIN_MAX);
+ _asn1_set_down((yyval.node),_asn1_add_node(TYPE_SIZE));
+ _asn1_set_value(_asn1_get_down((yyval.node)),(yyvsp[(6) - (7)].str),strlen((yyvsp[(6) - (7)].str))+1);
+ _asn1_set_name(_asn1_get_down((yyval.node)),(yyvsp[(3) - (7)].str));}
+ break;
+
+ case 37:
+#line 220 "ASN1.y"
+ {(yyval.node)=_asn1_add_node(TYPE_BOOLEAN);}
+ break;
+
+ case 38:
+#line 223 "ASN1.y"
+ {(yyval.node)=_asn1_add_node(TYPE_TIME|CONST_UTC);}
+ break;
+
+ case 39:
+#line 224 "ASN1.y"
+ {(yyval.node)=_asn1_add_node(TYPE_TIME|CONST_GENERALIZED);}
+ break;
+
+ case 40:
+#line 227 "ASN1.y"
+ {(yyval.node)=_asn1_add_node(TYPE_SIZE|CONST_1_PARAM);
+ _asn1_set_value((yyval.node),(yyvsp[(3) - (4)].str),strlen((yyvsp[(3) - (4)].str))+1);}
+ break;
+
+ case 41:
+#line 230 "ASN1.y"
+ {(yyval.node)=_asn1_add_node(TYPE_SIZE|CONST_MIN_MAX);
+ _asn1_set_value((yyval.node),(yyvsp[(3) - (7)].str),strlen((yyvsp[(3) - (7)].str))+1);
+ _asn1_set_name((yyval.node),(yyvsp[(6) - (7)].str));}
+ break;
+
+ case 42:
+#line 235 "ASN1.y"
+ {(yyval.node)=(yyvsp[(1) - (1)].node);}
+ break;
+
+ case 43:
+#line 236 "ASN1.y"
+ {(yyval.node)=(yyvsp[(2) - (3)].node);}
+ break;
+
+ case 44:
+#line 239 "ASN1.y"
+ {(yyval.node)=_asn1_add_node(TYPE_GENERALSTRING);}
+ break;
+
+ case 45:
+#line 240 "ASN1.y"
+ {(yyval.node)=_asn1_add_node(TYPE_GENERALSTRING|CONST_SIZE);
+ _asn1_set_down((yyval.node),(yyvsp[(2) - (2)].node));}
+ break;
+
+ case 46:
+#line 244 "ASN1.y"
+ {(yyval.node)=_asn1_add_node(TYPE_OCTET_STRING);}
+ break;
+
+ case 47:
+#line 245 "ASN1.y"
+ {(yyval.node)=_asn1_add_node(TYPE_OCTET_STRING|CONST_SIZE);
+ _asn1_set_down((yyval.node),(yyvsp[(3) - (3)].node));}
+ break;
+
+ case 48:
+#line 249 "ASN1.y"
+ {(yyval.node)=_asn1_add_node(TYPE_CONSTANT);
+ _asn1_set_name((yyval.node),(yyvsp[(1) - (4)].str));
+ _asn1_set_value((yyval.node),(yyvsp[(3) - (4)].str),strlen((yyvsp[(3) - (4)].str))+1);}
+ break;
+
+ case 49:
+#line 254 "ASN1.y"
+ {(yyval.node)=(yyvsp[(1) - (1)].node);}
+ break;
+
+ case 50:
+#line 255 "ASN1.y"
+ {(yyval.node)=(yyvsp[(1) - (3)].node);
+ _asn1_set_right(_asn1_get_last_right((yyvsp[(1) - (3)].node)),(yyvsp[(3) - (3)].node));}
+ break;
+
+ case 51:
+#line 259 "ASN1.y"
+ {(yyval.node)=_asn1_add_node(TYPE_BIT_STRING);}
+ break;
+
+ case 52:
+#line 260 "ASN1.y"
+ {(yyval.node)=_asn1_add_node(TYPE_BIT_STRING|CONST_SIZE);}
+ break;
+
+ case 53:
+#line 262 "ASN1.y"
+ {(yyval.node)=_asn1_add_node(TYPE_BIT_STRING|CONST_LIST);
+ _asn1_set_down((yyval.node),(yyvsp[(4) - (5)].node));}
+ break;
+
+ case 54:
+#line 267 "ASN1.y"
+ {(yyval.node)=_asn1_add_node(TYPE_ENUMERATED|CONST_LIST);
+ _asn1_set_down((yyval.node),(yyvsp[(3) - (4)].node));}
+ break;
+
+ case 55:
+#line 272 "ASN1.y"
+ {(yyval.node)=_asn1_add_node(TYPE_OBJECT_ID);}
+ break;
+
+ case 56:
+#line 275 "ASN1.y"
+ {(yyval.node)=_asn1_add_node(TYPE_IDENTIFIER);
+ _asn1_set_value((yyval.node),(yyvsp[(1) - (1)].str),strlen((yyvsp[(1) - (1)].str))+1);}
+ break;
+
+ case 57:
+#line 277 "ASN1.y"
+ {(yyval.node)=_asn1_add_node(TYPE_IDENTIFIER|CONST_SIZE);
+ _asn1_set_value((yyval.node),(yyvsp[(1) - (2)].str),strlen((yyvsp[(1) - (2)].str))+1);
+ _asn1_set_down((yyval.node),(yyvsp[(2) - (2)].node));}
+ break;
+
+ case 58:
+#line 280 "ASN1.y"
+ {(yyval.node)=(yyvsp[(1) - (1)].node);}
+ break;
+
+ case 59:
+#line 281 "ASN1.y"
+ {(yyval.node)=(yyvsp[(1) - (1)].node);}
+ break;
+
+ case 60:
+#line 282 "ASN1.y"
+ {(yyval.node)=(yyvsp[(1) - (1)].node);}
+ break;
+
+ case 62:
+#line 284 "ASN1.y"
+ {(yyval.node)=(yyvsp[(1) - (1)].node);}
+ break;
+
+ case 63:
+#line 285 "ASN1.y"
+ {(yyval.node)=(yyvsp[(1) - (1)].node);}
+ break;
+
+ case 64:
+#line 286 "ASN1.y"
+ {(yyval.node)=(yyvsp[(1) - (1)].node);}
+ break;
+
+ case 65:
+#line 287 "ASN1.y"
+ {(yyval.node)=(yyvsp[(1) - (1)].node);}
+ break;
+
+ case 66:
+#line 288 "ASN1.y"
+ {(yyval.node)=(yyvsp[(1) - (1)].node);}
+ break;
+
+ case 67:
+#line 289 "ASN1.y"
+ {(yyval.node)=(yyvsp[(1) - (1)].node);}
+ break;
+
+ case 68:
+#line 290 "ASN1.y"
+ {(yyval.node)=(yyvsp[(1) - (1)].node);}
+ break;
+
+ case 69:
+#line 291 "ASN1.y"
+ {(yyval.node)=(yyvsp[(1) - (1)].node);}
+ break;
+
+ case 70:
+#line 292 "ASN1.y"
+ {(yyval.node)=_asn1_add_node(TYPE_NULL);}
+ break;
+
+ case 71:
+#line 295 "ASN1.y"
+ {(yyval.node)=(yyvsp[(1) - (1)].node);}
+ break;
+
+ case 72:
+#line 296 "ASN1.y"
+ {(yyval.node)=_asn1_mod_type((yyvsp[(2) - (2)].node),CONST_TAG);
+ _asn1_set_right((yyvsp[(1) - (2)].node),_asn1_get_down((yyval.node)));
+ _asn1_set_down((yyval.node),(yyvsp[(1) - (2)].node));}
+ break;
+
+ case 73:
+#line 301 "ASN1.y"
+ {(yyval.node)=(yyvsp[(1) - (1)].node);}
+ break;
+
+ case 74:
+#line 302 "ASN1.y"
+ {(yyval.node)=_asn1_mod_type((yyvsp[(1) - (2)].node),CONST_DEFAULT);
+ _asn1_set_right((yyvsp[(2) - (2)].node),_asn1_get_down((yyval.node)));
+ _asn1_set_down((yyval.node),(yyvsp[(2) - (2)].node));}
+ break;
+
+ case 75:
+#line 305 "ASN1.y"
+ {(yyval.node)=_asn1_mod_type((yyvsp[(1) - (2)].node),CONST_OPTION);}
+ break;
+
+ case 76:
+#line 308 "ASN1.y"
+ {(yyval.node)=_asn1_set_name((yyvsp[(2) - (2)].node),(yyvsp[(1) - (2)].str));}
+ break;
+
+ case 77:
+#line 311 "ASN1.y"
+ {(yyval.node)=(yyvsp[(1) - (1)].node);}
+ break;
+
+ case 78:
+#line 312 "ASN1.y"
+ {(yyval.node)=(yyvsp[(1) - (3)].node);
+ _asn1_set_right(_asn1_get_last_right((yyvsp[(1) - (3)].node)),(yyvsp[(3) - (3)].node));}
+ break;
+
+ case 79:
+#line 316 "ASN1.y"
+ {(yyval.node)=_asn1_add_node(TYPE_SEQUENCE);
+ _asn1_set_down((yyval.node),(yyvsp[(3) - (4)].node));}
+ break;
+
+ case 80:
+#line 318 "ASN1.y"
+ {(yyval.node)=_asn1_add_node(TYPE_SEQUENCE_OF);
+ _asn1_set_down((yyval.node),(yyvsp[(3) - (3)].node));}
+ break;
+
+ case 81:
+#line 320 "ASN1.y"
+ {(yyval.node)=_asn1_add_node(TYPE_SEQUENCE_OF|CONST_SIZE);
+ _asn1_set_right((yyvsp[(2) - (4)].node),(yyvsp[(4) - (4)].node));
+ _asn1_set_down((yyval.node),(yyvsp[(2) - (4)].node));}
+ break;
+
+ case 82:
+#line 325 "ASN1.y"
+ {(yyval.node)=_asn1_add_node(TYPE_SET);
+ _asn1_set_down((yyval.node),(yyvsp[(3) - (4)].node));}
+ break;
+
+ case 83:
+#line 327 "ASN1.y"
+ {(yyval.node)=_asn1_add_node(TYPE_SET_OF);
+ _asn1_set_down((yyval.node),(yyvsp[(3) - (3)].node));}
+ break;
+
+ case 84:
+#line 329 "ASN1.y"
+ {(yyval.node)=_asn1_add_node(TYPE_SET_OF|CONST_SIZE);
+ _asn1_set_right((yyvsp[(2) - (4)].node),(yyvsp[(4) - (4)].node));
+ _asn1_set_down((yyval.node),(yyvsp[(2) - (4)].node));}
+ break;
+
+ case 85:
+#line 334 "ASN1.y"
+ {(yyval.node)=_asn1_add_node(TYPE_CHOICE);
+ _asn1_set_down((yyval.node),(yyvsp[(3) - (4)].node));}
+ break;
+
+ case 86:
+#line 338 "ASN1.y"
+ {(yyval.node)=_asn1_add_node(TYPE_ANY);}
+ break;
+
+ case 87:
+#line 339 "ASN1.y"
+ {(yyval.node)=_asn1_add_node(TYPE_ANY|CONST_DEFINED_BY);
+ _asn1_set_down((yyval.node),_asn1_add_node(TYPE_CONSTANT));
+ _asn1_set_name(_asn1_get_down((yyval.node)),(yyvsp[(4) - (4)].str));}
+ break;
+
+ case 88:
+#line 344 "ASN1.y"
+ {(yyval.node)=_asn1_set_name((yyvsp[(3) - (3)].node),(yyvsp[(1) - (3)].str));}
+ break;
+
+ case 89:
+#line 348 "ASN1.y"
+ {(yyval.node)=_asn1_add_node(TYPE_OBJECT_ID|CONST_ASSIGN);
+ _asn1_set_name((yyval.node),(yyvsp[(1) - (7)].str));
+ _asn1_set_down((yyval.node),(yyvsp[(6) - (7)].node));}
+ break;
+
+ case 90:
+#line 352 "ASN1.y"
+ {(yyval.node)=_asn1_add_node(TYPE_OBJECT_ID|CONST_ASSIGN|CONST_1_PARAM);
+ _asn1_set_name((yyval.node),(yyvsp[(1) - (6)].str));
+ _asn1_set_value((yyval.node),(yyvsp[(2) - (6)].str),strlen((yyvsp[(2) - (6)].str))+1);
+ _asn1_set_down((yyval.node),(yyvsp[(5) - (6)].node));}
+ break;
+
+ case 91:
+#line 357 "ASN1.y"
+ {(yyval.node)=_asn1_add_node(TYPE_INTEGER|CONST_ASSIGN);
+ _asn1_set_name((yyval.node),(yyvsp[(1) - (4)].str));
+ _asn1_set_value((yyval.node),(yyvsp[(4) - (4)].str),strlen((yyvsp[(4) - (4)].str))+1);}
+ break;
+
+ case 92:
+#line 362 "ASN1.y"
+ {(yyval.node)=(yyvsp[(1) - (1)].node);}
+ break;
+
+ case 93:
+#line 363 "ASN1.y"
+ {(yyval.node)=(yyvsp[(1) - (1)].node);}
+ break;
+
+ case 94:
+#line 366 "ASN1.y"
+ {(yyval.node)=(yyvsp[(1) - (1)].node);}
+ break;
+
+ case 95:
+#line 367 "ASN1.y"
+ {(yyval.node)=(yyvsp[(1) - (2)].node);
+ _asn1_set_right(_asn1_get_last_right((yyvsp[(1) - (2)].node)),(yyvsp[(2) - (2)].node));}
+ break;
+
+ case 96:
+#line 371 "ASN1.y"
+ {(yyval.node)=_asn1_add_node(TYPE_OBJECT_ID);
+ _asn1_set_down((yyval.node),(yyvsp[(3) - (4)].node));
+ _asn1_set_name((yyval.node),(yyvsp[(1) - (4)].str));}
+ break;
+
+ case 97:
+#line 374 "ASN1.y"
+ {(yyval.node)=_asn1_add_node(TYPE_OBJECT_ID);
+ _asn1_set_name((yyval.node),(yyvsp[(1) - (3)].str));}
+ break;
+
+ case 98:
+#line 398 "ASN1.y"
+ {(yyval.constant)=CONST_EXPLICIT;}
+ break;
+
+ case 99:
+#line 399 "ASN1.y"
+ {(yyval.constant)=CONST_IMPLICIT;}
+ break;
+
+
+/* Line 1267 of yacc.c. */
+#line 2141 "ASN1.c"
+ default: break;
+ }
+ YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc);
+
+ YYPOPSTACK (yylen);
+ yylen = 0;
+ YY_STACK_PRINT (yyss, yyssp);
+
+ *++yyvsp = yyval;
+
+
+ /* Now `shift' the result of the reduction. Determine what state
+ that goes to, based on the state we popped back to and the rule
+ number reduced by. */
+
+ yyn = yyr1[yyn];
+
+ yystate = yypgoto[yyn - YYNTOKENS] + *yyssp;
+ if (0 <= yystate && yystate <= YYLAST && yycheck[yystate] == *yyssp)
+ yystate = yytable[yystate];
+ else
+ yystate = yydefgoto[yyn - YYNTOKENS];
+
+ goto yynewstate;
+
+
+/*------------------------------------.
+| yyerrlab -- here on detecting error |
+`------------------------------------*/
+yyerrlab:
+ /* If not already recovering from an error, report this error. */
+ if (!yyerrstatus)
+ {
+ ++yynerrs;
+#if ! YYERROR_VERBOSE
+ yyerror (YY_("syntax error"));
+#else
+ {
+ YYSIZE_T yysize = yysyntax_error (0, yystate, yychar);
+ if (yymsg_alloc < yysize && yymsg_alloc < YYSTACK_ALLOC_MAXIMUM)
+ {
+ YYSIZE_T yyalloc = 2 * yysize;
+ if (! (yysize <= yyalloc && yyalloc <= YYSTACK_ALLOC_MAXIMUM))
+ yyalloc = YYSTACK_ALLOC_MAXIMUM;
+ if (yymsg != yymsgbuf)
+ YYSTACK_FREE (yymsg);
+ yymsg = (char *) YYSTACK_ALLOC (yyalloc);
+ if (yymsg)
+ yymsg_alloc = yyalloc;
+ else
+ {
+ yymsg = yymsgbuf;
+ yymsg_alloc = sizeof yymsgbuf;
+ }
+ }
+
+ if (0 < yysize && yysize <= yymsg_alloc)
+ {
+ (void) yysyntax_error (yymsg, yystate, yychar);
+ yyerror (yymsg);
+ }
+ else
+ {
+ yyerror (YY_("syntax error"));
+ if (yysize != 0)
+ goto yyexhaustedlab;
+ }
+ }
+#endif
+ }
+
+
+
+ if (yyerrstatus == 3)
+ {
+ /* If just tried and failed to reuse look-ahead token after an
+ error, discard it. */
+
+ if (yychar <= YYEOF)
+ {
+ /* Return failure if at end of input. */
+ if (yychar == YYEOF)
+ YYABORT;
+ }
+ else
+ {
+ yydestruct ("Error: discarding",
+ yytoken, &yylval);
+ yychar = YYEMPTY;
+ }
+ }
+
+ /* Else will try to reuse look-ahead token after shifting the error
+ token. */
+ goto yyerrlab1;
+
+
+/*---------------------------------------------------.
+| yyerrorlab -- error raised explicitly by YYERROR. |
+`---------------------------------------------------*/
+yyerrorlab:
+
+ /* Pacify compilers like GCC when the user code never invokes
+ YYERROR and the label yyerrorlab therefore never appears in user
+ code. */
+ if (/*CONSTCOND*/ 0)
+ goto yyerrorlab;
+
+ /* Do not reclaim the symbols of the rule which action triggered
+ this YYERROR. */
+ YYPOPSTACK (yylen);
+ yylen = 0;
+ YY_STACK_PRINT (yyss, yyssp);
+ yystate = *yyssp;
+ goto yyerrlab1;
+
+
+/*-------------------------------------------------------------.
+| yyerrlab1 -- common code for both syntax error and YYERROR. |
+`-------------------------------------------------------------*/
+yyerrlab1:
+ yyerrstatus = 3; /* Each real token shifted decrements this. */
+
+ for (;;)
+ {
+ yyn = yypact[yystate];
+ if (yyn != YYPACT_NINF)
+ {
+ yyn += YYTERROR;
+ if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR)
+ {
+ yyn = yytable[yyn];
+ if (0 < yyn)
+ break;
+ }
+ }
+
+ /* Pop the current state because it cannot handle the error token. */
+ if (yyssp == yyss)
+ YYABORT;
+
+
+ yydestruct ("Error: popping",
+ yystos[yystate], yyvsp);
+ YYPOPSTACK (1);
+ yystate = *yyssp;
+ YY_STACK_PRINT (yyss, yyssp);
+ }
+
+ if (yyn == YYFINAL)
+ YYACCEPT;
+
+ *++yyvsp = yylval;
+
+
+ /* Shift the error token. */
+ YY_SYMBOL_PRINT ("Shifting", yystos[yyn], yyvsp, yylsp);
+
+ yystate = yyn;
+ goto yynewstate;
+
+
+/*-------------------------------------.
+| yyacceptlab -- YYACCEPT comes here. |
+`-------------------------------------*/
+yyacceptlab:
+ yyresult = 0;
+ goto yyreturn;
+
+/*-----------------------------------.
+| yyabortlab -- YYABORT comes here. |
+`-----------------------------------*/
+yyabortlab:
+ yyresult = 1;
+ goto yyreturn;
+
+#ifndef yyoverflow
+/*-------------------------------------------------.
+| yyexhaustedlab -- memory exhaustion comes here. |
+`-------------------------------------------------*/
+yyexhaustedlab:
+ yyerror (YY_("memory exhausted"));
+ yyresult = 2;
+ /* Fall through. */
+#endif
+
+yyreturn:
+ if (yychar != YYEOF && yychar != YYEMPTY)
+ yydestruct ("Cleanup: discarding lookahead",
+ yytoken, &yylval);
+ /* Do not reclaim the symbols of the rule which action triggered
+ this YYABORT or YYACCEPT. */
+ YYPOPSTACK (yylen);
+ YY_STACK_PRINT (yyss, yyssp);
+ while (yyssp != yyss)
+ {
+ yydestruct ("Cleanup: popping",
+ yystos[*yyssp], yyvsp);
+ YYPOPSTACK (1);
+ }
+#ifndef yyoverflow
+ if (yyss != yyssa)
+ YYSTACK_FREE (yyss);
+#endif
+#if YYERROR_VERBOSE
+ if (yymsg != yymsgbuf)
+ YYSTACK_FREE (yymsg);
+#endif
+ /* Make sure YYID is used. */
+ return YYID (yyresult);
+}
+</pre>
+</div>
+</td>
+</tr>
+<tr class="function_entry_high">
+<td class="function_entry_filename">
+<a href="javascript:void(0);" title="show/hide function source" onClick="javascript:show_hide('_asn1_expand_object_id_src', '_asn1_expand_object_id_button')"><span id="_asn1_expand_object_id_button">↓</span></a>
+</td>
+<td class="function_entry_name">
+_asn1_expand_object_id
+</td>
+<td class="function_entry_cyclo">
+44
+</td>
+<td class="function_entry_number">
+95
+</td>
+<td class="function_entry_number">
+169
+</td>
+<td class="function_entry_filename">
+<a href="http://git.savannah.gnu.org/gitweb/?p=libtasn1.git;a=blob;f=lib/parser_aux.c;hb=HEAD">lib/parser_aux.c</a>
+</td>
+</tr>
+<tr>
+<td colspan="6" height="0">
+<div id="_asn1_expand_object_id_src" class="function_src" style="position: relative; display: none;">
+<pre class="function_src">
+asn1_retCode
+_asn1_expand_object_id (ASN1_TYPE node)
+{
+ ASN1_TYPE p, p2, p3, p4, p5;
+ char name_root[ASN1_MAX_NAME_SIZE], name2[2 * ASN1_MAX_NAME_SIZE + 1];
+ int move, tlen;
+
+ if (node == NULL)
+ return ASN1_ELEMENT_NOT_FOUND;
+
+ _asn1_str_cpy (name_root, sizeof (name_root), node->name);
+
+ p = node;
+ move = DOWN;
+
+ while (!((p == node) && (move == UP)))
+ {
+ if (move != UP)
+ {
+ if ((type_field (p->type) == TYPE_OBJECT_ID)
+ && (p->type & CONST_ASSIGN))
+ {
+ p2 = p->down;
+ if (p2 && (type_field (p2->type) == TYPE_CONSTANT))
+ {
+ if (p2->value && !isdigit (p2->value[0]))
+ {
+ _asn1_str_cpy (name2, sizeof (name2), name_root);
+ _asn1_str_cat (name2, sizeof (name2), ".");
+ _asn1_str_cat (name2, sizeof (name2), p2->value);
+ p3 = asn1_find_node (node, name2);
+ if (!p3 || (type_field (p3->type) != TYPE_OBJECT_ID) ||
+ !(p3->type & CONST_ASSIGN))
+ return ASN1_ELEMENT_NOT_FOUND;
+ _asn1_set_down (p, p2->right);
+ _asn1_remove_node (p2);
+ p2 = p;
+ p4 = p3->down;
+ while (p4)
+ {
+ if (type_field (p4->type) == TYPE_CONSTANT)
+ {
+ p5 = _asn1_add_node_only (TYPE_CONSTANT);
+ _asn1_set_name (p5, p4->name);
+ tlen = strlen (p4->value);
+ if (tlen > 0)
+ _asn1_set_value (p5, p4->value, tlen + 1);
+ if (p2 == p)
+ {
+ _asn1_set_right (p5, p->down);
+ _asn1_set_down (p, p5);
+ }
+ else
+ {
+ _asn1_set_right (p5, p2->right);
+ _asn1_set_right (p2, p5);
+ }
+ p2 = p5;
+ }
+ p4 = p4->right;
+ }
+ move = DOWN;
+ continue;
+ }
+ }
+ }
+ move = DOWN;
+ }
+ else
+ move = RIGHT;
+
+ if (move == DOWN)
+ {
+ if (p->down)
+ p = p->down;
+ else
+ move = RIGHT;
+ }
+
+ if (p == node)
+ {
+ move = UP;
+ continue;
+ }
+
+ if (move == RIGHT)
+ {
+ if (p->right)
+ p = p->right;
+ else
+ move = UP;
+ }
+ if (move == UP)
+ p = _asn1_find_up (p);
+ }
+
+
+ /*******************************/
+ /* expand DEFAULT */
+ /*******************************/
+ p = node;
+ move = DOWN;
+
+ while (!((p == node) && (move == UP)))
+ {
+ if (move != UP)
+ {
+ if ((type_field (p->type) == TYPE_OBJECT_ID) &&
+ (p->type & CONST_DEFAULT))
+ {
+ p2 = p->down;
+ if (p2 && (type_field (p2->type) == TYPE_DEFAULT))
+ {
+ _asn1_str_cpy (name2, sizeof (name2), name_root);
+ _asn1_str_cat (name2, sizeof (name2), ".");
+ _asn1_str_cat (name2, sizeof (name2), p2->value);
+ p3 = asn1_find_node (node, name2);
+ if (!p3 || (type_field (p3->type) != TYPE_OBJECT_ID) ||
+ !(p3->type & CONST_ASSIGN))
+ return ASN1_ELEMENT_NOT_FOUND;
+ p4 = p3->down;
+ name2[0] = 0;
+ while (p4)
+ {
+ if (type_field (p4->type) == TYPE_CONSTANT)
+ {
+ if (name2[0])
+ _asn1_str_cat (name2, sizeof (name2), ".");
+ _asn1_str_cat (name2, sizeof (name2), p4->value);
+ }
+ p4 = p4->right;
+ }
+ tlen = strlen (name2);
+ if (tlen > 0)
+ _asn1_set_value (p2, name2, tlen + 1);
+ }
+ }
+ move = DOWN;
+ }
+ else
+ move = RIGHT;
+
+ if (move == DOWN)
+ {
+ if (p->down)
+ p = p->down;
+ else
+ move = RIGHT;
+ }
+
+ if (p == node)
+ {
+ move = UP;
+ continue;
+ }
+
+ if (move == RIGHT)
+ {
+ if (p->right)
+ p = p->right;
+ else
+ move = UP;
+ }
+ if (move == UP)
+ p = _asn1_find_up (p);
+ }
+
+ return ASN1_SUCCESS;
+}
+</pre>
+</div>
+</td>
+</tr>
+<tr class="function_entry_high">
+<td class="function_entry_filename">
+<a href="javascript:void(0);" title="show/hide function source" onClick="javascript:show_hide('_asn1_yylex_src', '_asn1_yylex_button')"><span id="_asn1_yylex_button">↓</span></a>
+</td>
+<td class="function_entry_name">
+_asn1_yylex
+</td>
+<td class="function_entry_cyclo">
+44
+</td>
+<td class="function_entry_number">
+54
+</td>
+<td class="function_entry_number">
+80
+</td>
+<td class="function_entry_filename">
+<a href="http://git.savannah.gnu.org/gitweb/?p=libtasn1.git;a=blob;f=lib/ASN1.c;hb=HEAD">lib/ASN1.c</a>
+</td>
+</tr>
+<tr>
+<td colspan="6" height="0">
+<div id="_asn1_yylex_src" class="function_src" style="position: relative; display: none;">
+<pre class="function_src">
+static int
+_asn1_yylex()
+{
+ int c,counter=0,k,lastc;
+ char string[ASN1_MAX_NAME_SIZE+1]; /* will contain the next token */
+ size_t i;
+
+ while(1)
+ {
+ while((c=fgetc(file_asn1))==' ' || c=='\t' || c=='\n')
+ if(c=='\n') lineNumber++;
+
+ if(c==EOF){
+ strcpy(lastToken,"End Of File");
+ return 0;
+ }
+
+ if(c=='(' || c==')' || c=='[' || c==']' ||
+ c=='{' || c=='}' || c==',' || c=='.' ||
+ c=='+' || c=='|'){
+ lastToken[0]=c;lastToken[1]=0;
+ return c;
+ }
+ if(c=='-'){ /* Maybe the first '-' of a comment */
+ if((c=fgetc(file_asn1))!='-'){
+ ungetc(c,file_asn1);
+ lastToken[0]='-';lastToken[1]=0;
+ return '-';
+ }
+ else{ /* Comments */
+ lastc=0;
+ counter=0;
+ /* A comment finishes at the next double hypen or the end of line */
+ while((c=fgetc(file_asn1))!=EOF && c!='\n' &&
+ (lastc!='-' || (lastc=='-' && c!='-')))
+ lastc=c;
+ if(c==EOF){
+ strcpy(lastToken,"End Of File");
+ return 0;
+ }
+ else{
+ if(c=='\n') lineNumber++;
+ continue; /* next char, please! (repeat the search) */
+ }
+ }
+ }
+ string[counter++]=c;
+ /* Till the end of the token */
+ while(!((c=fgetc(file_asn1))==EOF || c==' '|| c=='\t' || c=='\n' ||
+ c=='(' || c==')' || c=='[' || c==']' ||
+ c=='{' || c=='}' || c==',' || c=='.'))
+ {
+ if(counter>=ASN1_MAX_NAME_SIZE){
+ result_parse=ASN1_NAME_TOO_LONG;
+ return 0;
+ }
+ string[counter++]=c;
+ }
+ ungetc(c,file_asn1);
+ string[counter]=0;
+ strcpy(lastToken,string);
+
+ /* Is STRING a number? */
+ for(k=0;k<counter;k++)
+ if(!isdigit(string[k])) break;
+ if(k>=counter)
+ {
+ strcpy(yylval.str,string);
+ return NUM; /* return the number */
+ }
+
+ /* Is STRING a keyword? */
+ for(i=0;i<(sizeof(key_word)/sizeof(char*));i++)
+ if(!strcmp(string,key_word[i])) return key_word_token[i];
+
+ /* STRING is an IDENTIFIER */
+ strcpy(yylval.str,string);
+ return IDENTIFIER;
+ }
+}
+</pre>
+</div>
+</td>
+</tr>
+<tr class="function_entry_high">
+<td class="function_entry_filename">
+<a href="javascript:void(0);" title="show/hide function source" onClick="javascript:show_hide('asn1_expand_any_defined_by_src', 'asn1_expand_any_defined_by_button')"><span id="asn1_expand_any_defined_by_button">↓</span></a>
+</td>
+<td class="function_entry_name">
+asn1_expand_any_defined_by
+</td>
+<td class="function_entry_cyclo">
+43
+</td>
+<td class="function_entry_number">
+101
+</td>
+<td class="function_entry_number">
+211
+</td>
+<td class="function_entry_filename">
+<a href="http://git.savannah.gnu.org/gitweb/?p=libtasn1.git;a=blob;f=lib/decoding.c;hb=HEAD">lib/decoding.c</a>
+</td>
+</tr>
+<tr>
+<td colspan="6" height="0">
+<div id="asn1_expand_any_defined_by_src" class="function_src" style="position: relative; display: none;">
+<pre class="function_src">
+asn1_retCode
+asn1_expand_any_defined_by (ASN1_TYPE definitions, ASN1_TYPE * element)
+{
+ char definitionsName[ASN1_MAX_NAME_SIZE], name[2 * ASN1_MAX_NAME_SIZE + 1],
+ value[ASN1_MAX_NAME_SIZE];
+ asn1_retCode retCode = ASN1_SUCCESS, result;
+ int len, len2, len3;
+ ASN1_TYPE p, p2, p3, aux = ASN1_TYPE_EMPTY;
+ char errorDescription[ASN1_MAX_ERROR_DESCRIPTION_SIZE];
+
+ if ((definitions == ASN1_TYPE_EMPTY) || (*element == ASN1_TYPE_EMPTY))
+ return ASN1_ELEMENT_NOT_FOUND;
+
+ strcpy (definitionsName, definitions->name);
+ strcat (definitionsName, ".");
+
+ p = *element;
+ while (p)
+ {
+
+ switch (type_field (p->type))
+ {
+ case TYPE_ANY:
+ if ((p->type & CONST_DEFINED_BY) && (p->value))
+ {
+ /* search the "DEF_BY" element */
+ p2 = p->down;
+ while ((p2) && (type_field (p2->type) != TYPE_CONSTANT))
+ p2 = p2->right;
+
+ if (!p2)
+ {
+ retCode = ASN1_ERROR_TYPE_ANY;
+ break;
+ }
+
+ p3 = _asn1_find_up (p);
+
+ if (!p3)
+ {
+ retCode = ASN1_ERROR_TYPE_ANY;
+ break;
+ }
+
+ p3 = p3->down;
+ while (p3)
+ {
+ if ((p3->name) && !(strcmp (p3->name, p2->name)))
+ break;
+ p3 = p3->right;
+ }
+
+ if ((!p3) || (type_field (p3->type) != TYPE_OBJECT_ID) ||
+ (p3->value == NULL))
+ {
+
+ p3 = _asn1_find_up (p);
+ p3 = _asn1_find_up (p3);
+
+ if (!p3)
+ {
+ retCode = ASN1_ERROR_TYPE_ANY;
+ break;
+ }
+
+ p3 = p3->down;
+
+ while (p3)
+ {
+ if ((p3->name) && !(strcmp (p3->name, p2->name)))
+ break;
+ p3 = p3->right;
+ }
+
+ if ((!p3) || (type_field (p3->type) != TYPE_OBJECT_ID) ||
+ (p3->value == NULL))
+ {
+ retCode = ASN1_ERROR_TYPE_ANY;
+ break;
+ }
+ }
+
+ /* search the OBJECT_ID into definitions */
+ p2 = definitions->down;
+ while (p2)
+ {
+ if ((type_field (p2->type) == TYPE_OBJECT_ID) &&
+ (p2->type & CONST_ASSIGN))
+ {
+ strcpy (name, definitionsName);
+ strcat (name, p2->name);
+
+ len = ASN1_MAX_NAME_SIZE;
+ result =
+ asn1_read_value (definitions, name, value, &len);
+
+ if ((result == ASN1_SUCCESS)
+ && (!strcmp (p3->value, value)))
+ {
+ p2 = p2->right; /* pointer to the structure to
+ use for expansion */
+ while ((p2) && (p2->type & CONST_ASSIGN))
+ p2 = p2->right;
+
+ if (p2)
+ {
+ strcpy (name, definitionsName);
+ strcat (name, p2->name);
+
+ result =
+ asn1_create_element (definitions, name, &aux);
+ if (result == ASN1_SUCCESS)
+ {
+ _asn1_set_name (aux, p->name);
+ len2 =
+ asn1_get_length_der (p->value,
+ p->value_len, &len3);
+ if (len2 < 0)
+ return ASN1_DER_ERROR;
+
+ result =
+ asn1_der_decoding (&aux, p->value + len3,
+ len2,
+ errorDescription);
+ if (result == ASN1_SUCCESS)
+ {
+
+ _asn1_set_right (aux, p->right);
+ _asn1_set_right (p, aux);
+
+ result = asn1_delete_structure (&p);
+ if (result == ASN1_SUCCESS)
+ {
+ p = aux;
+ aux = ASN1_TYPE_EMPTY;
+ break;
+ }
+ else
+ { /* error with asn1_delete_structure */
+ asn1_delete_structure (&aux);
+ retCode = result;
+ break;
+ }
+ }
+ else
+ { /* error with asn1_der_decoding */
+ retCode = result;
+ break;
+ }
+ }
+ else
+ { /* error with asn1_create_element */
+ retCode = result;
+ break;
+ }
+ }
+ else
+ { /* error with the pointer to the structure to exapand */
+ retCode = ASN1_ERROR_TYPE_ANY;
+ break;
+ }
+ }
+ }
+ p2 = p2->right;
+ } /* end while */
+
+ if (!p2)
+ {
+ retCode = ASN1_ERROR_TYPE_ANY;
+ break;
+ }
+
+ }
+ break;
+ default:
+ break;
+ }
+
+
+ if (p->down)
+ {
+ p = p->down;
+ }
+ else if (p == *element)
+ {
+ p = NULL;
+ break;
+ }
+ else if (p->right)
+ p = p->right;
+ else
+ {
+ while (1)
+ {
+ p = _asn1_find_up (p);
+ if (p == *element)
+ {
+ p = NULL;
+ break;
+ }
+ if (p->right)
+ {
+ p = p->right;
+ break;
+ }
+ }
+ }
+ }
+
+ return retCode;
+}
+</pre>
+</div>
+</td>
+</tr>
+<tr class="function_entry_high">
+<td class="function_entry_filename">
+<a href="javascript:void(0);" title="show/hide function source" onClick="javascript:show_hide('asn1_read_value_src', 'asn1_read_value_button')"><span id="asn1_read_value_button">↓</span></a>
+</td>
+<td class="function_entry_name">
+asn1_read_value
+</td>
+<td class="function_entry_cyclo">
+47
+</td>
+<td class="function_entry_number">
+83
+</td>
+<td class="function_entry_number">
+161
+</td>
+<td class="function_entry_filename">
+<a href="http://git.savannah.gnu.org/gitweb/?p=libtasn1.git;a=blob;f=lib/element.c;hb=HEAD">lib/element.c</a>
+</td>
+</tr>
+<tr>
+<td colspan="6" height="0">
+<div id="asn1_read_value_src" class="function_src" style="position: relative; display: none;">
+<pre class="function_src">
+asn1_retCode
+asn1_read_value (ASN1_TYPE root, const char *name, void *ivalue, int *len)
+{
+ ASN1_TYPE node, p, p2;
+ int len2, len3;
+ int value_size = *len;
+ unsigned char *value = ivalue;
+
+ node = asn1_find_node (root, name);
+ if (node == NULL)
+ return ASN1_ELEMENT_NOT_FOUND;
+
+ if ((type_field (node->type) != TYPE_NULL) &&
+ (type_field (node->type) != TYPE_CHOICE) &&
+ !(node->type & CONST_DEFAULT) && !(node->type & CONST_ASSIGN) &&
+ (node->value == NULL))
+ return ASN1_VALUE_NOT_FOUND;
+
+ switch (type_field (node->type))
+ {
+ case TYPE_NULL:
+ PUT_STR_VALUE (value, value_size, "NULL");
+ break;
+ case TYPE_BOOLEAN:
+ if ((node->type & CONST_DEFAULT) && (node->value == NULL))
+ {
+ p = node->down;
+ while (type_field (p->type) != TYPE_DEFAULT)
+ p = p->right;
+ if (p->type & CONST_TRUE)
+ {
+ PUT_STR_VALUE (value, value_size, "TRUE");
+ }
+ else
+ {
+ PUT_STR_VALUE (value, value_size, "FALSE");
+ }
+ }
+ else if (node->value[0] == 'T')
+ {
+ PUT_STR_VALUE (value, value_size, "TRUE");
+ }
+ else
+ {
+ PUT_STR_VALUE (value, value_size, "FALSE");
+ }
+ break;
+ case TYPE_INTEGER:
+ case TYPE_ENUMERATED:
+ if ((node->type & CONST_DEFAULT) && (node->value == NULL))
+ {
+ p = node->down;
+ while (type_field (p->type) != TYPE_DEFAULT)
+ p = p->right;
+ if ((isdigit (p->value[0])) || (p->value[0] == '-')
+ || (p->value[0] == '+'))
+ {
+ if (_asn1_convert_integer
+ (p->value, value, value_size, len) != ASN1_SUCCESS)
+ return ASN1_MEM_ERROR;
+ }
+ else
+ { /* is an identifier like v1 */
+ p2 = node->down;
+ while (p2)
+ {
+ if (type_field (p2->type) == TYPE_CONSTANT)
+ {
+ if ((p2->name) && (!strcmp (p2->name, p->value)))
+ {
+ if (_asn1_convert_integer
+ (p2->value, value, value_size,
+ len) != ASN1_SUCCESS)
+ return ASN1_MEM_ERROR;
+ break;
+ }
+ }
+ p2 = p2->right;
+ }
+ }
+ }
+ else
+ {
+ len2 = -1;
+ if (asn1_get_octet_der
+ (node->value, node->value_len, &len2, value, value_size,
+ len) != ASN1_SUCCESS)
+ return ASN1_MEM_ERROR;
+ }
+ break;
+ case TYPE_OBJECT_ID:
+ if (node->type & CONST_ASSIGN)
+ {
+ value[0] = 0;
+ p = node->down;
+ while (p)
+ {
+ if (type_field (p->type) == TYPE_CONSTANT)
+ {
+ ADD_STR_VALUE (value, value_size, p->value);
+ if (p->right)
+ {
+ ADD_STR_VALUE (value, value_size, ".");
+ }
+ }
+ p = p->right;
+ }
+ *len = strlen (value) + 1;
+ }
+ else if ((node->type & CONST_DEFAULT) && (node->value == NULL))
+ {
+ p = node->down;
+ while (type_field (p->type) != TYPE_DEFAULT)
+ p = p->right;
+ PUT_STR_VALUE (value, value_size, p->value);
+ }
+ else
+ {
+ PUT_STR_VALUE (value, value_size, node->value);
+ }
+ break;
+ case TYPE_TIME:
+ PUT_STR_VALUE (value, value_size, node->value);
+ break;
+ case TYPE_OCTET_STRING:
+ len2 = -1;
+ if (asn1_get_octet_der
+ (node->value, node->value_len, &len2, value, value_size,
+ len) != ASN1_SUCCESS)
+ return ASN1_MEM_ERROR;
+ break;
+ case TYPE_GENERALSTRING:
+ len2 = -1;
+ if (asn1_get_octet_der
+ (node->value, node->value_len, &len2, value, value_size,
+ len) != ASN1_SUCCESS)
+ return ASN1_MEM_ERROR;
+ break;
+ case TYPE_BIT_STRING:
+ len2 = -1;
+ if (asn1_get_bit_der
+ (node->value, node->value_len, &len2, value, value_size,
+ len) != ASN1_SUCCESS)
+ return ASN1_MEM_ERROR;
+ break;
+ case TYPE_CHOICE:
+ PUT_STR_VALUE (value, value_size, node->down->name);
+ break;
+ case TYPE_ANY:
+ len3 = -1;
+ len2 = asn1_get_length_der (node->value, node->value_len, &len3);
+ if (len2 < 0)
+ return ASN1_DER_ERROR;
+ PUT_VALUE (value, value_size, node->value + len3, len2);
+ break;
+ default:
+ return ASN1_ELEMENT_NOT_FOUND;
+ break;
+ }
+ return ASN1_SUCCESS;
+}
+</pre>
+</div>
+</td>
+</tr>
+<tr class="function_entry_high">
+<td class="function_entry_filename">
+<a href="javascript:void(0);" title="show/hide function source" onClick="javascript:show_hide('_asn1_check_identifier_src', '_asn1_check_identifier_button')"><span id="_asn1_check_identifier_button">↓</span></a>
+</td>
+<td class="function_entry_name">
+_asn1_check_identifier
+</td>
+<td class="function_entry_cyclo">
+26
+</td>
+<td class="function_entry_number">
+50
+</td>
+<td class="function_entry_number">
+91
+</td>
+<td class="function_entry_filename">
+<a href="http://git.savannah.gnu.org/gitweb/?p=libtasn1.git;a=blob;f=lib/parser_aux.c;hb=HEAD">lib/parser_aux.c</a>
+</td>
+</tr>
+<tr>
+<td colspan="6" height="0">
+<div id="_asn1_check_identifier_src" class="function_src" style="position: relative; display: none;">
+<pre class="function_src">
+asn1_retCode
+_asn1_check_identifier (ASN1_TYPE node)
+{
+ ASN1_TYPE p, p2;
+ char name2[ASN1_MAX_NAME_SIZE * 2 + 2];
+
+ if (node == NULL)
+ return ASN1_ELEMENT_NOT_FOUND;
+
+ p = node;
+ while (p)
+ {
+ if (type_field (p->type) == TYPE_IDENTIFIER)
+ {
+ _asn1_str_cpy (name2, sizeof (name2), node->name);
+ _asn1_str_cat (name2, sizeof (name2), ".");
+ _asn1_str_cat (name2, sizeof (name2), p->value);
+ p2 = asn1_find_node (node, name2);
+ if (p2 == NULL)
+ {
+ strcpy (_asn1_identifierMissing, p->value);
+ return ASN1_IDENTIFIER_NOT_FOUND;
+ }
+ }
+ else if ((type_field (p->type) == TYPE_OBJECT_ID) &&
+ (p->type & CONST_DEFAULT))
+ {
+ p2 = p->down;
+ if (p2 && (type_field (p2->type) == TYPE_DEFAULT))
+ {
+ _asn1_str_cpy (name2, sizeof (name2), node->name);
+ _asn1_str_cat (name2, sizeof (name2), ".");
+ _asn1_str_cat (name2, sizeof (name2), p2->value);
+ strcpy (_asn1_identifierMissing, p2->value);
+ p2 = asn1_find_node (node, name2);
+ if (!p2 || (type_field (p2->type) != TYPE_OBJECT_ID) ||
+ !(p2->type & CONST_ASSIGN))
+ return ASN1_IDENTIFIER_NOT_FOUND;
+ else
+ _asn1_identifierMissing[0] = 0;
+ }
+ }
+ else if ((type_field (p->type) == TYPE_OBJECT_ID) &&
+ (p->type & CONST_ASSIGN))
+ {
+ p2 = p->down;
+ if (p2 && (type_field (p2->type) == TYPE_CONSTANT))
+ {
+ if (p2->value && !isdigit (p2->value[0]))
+ {
+ _asn1_str_cpy (name2, sizeof (name2), node->name);
+ _asn1_str_cat (name2, sizeof (name2), ".");
+ _asn1_str_cat (name2, sizeof (name2), p2->value);
+ strcpy (_asn1_identifierMissing, p2->value);
+ p2 = asn1_find_node (node, name2);
+ if (!p2 || (type_field (p2->type) != TYPE_OBJECT_ID) ||
+ !(p2->type & CONST_ASSIGN))
+ return ASN1_IDENTIFIER_NOT_FOUND;
+ else
+ _asn1_identifierMissing[0] = 0;
+ }
+ }
+ }
+
+ if (p->down)
+ {
+ p = p->down;
+ }
+ else if (p->right)
+ p = p->right;
+ else
+ {
+ while (1)
+ {
+ p = _asn1_find_up (p);
+ if (p == node)
+ {
+ p = NULL;
+ break;
+ }
+ if (p->right)
+ {
+ p = p->right;
+ break;
+ }
+ }
+ }
+ }
+
+ return ASN1_SUCCESS;
+}
+</pre>
+</div>
+</td>
+</tr>
+<tr class="function_entry_high">
+<td class="function_entry_filename">
+<a href="javascript:void(0);" title="show/hide function source" onClick="javascript:show_hide('_asn1_expand_identifier_src', '_asn1_expand_identifier_button')"><span id="_asn1_expand_identifier_button">↓</span></a>
+</td>
+<td class="function_entry_name">
+_asn1_expand_identifier
+</td>
+<td class="function_entry_cyclo">
+25
+</td>
+<td class="function_entry_number">
+68
+</td>
+<td class="function_entry_number">
+107
+</td>
+<td class="function_entry_filename">
+<a href="http://git.savannah.gnu.org/gitweb/?p=libtasn1.git;a=blob;f=lib/structure.c;hb=HEAD">lib/structure.c</a>
+</td>
+</tr>
+<tr>
+<td colspan="6" height="0">
+<div id="_asn1_expand_identifier_src" class="function_src" style="position: relative; display: none;">
+<pre class="function_src">
+static asn1_retCode
+_asn1_expand_identifier (ASN1_TYPE * node, ASN1_TYPE root)
+{
+ ASN1_TYPE p, p2, p3;
+ char name2[ASN1_MAX_NAME_SIZE + 2];
+ int move;
+
+ if (node == NULL)
+ return ASN1_ELEMENT_NOT_FOUND;
+
+ p = *node;
+ move = DOWN;
+
+ while (!((p == *node) && (move == UP)))
+ {
+ if (move != UP)
+ {
+ if (type_field (p->type) == TYPE_IDENTIFIER)
+ {
+ _asn1_str_cpy (name2, sizeof (name2), root->name);
+ _asn1_str_cat (name2, sizeof (name2), ".");
+ _asn1_str_cat (name2, sizeof (name2), p->value);
+ p2 = _asn1_copy_structure2 (root, name2);
+ if (p2 == NULL)
+ {
+ return ASN1_IDENTIFIER_NOT_FOUND;
+ }
+ _asn1_set_name (p2, p->name);
+ p2->right = p->right;
+ p2->left = p->left;
+ if (p->right)
+ p->right->left = p2;
+ p3 = p->down;
+ if (p3)
+ {
+ while (p3->right)
+ p3 = p3->right;
+ _asn1_set_right (p3, p2->down);
+ _asn1_set_down (p2, p->down);
+ }
+
+ p3 = _asn1_find_left (p);
+ if (p3)
+ _asn1_set_right (p3, p2);
+ else
+ {
+ p3 = _asn1_find_up (p);
+ if (p3)
+ _asn1_set_down (p3, p2);
+ else
+ {
+ p2->left = NULL;
+ }
+ }
+
+ if (p->type & CONST_SIZE)
+ p2->type |= CONST_SIZE;
+ if (p->type & CONST_TAG)
+ p2->type |= CONST_TAG;
+ if (p->type & CONST_OPTION)
+ p2->type |= CONST_OPTION;
+ if (p->type & CONST_DEFAULT)
+ p2->type |= CONST_DEFAULT;
+ if (p->type & CONST_SET)
+ p2->type |= CONST_SET;
+ if (p->type & CONST_NOT_USED)
+ p2->type |= CONST_NOT_USED;
+
+ if (p == *node)
+ *node = p2;
+ _asn1_remove_node (p);
+ p = p2;
+ move = DOWN;
+ continue;
+ }
+ move = DOWN;
+ }
+ else
+ move = RIGHT;
+
+ if (move == DOWN)
+ {
+ if (p->down)
+ p = p->down;
+ else
+ move = RIGHT;
+ }
+
+ if (p == *node)
+ {
+ move = UP;
+ continue;
+ }
+
+ if (move == RIGHT)
+ {
+ if (p->right)
+ p = p->right;
+ else
+ move = UP;
+ }
+ if (move == UP)
+ p = _asn1_find_up (p);
+ }
+
+ return ASN1_SUCCESS;
+}
+</pre>
+</div>
+</td>
+</tr>
+<tr class="function_entry_high">
+<td class="function_entry_filename">
+<a href="javascript:void(0);" title="show/hide function source" onClick="javascript:show_hide('_asn1_ordering_set_of_src', '_asn1_ordering_set_of_button')"><span id="_asn1_ordering_set_of_button">↓</span></a>
+</td>
+<td class="function_entry_name">
+_asn1_ordering_set_of
+</td>
+<td class="function_entry_cyclo">
+23
+</td>
+<td class="function_entry_number">
+72
+</td>
+<td class="function_entry_number">
+124
+</td>
+<td class="function_entry_filename">
+<a href="http://git.savannah.gnu.org/gitweb/?p=libtasn1.git;a=blob;f=lib/coding.c;hb=HEAD">lib/coding.c</a>
+</td>
+</tr>
+<tr>
+<td colspan="6" height="0">
+<div id="_asn1_ordering_set_of_src" class="function_src" style="position: relative; display: none;">
+<pre class="function_src">
+static void
+_asn1_ordering_set_of (unsigned char *der, int der_len, ASN1_TYPE node)
+{
+ struct vet
+ {
+ int end;
+ struct vet *next, *prev;
+ };
+
+ int counter, len, len2, change;
+ struct vet *first, *last, *p_vet, *p2_vet;
+ ASN1_TYPE p;
+ unsigned char *temp, class;
+ unsigned long k, max;
+
+ counter = 0;
+
+ if (type_field (node->type) != TYPE_SET_OF)
+ return;
+
+ p = node->down;
+ while ((type_field (p->type) == TYPE_TAG)
+ || (type_field (p->type) == TYPE_SIZE))
+ p = p->right;
+ p = p->right;
+
+ if ((p == NULL) || (p->right == NULL))
+ return;
+
+ first = last = NULL;
+ while (p)
+ {
+ p_vet = (struct vet *) _asn1_malloc (sizeof (struct vet));
+ if (p_vet == NULL)
+ return;
+
+ p_vet->next = NULL;
+ p_vet->prev = last;
+ if (first == NULL)
+ first = p_vet;
+ else
+ last->next = p_vet;
+ last = p_vet;
+
+ /* extraction of tag and length */
+ if (der_len - counter > 0)
+ {
+
+ if (asn1_get_tag_der
+ (der + counter, der_len - counter, &class, &len,
+ NULL) != ASN1_SUCCESS)
+ return;
+ counter += len;
+
+ len2 = asn1_get_length_der (der + counter, der_len - counter, &len);
+ if (len2 < 0)
+ return;
+ counter += len + len2;
+ }
+
+ p_vet->end = counter;
+ p = p->right;
+ }
+
+ p_vet = first;
+
+ while (p_vet)
+ {
+ p2_vet = p_vet->next;
+ counter = 0;
+ while (p2_vet)
+ {
+ if ((p_vet->end - counter) > (p2_vet->end - p_vet->end))
+ max = p_vet->end - counter;
+ else
+ max = p2_vet->end - p_vet->end;
+
+ change = -1;
+ for (k = 0; k < max; k++)
+ if (der[counter + k] > der[p_vet->end + k])
+ {
+ change = 1;
+ break;
+ }
+ else if (der[counter + k] < der[p_vet->end + k])
+ {
+ change = 0;
+ break;
+ }
+
+ if ((change == -1)
+ && ((p_vet->end - counter) > (p2_vet->end - p_vet->end)))
+ change = 1;
+
+ if (change == 1)
+ {
+ /* change position */
+ temp = (unsigned char *) _asn1_malloc (p_vet->end - counter);
+ if (temp == NULL)
+ return;
+
+ memcpy (temp, der + counter, (p_vet->end) - counter);
+ memcpy (der + counter, der + (p_vet->end),
+ (p2_vet->end) - (p_vet->end));
+ memcpy (der + counter + (p2_vet->end) - (p_vet->end), temp,
+ (p_vet->end) - counter);
+ _asn1_free (temp);
+
+ p_vet->end = counter + (p2_vet->end - p_vet->end);
+ }
+ counter = p_vet->end;
+
+ p2_vet = p2_vet->next;
+ p_vet = p_vet->next;
+ }
+
+ if (p_vet != first)
+ p_vet->prev->next = NULL;
+ else
+ first = NULL;
+ _asn1_free (p_vet);
+ p_vet = first;
+ }
+}
+</pre>
+</div>
+</td>
+</tr>
+<tr class="function_entry_high">
+<td class="function_entry_filename">
+<a href="javascript:void(0);" title="show/hide function source" onClick="javascript:show_hide('asn1_expand_octet_string_src', 'asn1_expand_octet_string_button')"><span id="asn1_expand_octet_string_button">↓</span></a>
+</td>
+<td class="function_entry_name">
+asn1_expand_octet_string
+</td>
+<td class="function_entry_cyclo">
+22
+</td>
+<td class="function_entry_number">
+65
+</td>
+<td class="function_entry_number">
+123
+</td>
+<td class="function_entry_filename">
+<a href="http://git.savannah.gnu.org/gitweb/?p=libtasn1.git;a=blob;f=lib/decoding.c;hb=HEAD">lib/decoding.c</a>
+</td>
+</tr>
+<tr>
+<td colspan="6" height="0">
+<div id="asn1_expand_octet_string_src" class="function_src" style="position: relative; display: none;">
+<pre class="function_src">
+asn1_retCode
+asn1_expand_octet_string (ASN1_TYPE definitions, ASN1_TYPE * element,
+ const char *octetName, const char *objectName)
+{
+ char name[2 * ASN1_MAX_NAME_SIZE + 1], value[ASN1_MAX_NAME_SIZE];
+ asn1_retCode retCode = ASN1_SUCCESS, result;
+ int len, len2, len3;
+ ASN1_TYPE p2, aux = ASN1_TYPE_EMPTY;
+ ASN1_TYPE octetNode = ASN1_TYPE_EMPTY, objectNode = ASN1_TYPE_EMPTY;
+ char errorDescription[ASN1_MAX_ERROR_DESCRIPTION_SIZE];
+
+ if ((definitions == ASN1_TYPE_EMPTY) || (*element == ASN1_TYPE_EMPTY))
+ return ASN1_ELEMENT_NOT_FOUND;
+
+ octetNode = asn1_find_node (*element, octetName);
+ if (octetNode == ASN1_TYPE_EMPTY)
+ return ASN1_ELEMENT_NOT_FOUND;
+ if (type_field (octetNode->type) != TYPE_OCTET_STRING)
+ return ASN1_ELEMENT_NOT_FOUND;
+ if (octetNode->value == NULL)
+ return ASN1_VALUE_NOT_FOUND;
+
+ objectNode = asn1_find_node (*element, objectName);
+ if (objectNode == ASN1_TYPE_EMPTY)
+ return ASN1_ELEMENT_NOT_FOUND;
+
+ if (type_field (objectNode->type) != TYPE_OBJECT_ID)
+ return ASN1_ELEMENT_NOT_FOUND;
+
+ if (objectNode->value == NULL)
+ return ASN1_VALUE_NOT_FOUND;
+
+
+ /* search the OBJECT_ID into definitions */
+ p2 = definitions->down;
+ while (p2)
+ {
+ if ((type_field (p2->type) == TYPE_OBJECT_ID) &&
+ (p2->type & CONST_ASSIGN))
+ {
+ strcpy (name, definitions->name);
+ strcat (name, ".");
+ strcat (name, p2->name);
+
+ len = sizeof (value);
+ result = asn1_read_value (definitions, name, value, &len);
+
+ if ((result == ASN1_SUCCESS)
+ && (!strcmp (objectNode->value, value)))
+ {
+
+ p2 = p2->right; /* pointer to the structure to
+ use for expansion */
+ while ((p2) && (p2->type & CONST_ASSIGN))
+ p2 = p2->right;
+
+ if (p2)
+ {
+ strcpy (name, definitions->name);
+ strcat (name, ".");
+ strcat (name, p2->name);
+
+ result = asn1_create_element (definitions, name, &aux);
+ if (result == ASN1_SUCCESS)
+ {
+ _asn1_set_name (aux, octetNode->name);
+ len2 =
+ asn1_get_length_der (octetNode->value,
+ octetNode->value_len, &len3);
+ if (len2 < 0)
+ return ASN1_DER_ERROR;
+
+ result =
+ asn1_der_decoding (&aux, octetNode->value + len3,
+ len2, errorDescription);
+ if (result == ASN1_SUCCESS)
+ {
+
+ _asn1_set_right (aux, octetNode->right);
+ _asn1_set_right (octetNode, aux);
+
+ result = asn1_delete_structure (&octetNode);
+ if (result == ASN1_SUCCESS)
+ {
+ aux = ASN1_TYPE_EMPTY;
+ break;
+ }
+ else
+ { /* error with asn1_delete_structure */
+ asn1_delete_structure (&aux);
+ retCode = result;
+ break;
+ }
+ }
+ else
+ { /* error with asn1_der_decoding */
+ retCode = result;
+ break;
+ }
+ }
+ else
+ { /* error with asn1_create_element */
+ retCode = result;
+ break;
+ }
+ }
+ else
+ { /* error with the pointer to the structure to exapand */
+ retCode = ASN1_VALUE_NOT_VALID;
+ break;
+ }
+ }
+ }
+
+ p2 = p2->right;
+
+ }
+
+ if (!p2)
+ retCode = ASN1_VALUE_NOT_VALID;
+
+ return retCode;
+}
+</pre>
+</div>
+</td>
+</tr>
+<tr class="function_entry_high">
+<td class="function_entry_filename">
+<a href="javascript:void(0);" title="show/hide function source" onClick="javascript:show_hide('asn1_array2tree_src', 'asn1_array2tree_button')"><span id="asn1_array2tree_button">↓</span></a>
+</td>
+<td class="function_entry_name">
+asn1_array2tree
+</td>
+<td class="function_entry_cyclo">
+21
+</td>
+<td class="function_entry_number">
+53
+</td>
+<td class="function_entry_number">
+97
+</td>
+<td class="function_entry_filename">
+<a href="http://git.savannah.gnu.org/gitweb/?p=libtasn1.git;a=blob;f=lib/structure.c;hb=HEAD">lib/structure.c</a>
+</td>
+</tr>
+<tr>
+<td colspan="6" height="0">
+<div id="asn1_array2tree_src" class="function_src" style="position: relative; display: none;">
+<pre class="function_src">
+asn1_retCode
+asn1_array2tree (const ASN1_ARRAY_TYPE * array, ASN1_TYPE * definitions,
+ char *errorDescription)
+{
+ ASN1_TYPE p, p_last = NULL;
+ unsigned long k;
+ int move;
+ asn1_retCode result;
+
+
+ if (*definitions != ASN1_TYPE_EMPTY)
+ return ASN1_ELEMENT_NOT_EMPTY;
+
+ move = UP;
+
+ k = 0;
+ while (array[k].value || array[k].type || array[k].name)
+ {
+ p = _asn1_add_node (array[k].type & (~CONST_DOWN));
+ if (array[k].name)
+ _asn1_set_name (p, array[k].name);
+ if (array[k].value)
+ _asn1_set_value (p, array[k].value, strlen (array[k].value) + 1);
+
+ if (*definitions == NULL)
+ *definitions = p;
+
+ if (move == DOWN)
+ _asn1_set_down (p_last, p);
+ else if (move == RIGHT)
+ _asn1_set_right (p_last, p);
+
+ p_last = p;
+
+ if (array[k].type & CONST_DOWN)
+ move = DOWN;
+ else if (array[k].type & CONST_RIGHT)
+ move = RIGHT;
+ else
+ {
+ while (1)
+ {
+ if (p_last == *definitions)
+ break;
+
+ p_last = _asn1_find_up (p_last);
+
+ if (p_last == NULL)
+ break;
+
+ if (p_last->type & CONST_RIGHT)
+ {
+ p_last->type &= ~CONST_RIGHT;
+ move = RIGHT;
+ break;
+ }
+ } /* while */
+ }
+ k++;
+ } /* while */
+
+ if (p_last == *definitions)
+ {
+ result = _asn1_check_identifier (*definitions);
+ if (result == ASN1_SUCCESS)
+ {
+ _asn1_change_integer_value (*definitions);
+ _asn1_expand_object_id (*definitions);
+ }
+ }
+ else
+ {
+ result = ASN1_ARRAY_ERROR;
+ }
+
+ if (errorDescription != NULL)
+ {
+ if (result == ASN1_IDENTIFIER_NOT_FOUND)
+ {
+ Estrcpy (errorDescription, ":: identifier '");
+ Estrcat (errorDescription, _asn1_identifierMissing);
+ Estrcat (errorDescription, "' not found");
+ }
+ else
+ errorDescription[0] = 0;
+ }
+
+ if (result != ASN1_SUCCESS)
+ {
+ _asn1_delete_list_and_nodes ();
+ *definitions = ASN1_TYPE_EMPTY;
+ }
+ else
+ _asn1_delete_list ();
+
+ return result;
+}
+</pre>
+</div>
+</td>
+</tr>
+<tr class="function_entry_moderate">
+<td class="function_entry_filename">
+<a href="javascript:void(0);" title="show/hide function source" onClick="javascript:show_hide('_asn1_insert_tag_der_src', '_asn1_insert_tag_der_button')"><span id="_asn1_insert_tag_der_button">↓</span></a>
+</td>
+<td class="function_entry_name">
+_asn1_insert_tag_der
+</td>
+<td class="function_entry_cyclo">
+35
+</td>
+<td class="function_entry_number">
+75
+</td>
+<td class="function_entry_number">
+151
+</td>
+<td class="function_entry_filename">
+<a href="http://git.savannah.gnu.org/gitweb/?p=libtasn1.git;a=blob;f=lib/coding.c;hb=HEAD">lib/coding.c</a>
+</td>
+</tr>
+<tr>
+<td colspan="6" height="0">
+<div id="_asn1_insert_tag_der_src" class="function_src" style="position: relative; display: none;">
+<pre class="function_src">
+static asn1_retCode
+_asn1_insert_tag_der (ASN1_TYPE node, unsigned char *der, int *counter,
+ int *max_len)
+{
+ ASN1_TYPE p;
+ 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];
+
+ is_tag_implicit = 0;
+
+ if (node->type & CONST_TAG)
+ {
+ p = node->down;
+ while (p)
+ {
+ if (type_field (p->type) == TYPE_TAG)
+ {
+ if (p->type & CONST_APPLICATION)
+ class = ASN1_CLASS_APPLICATION;
+ else if (p->type & CONST_UNIVERSAL)
+ class = ASN1_CLASS_UNIVERSAL;
+ else if (p->type & CONST_PRIVATE)
+ class = ASN1_CLASS_PRIVATE;
+ else
+ class = ASN1_CLASS_CONTEXT_SPECIFIC;
+
+ if (p->type & CONST_EXPLICIT)
+ {
+ if (is_tag_implicit)
+ _asn1_tag_der (class_implicit, tag_implicit, tag_der,
+ &tag_len);
+ else
+ _asn1_tag_der (class | ASN1_CLASS_STRUCTURED,
+ 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);
+
+ is_tag_implicit = 0;
+ }
+ else
+ { /* CONST_IMPLICIT */
+ if (!is_tag_implicit)
+ {
+ if ((type_field (node->type) == TYPE_SEQUENCE) ||
+ (type_field (node->type) == TYPE_SEQUENCE_OF) ||
+ (type_field (node->type) == TYPE_SET) ||
+ (type_field (node->type) == TYPE_SET_OF))
+ class |= ASN1_CLASS_STRUCTURED;
+ class_implicit = class;
+ tag_implicit = strtoul (p->value, NULL, 10);
+ is_tag_implicit = 1;
+ }
+ }
+ }
+ p = p->right;
+ }
+ }
+
+ if (is_tag_implicit)
+ {
+ _asn1_tag_der (class_implicit, tag_implicit, tag_der, &tag_len);
+ }
+ else
+ {
+ switch (type_field (node->type))
+ {
+ case TYPE_NULL:
+ _asn1_tag_der (ASN1_CLASS_UNIVERSAL, ASN1_TAG_NULL, tag_der,
+ &tag_len);
+ break;
+ case TYPE_BOOLEAN:
+ _asn1_tag_der (ASN1_CLASS_UNIVERSAL, ASN1_TAG_BOOLEAN, tag_der,
+ &tag_len);
+ break;
+ case TYPE_INTEGER:
+ _asn1_tag_der (ASN1_CLASS_UNIVERSAL, ASN1_TAG_INTEGER, tag_der,
+ &tag_len);
+ break;
+ case TYPE_ENUMERATED:
+ _asn1_tag_der (ASN1_CLASS_UNIVERSAL, ASN1_TAG_ENUMERATED, tag_der,
+ &tag_len);
+ break;
+ case TYPE_OBJECT_ID:
+ _asn1_tag_der (ASN1_CLASS_UNIVERSAL, ASN1_TAG_OBJECT_ID, tag_der,
+ &tag_len);
+ break;
+ case TYPE_TIME:
+ if (node->type & CONST_UTC)
+ {
+ _asn1_tag_der (ASN1_CLASS_UNIVERSAL, ASN1_TAG_UTCTime, tag_der,
+ &tag_len);
+ }
+ else
+ _asn1_tag_der (ASN1_CLASS_UNIVERSAL, ASN1_TAG_GENERALIZEDTime,
+ tag_der, &tag_len);
+ break;
+ case TYPE_OCTET_STRING:
+ _asn1_tag_der (ASN1_CLASS_UNIVERSAL, ASN1_TAG_OCTET_STRING, tag_der,
+ &tag_len);
+ break;
+ case TYPE_GENERALSTRING:
+ _asn1_tag_der (ASN1_CLASS_UNIVERSAL, ASN1_TAG_GENERALSTRING,
+ tag_der, &tag_len);
+ break;
+ case TYPE_BIT_STRING:
+ _asn1_tag_der (ASN1_CLASS_UNIVERSAL, ASN1_TAG_BIT_STRING, tag_der,
+ &tag_len);
+ break;
+ case TYPE_SEQUENCE:
+ case TYPE_SEQUENCE_OF:
+ _asn1_tag_der (ASN1_CLASS_UNIVERSAL | ASN1_CLASS_STRUCTURED,
+ ASN1_TAG_SEQUENCE, tag_der, &tag_len);
+ break;
+ case TYPE_SET:
+ case TYPE_SET_OF:
+ _asn1_tag_der (ASN1_CLASS_UNIVERSAL | ASN1_CLASS_STRUCTURED,
+ ASN1_TAG_SET, tag_der, &tag_len);
+ break;
+ case TYPE_TAG:
+ tag_len = 0;
+ break;
+ case TYPE_CHOICE:
+ tag_len = 0;
+ break;
+ case TYPE_ANY:
+ tag_len = 0;
+ break;
+ default:
+ return ASN1_GENERIC_ERROR;
+ }
+ }
+
+ *max_len -= tag_len;
+ if (*max_len >= 0)
+ memcpy (der + *counter, tag_der, tag_len);
+ *counter += tag_len;
+
+ if (*max_len < 0)
+ return ASN1_MEM_ERROR;
+
+ return ASN1_SUCCESS;
+}
+</pre>
+</div>
+</td>
+</tr>
+<tr class="function_entry_moderate">
+<td class="function_entry_filename">
+<a href="javascript:void(0);" title="show/hide function source" onClick="javascript:show_hide('asn1_find_node_src', 'asn1_find_node_button')"><span id="asn1_find_node_button">↓</span></a>
+</td>
+<td class="function_entry_name">
+asn1_find_node
+</td>
+<td class="function_entry_cyclo">
+20
+</td>
+<td class="function_entry_number">
+50
+</td>
+<td class="function_entry_number">
+95
+</td>
+<td class="function_entry_filename">
+<a href="http://git.savannah.gnu.org/gitweb/?p=libtasn1.git;a=blob;f=lib/parser_aux.c;hb=HEAD">lib/parser_aux.c</a>
+</td>
+</tr>
+<tr>
+<td colspan="6" height="0">
+<div id="asn1_find_node_src" class="function_src" style="position: relative; display: none;">
+<pre class="function_src">
+ASN1_TYPE
+asn1_find_node (ASN1_TYPE pointer, const char *name)
+{
+ ASN1_TYPE p;
+ char *n_end, n[ASN1_MAX_NAME_SIZE + 1];
+ const char *n_start;
+
+ if (pointer == NULL)
+ return NULL;
+
+ if (name == NULL)
+ return NULL;
+
+ p = pointer;
+ n_start = name;
+
+ if (p->name != NULL)
+ { /* has *pointer got a name ? */
+ n_end = strchr (n_start, '.'); /* search the first dot */
+ if (n_end)
+ {
+ memcpy (n, n_start, n_end - n_start);
+ n[n_end - n_start] = 0;
+ n_start = n_end;
+ n_start++;
+ }
+ else
+ {
+ _asn1_str_cpy (n, sizeof (n), n_start);
+ n_start = NULL;
+ }
+
+ while (p)
+ {
+ if ((p->name) && (!strcmp (p->name, n)))
+ break;
+ else
+ p = p->right;
+ } /* while */
+
+ if (p == NULL)
+ return NULL;
+ }
+ else
+ { /* *pointer doesn't have a name */
+ if (n_start[0] == 0)
+ return p;
+ }
+
+ while (n_start)
+ { /* Has the end of NAME been reached? */
+ n_end = strchr (n_start, '.'); /* search the next dot */
+ if (n_end)
+ {
+ memcpy (n, n_start, n_end - n_start);
+ n[n_end - n_start] = 0;
+ n_start = n_end;
+ n_start++;
+ }
+ else
+ {
+ _asn1_str_cpy (n, sizeof (n), n_start);
+ n_start = NULL;
+ }
+
+ if (p->down == NULL)
+ return NULL;
+
+ p = p->down;
+
+ /* The identifier "?LAST" indicates the last element
+ in the right chain. */
+ if (!strcmp (n, "?LAST"))
+ {
+ if (p == NULL)
+ return NULL;
+ while (p->right)
+ p = p->right;
+ }
+ else
+ { /* no "?LAST" */
+ while (p)
+ {
+ if ((p->name) && (!strcmp (p->name, n)))
+ break;
+ else
+ p = p->right;
+ }
+ if (p == NULL)
+ return NULL;
+ }
+ } /* while */
+
+ return p;
+}
+</pre>
+</div>
+</td>
+</tr>
+<tr class="function_entry_moderate">
+<td class="function_entry_filename">
+<a href="javascript:void(0);" title="show/hide function source" onClick="javascript:show_hide('_asn1_type_choice_config_src', '_asn1_type_choice_config_button')"><span id="_asn1_type_choice_config_button">↓</span></a>
+</td>
+<td class="function_entry_name">
+_asn1_type_choice_config
+</td>
+<td class="function_entry_cyclo">
+20
+</td>
+<td class="function_entry_number">
+47
+</td>
+<td class="function_entry_number">
+83
+</td>
+<td class="function_entry_filename">
+<a href="http://git.savannah.gnu.org/gitweb/?p=libtasn1.git;a=blob;f=lib/structure.c;hb=HEAD">lib/structure.c</a>
+</td>
+</tr>
+<tr>
+<td colspan="6" height="0">
+<div id="_asn1_type_choice_config_src" class="function_src" style="position: relative; display: none;">
+<pre class="function_src">
+static asn1_retCode
+_asn1_type_choice_config (ASN1_TYPE node)
+{
+ ASN1_TYPE p, p2, p3, p4;
+ int move, tlen;
+
+ if (node == NULL)
+ return ASN1_ELEMENT_NOT_FOUND;
+
+ p = node;
+ move = DOWN;
+
+ while (!((p == node) && (move == UP)))
+ {
+ if (move != UP)
+ {
+ if ((type_field (p->type) == TYPE_CHOICE) && (p->type & CONST_TAG))
+ {
+ p2 = p->down;
+ while (p2)
+ {
+ if (type_field (p2->type) != TYPE_TAG)
+ {
+ p2->type |= CONST_TAG;
+ p3 = _asn1_find_left (p2);
+ while (p3)
+ {
+ if (type_field (p3->type) == TYPE_TAG)
+ {
+ p4 = _asn1_add_node_only (p3->type);
+ tlen = strlen (p3->value);
+ if (tlen > 0)
+ _asn1_set_value (p4, p3->value, tlen + 1);
+ _asn1_set_right (p4, p2->down);
+ _asn1_set_down (p2, p4);
+ }
+ p3 = _asn1_find_left (p3);
+ }
+ }
+ p2 = p2->right;
+ }
+ p->type &= ~(CONST_TAG);
+ p2 = p->down;
+ while (p2)
+ {
+ p3 = p2->right;
+ if (type_field (p2->type) == TYPE_TAG)
+ asn1_delete_structure (&p2);
+ p2 = p3;
+ }
+ }
+ move = DOWN;
+ }
+ else
+ move = RIGHT;
+
+ if (move == DOWN)
+ {
+ if (p->down)
+ p = p->down;
+ else
+ move = RIGHT;
+ }
+
+ if (p == node)
+ {
+ move = UP;
+ continue;
+ }
+
+ if (move == RIGHT)
+ {
+ if (p->right)
+ p = p->right;
+ else
+ move = UP;
+ }
+ if (move == UP)
+ p = _asn1_find_up (p);
+ }
+
+ return ASN1_SUCCESS;
+}
+</pre>
+</div>
+</td>
+</tr>
+<tr class="function_entry_moderate">
+<td class="function_entry_filename">
+<a href="javascript:void(0);" title="show/hide function source" onClick="javascript:show_hide('_asn1_get_octet_string_src', '_asn1_get_octet_string_button')"><span id="_asn1_get_octet_string_button">↓</span></a>
+</td>
+<td class="function_entry_name">
+_asn1_get_octet_string
+</td>
+<td class="function_entry_cyclo">
+17
+</td>
+<td class="function_entry_number">
+47
+</td>
+<td class="function_entry_number">
+82
+</td>
+<td class="function_entry_filename">
+<a href="http://git.savannah.gnu.org/gitweb/?p=libtasn1.git;a=blob;f=lib/decoding.c;hb=HEAD">lib/decoding.c</a>
+</td>
+</tr>
+<tr>
+<td colspan="6" height="0">
+<div id="_asn1_get_octet_string_src" class="function_src" style="position: relative; display: none;">
+<pre class="function_src">
+static asn1_retCode
+_asn1_get_octet_string (const unsigned char *der, ASN1_TYPE node, int *len)
+{
+ int len2, len3, counter, tot_len, indefinite;
+
+ counter = 0;
+
+ if (*(der - 1) & ASN1_CLASS_STRUCTURED)
+ {
+ tot_len = 0;
+ indefinite = asn1_get_length_der (der, *len, &len3);
+ if (indefinite < -1)
+ return ASN1_DER_ERROR;
+
+ counter += len3;
+ if (indefinite >= 0)
+ indefinite += len3;
+
+ while (1)
+ {
+ if (counter > (*len))
+ return ASN1_DER_ERROR;
+
+ if (indefinite == -1)
+ {
+ if ((der[counter] == 0) && (der[counter + 1] == 0))
+ {
+ counter += 2;
+ break;
+ }
+ }
+ else if (counter >= indefinite)
+ break;
+
+ if (der[counter] != ASN1_TAG_OCTET_STRING)
+ return ASN1_DER_ERROR;
+
+ counter++;
+
+ len2 = asn1_get_length_der (der + counter, *len - counter, &len3);
+ if (len2 <= 0)
+ return ASN1_DER_ERROR;
+
+ counter += len3 + len2;
+ tot_len += len2;
+ }
+
+ /* copy */
+ if (node)
+ {
+ unsigned char temp[DER_LEN];
+ int ret;
+
+ len2 = sizeof(temp);
+
+ asn1_length_der (tot_len, temp, &len2);
+ _asn1_set_value (node, temp, len2);
+
+ tot_len += len2;
+
+ ret = _asn1_extract_der_octet(node, der, *len);
+ if (ret!=ASN1_SUCCESS)
+ return ret;
+
+ }
+ }
+ else
+ { /* NOT STRUCTURED */
+ len2 = asn1_get_length_der (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;
+ }
+
+ *len = counter;
+ return ASN1_SUCCESS;
+
+}
+</pre>
+</div>
+</td>
+</tr>
+<tr class="function_entry_moderate">
+<td class="function_entry_filename">
+<a href="javascript:void(0);" title="show/hide function source" onClick="javascript:show_hide('_asn1_ordering_set_src', '_asn1_ordering_set_button')"><span id="_asn1_ordering_set_button">↓</span></a>
+</td>
+<td class="function_entry_name">
+_asn1_ordering_set
+</td>
+<td class="function_entry_cyclo">
+16
+</td>
+<td class="function_entry_number">
+59
+</td>
+<td class="function_entry_number">
+104
+</td>
+<td class="function_entry_filename">
+<a href="http://git.savannah.gnu.org/gitweb/?p=libtasn1.git;a=blob;f=lib/coding.c;hb=HEAD">lib/coding.c</a>
+</td>
+</tr>
+<tr>
+<td colspan="6" height="0">
+<div id="_asn1_ordering_set_src" class="function_src" style="position: relative; display: none;">
+<pre class="function_src">
+static void
+_asn1_ordering_set (unsigned char *der, int der_len, ASN1_TYPE node)
+{
+ struct vet
+ {
+ int end;
+ unsigned long value;
+ struct vet *next, *prev;
+ };
+
+ int counter, len, len2;
+ struct vet *first, *last, *p_vet, *p2_vet;
+ ASN1_TYPE p;
+ unsigned char class, *temp;
+ unsigned long tag;
+
+ counter = 0;
+
+ if (type_field (node->type) != TYPE_SET)
+ return;
+
+ p = node->down;
+ while ((type_field (p->type) == TYPE_TAG)
+ || (type_field (p->type) == TYPE_SIZE))
+ p = p->right;
+
+ if ((p == NULL) || (p->right == NULL))
+ return;
+
+ first = last = NULL;
+ while (p)
+ {
+ p_vet = (struct vet *) _asn1_malloc (sizeof (struct vet));
+ if (p_vet == NULL)
+ return;
+
+ p_vet->next = NULL;
+ p_vet->prev = last;
+ if (first == NULL)
+ first = p_vet;
+ else
+ last->next = p_vet;
+ last = p_vet;
+
+ /* tag value calculation */
+ if (asn1_get_tag_der
+ (der + counter, der_len - counter, &class, &len2,
+ &tag) != ASN1_SUCCESS)
+ return;
+ p_vet->value = (class << 24) | tag;
+ counter += len2;
+
+ /* extraction and length */
+ len2 = asn1_get_length_der (der + counter, der_len - counter, &len);
+ if (len2 < 0)
+ return;
+ counter += len + len2;
+
+ p_vet->end = counter;
+ p = p->right;
+ }
+
+ p_vet = first;
+
+ while (p_vet)
+ {
+ p2_vet = p_vet->next;
+ counter = 0;
+ while (p2_vet)
+ {
+ if (p_vet->value > p2_vet->value)
+ {
+ /* change position */
+ temp = (unsigned char *) _asn1_malloc (p_vet->end - counter);
+ if (temp == NULL)
+ return;
+
+ memcpy (temp, der + counter, p_vet->end - counter);
+ memcpy (der + counter, der + p_vet->end,
+ p2_vet->end - p_vet->end);
+ memcpy (der + counter + p2_vet->end - p_vet->end, temp,
+ p_vet->end - counter);
+ _asn1_free (temp);
+
+ tag = p_vet->value;
+ p_vet->value = p2_vet->value;
+ p2_vet->value = tag;
+
+ p_vet->end = counter + (p2_vet->end - p_vet->end);
+ }
+ counter = p_vet->end;
+
+ p2_vet = p2_vet->next;
+ p_vet = p_vet->next;
+ }
+
+ if (p_vet != first)
+ p_vet->prev->next = NULL;
+ else
+ first = NULL;
+ _asn1_free (p_vet);
+ p_vet = first;
+ }
+}
+</pre>
+</div>
+</td>
+</tr>
+<tr class="function_entry_moderate">
+<td class="function_entry_filename">
+<a href="javascript:void(0);" title="show/hide function source" onClick="javascript:show_hide('yysyntax_error_src', 'yysyntax_error_button')"><span id="yysyntax_error_button">↓</span></a>
+</td>
+<td class="function_entry_name">
+yysyntax_error
+</td>
+<td class="function_entry_cyclo">
+15
+</td>
+<td class="function_entry_number">
+62
+</td>
+<td class="function_entry_number">
+100
+</td>
+<td class="function_entry_filename">
+<a href="http://git.savannah.gnu.org/gitweb/?p=libtasn1.git;a=blob;f=lib/ASN1.c;hb=HEAD">lib/ASN1.c</a>
+</td>
+</tr>
+<tr>
+<td colspan="6" height="0">
+<div id="yysyntax_error_src" class="function_src" style="position: relative; display: none;">
+<pre class="function_src">
+static YYSIZE_T
+yysyntax_error (char *yyresult, int yystate, int yychar)
+{
+ int yyn = yypact[yystate];
+
+ if (! (YYPACT_NINF < yyn && yyn <= YYLAST))
+ return 0;
+ else
+ {
+ int yytype = YYTRANSLATE (yychar);
+ YYSIZE_T yysize0 = yytnamerr (0, yytname[yytype]);
+ YYSIZE_T yysize = yysize0;
+ YYSIZE_T yysize1;
+ int yysize_overflow = 0;
+ enum { YYERROR_VERBOSE_ARGS_MAXIMUM = 5 };
+ char const *yyarg[YYERROR_VERBOSE_ARGS_MAXIMUM];
+ int yyx;
+
+# if 0
+ /* This is so xgettext sees the translatable formats that are
+ constructed on the fly. */
+ YY_("syntax error, unexpected %s");
+ YY_("syntax error, unexpected %s, expecting %s");
+ YY_("syntax error, unexpected %s, expecting %s or %s");
+ YY_("syntax error, unexpected %s, expecting %s or %s or %s");
+ YY_("syntax error, unexpected %s, expecting %s or %s or %s or %s");
+# endif
+ char *yyfmt;
+ char const *yyf;
+ static char const yyunexpected[] = "syntax error, unexpected %s";
+ static char const yyexpecting[] = ", expecting %s";
+ static char const yyor[] = " or %s";
+ char yyformat[sizeof yyunexpected
+ + sizeof yyexpecting - 1
+ + ((YYERROR_VERBOSE_ARGS_MAXIMUM - 2)
+ * (sizeof yyor - 1))];
+ char const *yyprefix = yyexpecting;
+
+ /* Start YYX at -YYN if negative to avoid negative indexes in
+ YYCHECK. */
+ int yyxbegin = yyn < 0 ? -yyn : 0;
+
+ /* Stay within bounds of both yycheck and yytname. */
+ int yychecklim = YYLAST - yyn + 1;
+ int yyxend = yychecklim < YYNTOKENS ? yychecklim : YYNTOKENS;
+ int yycount = 1;
+
+ yyarg[0] = yytname[yytype];
+ yyfmt = yystpcpy (yyformat, yyunexpected);
+
+ for (yyx = yyxbegin; yyx < yyxend; ++yyx)
+ if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR)
+ {
+ if (yycount == YYERROR_VERBOSE_ARGS_MAXIMUM)
+ {
+ yycount = 1;
+ yysize = yysize0;
+ yyformat[sizeof yyunexpected - 1] = '\0';
+ break;
+ }
+ yyarg[yycount++] = yytname[yyx];
+ yysize1 = yysize + yytnamerr (0, yytname[yyx]);
+ yysize_overflow |= (yysize1 < yysize);
+ yysize = yysize1;
+ yyfmt = yystpcpy (yyfmt, yyprefix);
+ yyprefix = yyor;
+ }
+
+ yyf = YY_(yyformat);
+ yysize1 = yysize + yystrlen (yyf);
+ yysize_overflow |= (yysize1 < yysize);
+ yysize = yysize1;
+
+ if (yysize_overflow)
+ return YYSIZE_MAXIMUM;
+
+ if (yyresult)
+ {
+ /* Avoid sprintf, as that infringes on the user's name space.
+ Don't have undefined behavior even if the translation
+ produced a string with the wrong number of "%s"s. */
+ char *yyp = yyresult;
+ int yyi = 0;
+ while ((*yyp = *yyf) != '\0')
+ {
+ if (*yyp == '%' && yyf[1] == 's' && yyi < yycount)
+ {
+ yyp += yytnamerr (yyp, yyarg[yyi++]);
+ yyf += 2;
+ }
+ else
+ {
+ yyp++;
+ yyf++;
+ }
+ }
+ }
+ return yysize;
+ }
+}
+</pre>
+</div>
+</td>
+</tr>
+<tr class="function_entry_moderate">
+<td class="function_entry_filename">
+<a href="javascript:void(0);" title="show/hide function source" onClick="javascript:show_hide('_asn1_convert_integer_src', '_asn1_convert_integer_button')"><span id="_asn1_convert_integer_button">↓</span></a>
+</td>
+<td class="function_entry_name">
+_asn1_convert_integer
+</td>
+<td class="function_entry_cyclo">
+15
+</td>
+<td class="function_entry_number">
+35
+</td>
+<td class="function_entry_number">
+52
+</td>
+<td class="function_entry_filename">
+<a href="http://git.savannah.gnu.org/gitweb/?p=libtasn1.git;a=blob;f=lib/element.c;hb=HEAD">lib/element.c</a>
+</td>
+</tr>
+<tr>
+<td colspan="6" height="0">
+<div id="_asn1_convert_integer_src" class="function_src" style="position: relative; display: none;">
+<pre class="function_src">
+asn1_retCode
+_asn1_convert_integer (const char *value, unsigned char *value_out,
+ int value_out_size, int *len)
+{
+ char negative;
+ unsigned char val[SIZEOF_UNSIGNED_LONG_INT];
+ long valtmp;
+ int k, k2;
+
+ valtmp = strtol (value, NULL, 10);
+
+ for (k = 0; k < SIZEOF_UNSIGNED_LONG_INT; k++)
+ {
+ val[SIZEOF_UNSIGNED_LONG_INT - k - 1] = (valtmp >> (8 * k)) & 0xFF;
+ }
+
+ if (val[0] & 0x80)
+ negative = 1;
+ else
+ negative = 0;
+
+ for (k = 0; k < SIZEOF_UNSIGNED_LONG_INT - 1; k++)
+ {
+ if (negative && (val[k] != 0xFF))
+ break;
+ else if (!negative && val[k])
+ break;
+ }
+
+ if ((negative && !(val[k] & 0x80)) || (!negative && (val[k] & 0x80)))
+ k--;
+
+ *len = SIZEOF_UNSIGNED_LONG_INT - k;
+
+ if (SIZEOF_UNSIGNED_LONG_INT - k > value_out_size)
+ /* VALUE_OUT is too short to contain the value conversion */
+ return ASN1_MEM_ERROR;
+
+ for (k2 = k; k2 < SIZEOF_UNSIGNED_LONG_INT; k2++)
+ value_out[k2 - k] = val[k2];
+
+
+#ifdef LIBTASN1_DEBUG_INTEGER
+ _libtasn1_log ("_asn1_convert_integer: valueIn=%s, lenOut=%d", value, *len);
+ for (k = 0; k < SIZEOF_UNSIGNED_LONG_INT; k++)
+ _libtasn1_log (", vOut[%d]=%d", k, value_out[k]);
+ _libtasn1_log ("\n");
+#endif
+
+
+ return ASN1_SUCCESS;
+}
+</pre>
+</div>
+</td>
+</tr>
+<tr class="function_entry_moderate">
+<td class="function_entry_filename">
+<a href="javascript:void(0);" title="show/hide function source" onClick="javascript:show_hide('asn1_read_tag_src', 'asn1_read_tag_button')"><span id="asn1_read_tag_button">↓</span></a>
+</td>
+<td class="function_entry_name">
+asn1_read_tag
+</td>
+<td class="function_entry_cyclo">
+29
+</td>
+<td class="function_entry_number">
+51
+</td>
+<td class="function_entry_number">
+101
+</td>
+<td class="function_entry_filename">
+<a href="http://git.savannah.gnu.org/gitweb/?p=libtasn1.git;a=blob;f=lib/element.c;hb=HEAD">lib/element.c</a>
+</td>
+</tr>
+<tr>
+<td colspan="6" height="0">
+<div id="asn1_read_tag_src" class="function_src" style="position: relative; display: none;">
+<pre class="function_src">
+asn1_retCode
+asn1_read_tag (ASN1_TYPE root, const char *name, int *tagValue,
+ int *classValue)
+{
+ ASN1_TYPE node, p, pTag;
+
+ node = asn1_find_node (root, name);
+ if (node == NULL)
+ return ASN1_ELEMENT_NOT_FOUND;
+
+ p = node->down;
+
+ /* pTag will points to the IMPLICIT TAG */
+ pTag = NULL;
+ if (node->type & CONST_TAG)
+ {
+ while (p)
+ {
+ if (type_field (p->type) == TYPE_TAG)
+ {
+ if ((p->type & CONST_IMPLICIT) && (pTag == NULL))
+ pTag = p;
+ else if (p->type & CONST_EXPLICIT)
+ pTag = NULL;
+ }
+ p = p->right;
+ }
+ }
+
+ if (pTag)
+ {
+ *tagValue = strtoul (pTag->value, NULL, 10);
+
+ if (pTag->type & CONST_APPLICATION)
+ *classValue = ASN1_CLASS_APPLICATION;
+ else if (pTag->type & CONST_UNIVERSAL)
+ *classValue = ASN1_CLASS_UNIVERSAL;
+ else if (pTag->type & CONST_PRIVATE)
+ *classValue = ASN1_CLASS_PRIVATE;
+ else
+ *classValue = ASN1_CLASS_CONTEXT_SPECIFIC;
+ }
+ else
+ {
+ *classValue = ASN1_CLASS_UNIVERSAL;
+
+ switch (type_field (node->type))
+ {
+ case TYPE_NULL:
+ *tagValue = ASN1_TAG_NULL;
+ break;
+ case TYPE_BOOLEAN:
+ *tagValue = ASN1_TAG_BOOLEAN;
+ break;
+ case TYPE_INTEGER:
+ *tagValue = ASN1_TAG_INTEGER;
+ break;
+ case TYPE_ENUMERATED:
+ *tagValue = ASN1_TAG_ENUMERATED;
+ break;
+ case TYPE_OBJECT_ID:
+ *tagValue = ASN1_TAG_OBJECT_ID;
+ break;
+ case TYPE_TIME:
+ if (node->type & CONST_UTC)
+ {
+ *tagValue = ASN1_TAG_UTCTime;
+ }
+ else
+ *tagValue = ASN1_TAG_GENERALIZEDTime;
+ break;
+ case TYPE_OCTET_STRING:
+ *tagValue = ASN1_TAG_OCTET_STRING;
+ break;
+ case TYPE_GENERALSTRING:
+ *tagValue = ASN1_TAG_GENERALSTRING;
+ break;
+ case TYPE_BIT_STRING:
+ *tagValue = ASN1_TAG_BIT_STRING;
+ break;
+ case TYPE_SEQUENCE:
+ case TYPE_SEQUENCE_OF:
+ *tagValue = ASN1_TAG_SEQUENCE;
+ break;
+ case TYPE_SET:
+ case TYPE_SET_OF:
+ *tagValue = ASN1_TAG_SET;
+ break;
+ case TYPE_TAG:
+ case TYPE_CHOICE:
+ case TYPE_ANY:
+ break;
+ default:
+ break;
+ }
+ }
+
+
+ return ASN1_SUCCESS;
+
+}
+</pre>
+</div>
+</td>
+</tr>
+<tr class="function_entry_moderate">
+<td class="function_entry_filename">
+<a href="javascript:void(0);" title="show/hide function source" onClick="javascript:show_hide('_asn1_objectid_der_src', '_asn1_objectid_der_button')"><span id="_asn1_objectid_der_button">↓</span></a>
+</td>
+<td class="function_entry_name">
+_asn1_objectid_der
+</td>
+<td class="function_entry_cyclo">
+14
+</td>
+<td class="function_entry_number">
+44
+</td>
+<td class="function_entry_number">
+69
+</td>
+<td class="function_entry_filename">
+<a href="http://git.savannah.gnu.org/gitweb/?p=libtasn1.git;a=blob;f=lib/coding.c;hb=HEAD">lib/coding.c</a>
+</td>
+</tr>
+<tr>
+<td colspan="6" height="0">
+<div id="_asn1_objectid_der_src" class="function_src" style="position: relative; display: none;">
+<pre class="function_src">
+static asn1_retCode
+_asn1_objectid_der (unsigned char *str, unsigned char *der, int *der_len)
+{
+ int len_len, counter, k, first, max_len;
+ char *temp, *n_end, *n_start;
+ unsigned char bit7;
+ unsigned long val, val1 = 0;
+
+ max_len = *der_len;
+
+ temp = (char *) _asn1_malloc (strlen (str) + 2);
+ if (temp == NULL)
+ return ASN1_MEM_ALLOC_ERROR;
+
+ strcpy (temp, str);
+ strcat (temp, ".");
+
+ counter = 0;
+ n_start = temp;
+ while ((n_end = strchr (n_start, '.')))
+ {
+ *n_end = 0;
+ val = strtoul (n_start, NULL, 10);
+ counter++;
+
+ if (counter == 1)
+ val1 = val;
+ else if (counter == 2)
+ {
+ if (max_len > 0)
+ der[0] = 40 * val1 + val;
+ *der_len = 1;
+ }
+ else
+ {
+ first = 0;
+ for (k = 4; k >= 0; k--)
+ {
+ bit7 = (val >> (k * 7)) & 0x7F;
+ if (bit7 || first || !k)
+ {
+ if (k)
+ bit7 |= 0x80;
+ if (max_len > (*der_len))
+ der[*der_len] = bit7;
+ (*der_len)++;
+ first = 1;
+ }
+ }
+
+ }
+ n_start = n_end + 1;
+ }
+
+ asn1_length_der (*der_len, NULL, &len_len);
+ if (max_len >= (*der_len + len_len))
+ {
+ memmove (der + len_len, der, *der_len);
+ asn1_length_der (*der_len, der, &len_len);
+ }
+ *der_len += len_len;
+
+ _asn1_free (temp);
+
+ if (max_len < (*der_len))
+ return ASN1_MEM_ERROR;
+
+ return ASN1_SUCCESS;
+}
+</pre>
+</div>
+</td>
+</tr>
+<tr class="function_entry_moderate">
+<td class="function_entry_filename">
+<a href="javascript:void(0);" title="show/hide function source" onClick="javascript:show_hide('_asn1_type_set_config_src', '_asn1_type_set_config_button')"><span id="_asn1_type_set_config_button">↓</span></a>
+</td>
+<td class="function_entry_name">
+_asn1_type_set_config
+</td>
+<td class="function_entry_cyclo">
+14
+</td>
+<td class="function_entry_number">
+30
+</td>
+<td class="function_entry_number">
+58
+</td>
+<td class="function_entry_filename">
+<a href="http://git.savannah.gnu.org/gitweb/?p=libtasn1.git;a=blob;f=lib/parser_aux.c;hb=HEAD">lib/parser_aux.c</a>
+</td>
+</tr>
+<tr>
+<td colspan="6" height="0">
+<div id="_asn1_type_set_config_src" class="function_src" style="position: relative; display: none;">
+<pre class="function_src">
+asn1_retCode
+_asn1_type_set_config (ASN1_TYPE node)
+{
+ ASN1_TYPE p, p2;
+ int move;
+
+ if (node == NULL)
+ return ASN1_ELEMENT_NOT_FOUND;
+
+ p = node;
+ move = DOWN;
+
+ while (!((p == node) && (move == UP)))
+ {
+ if (move != UP)
+ {
+ if (type_field (p->type) == TYPE_SET)
+ {
+ p2 = p->down;
+ while (p2)
+ {
+ if (type_field (p2->type) != TYPE_TAG)
+ p2->type |= CONST_SET | CONST_NOT_USED;
+ p2 = p2->right;
+ }
+ }
+ move = DOWN;
+ }
+ else
+ move = RIGHT;
+
+ if (move == DOWN)
+ {
+ if (p->down)
+ p = p->down;
+ else
+ move = RIGHT;
+ }
+
+ if (p == node)
+ {
+ move = UP;
+ continue;
+ }
+
+ if (move == RIGHT)
+ {
+ if (p->right)
+ p = p->right;
+ else
+ move = UP;
+ }
+ if (move == UP)
+ p = _asn1_find_up (p);
+ }
+
+ return ASN1_SUCCESS;
+}
+</pre>
+</div>
+</td>
+</tr>
+<tr class="function_entry_moderate">
+<td class="function_entry_filename">
+<a href="javascript:void(0);" title="show/hide function source" onClick="javascript:show_hide('asn1_check_version_src', 'asn1_check_version_button')"><span id="asn1_check_version_button">↓</span></a>
+</td>
+<td class="function_entry_name">
+asn1_check_version
+</td>
+<td class="function_entry_cyclo">
+14
+</td>
+<td class="function_entry_number">
+15
+</td>
+<td class="function_entry_number">
+30
+</td>
+<td class="function_entry_filename">
+<a href="http://git.savannah.gnu.org/gitweb/?p=libtasn1.git;a=blob;f=lib/parser_aux.c;hb=HEAD">lib/parser_aux.c</a>
+</td>
+</tr>
+<tr>
+<td colspan="6" height="0">
+<div id="asn1_check_version_src" class="function_src" style="position: relative; display: none;">
+<pre class="function_src">
+const char *
+asn1_check_version (const char *req_version)
+{
+ const char *ver = ASN1_VERSION;
+ int my_major, my_minor, my_micro;
+ int rq_major, rq_minor, rq_micro;
+ const char *my_plvl, *rq_plvl;
+
+ if (!req_version)
+ return ver;
+
+ my_plvl = parse_version_string (ver, &my_major, &my_minor, &my_micro);
+ if (!my_plvl)
+ return NULL; /* very strange our own version is bogus */
+ rq_plvl = parse_version_string (req_version, &rq_major, &rq_minor,
+ &rq_micro);
+ if (!rq_plvl)
+ return NULL; /* req version string is invalid */
+
+ if (my_major > rq_major
+ || (my_major == rq_major && my_minor > rq_minor)
+ || (my_major == rq_major && my_minor == rq_minor
+ && my_micro > rq_micro)
+ || (my_major == rq_major && my_minor == rq_minor
+ && my_micro == rq_micro && strcmp (my_plvl, rq_plvl) >= 0))
+ {
+ return ver;
+ }
+ return NULL;
+}
+</pre>
+</div>
+</td>
+</tr>
+<tr class="function_entry_moderate">
+<td class="function_entry_filename">
+<a href="javascript:void(0);" title="show/hide function source" onClick="javascript:show_hide('_asn1_delete_not_used_src', '_asn1_delete_not_used_button')"><span id="_asn1_delete_not_used_button">↓</span></a>
+</td>
+<td class="function_entry_name">
+_asn1_delete_not_used
+</td>
+<td class="function_entry_cyclo">
+13
+</td>
+<td class="function_entry_number">
+30
+</td>
+<td class="function_entry_number">
+58
+</td>
+<td class="function_entry_filename">
+<a href="http://git.savannah.gnu.org/gitweb/?p=libtasn1.git;a=blob;f=lib/decoding.c;hb=HEAD">lib/decoding.c</a>
+</td>
+</tr>
+<tr>
+<td colspan="6" height="0">
+<div id="_asn1_delete_not_used_src" class="function_src" style="position: relative; display: none;">
+<pre class="function_src">
+static int
+_asn1_delete_not_used (ASN1_TYPE node)
+{
+ ASN1_TYPE p, p2;
+
+ if (node == NULL)
+ return ASN1_ELEMENT_NOT_FOUND;
+
+ p = node;
+ while (p)
+ {
+ if (p->type & CONST_NOT_USED)
+ {
+ p2 = NULL;
+ if (p != node)
+ {
+ p2 = _asn1_find_left (p);
+ if (!p2)
+ p2 = _asn1_find_up (p);
+ }
+ asn1_delete_structure (&p);
+ p = p2;
+ }
+
+ if (!p)
+ break; /* reach node */
+
+ if (p->down)
+ {
+ p = p->down;
+ }
+ else
+ {
+ if (p == node)
+ p = NULL;
+ else if (p->right)
+ p = p->right;
+ else
+ {
+ while (1)
+ {
+ p = _asn1_find_up (p);
+ if (p == node)
+ {
+ p = NULL;
+ break;
+ }
+ if (p->right)
+ {
+ p = p->right;
+ break;
+ }
+ }
+ }
+ }
+ }
+ return ASN1_SUCCESS;
+}
+</pre>
+</div>
+</td>
+</tr>
+<tr class="function_entry_moderate">
+<td class="function_entry_filename">
+<a href="javascript:void(0);" title="show/hide function source" onClick="javascript:show_hide('_asn1_set_default_tag_src', '_asn1_set_default_tag_button')"><span id="_asn1_set_default_tag_button">↓</span></a>
+</td>
+<td class="function_entry_name">
+_asn1_set_default_tag
+</td>
+<td class="function_entry_cyclo">
+13
+</td>
+<td class="function_entry_number">
+22
+</td>
+<td class="function_entry_number">
+47
+</td>
+<td class="function_entry_filename">
+<a href="http://git.savannah.gnu.org/gitweb/?p=libtasn1.git;a=blob;f=lib/parser_aux.c;hb=HEAD">lib/parser_aux.c</a>
+</td>
+</tr>
+<tr>
+<td colspan="6" height="0">
+<div id="_asn1_set_default_tag_src" class="function_src" style="position: relative; display: none;">
+<pre class="function_src">
+asn1_retCode
+_asn1_set_default_tag (ASN1_TYPE node)
+{
+ ASN1_TYPE p;
+
+ if ((node == NULL) || (type_field (node->type) != TYPE_DEFINITIONS))
+ return ASN1_ELEMENT_NOT_FOUND;
+
+ p = node;
+ while (p)
+ {
+ if ((type_field (p->type) == TYPE_TAG) &&
+ !(p->type & CONST_EXPLICIT) && !(p->type & CONST_IMPLICIT))
+ {
+ if (node->type & CONST_EXPLICIT)
+ p->type |= CONST_EXPLICIT;
+ else
+ p->type |= CONST_IMPLICIT;
+ }
+
+ if (p->down)
+ {
+ p = p->down;
+ }
+ else if (p->right)
+ p = p->right;
+ else
+ {
+ while (1)
+ {
+ p = _asn1_find_up (p);
+ if (p == node)
+ {
+ p = NULL;
+ break;
+ }
+ if (p->right)
+ {
+ p = p->right;
+ break;
+ }
+ }
+ }
+ }
+
+ return ASN1_SUCCESS;
+}
+</pre>
+</div>
+</td>
+</tr>
+<tr class="function_entry_moderate">
+<td class="function_entry_filename">
+<a href="javascript:void(0);" title="show/hide function source" onClick="javascript:show_hide('_asn1_create_static_structure_src', '_asn1_create_static_structure_button')"><span id="_asn1_create_static_structure_button">↓</span></a>
+</td>
+<td class="function_entry_name">
+_asn1_create_static_structure
+</td>
+<td class="function_entry_cyclo">
+12
+</td>
+<td class="function_entry_number">
+41
+</td>
+<td class="function_entry_number">
+78
+</td>
+<td class="function_entry_filename">
+<a href="http://git.savannah.gnu.org/gitweb/?p=libtasn1.git;a=blob;f=lib/structure.c;hb=HEAD">lib/structure.c</a>
+</td>
+</tr>
+<tr>
+<td colspan="6" height="0">
+<div id="_asn1_create_static_structure_src" class="function_src" style="position: relative; display: none;">
+<pre class="function_src">
+asn1_retCode
+_asn1_create_static_structure (ASN1_TYPE pointer, char *output_file_name,
+ char *vector_name)
+{
+ FILE *file;
+ ASN1_TYPE p;
+ unsigned long t;
+
+ file = fopen (output_file_name, "w");
+
+ if (file == NULL)
+ return ASN1_FILE_NOT_FOUND;
+
+ fprintf (file, "#if HAVE_CONFIG_H\n");
+ fprintf (file, "# include \"config.h\"\n");
+ fprintf (file, "#endif\n\n");
+
+ fprintf (file, "#include <libtasn1.h>\n\n");
+
+ fprintf (file, "const ASN1_ARRAY_TYPE %s[] = {\n", vector_name);
+
+ p = pointer;
+
+ while (p)
+ {
+ fprintf (file, " { ");
+
+ if (p->name)
+ fprintf (file, "\"%s\", ", p->name);
+ else
+ fprintf (file, "NULL, ");
+
+ t = p->type;
+ if (p->down)
+ t |= CONST_DOWN;
+ if (p->right)
+ t |= CONST_RIGHT;
+
+ fprintf (file, "%lu, ", t);
+
+ if (p->value)
+ fprintf (file, "\"%s\"},\n", p->value);
+ else
+ fprintf (file, "NULL },\n");
+
+ if (p->down)
+ {
+ p = p->down;
+ }
+ else if (p->right)
+ {
+ p = p->right;
+ }
+ else
+ {
+ while (1)
+ {
+ p = _asn1_find_up (p);
+ if (p == pointer)
+ {
+ p = NULL;
+ break;
+ }
+ if (p->right)
+ {
+ p = p->right;
+ break;
+ }
+ }
+ }
+ }
+
+ fprintf (file, " { NULL, 0, NULL }\n};\n");
+
+ fclose (file);
+
+ return ASN1_SUCCESS;
+}
+</pre>
+</div>
+</td>
+</tr>
+<tr class="function_entry_moderate">
+<td class="function_entry_filename">
+<a href="javascript:void(0);" title="show/hide function source" onClick="javascript:show_hide('_asn1_copy_structure3_src', '_asn1_copy_structure3_button')"><span id="_asn1_copy_structure3_button">↓</span></a>
+</td>
+<td class="function_entry_name">
+_asn1_copy_structure3
+</td>
+<td class="function_entry_cyclo">
+12
+</td>
+<td class="function_entry_number">
+37
+</td>
+<td class="function_entry_number">
+67
+</td>
+<td class="function_entry_filename">
+<a href="http://git.savannah.gnu.org/gitweb/?p=libtasn1.git;a=blob;f=lib/structure.c;hb=HEAD">lib/structure.c</a>
+</td>
+</tr>
+<tr>
+<td colspan="6" height="0">
+<div id="_asn1_copy_structure3_src" class="function_src" style="position: relative; display: none;">
+<pre class="function_src">
+ASN1_TYPE
+_asn1_copy_structure3 (ASN1_TYPE source_node)
+{
+ ASN1_TYPE dest_node, p_s, p_d, p_d_prev;
+ int move;
+
+ if (source_node == NULL)
+ return NULL;
+
+ dest_node = _asn1_add_node_only (source_node->type);
+
+ p_s = source_node;
+ p_d = dest_node;
+
+ move = DOWN;
+
+ do
+ {
+ if (move != UP)
+ {
+ if (p_s->name)
+ _asn1_set_name (p_d, p_s->name);
+ if (p_s->value)
+ _asn1_set_value (p_d, p_s->value, p_s->value_len);
+ move = DOWN;
+ }
+ else
+ move = RIGHT;
+
+ if (move == DOWN)
+ {
+ if (p_s->down)
+ {
+ p_s = p_s->down;
+ p_d_prev = p_d;
+ p_d = _asn1_add_node_only (p_s->type);
+ _asn1_set_down (p_d_prev, p_d);
+ }
+ else
+ move = RIGHT;
+ }
+
+ if (p_s == source_node)
+ break;
+
+ if (move == RIGHT)
+ {
+ if (p_s->right)
+ {
+ p_s = p_s->right;
+ p_d_prev = p_d;
+ p_d = _asn1_add_node_only (p_s->type);
+ _asn1_set_right (p_d_prev, p_d);
+ }
+ else
+ move = UP;
+ }
+ if (move == UP)
+ {
+ p_s = _asn1_find_up (p_s);
+ p_d = _asn1_find_up (p_d);
+ }
+ }
+ while (p_s != source_node);
+
+ return dest_node;
+}
+</pre>
+</div>
+</td>
+</tr>
+<tr class="function_entry_moderate">
+<td class="function_entry_filename">
+<a href="javascript:void(0);" title="show/hide function source" onClick="javascript:show_hide('_asn1_change_integer_value_src', '_asn1_change_integer_value_button')"><span id="_asn1_change_integer_value_button">↓</span></a>
+</td>
+<td class="function_entry_name">
+_asn1_change_integer_value
+</td>
+<td class="function_entry_cyclo">
+12
+</td>
+<td class="function_entry_number">
+28
+</td>
+<td class="function_entry_number">
+56
+</td>
+<td class="function_entry_filename">
+<a href="http://git.savannah.gnu.org/gitweb/?p=libtasn1.git;a=blob;f=lib/parser_aux.c;hb=HEAD">lib/parser_aux.c</a>
+</td>
+</tr>
+<tr>
+<td colspan="6" height="0">
+<div id="_asn1_change_integer_value_src" class="function_src" style="position: relative; display: none;">
+<pre class="function_src">
+asn1_retCode
+_asn1_change_integer_value (ASN1_TYPE node)
+{
+ ASN1_TYPE p;
+ unsigned char val[SIZEOF_UNSIGNED_LONG_INT];
+ unsigned char val2[SIZEOF_UNSIGNED_LONG_INT + 1];
+ int len;
+
+ if (node == NULL)
+ return ASN1_ELEMENT_NOT_FOUND;
+
+ p = node;
+ while (p)
+ {
+ if ((type_field (p->type) == TYPE_INTEGER) && (p->type & CONST_ASSIGN))
+ {
+ if (p->value)
+ {
+ _asn1_convert_integer (p->value, val, sizeof (val), &len);
+ asn1_octet_der (val, len, val2, &len);
+ _asn1_set_value (p, val2, len);
+ }
+ }
+
+ if (p->down)
+ {
+ p = p->down;
+ }
+ else
+ {
+ if (p == node)
+ p = NULL;
+ else if (p->right)
+ p = p->right;
+ else
+ {
+ while (1)
+ {
+ p = _asn1_find_up (p);
+ if (p == node)
+ {
+ p = NULL;
+ break;
+ }
+ if (p->right)
+ {
+ p = p->right;
+ break;
+ }
+ }
+ }
+ }
+ }
+
+ return ASN1_SUCCESS;
+}
+</pre>
+</div>
+</td>
+</tr>
+<tr class="function_entry_moderate">
+<td class="function_entry_filename">
+<a href="javascript:void(0);" title="show/hide function source" onClick="javascript:show_hide('asn1_get_tag_der_src', 'asn1_get_tag_der_button')"><span id="asn1_get_tag_der_button">↓</span></a>
+</td>
+<td class="function_entry_name">
+asn1_get_tag_der
+</td>
+<td class="function_entry_cyclo">
+11
+</td>
+<td class="function_entry_number">
+24
+</td>
+<td class="function_entry_number">
+44
+</td>
+<td class="function_entry_filename">
+<a href="http://git.savannah.gnu.org/gitweb/?p=libtasn1.git;a=blob;f=lib/decoding.c;hb=HEAD">lib/decoding.c</a>
+</td>
+</tr>
+<tr>
+<td colspan="6" height="0">
+<div id="asn1_get_tag_der_src" class="function_src" style="position: relative; display: none;">
+<pre class="function_src">
+int
+asn1_get_tag_der (const unsigned char *der, int der_len,
+ unsigned char *cls, int *len, unsigned long *tag)
+{
+ int punt, ris;
+
+ if (der == NULL || der_len < 2 || len == NULL)
+ return ASN1_DER_ERROR;
+
+ *cls = der[0] & 0xE0;
+ if ((der[0] & 0x1F) != 0x1F)
+ {
+ /* short form */
+ *len = 1;
+ ris = der[0] & 0x1F;
+ }
+ else
+ {
+ /* Long form */
+ punt = 1;
+ ris = 0;
+ while (punt <= der_len && der[punt] & 128)
+ {
+ int last = ris;
+ ris = ris * 128 + (der[punt++] & 0x7F);
+ if (ris < last)
+ /* wrapper around, and no bignums... */
+ return ASN1_DER_ERROR;
+ }
+ if (punt >= der_len)
+ return ASN1_DER_ERROR;
+ {
+ int last = ris;
+ ris = ris * 128 + (der[punt++] & 0x7F);
+ if (ris < last)
+ /* wrapper around, and no bignums... */
+ return ASN1_DER_ERROR;
+ }
+ *len = punt;
+ }
+ if (tag)
+ *tag = ris;
+ return ASN1_SUCCESS;
+}
+</pre>
+</div>
+</td>
+</tr>
+<tr class="function_entry_simple">
+<td class="function_entry_filename">
+
+</td>
+<td class="function_entry_name">
+_asn1_get_indefinite_length_string
+</td>
+<td class="function_entry_cyclo">
+10
+</td>
+<td class="function_entry_number">
+27
+</td>
+<td class="function_entry_number">
+49
+</td>
+<td class="function_entry_filename">
+<a href="http://git.savannah.gnu.org/gitweb/?p=libtasn1.git;a=blob;f=lib/decoding.c;hb=HEAD">lib/decoding.c</a>
+</td>
+</tr>
+<tr class="function_entry_simple">
+<td class="function_entry_filename">
+
+</td>
+<td class="function_entry_name">
+_asn1_get_objectid_der
+</td>
+<td class="function_entry_cyclo">
+10
+</td>
+<td class="function_entry_number">
+27
+</td>
+<td class="function_entry_number">
+40
+</td>
+<td class="function_entry_filename">
+<a href="http://git.savannah.gnu.org/gitweb/?p=libtasn1.git;a=blob;f=lib/decoding.c;hb=HEAD">lib/decoding.c</a>
+</td>
+</tr>
+<tr class="function_entry_simple">
+<td class="function_entry_filename">
+
+</td>
+<td class="function_entry_name">
+_asn1_complete_explicit_tag
+</td>
+<td class="function_entry_cyclo">
+10
+</td>
+<td class="function_entry_number">
+26
+</td>
+<td class="function_entry_number">
+56
+</td>
+<td class="function_entry_filename">
+<a href="http://git.savannah.gnu.org/gitweb/?p=libtasn1.git;a=blob;f=lib/coding.c;hb=HEAD">lib/coding.c</a>
+</td>
+</tr>
+<tr class="function_entry_simple">
+<td class="function_entry_filename">
+
+</td>
+<td class="function_entry_name">
+asn1_parser2array
+</td>
+<td class="function_entry_cyclo">
+9
+</td>
+<td class="function_entry_number">
+48
+</td>
+<td class="function_entry_number">
+95
+</td>
+<td class="function_entry_filename">
+<a href="http://git.savannah.gnu.org/gitweb/?p=libtasn1.git;a=blob;f=lib/ASN1.c;hb=HEAD">lib/ASN1.c</a>
+</td>
+</tr>
+<tr class="function_entry_simple">
+<td class="function_entry_filename">
+
+</td>
+<td class="function_entry_name">
+asn1_find_structure_from_oid
+</td>
+<td class="function_entry_cyclo">
+9
+</td>
+<td class="function_entry_number">
+23
+</td>
+<td class="function_entry_number">
+43
+</td>
+<td class="function_entry_filename">
+<a href="http://git.savannah.gnu.org/gitweb/?p=libtasn1.git;a=blob;f=lib/structure.c;hb=HEAD">lib/structure.c</a>
+</td>
+</tr>
+<tr class="function_entry_simple">
+<td class="function_entry_filename">
+
+</td>
+<td class="function_entry_name">
+asn1_delete_structure
+</td>
+<td class="function_entry_cyclo">
+8
+</td>
+<td class="function_entry_number">
+25
+</td>
+<td class="function_entry_number">
+50
+</td>
+<td class="function_entry_filename">
+<a href="http://git.savannah.gnu.org/gitweb/?p=libtasn1.git;a=blob;f=lib/structure.c;hb=HEAD">lib/structure.c</a>
+</td>
+</tr>
+<tr class="function_entry_simple">
+<td class="function_entry_filename">
+
+</td>
+<td class="function_entry_name">
+yytnamerr
+</td>
+<td class="function_entry_cyclo">
+11
+</td>
+<td class="function_entry_number">
+20
+</td>
+<td class="function_entry_number">
+38
+</td>
+<td class="function_entry_filename">
+<a href="http://git.savannah.gnu.org/gitweb/?p=libtasn1.git;a=blob;f=lib/ASN1.c;hb=HEAD">lib/ASN1.c</a>
+</td>
+</tr>
+<tr class="function_entry_simple">
+<td class="function_entry_filename">
+
+</td>
+<td class="function_entry_name">
+_asn1_append_value
+</td>
+<td class="function_entry_cyclo">
+7
+</td>
+<td class="function_entry_number">
+22
+</td>
+<td class="function_entry_number">
+37
+</td>
+<td class="function_entry_filename">
+<a href="http://git.savannah.gnu.org/gitweb/?p=libtasn1.git;a=blob;f=lib/parser_aux.c;hb=HEAD">lib/parser_aux.c</a>
+</td>
+</tr>
+<tr class="function_entry_simple">
+<td class="function_entry_filename">
+
+</td>
+<td class="function_entry_name">
+asn1_get_length_der
+</td>
+<td class="function_entry_cyclo">
+7
+</td>
+<td class="function_entry_number">
+20
+</td>
+<td class="function_entry_number">
+43
+</td>
+<td class="function_entry_filename">
+<a href="http://git.savannah.gnu.org/gitweb/?p=libtasn1.git;a=blob;f=lib/decoding.c;hb=HEAD">lib/decoding.c</a>
+</td>
+</tr>
+<tr class="function_entry_simple">
+<td class="function_entry_filename">
+
+</td>
+<td class="function_entry_name">
+_asn1_extract_der_octet
+</td>
+<td class="function_entry_cyclo">
+7
+</td>
+<td class="function_entry_number">
+20
+</td>
+<td class="function_entry_number">
+41
+</td>
+<td class="function_entry_filename">
+<a href="http://git.savannah.gnu.org/gitweb/?p=libtasn1.git;a=blob;f=lib/decoding.c;hb=HEAD">lib/decoding.c</a>
+</td>
+</tr>
+<tr class="function_entry_simple">
+<td class="function_entry_filename">
+
+</td>
+<td class="function_entry_name">
+_asn1_append_sequence_set
+</td>
+<td class="function_entry_cyclo">
+7
+</td>
+<td class="function_entry_number">
+20
+</td>
+<td class="function_entry_number">
+33
+</td>
+<td class="function_entry_filename">
+<a href="http://git.savannah.gnu.org/gitweb/?p=libtasn1.git;a=blob;f=lib/element.c;hb=HEAD">lib/element.c</a>
+</td>
+</tr>
+<tr class="function_entry_simple">
+<td class="function_entry_filename">
+
+</td>
+<td class="function_entry_name">
+_asn1_set_value
+</td>
+<td class="function_entry_cyclo">
+7
+</td>
+<td class="function_entry_number">
+17
+</td>
+<td class="function_entry_number">
+27
+</td>
+<td class="function_entry_filename">
+<a href="http://git.savannah.gnu.org/gitweb/?p=libtasn1.git;a=blob;f=lib/parser_aux.c;hb=HEAD">lib/parser_aux.c</a>
+</td>
+</tr>
+<tr class="function_entry_simple">
+<td class="function_entry_filename">
+
+</td>
+<td class="function_entry_name">
+_asn1_create_errorDescription
+</td>
+<td class="function_entry_cyclo">
+11
+</td>
+<td class="function_entry_number">
+29
+</td>
+<td class="function_entry_number">
+42
+</td>
+<td class="function_entry_filename">
+<a href="http://git.savannah.gnu.org/gitweb/?p=libtasn1.git;a=blob;f=lib/ASN1.c;hb=HEAD">lib/ASN1.c</a>
+</td>
+</tr>
+<tr class="function_entry_simple">
+<td class="function_entry_filename">
+
+</td>
+<td class="function_entry_name">
+asn1_parser2tree
+</td>
+<td class="function_entry_cyclo">
+6
+</td>
+<td class="function_entry_number">
+26
+</td>
+<td class="function_entry_number">
+58
+</td>
+<td class="function_entry_filename">
+<a href="http://git.savannah.gnu.org/gitweb/?p=libtasn1.git;a=blob;f=lib/ASN1.c;hb=HEAD">lib/ASN1.c</a>
+</td>
+</tr>
+<tr class="function_entry_simple">
+<td class="function_entry_filename">
+
+</td>
+<td class="function_entry_name">
+asn1_length_der
+</td>
+<td class="function_entry_cyclo">
+6
+</td>
+<td class="function_entry_number">
+15
+</td>
+<td class="function_entry_number">
+31
+</td>
+<td class="function_entry_filename">
+<a href="http://git.savannah.gnu.org/gitweb/?p=libtasn1.git;a=blob;f=lib/coding.c;hb=HEAD">lib/coding.c</a>
+</td>
+</tr>
+<tr class="function_entry_simple">
+<td class="function_entry_filename">
+
+</td>
+<td class="function_entry_name">
+parse_version_string
+</td>
+<td class="function_entry_cyclo">
+6
+</td>
+<td class="function_entry_number">
+15
+</td>
+<td class="function_entry_number">
+21
+</td>
+<td class="function_entry_filename">
+<a href="http://git.savannah.gnu.org/gitweb/?p=libtasn1.git;a=blob;f=lib/parser_aux.c;hb=HEAD">lib/parser_aux.c</a>
+</td>
+</tr>
+<tr class="function_entry_simple">
+<td class="function_entry_filename">
+
+</td>
+<td class="function_entry_name">
+_asn1_set_name
+</td>
+<td class="function_entry_cyclo">
+6
+</td>
+<td class="function_entry_number">
+13
+</td>
+<td class="function_entry_number">
+25
+</td>
+<td class="function_entry_filename">
+<a href="http://git.savannah.gnu.org/gitweb/?p=libtasn1.git;a=blob;f=lib/parser_aux.c;hb=HEAD">lib/parser_aux.c</a>
+</td>
+</tr>
+<tr class="function_entry_simple">
+<td class="function_entry_filename">
+
+</td>
+<td class="function_entry_name">
+asn1_number_of_elements
+</td>
+<td class="function_entry_cyclo">
+6
+</td>
+<td class="function_entry_number">
+13
+</td>
+<td class="function_entry_number">
+25
+</td>
+<td class="function_entry_filename">
+<a href="http://git.savannah.gnu.org/gitweb/?p=libtasn1.git;a=blob;f=lib/structure.c;hb=HEAD">lib/structure.c</a>
+</td>
+</tr>
+<tr class="function_entry_simple">
+<td class="function_entry_filename">
+
+</td>
+<td class="function_entry_name">
+_asn1_remove_node
+</td>
+<td class="function_entry_cyclo">
+5
+</td>
+<td class="function_entry_number">
+7
+</td>
+<td class="function_entry_number">
+12
+</td>
+<td class="function_entry_filename">
+<a href="http://git.savannah.gnu.org/gitweb/?p=libtasn1.git;a=blob;f=lib/parser_aux.c;hb=HEAD">lib/parser_aux.c</a>
+</td>
+</tr>
+<tr class="function_entry_simple">
+<td class="function_entry_filename">
+
+</td>
+<td class="function_entry_name">
+asn1_copy_node
+</td>
+<td class="function_entry_cyclo">
+5
+</td>
+<td class="function_entry_number">
+21
+</td>
+<td class="function_entry_number">
+40
+</td>
+<td class="function_entry_filename">
+<a href="http://git.savannah.gnu.org/gitweb/?p=libtasn1.git;a=blob;f=lib/structure.c;hb=HEAD">lib/structure.c</a>
+</td>
+</tr>
+<tr class="function_entry_simple">
+<td class="function_entry_filename">
+
+</td>
+<td class="function_entry_name">
+asn1_delete_element
+</td>
+<td class="function_entry_cyclo">
+5
+</td>
+<td class="function_entry_number">
+14
+</td>
+<td class="function_entry_number">
+25
+</td>
+<td class="function_entry_filename">
+<a href="http://git.savannah.gnu.org/gitweb/?p=libtasn1.git;a=blob;f=lib/structure.c;hb=HEAD">lib/structure.c</a>
+</td>
+</tr>
+<tr class="function_entry_simple">
+<td class="function_entry_filename">
+
+</td>
+<td class="function_entry_name">
+_asn1_set_value_m
+</td>
+<td class="function_entry_cyclo">
+5
+</td>
+<td class="function_entry_number">
+12
+</td>
+<td class="function_entry_number">
+21
+</td>
+<td class="function_entry_filename">
+<a href="http://git.savannah.gnu.org/gitweb/?p=libtasn1.git;a=blob;f=lib/parser_aux.c;hb=HEAD">lib/parser_aux.c</a>
+</td>
+</tr>
+<tr class="function_entry_simple">
+<td class="function_entry_filename">
+
+</td>
+<td class="function_entry_name">
+parse_version_number
+</td>
+<td class="function_entry_cyclo">
+5
+</td>
+<td class="function_entry_number">
+11
+</td>
+<td class="function_entry_number">
+15
+</td>
+<td class="function_entry_filename">
+<a href="http://git.savannah.gnu.org/gitweb/?p=libtasn1.git;a=blob;f=lib/parser_aux.c;hb=HEAD">lib/parser_aux.c</a>
+</td>
+</tr>
+<tr class="function_entry_simple">
+<td class="function_entry_filename">
+
+</td>
+<td class="function_entry_name">
+_asn1_get_time_der
+</td>
+<td class="function_entry_cyclo">
+5
+</td>
+<td class="function_entry_number">
+10
+</td>
+<td class="function_entry_number">
+17
+</td>
+<td class="function_entry_filename">
+<a href="http://git.savannah.gnu.org/gitweb/?p=libtasn1.git;a=blob;f=lib/decoding.c;hb=HEAD">lib/decoding.c</a>
+</td>
+</tr>
+<tr class="function_entry_simple">
+<td class="function_entry_filename">
+
+</td>
+<td class="function_entry_name">
+_asn1_find_up
+</td>
+<td class="function_entry_cyclo">
+4
+</td>
+<td class="function_entry_number">
+7
+</td>
+<td class="function_entry_number">
+15
+</td>
+<td class="function_entry_filename">
+<a href="http://git.savannah.gnu.org/gitweb/?p=libtasn1.git;a=blob;f=lib/parser_aux.c;hb=HEAD">lib/parser_aux.c</a>
+</td>
+</tr>
+<tr class="function_entry_simple">
+<td class="function_entry_filename">
+
+</td>
+<td class="function_entry_name">
+_asn1_find_left
+</td>
+<td class="function_entry_cyclo">
+4
+</td>
+<td class="function_entry_number">
+3
+</td>
+<td class="function_entry_number">
+8
+</td>
+<td class="function_entry_filename">
+<a href="http://git.savannah.gnu.org/gitweb/?p=libtasn1.git;a=blob;f=lib/structure.c;hb=HEAD">lib/structure.c</a>
+</td>
+</tr>
+<tr class="function_entry_simple">
+<td class="function_entry_filename">
+
+</td>
+<td class="function_entry_name">
+_asn1_ltostr
+</td>
+<td class="function_entry_cyclo">
+4
+</td>
+<td class="function_entry_number">
+22
+</td>
+<td class="function_entry_number">
+32
+</td>
+<td class="function_entry_filename">
+<a href="http://git.savannah.gnu.org/gitweb/?p=libtasn1.git;a=blob;f=lib/parser_aux.c;hb=HEAD">lib/parser_aux.c</a>
+</td>
+</tr>
+<tr class="function_entry_simple">
+<td class="function_entry_filename">
+
+</td>
+<td class="function_entry_name">
+_asn1_tag_der
+</td>
+<td class="function_entry_cyclo">
+4
+</td>
+<td class="function_entry_number">
+14
+</td>
+<td class="function_entry_number">
+29
+</td>
+<td class="function_entry_filename">
+<a href="http://git.savannah.gnu.org/gitweb/?p=libtasn1.git;a=blob;f=lib/coding.c;hb=HEAD">lib/coding.c</a>
+</td>
+</tr>
+<tr class="function_entry_simple">
+<td class="function_entry_filename">
+
+</td>
+<td class="function_entry_name">
+_asn1_hierarchical_name
+</td>
+<td class="function_entry_cyclo">
+4
+</td>
+<td class="function_entry_number">
+12
+</td>
+<td class="function_entry_number">
+25
+</td>
+<td class="function_entry_filename">
+<a href="http://git.savannah.gnu.org/gitweb/?p=libtasn1.git;a=blob;f=lib/element.c;hb=HEAD">lib/element.c</a>
+</td>
+</tr>
+<tr class="function_entry_simple">
+<td class="function_entry_filename">
+
+</td>
+<td class="function_entry_name">
+asn1_get_bit_der
+</td>
+<td class="function_entry_cyclo">
+4
+</td>
+<td class="function_entry_number">
+12
+</td>
+<td class="function_entry_number">
+25
+</td>
+<td class="function_entry_filename">
+<a href="http://git.savannah.gnu.org/gitweb/?p=libtasn1.git;a=blob;f=lib/decoding.c;hb=HEAD">lib/decoding.c</a>
+</td>
+</tr>
+<tr class="function_entry_simple">
+<td class="function_entry_filename">
+
+</td>
+<td class="function_entry_name">
+asn1_get_octet_der
+</td>
+<td class="function_entry_cyclo">
+4
+</td>
+<td class="function_entry_number">
+11
+</td>
+<td class="function_entry_number">
+26
+</td>
+<td class="function_entry_filename">
+<a href="http://git.savannah.gnu.org/gitweb/?p=libtasn1.git;a=blob;f=lib/decoding.c;hb=HEAD">lib/decoding.c</a>
+</td>
+</tr>
+<tr class="function_entry_simple">
+<td class="function_entry_filename">
+
+</td>
+<td class="function_entry_name">
+_asn1_time_der
+</td>
+<td class="function_entry_cyclo">
+4
+</td>
+<td class="function_entry_number">
+11
+</td>
+<td class="function_entry_number">
+19
+</td>
+<td class="function_entry_filename">
+<a href="http://git.savannah.gnu.org/gitweb/?p=libtasn1.git;a=blob;f=lib/coding.c;hb=HEAD">lib/coding.c</a>
+</td>
+</tr>
+<tr class="function_entry_simple">
+<td class="function_entry_filename">
+
+</td>
+<td class="function_entry_name">
+yy_symbol_value_print
+</td>
+<td class="function_entry_cyclo">
+3
+</td>
+<td class="function_entry_number">
+6
+</td>
+<td class="function_entry_number">
+24
+</td>
+<td class="function_entry_filename">
+<a href="http://git.savannah.gnu.org/gitweb/?p=libtasn1.git;a=blob;f=lib/ASN1.c;hb=HEAD">lib/ASN1.c</a>
+</td>
+</tr>
+<tr class="function_entry_simple">
+<td class="function_entry_filename">
+
+</td>
+<td class="function_entry_name">
+asn1_get_length_ber
+</td>
+<td class="function_entry_cyclo">
+3
+</td>
+<td class="function_entry_number">
+9
+</td>
+<td class="function_entry_number">
+17
+</td>
+<td class="function_entry_filename">
+<a href="http://git.savannah.gnu.org/gitweb/?p=libtasn1.git;a=blob;f=lib/decoding.c;hb=HEAD">lib/decoding.c</a>
+</td>
+</tr>
+<tr class="function_entry_simple">
+<td class="function_entry_filename">
+
+</td>
+<td class="function_entry_name">
+asn1_strerror
+</td>
+<td class="function_entry_cyclo">
+3
+</td>
+<td class="function_entry_number">
+7
+</td>
+<td class="function_entry_number">
+11
+</td>
+<td class="function_entry_filename">
+<a href="http://git.savannah.gnu.org/gitweb/?p=libtasn1.git;a=blob;f=lib/errors.c;hb=HEAD">lib/errors.c</a>
+</td>
+</tr>
+<tr class="function_entry_simple">
+<td class="function_entry_filename">
+
+</td>
+<td class="function_entry_name">
+_asn1_get_last_right
+</td>
+<td class="function_entry_cyclo">
+3
+</td>
+<td class="function_entry_number">
+7
+</td>
+<td class="function_entry_number">
+12
+</td>
+<td class="function_entry_filename">
+<a href="http://git.savannah.gnu.org/gitweb/?p=libtasn1.git;a=blob;f=lib/parser_aux.c;hb=HEAD">lib/parser_aux.c</a>
+</td>
+</tr>
+<tr class="function_entry_simple">
+<td class="function_entry_filename">
+
+</td>
+<td class="function_entry_name">
+_asn1_str_cat
+</td>
+<td class="function_entry_cyclo">
+3
+</td>
+<td class="function_entry_number">
+7
+</td>
+<td class="function_entry_number">
+19
+</td>
+<td class="function_entry_filename">
+<a href="http://git.savannah.gnu.org/gitweb/?p=libtasn1.git;a=blob;f=lib/gstr.c;hb=HEAD">lib/gstr.c</a>
+</td>
+</tr>
+<tr class="function_entry_simple">
+<td class="function_entry_filename">
+
+</td>
+<td class="function_entry_name">
+_asn1_str_cpy
+</td>
+<td class="function_entry_cyclo">
+3
+</td>
+<td class="function_entry_number">
+6
+</td>
+<td class="function_entry_number">
+18
+</td>
+<td class="function_entry_filename">
+<a href="http://git.savannah.gnu.org/gitweb/?p=libtasn1.git;a=blob;f=lib/gstr.c;hb=HEAD">lib/gstr.c</a>
+</td>
+</tr>
+<tr class="function_entry_simple">
+<td class="function_entry_filename">
+
+</td>
+<td class="function_entry_name">
+_asn1_set_down
+</td>
+<td class="function_entry_cyclo">
+3
+</td>
+<td class="function_entry_number">
+6
+</td>
+<td class="function_entry_number">
+10
+</td>
+<td class="function_entry_filename">
+<a href="http://git.savannah.gnu.org/gitweb/?p=libtasn1.git;a=blob;f=lib/parser_aux.c;hb=HEAD">lib/parser_aux.c</a>
+</td>
+</tr>
+<tr class="function_entry_simple">
+<td class="function_entry_filename">
+
+</td>
+<td class="function_entry_name">
+_asn1_set_right
+</td>
+<td class="function_entry_cyclo">
+3
+</td>
+<td class="function_entry_number">
+6
+</td>
+<td class="function_entry_number">
+10
+</td>
+<td class="function_entry_filename">
+<a href="http://git.savannah.gnu.org/gitweb/?p=libtasn1.git;a=blob;f=lib/parser_aux.c;hb=HEAD">lib/parser_aux.c</a>
+</td>
+</tr>
+<tr class="function_entry_simple">
+<td class="function_entry_filename">
+
+</td>
+<td class="function_entry_name">
+asn1_octet_der
+</td>
+<td class="function_entry_cyclo">
+3
+</td>
+<td class="function_entry_number">
+6
+</td>
+<td class="function_entry_number">
+12
+</td>
+<td class="function_entry_filename">
+<a href="http://git.savannah.gnu.org/gitweb/?p=libtasn1.git;a=blob;f=lib/coding.c;hb=HEAD">lib/coding.c</a>
+</td>
+</tr>
+<tr class="function_entry_simple">
+<td class="function_entry_filename">
+
+</td>
+<td class="function_entry_name">
+_asn1_add_node
+</td>
+<td class="function_entry_cyclo">
+3
+</td>
+<td class="function_entry_number">
+14
+</td>
+<td class="function_entry_number">
+25
+</td>
+<td class="function_entry_filename">
+<a href="http://git.savannah.gnu.org/gitweb/?p=libtasn1.git;a=blob;f=lib/parser_aux.c;hb=HEAD">lib/parser_aux.c</a>
+</td>
+</tr>
+<tr class="function_entry_simple">
+<td class="function_entry_filename">
+
+</td>
+<td class="function_entry_name">
+asn1_bit_der
+</td>
+<td class="function_entry_cyclo">
+3
+</td>
+<td class="function_entry_number">
+13
+</td>
+<td class="function_entry_number">
+20
+</td>
+<td class="function_entry_filename">
+<a href="http://git.savannah.gnu.org/gitweb/?p=libtasn1.git;a=blob;f=lib/coding.c;hb=HEAD">lib/coding.c</a>
+</td>
+</tr>
+<tr class="function_entry_simple">
+<td class="function_entry_filename">
+
+</td>
+<td class="function_entry_name">
+_asn1_set_value_octet
+</td>
+<td class="function_entry_cyclo">
+3
+</td>
+<td class="function_entry_number">
+10
+</td>
+<td class="function_entry_number">
+17
+</td>
+<td class="function_entry_filename">
+<a href="http://git.savannah.gnu.org/gitweb/?p=libtasn1.git;a=blob;f=lib/parser_aux.c;hb=HEAD">lib/parser_aux.c</a>
+</td>
+</tr>
+<tr class="function_entry_simple">
+<td class="function_entry_filename">
+
+</td>
+<td class="function_entry_name">
+yydestruct
+</td>
+<td class="function_entry_cyclo">
+2
+</td>
+<td class="function_entry_number">
+5
+</td>
+<td class="function_entry_number">
+32
+</td>
+<td class="function_entry_filename">
+<a href="http://git.savannah.gnu.org/gitweb/?p=libtasn1.git;a=blob;f=lib/ASN1.c;hb=HEAD">lib/ASN1.c</a>
+</td>
+</tr>
+<tr class="function_entry_simple">
+<td class="function_entry_filename">
+
+</td>
+<td class="function_entry_name">
+yy_stack_print
+</td>
+<td class="function_entry_cyclo">
+2
+</td>
+<td class="function_entry_number">
+6
+</td>
+<td class="function_entry_number">
+14
+</td>
+<td class="function_entry_filename">
+<a href="http://git.savannah.gnu.org/gitweb/?p=libtasn1.git;a=blob;f=lib/ASN1.c;hb=HEAD">lib/ASN1.c</a>
+</td>
+</tr>
+<tr class="function_entry_simple">
+<td class="function_entry_filename">
+
+</td>
+<td class="function_entry_name">
+_asn1_delete_list_and_nodes
+</td>
+<td class="function_entry_cyclo">
+2
+</td>
+<td class="function_entry_number">
+6
+</td>
+<td class="function_entry_number">
+13
+</td>
+<td class="function_entry_filename">
+<a href="http://git.savannah.gnu.org/gitweb/?p=libtasn1.git;a=blob;f=lib/parser_aux.c;hb=HEAD">lib/parser_aux.c</a>
+</td>
+</tr>
+<tr class="function_entry_simple">
+<td class="function_entry_filename">
+
+</td>
+<td class="function_entry_name">
+_asn1_add_node_only
+</td>
+<td class="function_entry_cyclo">
+2
+</td>
+<td class="function_entry_number">
+6
+</td>
+<td class="function_entry_number">
+13
+</td>
+<td class="function_entry_filename">
+<a href="http://git.savannah.gnu.org/gitweb/?p=libtasn1.git;a=blob;f=lib/structure.c;hb=HEAD">lib/structure.c</a>
+</td>
+</tr>
+<tr class="function_entry_simple">
+<td class="function_entry_filename">
+
+</td>
+<td class="function_entry_name">
+yystrlen
+</td>
+<td class="function_entry_cyclo">
+2
+</td>
+<td class="function_entry_number">
+6
+</td>
+<td class="function_entry_number">
+24
+</td>
+<td class="function_entry_filename">
+<a href="http://git.savannah.gnu.org/gitweb/?p=libtasn1.git;a=blob;f=lib/ASN1.c;hb=HEAD">lib/ASN1.c</a>
+</td>
+</tr>
+<tr class="function_entry_simple">
+<td class="function_entry_filename">
+
+</td>
+<td class="function_entry_name">
+yy_symbol_print
+</td>
+<td class="function_entry_cyclo">
+2
+</td>
+<td class="function_entry_number">
+5
+</td>
+<td class="function_entry_number">
+18
+</td>
+<td class="function_entry_filename">
+<a href="http://git.savannah.gnu.org/gitweb/?p=libtasn1.git;a=blob;f=lib/ASN1.c;hb=HEAD">lib/ASN1.c</a>
+</td>
+</tr>
+<tr class="function_entry_simple">
+<td class="function_entry_filename">
+
+</td>
+<td class="function_entry_name">
+_asn1_delete_list
+</td>
+<td class="function_entry_cyclo">
+2
+</td>
+<td class="function_entry_number">
+5
+</td>
+<td class="function_entry_number">
+12
+</td>
+<td class="function_entry_filename">
+<a href="http://git.savannah.gnu.org/gitweb/?p=libtasn1.git;a=blob;f=lib/parser_aux.c;hb=HEAD">lib/parser_aux.c</a>
+</td>
+</tr>
+<tr class="function_entry_simple">
+<td class="function_entry_filename">
+
+</td>
+<td class="function_entry_name">
+_asn1_error_description_value_not_found
+</td>
+<td class="function_entry_cyclo">
+2
+</td>
+<td class="function_entry_number">
+5
+</td>
+<td class="function_entry_number">
+14
+</td>
+<td class="function_entry_filename">
+<a href="http://git.savannah.gnu.org/gitweb/?p=libtasn1.git;a=blob;f=lib/coding.c;hb=HEAD">lib/coding.c</a>
+</td>
+</tr>
+<tr class="function_entry_simple">
+<td class="function_entry_filename">
+
+</td>
+<td class="function_entry_name">
+yystpcpy
+</td>
+<td class="function_entry_cyclo">
+2
+</td>
+<td class="function_entry_number">
+5
+</td>
+<td class="function_entry_number">
+17
+</td>
+<td class="function_entry_filename">
+<a href="http://git.savannah.gnu.org/gitweb/?p=libtasn1.git;a=blob;f=lib/ASN1.c;hb=HEAD">lib/ASN1.c</a>
+</td>
+</tr>
+<tr class="function_entry_simple">
+<td class="function_entry_filename">
+
+</td>
+<td class="function_entry_name">
+_asn1_mod_type
+</td>
+<td class="function_entry_cyclo">
+2
+</td>
+<td class="function_entry_number">
+4
+</td>
+<td class="function_entry_number">
+8
+</td>
+<td class="function_entry_filename">
+<a href="http://git.savannah.gnu.org/gitweb/?p=libtasn1.git;a=blob;f=lib/parser_aux.c;hb=HEAD">lib/parser_aux.c</a>
+</td>
+</tr>
+<tr class="function_entry_simple">
+<td class="function_entry_filename">
+
+</td>
+<td class="function_entry_name">
+_asn1_yyerror
+</td>
+<td class="function_entry_cyclo">
+2
+</td>
+<td class="function_entry_number">
+4
+</td>
+<td class="function_entry_number">
+14
+</td>
+<td class="function_entry_filename">
+<a href="http://git.savannah.gnu.org/gitweb/?p=libtasn1.git;a=blob;f=lib/ASN1.c;hb=HEAD">lib/ASN1.c</a>
+</td>
+</tr>
+<tr class="function_entry_simple">
+<td class="function_entry_filename">
+
+</td>
+<td class="function_entry_name">
+asn1_perror
+</td>
+<td class="function_entry_cyclo">
+2
+</td>
+<td class="function_entry_number">
+3
+</td>
+<td class="function_entry_number">
+6
+</td>
+<td class="function_entry_filename">
+<a href="http://git.savannah.gnu.org/gitweb/?p=libtasn1.git;a=blob;f=lib/errors.c;hb=HEAD">lib/errors.c</a>
+</td>
+</tr>
+<tr class="function_entry_simple">
+<td class="function_entry_filename">
+
+</td>
+<td class="function_entry_name">
+_asn1_get_name
+</td>
+<td class="function_entry_cyclo">
+2
+</td>
+<td class="function_entry_number">
+3
+</td>
+<td class="function_entry_number">
+7
+</td>
+<td class="function_entry_filename">
+<a href="http://git.savannah.gnu.org/gitweb/?p=libtasn1.git;a=blob;f=lib/parser_aux.c;hb=HEAD">lib/parser_aux.c</a>
+</td>
+</tr>
+<tr class="function_entry_simple">
+<td class="function_entry_filename">
+
+</td>
+<td class="function_entry_name">
+_asn1_get_down
+</td>
+<td class="function_entry_cyclo">
+2
+</td>
+<td class="function_entry_number">
+3
+</td>
+<td class="function_entry_number">
+7
+</td>
+<td class="function_entry_filename">
+<a href="http://git.savannah.gnu.org/gitweb/?p=libtasn1.git;a=blob;f=lib/parser_aux.c;hb=HEAD">lib/parser_aux.c</a>
+</td>
+</tr>
+<tr class="function_entry_simple">
+<td class="function_entry_filename">
+
+</td>
+<td class="function_entry_name">
+_asn1_get_right
+</td>
+<td class="function_entry_cyclo">
+2
+</td>
+<td class="function_entry_number">
+3
+</td>
+<td class="function_entry_number">
+7
+</td>
+<td class="function_entry_filename">
+<a href="http://git.savannah.gnu.org/gitweb/?p=libtasn1.git;a=blob;f=lib/parser_aux.c;hb=HEAD">lib/parser_aux.c</a>
+</td>
+</tr>
+<tr class="function_entry_simple">
+<td class="function_entry_filename">
+
+</td>
+<td class="function_entry_name">
+yy_reduce_print
+</td>
+<td class="function_entry_cyclo">
+2
+</td>
+<td class="function_entry_number">
+10
+</td>
+<td class="function_entry_number">
+24
+</td>
+<td class="function_entry_filename">
+<a href="http://git.savannah.gnu.org/gitweb/?p=libtasn1.git;a=blob;f=lib/ASN1.c;hb=HEAD">lib/ASN1.c</a>
+</td>
+</tr>
+<tr class="function_entry_simple">
+<td class="function_entry_filename">
+
+</td>
+<td class="function_entry_name">
+asn1_create_element
+</td>
+<td class="function_entry_cyclo">
+2
+</td>
+<td class="function_entry_number">
+10
+</td>
+<td class="function_entry_number">
+21
+</td>
+<td class="function_entry_filename">
+<a href="http://git.savannah.gnu.org/gitweb/?p=libtasn1.git;a=blob;f=lib/structure.c;hb=HEAD">lib/structure.c</a>
+</td>
+</tr>
+<tr class="function_entry_simple">
+<td class="function_entry_filename">
+
+</td>
+<td class="function_entry_name">
+_asn1_copy_structure2
+</td>
+<td class="function_entry_cyclo">
+1
+</td>
+<td class="function_entry_number">
+3
+</td>
+<td class="function_entry_number">
+10
+</td>
+<td class="function_entry_filename">
+<a href="http://git.savannah.gnu.org/gitweb/?p=libtasn1.git;a=blob;f=lib/structure.c;hb=HEAD">lib/structure.c</a>
+</td>
+</tr>
+<tr class="function_entry_simple">
+<td class="function_entry_filename">
+
+</td>
+<td class="function_entry_name">
+_asn1_error_description_tag_error
+</td>
+<td class="function_entry_cyclo">
+1
+</td>
+<td class="function_entry_number">
+3
+</td>
+<td class="function_entry_number">
+10
+</td>
+<td class="function_entry_filename">
+<a href="http://git.savannah.gnu.org/gitweb/?p=libtasn1.git;a=blob;f=lib/decoding.c;hb=HEAD">lib/decoding.c</a>
+</td>
+</tr>
+</table>
+<hr color="black" size="2"/> Copyright (c) 2007, 2008 Free Software Foundation Inc.
+</body>
+</html>