Skip to content

Commit

Permalink
add notes on recursion for asn1
Browse files Browse the repository at this point in the history
  • Loading branch information
acagliano committed Oct 22, 2023
1 parent 304631d commit 5d9ecc5
Show file tree
Hide file tree
Showing 4 changed files with 67 additions and 39 deletions.
34 changes: 22 additions & 12 deletions docs/modules/asn1.rst
Original file line number Diff line number Diff line change
Expand Up @@ -79,20 +79,30 @@ __________
.. doxygenfunction:: cryptx_asn1_decode
:project: CryptX

Here is a simple example of how to loop each element in an ASN.1 structure and return its metadata. Note how a return value of ASN1_END_OF_FILE is used as a limiter. Also notice that this does not process any constructed objects (such as contents of SEQUENCE or SET objects). To add recursion, simply check the value of bit 5 and if it is set, call a function to process that tag's data using :code:`data` and :code:`data_len` as your *data_start* and *data_len* arguments, respectively.
Here is a simple example of how to loop each element in an ASN.1 structure and return its metadata. Note how a return value of ASN1_END_OF_FILE is used as a limiter. Also notice how recursion is achieved.

.. code-block:: c
void decode_level(uint8_t *data, size_t len){
cryptx_asn1_object obj;
do {
err = cryptx_asn1_decode(data, len, index++, &obj);
if(err == ASN1_OK){
printf("element -- tag:%u, len:%u, data:%p\n", obj.tag, obj.len, obj.data);
if(cryptx_asn1_getform(obj.tag)) // is a constructed object
decode_level(obj.data, obj.len);
}
else
printf("error code: %u", err);
} while(err != ASN1_END_OF_FILE);
}
// assume `asn1_data` is some imported data encoded with ASN.1
int main(void){
// assume `asn1_data` is some imported data encoded with ASN.1
asn1_error_t err = ASN1_OK;
uint8_t index = 0, tag, *data;
size_t data_len;
decode_level(asn1_data, sizeof(asn1_data));
}
asn1_error_t err = ASN1_OK;
uint8_t index = 0, tag, *data;
size_t data_len;
do {
err = cryptx_asn1_decode(asn1_data, sizeof(asn1_data), index++, &tag, &data_len, &data);
if(err == ASN1_OK)
printf("element -- tag:%u, len:%u, data:%p\n", tag, data_len, data);
else
printf("error code: %u", err);
} while(err != ASN1_END_OF_FILE);
34 changes: 22 additions & 12 deletions docs/www/_sources/modules/asn1.rst.txt
Original file line number Diff line number Diff line change
Expand Up @@ -79,20 +79,30 @@ __________
.. doxygenfunction:: cryptx_asn1_decode
:project: CryptX

Here is a simple example of how to loop each element in an ASN.1 structure and return its metadata. Note how a return value of ASN1_END_OF_FILE is used as a limiter. Also notice that this does not process any constructed objects (such as contents of SEQUENCE or SET objects). To add recursion, simply check the value of bit 5 and if it is set, call a function to process that tag's data using :code:`data` and :code:`data_len` as your *data_start* and *data_len* arguments, respectively.
Here is a simple example of how to loop each element in an ASN.1 structure and return its metadata. Note how a return value of ASN1_END_OF_FILE is used as a limiter. Also notice how recursion is achieved.

.. code-block:: c
void decode_level(uint8_t *data, size_t len){
cryptx_asn1_object obj;
do {
err = cryptx_asn1_decode(data, len, index++, &obj);
if(err == ASN1_OK){
printf("element -- tag:%u, len:%u, data:%p\n", obj.tag, obj.len, obj.data);
if(cryptx_asn1_getform(obj.tag)) // is a constructed object
decode_level(obj.data, obj.len);
}
else
printf("error code: %u", err);
} while(err != ASN1_END_OF_FILE);
}
// assume `asn1_data` is some imported data encoded with ASN.1
int main(void){
// assume `asn1_data` is some imported data encoded with ASN.1
asn1_error_t err = ASN1_OK;
uint8_t index = 0, tag, *data;
size_t data_len;
decode_level(asn1_data, sizeof(asn1_data));
}
asn1_error_t err = ASN1_OK;
uint8_t index = 0, tag, *data;
size_t data_len;
do {
err = cryptx_asn1_decode(asn1_data, sizeof(asn1_data), index++, &tag, &data_len, &data);
if(err == ASN1_OK)
printf("element -- tag:%u, len:%u, data:%p\n", tag, data_len, data);
else
printf("error code: %u", err);
} while(err != ASN1_END_OF_FILE);
36 changes: 22 additions & 14 deletions docs/www/modules/asn1.html
Original file line number Diff line number Diff line change
Expand Up @@ -426,20 +426,28 @@ <h2>Functions<a class="headerlink" href="#functions" title="Permalink to this he
</dl>
</dd></dl>

<p>Here is a simple example of how to loop each element in an ASN.1 structure and return its metadata. Note how a return value of ASN1_END_OF_FILE is used as a limiter. Also notice that this does not process any constructed objects (such as contents of SEQUENCE or SET objects). To add recursion, simply check the value of bit 5 and if it is set, call a function to process that tag’s data using <code class="code docutils literal notranslate"><span class="pre">data</span></code> and <code class="code docutils literal notranslate"><span class="pre">data_len</span></code> as your <em>data_start</em> and <em>data_len</em> arguments, respectively.</p>
<div class="highlight-c notranslate"><div class="highlight"><pre><span></span><span class="c1">// assume `asn1_data` is some imported data encoded with ASN.1</span>

<span class="n">asn1_error_t</span><span class="w"> </span><span class="n">err</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">ASN1_OK</span><span class="p">;</span>
<span class="kt">uint8_t</span><span class="w"> </span><span class="n">index</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="n">tag</span><span class="p">,</span><span class="w"> </span><span class="o">*</span><span class="n">data</span><span class="p">;</span>
<span class="kt">size_t</span><span class="w"> </span><span class="n">data_len</span><span class="p">;</span>

<span class="k">do</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="n">err</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">cryptx_asn1_decode</span><span class="p">(</span><span class="n">asn1_data</span><span class="p">,</span><span class="w"> </span><span class="k">sizeof</span><span class="p">(</span><span class="n">asn1_data</span><span class="p">),</span><span class="w"> </span><span class="n">index</span><span class="o">++</span><span class="p">,</span><span class="w"> </span><span class="o">&amp;</span><span class="n">tag</span><span class="p">,</span><span class="w"> </span><span class="o">&amp;</span><span class="n">data_len</span><span class="p">,</span><span class="w"> </span><span class="o">&amp;</span><span class="n">data</span><span class="p">);</span>
<span class="w"> </span><span class="k">if</span><span class="p">(</span><span class="n">err</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="n">ASN1_OK</span><span class="p">)</span>
<span class="w"> </span><span class="n">printf</span><span class="p">(</span><span class="s">&quot;element -- tag:%u, len:%u, data:%p</span><span class="se">\n</span><span class="s">&quot;</span><span class="p">,</span><span class="w"> </span><span class="n">tag</span><span class="p">,</span><span class="w"> </span><span class="n">data_len</span><span class="p">,</span><span class="w"> </span><span class="n">data</span><span class="p">);</span>
<span class="w"> </span><span class="k">else</span>
<span class="w"> </span><span class="n">printf</span><span class="p">(</span><span class="s">&quot;error code: %u&quot;</span><span class="p">,</span><span class="w"> </span><span class="n">err</span><span class="p">);</span>
<span class="p">}</span><span class="w"> </span><span class="k">while</span><span class="p">(</span><span class="n">err</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="n">ASN1_END_OF_FILE</span><span class="p">);</span>
<p>Here is a simple example of how to loop each element in an ASN.1 structure and return its metadata. Note how a return value of ASN1_END_OF_FILE is used as a limiter. Also notice how recursion is achieved.</p>
<div class="highlight-c notranslate"><div class="highlight"><pre><span></span><span class="kt">void</span><span class="w"> </span><span class="nf">decode_level</span><span class="p">(</span><span class="kt">uint8_t</span><span class="w"> </span><span class="o">*</span><span class="n">data</span><span class="p">,</span><span class="w"> </span><span class="kt">size_t</span><span class="w"> </span><span class="n">len</span><span class="p">){</span>
<span class="w"> </span><span class="n">cryptx_asn1_object</span><span class="w"> </span><span class="n">obj</span><span class="p">;</span>
<span class="w"> </span><span class="k">do</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="n">err</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">cryptx_asn1_decode</span><span class="p">(</span><span class="n">data</span><span class="p">,</span><span class="w"> </span><span class="n">len</span><span class="p">,</span><span class="w"> </span><span class="n">index</span><span class="o">++</span><span class="p">,</span><span class="w"> </span><span class="o">&amp;</span><span class="n">obj</span><span class="p">);</span>
<span class="w"> </span><span class="k">if</span><span class="p">(</span><span class="n">err</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="n">ASN1_OK</span><span class="p">){</span>
<span class="w"> </span><span class="n">printf</span><span class="p">(</span><span class="s">&quot;element -- tag:%u, len:%u, data:%p</span><span class="se">\n</span><span class="s">&quot;</span><span class="p">,</span><span class="w"> </span><span class="n">obj</span><span class="p">.</span><span class="n">tag</span><span class="p">,</span><span class="w"> </span><span class="n">obj</span><span class="p">.</span><span class="n">len</span><span class="p">,</span><span class="w"> </span><span class="n">obj</span><span class="p">.</span><span class="n">data</span><span class="p">);</span>
<span class="w"> </span><span class="k">if</span><span class="p">(</span><span class="n">cryptx_asn1_getform</span><span class="p">(</span><span class="n">obj</span><span class="p">.</span><span class="n">tag</span><span class="p">))</span><span class="w"> </span><span class="c1">// is a constructed object</span>
<span class="w"> </span><span class="n">decode_level</span><span class="p">(</span><span class="n">obj</span><span class="p">.</span><span class="n">data</span><span class="p">,</span><span class="w"> </span><span class="n">obj</span><span class="p">.</span><span class="n">len</span><span class="p">);</span>
<span class="w"> </span><span class="p">}</span>
<span class="w"> </span><span class="k">else</span>
<span class="w"> </span><span class="n">printf</span><span class="p">(</span><span class="s">&quot;error code: %u&quot;</span><span class="p">,</span><span class="w"> </span><span class="n">err</span><span class="p">);</span>
<span class="w"> </span><span class="p">}</span><span class="w"> </span><span class="k">while</span><span class="p">(</span><span class="n">err</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="n">ASN1_END_OF_FILE</span><span class="p">);</span>
<span class="p">}</span>

<span class="kt">int</span><span class="w"> </span><span class="nf">main</span><span class="p">(</span><span class="kt">void</span><span class="p">){</span>
<span class="w"> </span><span class="c1">// assume `asn1_data` is some imported data encoded with ASN.1</span>
<span class="w"> </span><span class="n">asn1_error_t</span><span class="w"> </span><span class="n">err</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">ASN1_OK</span><span class="p">;</span>
<span class="w"> </span><span class="kt">uint8_t</span><span class="w"> </span><span class="n">index</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="n">tag</span><span class="p">,</span><span class="w"> </span><span class="o">*</span><span class="n">data</span><span class="p">;</span>
<span class="w"> </span><span class="kt">size_t</span><span class="w"> </span><span class="n">data_len</span><span class="p">;</span>
<span class="w"> </span><span class="n">decode_level</span><span class="p">(</span><span class="n">asn1_data</span><span class="p">,</span><span class="w"> </span><span class="k">sizeof</span><span class="p">(</span><span class="n">asn1_data</span><span class="p">));</span>
<span class="p">}</span>
</pre></div>
</div>
</div>
Expand Down
2 changes: 1 addition & 1 deletion docs/www/searchindex.js

Large diffs are not rendered by default.

0 comments on commit 5d9ecc5

Please sign in to comment.