Author: Pekka Riikonen <priikone@silcnet.org>
- Copyright (C) 2003 - 2007 Pekka Riikonen
+ Copyright (C) 2003 - 2008 Pekka Riikonen
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
*
* Efficient Abstract Syntax Notation One (ASN.1) implementation. This
* interface provides simple and efficient ASN.1 encoder and decoder.
+ *
* The encoder directly encodes BER encoded data blocks from variable
* argument list of ASN.1 types. Multiple trees can be encoded at once
* and multiple nodes can be encoded into the tree at once. By default
* to encode and decode with various options (such as implicit and explicit
* tagging and defining specific class option).
*
- * The implementation supports all the common ASN.1 types. This
- * implementation does not support advanced ASN.1 features like macros.
+ * The implementation supports all the common ASN.1 types.
*
* References: ITU-T X.680 - X.693
* http://www.itu.int/ITU-T/studygroups/com17/languages/
*
+ * EXAMPLE
+ *
+ * silc_asn1_encode(asn1, buf,
+ * 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, string2, string2_len),
+ * SILC_ASN1_END, SILC_ASN1_END);
+ *
+ * Creates ASN.1 tree that looks something like:
+ *
+ * buf ::= SEQUENCE {
+ * bool_val BOOLEAN,
+ * string OCTET-STRING,
+ * [2] SEQUENCE {
+ * foo [100] EXPLICIT BOOLEAN }
+ * string2 [1] OCTET-STRING }
+ *
***/
#ifndef SILCASN1_H
#define SILCASN1_H
-/****s* silcasn1/SilcASN1API/SilcAsn1
+/****s* silcasn1/SilcAsn1
*
* NAME
*
***/
typedef struct SilcAsn1Object *SilcAsn1;
-/****s* silcasn1/SilcASN1API/SilcAsn1Struct
+/****s* silcasn1/SilcAsn1Struct
*
* NAME
*
***/
typedef struct SilcAsn1Object SilcAsn1Struct;
-/****d* silcasn1/SilcASN1API/SilcAsn1Options
+/****d* silcasn1/SilcAsn1Options
*
* NAME
*
* SILC_ASN1_EXPLICIT, 100, boolval),
* SILC_ASN1_END);
*
+ * // Decode optional value, with SILC_ASN1_OPTIONAL the type must be
+ * // a pointer so that NULL can be returned if the type is not present.
+ * SilcBool *val;
+ *
+ * silc_asn1_decode(asn1, src,
+ * SILC_ASN1_OPTS(SILC_ASN1_OPTIONAL),
+ * SILC_ASN1_BOOLEAN(&val),
+ * SILC_ASN1_END);
+ *
+ * // If val == NULL, the optional value was not present
+ * if (val == NULL)
+ * error;
+ *
* SOURCE
*/
typedef enum {
/* Default. If only this is set then defaults are implied. */
SILC_ASN1_DEFAULT = 0x0000,
- /* Class options. User does not need to set these unless specificly
+ /* Class options. User does not need to set these unless specifically
wanted to do so. If SILC_ASN1_DEFAULT is set the SILC_ASN1_CONTEXT is
implied if any of the tag options are set. Otherwise SILC_ASN1_UNIVERSAL
is implied. Only one of these can bet set at once. */
/* ASN.1 encoder/decoder options (bitmask). These can be given
only with SILC_ASN1_OPTS macro at the start of encoding/decoding. */
- SILC_ASN1_ALLOC = 0x0400, /* Dynamically allocate results */
+ SILC_ASN1_ALLOC = 0x0400, /* Dynamically allocate results,
+ or if stack was given to
+ silc_asn1_alloc, they are allocated
+ and consumed from the stack. */
SILC_ASN1_ACCUMUL = 0x0800, /* Accumulate memory for results,
next call to silc_asn1_decode
will not cancel old results. */
} SilcAsn1Options;
/***/
-/****d* silcasn1/SilcASN1API/SilcAsn1Tag
+/****d* silcasn1/SilcAsn1Tag
*
* NAME
*
#include "silcasn1_i.h"
-/****f* silcasn1/SilcASN1API/silc_asn1_alloc
+/****f* silcasn1/silc_asn1_alloc
*
* SYNOPSIS
*
- * SilcAsn1 silc_asn1_alloc(void);
+ * SilcAsn1 silc_asn1_alloc(SilcStack stack);
*
* DESCRIPTION
*
* Allocates and initializes ASN.1 encoder/decoder and returns SilcAsn1
* context or NULL on error. This context can be used with both
- * silc_asn1_encode and silc_asn1_decode functions.
+ * silc_asn1_encode and silc_asn1_decode functions. If `stack' is non-NULL
+ * all memory will be allocated from `stack'.
*
* Usually SilcAsn1 is allocated when encoder or decoder is needed,
* however it is also possible to allocate long-lasting SilcAsn1 and
*
* When this context is freed with silc_asn1_free all memory will be
* freed, and all encoded ASN.1 buffers becomes invalid. Also all
- * data that is returned by silc_asn1_decode function becomes invalid.
+ * data that is returned by silc_asn1_encode and silc_asn1_decode function
+ * becomes invalid, unless SILC_ASN1_ALLOC flag is used, in which case the
+ * memory is allocated from `stack' and the `stack' is consumed.
*
***/
-SilcAsn1 silc_asn1_alloc(void);
+SilcAsn1 silc_asn1_alloc(SilcStack stack);
-/****f* silcasn1/SilcASN1API/silc_asn1_free
+/****f* silcasn1/silc_asn1_free
*
* SYNOPSIS
*
***/
void silc_asn1_free(SilcAsn1 asn1);
-/****f* silcasn1/SilcASN1API/silc_asn1_init
+/****f* silcasn1/silc_asn1_init
*
* SYNOPSIS
*
- * SilcBool silc_asn1_init(SilcAsn1 asn1);
+ * SilcBool silc_asn1_init(SilcAsn1 asn1, SilcStack stack);
*
* DESCRIPTION
*
* EXAMPLE
*
* SilcAsn1Struct asn1;
- * if (!silc_asn1_init(&asn1))
+ * if (!silc_asn1_init(&asn1, NULL))
* error;
*
***/
-SilcBool silc_asn1_init(SilcAsn1 asn1);
+SilcBool silc_asn1_init(SilcAsn1 asn1, SilcStack stack);
-/****f* silcasn1/SilcASN1API/silc_asn1_uninit
+/****f* silcasn1/silc_asn1_uninit
*
* SYNOPSIS
*
***/
void silc_asn1_uninit(SilcAsn1 asn1);
-/****f* silcasn1/SilcASN1API/silc_asn1_encode
+/****f* silcasn1/silc_asn1_encode
*
* SYNOPSIS
*
* trees and nodes that are encoded into the `dest'. By default, the
* memory for `dest' is allocated from the `asn1', and the buffer becomes
* invalid either by calling silc_asn1_free, silc_asn1_uninit, or when
- * silc_asn1_encode is called for the next time.
+ * silc_asn1_encode is called for the next time with `asn1' context.
*
* If the SILC_ASN1_OPTS macro with SILC_ASN1_ALLOC option is given then
* the `dest' is dynamically allocated and caller must free it by itself.
- * Alternatively if SILC_ASN1_ACCUMUL is given then memory is accumulated
- * from `asn1' for `dest' and it is freed only when silc_asn1_free or
- * silc_asn1_uninit is called. Next call to silc_asn1_encode will not
- * cancel the previous result, but will accumulate more memory for new
- * result.
+ * 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
+ * `dest' and it is freed only when silc_asn1_free or silc_asn1_uninit
+ * is called. Next call to silc_asn1_encode will not cancel the previous
+ * result, but will accumulate more memory for new result.
*
* The variable argument list is constructed by using various
* macros, for example SILC_ASN1_SEQUENCE, etc. The variable argument
***/
SilcBool silc_asn1_encode(SilcAsn1 asn1, SilcBuffer dest, ...);
-/****f* silcasn1/SilcASN1API/silc_asn1_decode
+/****f* silcasn1/silc_asn1_decode
*
* SYNOPSIS
*
*
* 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. 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.
+ * 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
***/
SilcBool silc_asn1_decode(SilcAsn1 asn1, SilcBuffer src, ...);
-/****f* silcasn1/SilcASN1API/SILC_ASN1_OPTS
+/****f* silcasn1/SILC_ASN1_OPTS
*
* SYNOPSIS
*
***/
#define SILC_ASN1_OPTS(opts) SILC_ASN1_TAG_OPTS, (opts)
-/****f* silcasn1/SilcASN1API/SILC_ASN1_ANY
+/****f* silcasn1/SILC_ASN1_ANY
*
* SYNOPSIS
*
#define SILC_ASN1_ANY(x) SILC_ASN1_U1(ANY, x)
#define SILC_ASN1_ANY_T(o, t, x) SILC_ASN1_T1(ANY, o, t, x)
-/****f* silcasn1/SilcASN1API/SILC_ASN1_ANY_PRIMITIVE
+/****f* silcasn1/SILC_ASN1_ANY_PRIMITIVE
*
* SYNOPSIS
*
#define SILC_ASN1_ANY_PRIMITIVE(t, x) SILC_ASN1_T1(ANY_PRIMITIVE, 0, t, x)
#define SILC_ASN1_ANY_PRIMITIVE_T(o, t, x) SILC_ASN1_T1(ANY_PRIMITIVE, o, t, x)
-/****f* silcasn1/SilcASN1API/SILC_ASN1_SEQUENCE
+/****f* silcasn1/SILC_ASN1_SEQUENCE
*
* SYNOPSIS
*
* SILC_ASN1_BOOLEAN(boolval),
* SILC_ASN1_END, SILC_ASN1_END);
*
+ * silc_asn1_encode(asn1, tree2,
+ * SILC_ASN1_SEQUENCE_T(SILC_ASN1_PRIVATE, 101),
+ * SILC_ASN1_ANY(node),
+ * SILC_ASN1_BOOLEAN(boolval),
+ * SILC_ASN1_END, SILC_ASN1_END);
+ *
***/
#define SILC_ASN1_SEQUENCE SILC_ASN1_U0(SEQUENCE)
#define SILC_ASN1_SEQUENCE_T(o, t) SILC_ASN1_T0(SEQUENCE, o, t)
-/****f* silcasn1/SilcASN1API/SILC_ASN1_SET
+/****f* silcasn1/SILC_ASN1_SET
*
* SYNOPSIS
*
#define SILC_ASN1_SET SILC_ASN1_U0(SET)
#define SILC_ASN1_SET_T(o, t) SILC_ASN1_T0(SET, o, t)
-/****f* silcasn1/SilcASN1API/SILC_ASN1_SEQUENCE_OF
+/****f* silcasn1/SILC_ASN1_SEQUENCE_OF
*
* SYNOPSIS
*
***/
#define SILC_ASN1_SEQUENCE_OF(x, c) SILC_ASN1_U2(SEQUENCE_OF, x, c)
-/****f* silcasn1/SilcASN1API/SILC_ASN1_SET_OF
+/****f* silcasn1/SILC_ASN1_SET_OF
*
* SYNOPSIS
*
***/
#define SILC_ASN1_SET_OF(x, c) SILC_ASN1_U2(SEQUENCE_OF, x, c)
-/****f* silcasn1/SilcASN1API/SILC_ASN1_CHOICE
+/****f* silcasn1/SILC_ASN1_CHOICE
*
* SYNOPSIS
*
* Decoding:
- * SILC_ASN1_CHOICE
+ * SILC_ASN1_CHOICE(&chosen)
*
* DESCRIPTION
*
* Macro used to specify choices in decoding. The choice list must
* be terminated with SILC_ASN1_END. There is no limit how many choices
- * can be specified in the list.
+ * can be specified in the list. The `chosen' is SilcUInt32 and its
+ * value tells which of the choice was found. First choice in the list
+ * has value 1, second value 2, and so on.
*
* EXAMPLE
*
* // Decode timeval that is either UTC or generalized time
* silc_asn1_decode(asn1, tree,
* SILC_ASN1_SEQUENCE,
- * SILC_ASN1_CHOICE,
+ * SILC_ASN1_CHOICE(&chosen),
* SILC_ASN1_UTC_TIME(&timeval),
* SILC_ASN1_GEN_TIME(&timeval),
* SILC_ASN1_END,
* SILC_ASN1_END, SILC_ASN1_END);
*
***/
-#define SILC_ASN1_CHOICE SILC_ASN1_U0(CHOICE)
+#define SILC_ASN1_CHOICE(x) SILC_ASN1_U1(CHOICE, x)
-/****f* silcasn1/SilcASN1API/SILC_ASN1_BOOLEAN
+/****f* silcasn1/SILC_ASN1_BOOLEAN
*
* SYNOPSIS
*
#define SILC_ASN1_BOOLEAN(x) SILC_ASN1_U1(BOOLEAN, x)
#define SILC_ASN1_BOOLEAN_T(o, t, x) SILC_ASN1_T1(BOOLEAN, o, t, x)
-/****f* silcasn1/SilcASN1API/SILC_ASN1_INT
+/****f* silcasn1/SILC_ASN1_INT
*
* SYNOPSIS
*
* Encoding:
* SILC_ASN1_INT(integer)
- * SILC_ASN1_INT_T(opts, tag, &integer)
+ * SILC_ASN1_INT_T(opts, tag, integer)
*
* Decoding:
* SILC_ASN1_INT(&integer)
#define SILC_ASN1_INT(x) SILC_ASN1_U1(INTEGER, x)
#define SILC_ASN1_INT_T(o, t, x) SILC_ASN1_T1(INTEGER, o, t, x)
-/****f* silcasn1/SilcASN1API/SILC_ASN1_SHORT_INT
+/****f* silcasn1/SILC_ASN1_SHORT_INT
*
* SYNOPSIS
*
* Encoding:
* SILC_ASN1_SHORT_INT(integer)
- * SILC_ASN1_SHORT_INT_T(opts, tag, &integer)
+ * SILC_ASN1_SHORT_INT_T(opts, tag, integer)
*
* Decoding:
* SILC_ASN1_SHORT_INT(&integer)
#define SILC_ASN1_SHORT_INT(x) SILC_ASN1_U1(SHORT_INTEGER, x)
#define SILC_ASN1_SHORT_INT_T(o, t, x) SILC_ASN1_T1(SHORT_INTEGER, o, t, x)
-/****f* silcasn1/SilcASN1API/SILC_ASN1_ENUM
+/****f* silcasn1/SILC_ASN1_ENUM
*
* SYNOPSIS
*
* Encoding:
* SILC_ASN1_ENUM(enum)
- * SILC_ASN1_ENUM_T(opts, tag, &enum)
+ * SILC_ASN1_ENUM_T(opts, tag, enum)
*
* Decoding:
* SILC_ASN1_ENUM(&enum)
#define SILC_ASN1_ENUM(x) SILC_ASN1_U1(ENUM, x)
#define SILC_ASN1_ENUM_T(o, t, x) SILC_ASN1_T1(ENUM, o, t, x)
-/****f* silcasn1/SilcASN1API/SILC_ASN1_BIT_STRING
+/****f* silcasn1/SILC_ASN1_BIT_STRING
*
* SYNOPSIS
*
#define SILC_ASN1_BIT_STRING(x, xl) SILC_ASN1_U2(BIT_STRING, x, xl)
#define SILC_ASN1_BIT_STRING_T(o, t, x, xl) SILC_ASN1_T2(BIT_STRING, o, t, x, xl)
-/****f* silcasn1/SilcASN1API/SILC_ASN1_NULL
+/****f* silcasn1/SILC_ASN1_NULL
*
* SYNOPSIS
*
* Encoding:
* SILC_ASN1_NULL
- * SILC_ASN1_NULL_T(opts, tag)
+ * SILC_ASN1_NULL_T(opts, tag, set)
*
* Decoding:
* SILC_ASN1_NULL
- * SILC_ASN1_NULL_T(opts, tag)
+ * SILC_ASN1_NULL_T(opts, tag, &set)
*
* DESCRIPTION
*
* Macro used to encode or decode null value.
*
- * The `opts' is SilcAsn1Options. The `tag' is a tag number.
+ * The `opts' is SilcAsn1Options. The `tag' is a tag number. In encoding
+ * `set' is SilcBool and if it is TRUE the NULL value will be encoded. If
+ * it is FALSE the SILC_ASN1_NULL will be ignored. In decoding the `set'
+ * is SilcBool and if it is TRUE the NULL value was present. This can be
+ * used to verify whether NULL was present if it is SILC_ASN1_OPTIONAL.
*
***/
-#define SILC_ASN1_NULL SILC_ASN1_U0(NULL)
-#define SILC_ASN1_NULL_T(o, t) SILC_ASN1_T0(NULL, 0, t)
+#define SILC_ASN1_NULL(x) SILC_ASN1_U1(NULL, x)
+#define SILC_ASN1_NULL_T(o, t, x) SILC_ASN1_T1(NULL, o, t, x)
-/****f* silcasn1/SilcASN1API/SILC_ASN1_OID
+/****f* silcasn1/SILC_ASN1_OID
*
* SYNOPSIS
*
#define SILC_ASN1_OID(x) SILC_ASN1_U1(OID, x)
#define SILC_ASN1_OID_T(o, t, x) SILC_ASN1_UT(OID, o, t, x)
-/****f* silcasn1/SilcASN1API/SILC_ASN1_OCTET_STRING
+/****f* silcasn1/SILC_ASN1_OCTET_STRING
*
* SYNOPSIS
*
#define SILC_ASN1_OCTET_STRING(x, xl) SILC_ASN1_U2(OCTET_STRING, x, xl)
#define SILC_ASN1_OCTET_STRING_T(o, t, x, xl) SILC_ASN1_T2(OCTET_STRING, o, t, x, xl)
-/****f* silcasn1/SilcASN1API/SILC_ASN1_UTF8_STRING
+/****f* silcasn1/SILC_ASN1_UTF8_STRING
*
* SYNOPSIS
*
#define SILC_ASN1_UTF8_STRING(x, xl) SILC_ASN1_U2(UTF8_STRING, x, xl)
#define SILC_ASN1_UTF8_STRING_T(o, t, x, xl) SILC_ASN1_T2(UTF8_STRING, o, t, x, xl)
-/****f* silcasn1/SilcASN1API/SILC_ASN1_NUMERIC_STRING
+/****f* silcasn1/SILC_ASN1_NUMERIC_STRING
*
* SYNOPSIS
*
#define SILC_ASN1_NUMERIC_STRING(x, xl) SILC_ASN1_U2(NUMERIC_STRING, x, xl)
#define SILC_ASN1_NUMERIC_STRING_T(o, t, x, xl) SILC_ASN1_T2(NUMERIC_STRING, o, t, x, xl)
-/****f* silcasn1/SilcASN1API/SILC_ASN1_PRINTABLE_STRING
+/****f* silcasn1/SILC_ASN1_PRINTABLE_STRING
*
* SYNOPSIS
*
#define SILC_ASN1_PRINTABLE_STRING(x, xl) SILC_ASN1_U2(PRINTABLE_STRING, x, xl)
#define SILC_ASN1_PRINTABLE_STRING_T(o, t, x, xl) SILC_ASN1_T2(PRINTABLE_STRING, o, t, x, xl)
-/****f* silcasn1/SilcASN1API/SILC_ASN1_TELETEX_STRING
+/****f* silcasn1/SILC_ASN1_TELETEX_STRING
*
* SYNOPSIS
*
#define SILC_ASN1_TELETEX_STRING(x, xl) SILC_ASN1_U2(TELETEX_STRING, x, xl)
#define SILC_ASN1_TELETEX_STRING_T(o, t, x, xl) SILC_ASN1_T2(TELETEX_STRING, o, t, x, xl)
-/****f* silcasn1/SilcASN1API/SILC_ASN1_IA5_STRING
+/****f* silcasn1/SILC_ASN1_IA5_STRING
*
* SYNOPSIS
*
#define SILC_ASN1_IA5_STRING(x, xl) SILC_ASN1_U2(IA5_STRING, x, xl)
#define SILC_ASN1_IA5_STRING_T(o, t, x, xl) SILC_ASN1_T2(IA5_STRING, o, t, x, xl)
-/****f* silcasn1/SilcASN1API/SILC_ASN1_VISIBLE_STRING
+/****f* silcasn1/SILC_ASN1_VISIBLE_STRING
*
* SYNOPSIS
*
#define SILC_ASN1_VISIBLE_STRING(x, xl) SILC_ASN1_U2(VISIBLE_STRING, x, xl)
#define SILC_ASN1_VISIBLE_STRING_T(o, t, x, xl) SILC_ASN1_T2(VISIBLE_STRING, o, t, x, xl)
-/****f* silcasn1/SilcASN1API/SILC_ASN1_UNIVERSAL_STRING
+/****f* silcasn1/SILC_ASN1_UNIVERSAL_STRING
*
* SYNOPSIS
*
#define SILC_ASN1_UNIVERSAL_STRING(x, xl) SILC_ASN1_U2(UNIVERSAL_STRING, x, xl)
#define SILC_ASN1_UNIVERSAL_STRING_T(o, t, x, xl) SILC_ASN1_T2(UNIVERSAL_STRING, o, t, x, xl)
-/****f* silcasn1/SilcASN1API/SILC_ASN1_BMP_STRING
+/****f* silcasn1/SILC_ASN1_BMP_STRING
*
* SYNOPSIS
*
#define SILC_ASN1_BMP_STRING(x, xl) SILC_ASN1_U2(BMP_STRING, x, xl)
#define SILC_ASN1_BMP_STRING_T(o, t, x, xl) SILC_ASN1_T2(BMP_STRING, o, t, x, xl)
-/****f* silcasn1/SilcASN1API/SILC_ASN1_UNRESTRICTED_STRING
+/****f* silcasn1/SILC_ASN1_UNRESTRICTED_STRING
*
* SYNOPSIS
*
#define SILC_ASN1_UNRESTRICTED_STRING(x, xl) SILC_ASN1_U2(UNRESTRICTED_STRING, x, xl)
#define SILC_ASN1_UNRESTRICTED_STRING_T(o, t, x, xl) SILC_ASN1_T2(UNRESTRICTED_STRING, o, t, x, xl)
-/****f* silcasn1/SilcASN1API/SILC_ASN1_GENERAL_STRING
+/****f* silcasn1/SILC_ASN1_GENERAL_STRING
*
* SYNOPSIS
*
#define SILC_ASN1_GENERAL_STRING(x, xl) SILC_ASN1_U2(GENERAL_STRING, x, xl)
#define SILC_ASN1_GENERAL_STRING_T(o, t, x, xl) SILC_ASN1_T2(GENERAL_STRING, o, t, x, xl)
-/****f* silcasn1/SilcASN1API/SILC_ASN1_UTC_TIME
+/****f* silcasn1/SILC_ASN1_UTC_TIME
*
* SYNOPSIS
*
#define SILC_ASN1_UTC_TIME(x) SILC_ASN1_U1(UTC_TIME, x)
#define SILC_ASN1_UTC_TIME_T(o, t, x) SILC_ASN1_T1(UTC_TIME, o, t, x)
-/****f* silcasn1/SilcASN1API/SILC_ASN1_GEN_TIME
+/****f* silcasn1/SILC_ASN1_GEN_TIME
*
* SYNOPSIS
*
#define SILC_ASN1_GEN_TIME(x) SILC_ASN1_U1(GENERALIZED_TIME, x)
#define SILC_ASN1_GEN_TIME_T(o, t, x) SILC_ASN1_T1(GENERALIZED_TIME, o, t, x)
-/****f* silcasn1/SilcASN1API/SILC_ASN1_END
+/****f* silcasn1/SILC_ASN1_END
*
* SYNOPSIS
*