silc_asn1_decode

SYNOPSIS

    SilcBool silc_asn1_decode(SilcAsn1 asn1, SilcBuffer src, ...);

DESCRIPTION

Decodes the ASN.1 encoded buffer `src' by the ASN.1 types sent as argument. The ASN.1 types sent as argument must be found from the `src' for this function to decode successfully.

The memory allocated for the results are allocated from `asn1' and they become invalid if `asn1' becomes invalid. Next (second) call to this function does NOT invalidate the previous results. However, third call to this function does invalidate the results of the first call but not second. On the other hand, fourth call invalidates the results of the second call but not third, fifth call invalidates the results of the third call but not fourth, and so on. This allows efficient decoding, when silc_asn1_decode must be called multiple times to decode all data, without new memory allocations. However, caller must be cautios and understand that the every second call invalidates the results of every second previous results.

If the SILC_ASN1_OPTS macro with SILC_ASN1_ALLOC option is given then all results are dynamically allocated and caller must free them by itself. If the `stack' was given to silc_asn1_alloc, the SILC_ASN1_ALLOC will allocate from that stack and consume the stack. Alternatively if SILC_ASN1_ACCUMUL is given then memory is accumulated from `asn1' for results and they are freed only when the silc_asn1_free or silc_asn1_uninit is called. Next calls to the silc_asn1_decode will NOT invalidate the old results, but will accumulate more memory for new results. If the SILC_ASN1_OPTS is not given at all then the default allocation method (decribed above) applies.

If caller needs to store the results even after `asn1' becomes invalid then call must either use SILC_ASN1_ALLOC option or duplicate the results by itself.

EXAMPLE

    SilcBool bool_val, foo;
    unsigned char *string, string2;
    SilcUInt32 string_len, string2_len;

    silc_asn1_decode(asn1, tree,
                     SILC_ASN1_SEQUENCE,
                       SILC_ASN1_BOOLEAN(&bool_val),
                       SILC_ASN1_OCTET_STRING(&string, &string_len),
                       SILC_ASN1_SEQUENCE_T(0, 2),
                         SILC_ASN1_BOOLEAN_T(SILC_ASN1_EXPLICIT, 100, &foo),
                       SILC_ASN1_END,
                       SILC_ASN1_OCTET_STRING_T(0, 1, &str2, &str2_len),
                     SILC_ASN1_END, SILC_ASN1_END);