5 Author: Pekka Riikonen <priikone@silcnet.org>
7 Copyright (C) 2003 - 2005 Pekka Riikonen
9 This program is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
11 the Free Software Foundation; version 2 of the License.
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
20 /****h* silcasn1/ASN.1 Interface
24 * Efficient Abstract Syntax Notation One (ASN.1) implementation. This
25 * interface provides simple and efficient ASN.1 encoder and decoder.
26 * The encoder directly encodes BER encoded data blocks from variable
27 * argument list of ASN.1 types. Multiple trees can be encoded at once
28 * and multiple nodes can be encoded into the tree at once. By default
29 * encoder does not allocate any memory during encoding but a pre-allocated
30 * SilcStack is used as memory.
32 * The decoder directly decodes BER encoded data blocks into the correct
33 * types dictated by the variable argument list of ASN.1 types. By
34 * default decoder does not allocate any memory during decoding but a
35 * pre-allocated SilcStack is used as memory.
37 * The encoding and decoding interface is simple. silc_asn1_encode is used
38 * encode and silc_asn1_decode to decode. The actual ASN.1 is defined
39 * as variable argument list to the function. Various macros can be used
40 * to encode and decode different ASN.1 types. All types may also be used
41 * to encode and decode with various options (such as implicit and explicit
42 * tagging and defining specific class option).
44 * The implementation supports all the common ASN.1 types. This
45 * implementation does not support advanced ASN.1 features like macros.
47 * References: ITU-T X.680 - X.693
48 * http://www.itu.int/ITU-T/studygroups/com17/languages/
55 /****s* silcasn1/SilcASN1API/SilcAsn1
59 * typedef struct SilcAsn1Object *SilcAsn1;
63 * This context is the actual ASN.1 encoder/decoder and is allocated
64 * by silc_asn1_alloc and given as argument to all silc_asn1_*
65 * functions. It is freed by the silc_asn1_free function. It is
66 * also possible to use pre-allocated ASN.1 context by using the
67 * SilcAsn1Struct instead of SilcAsn1.
70 typedef struct SilcAsn1Object *SilcAsn1;
72 /****s* silcasn1/SilcASN1API/SilcAsn1Struct
76 * typedef struct SilcAsn1Object SilcAsn1Struct;
80 * This context is the actual ASN.1 encoder/decoder and can be
81 * used as pre-allocated ASN.1 context instead of SilcAsn1 context.
82 * This context is initialized with silc_asn1_init and uninitialized
83 * with silc_asn1_uninit.
86 typedef struct SilcAsn1Object SilcAsn1Struct;
88 /****d* silcasn1/SilcASN1API/SilcAsn1Options
92 * typedef enum { ... } SilcAsn1Options;
96 * Options for ASN.1 encoder and decoder. The ASN.1 options can be
97 * given to the SILC_ASN1_*_T macros and/or SILC_ASN1_OPTS macro.
101 * The SILC_ASN1_ALLOC and SILC_ASN1_ACCUMUL flags can be given only
102 * with SILC_ASN1_OPTS macro. Other options can be given with various
103 * SILC_ASN1_*_T macros.
108 /* Default. If only this is set then defaults are implied. */
109 SILC_ASN1_DEFAULT = 0x0000,
111 /* Class options. User does not need to set these unless specificly
112 wanted to do so. If SILC_ASN1_DEFAULT is set the SILC_ASN1_CONTEXT is
113 implied if any of the tag options are set. Otherwise SILC_ASN1_UNIVERSAL
114 is implied. Only one of these can bet set at once. */
115 SILC_ASN1_UNIVERSAL = 0x0001, /* Universal class (default) */
116 SILC_ASN1_APP = 0x0002, /* Application specific class */
117 SILC_ASN1_CONTEXT = 0x0003, /* Context specific class */
118 SILC_ASN1_PRIVATE = 0x0004, /* Private class */
120 /* Tag options (bitmask) */
121 SILC_ASN1_IMPLICIT = 0x0010, /* Tag is implicit (default) */
122 SILC_ASN1_EXPLICIT = 0x0020, /* Tag is explicit */
123 SILC_ASN1_DEFINITE = 0x0040, /* Length is definite (default) */
124 SILC_ASN1_INDEFINITE = 0x0080, /* Length is indefinite */
126 /* Decoding options (bitmask) */
127 SILC_ASN1_OPTIONAL = 0x0100, /* Zero or more may be found. The
128 argument must be pointer to the
129 type pointer so that NULL can be
130 returned if type is not found. */
132 /* ASN.1 encoder/decoder options (bitmask). These can be given
133 only with SILC_ASN1_OPTS macro at the start of encoding/decoding. */
134 SILC_ASN1_ALLOC = 0x0400, /* Dynamically allocate results */
135 SILC_ASN1_ACCUMUL = 0x0800, /* Accumulate memory for results,
136 next call to silc_asn1_decode
137 will not cancel old results. */
141 /****d* silcasn1/SilcASN1API/SilcAsn1Tag
145 * typedef enum { ... } SilcAsn1Tag;
149 * Universal ASN.1 tags. Usually these tags are given automatically
150 * to the silc_asn1_encode and silc_asn1_decode by using the various
151 * macros (such as SILC_ASN1_BOOLEAN). Some macros may take the tag
152 * as additional argument.
157 SILC_ASN1_TAG_BOOLEAN = 1, /* SILC_ASN1_BOOLEAN */
158 SILC_ASN1_TAG_INTEGER = 2, /* SILC_ASN1_INT */
159 SILC_ASN1_TAG_BIT_STRING = 3, /* SILC_ASN1_BIT_STRING */
160 SILC_ASN1_TAG_OCTET_STRING = 4, /* SILC_ASN1_OCTET_STRING */
161 SILC_ASN1_TAG_NULL = 5, /* SILC_ASN1_NULL */
162 SILC_ASN1_TAG_OID = 6, /* SILC_ASN1_OID */
163 SILC_ASN1_TAG_ODE = 7, /* not supported */
164 SILC_ASN1_TAG_ETI = 8, /* not supported */
165 SILC_ASN1_TAG_REAL = 9, /* not supported */
166 SILC_ASN1_TAG_ENUM = 10, /* SILC_ASN1_ENUM */
167 SILC_ASN1_TAG_EMBEDDED = 11, /* not supported */
168 SILC_ASN1_TAG_UTF8_STRING = 12, /* SILC_ASN1_UTF8_STRING */
169 SILC_ASN1_TAG_ROI = 13, /* not supported */
170 SILC_ASN1_TAG_SEQUENCE = 16, /* SILC_ASN1_SEQUENCE */
171 SILC_ASN1_TAG_SET = 17, /* SILC_ASN1_SET */
172 SILC_ASN1_TAG_NUMERIC_STRING = 18, /* SILC_ASN1_NUMERIC_STRING */
173 SILC_ASN1_TAG_PRINTABLE_STRING = 19, /* SILC_ASN1_PRINTABLE_STRING */
174 SILC_ASN1_TAG_TELETEX_STRING = 20, /* SILC_ASN1_TELETEX_STRING */
175 SILC_ASN1_TAG_VIDEOTEX_STRING = 21, /* not supported */
176 SILC_ASN1_TAG_IA5_STRING = 22, /* SILC_ASN1_IA5_STRING */
177 SILC_ASN1_TAG_UTC_TIME = 23, /* SILC_ASN1_UTC_TIME */
178 SILC_ASN1_TAG_GENERALIZED_TIME = 24, /* SILC_ASN1_GENERAL_STRING */
179 SILC_ASN1_TAG_GRAPHIC_STRING = 25, /* not supported */
180 SILC_ASN1_TAG_VISIBLE_STRING = 26, /* SILC_ASN1_VISIBLE_STRING */
181 SILC_ASN1_TAG_GENERAL_STRING = 27, /* SILC_ASN1_GENERAL_STRING */
182 SILC_ASN1_TAG_UNIVERSAL_STRING = 28, /* SILC_ASN1_UNIVERSAL_STRING */
183 SILC_ASN1_TAG_UNRESTRICTED_STRING = 29, /* SILC_ASN1_UNRESTRICTED_STRING */
184 SILC_ASN1_TAG_BMP_STRING = 30, /* SILC_ASN1_BMP_STRING */
188 #include "silcasn1_i.h"
190 /****f* silcasn1/SilcASN1API/silc_asn1_alloc
194 * SilcAsn1 silc_asn1_alloc(void);
198 * Allocates and initializes ASN.1 encoder/decoder and returns SilcAsn1
199 * context or NULL on error. This context can be used with both
200 * silc_asn1_encode and silc_asn1_decode functions.
202 * Usually SilcAsn1 is allocated when encoder or decoder is needed,
203 * however it is also possible to allocate long-lasting SilcAsn1 and
204 * use that every time ASN.1 routines are needed. Application could
205 * for example allocate one SilcAsn1 and use that for all ASN.1 encoding
208 * When this context is freed with silc_asn1_free all memory will be
209 * freed, and all encoded ASN.1 buffers becomes invalid. Also all
210 * data that is returned by silc_asn1_decode function becomes invalid.
213 SilcAsn1 silc_asn1_alloc(void);
215 /****f* silcasn1/SilcASN1API/silc_asn1_free
219 * void silc_asn1_free(SilcAsn1 asn1);
223 * Frees the SilcAsn1 context and all allocated memory. All encoded
224 * buffers and all decoded buffers with this context becomes invalid
228 void silc_asn1_free(SilcAsn1 asn1);
230 /****f* silcasn1/SilcASN1API/silc_asn1_init
234 * SilcBool silc_asn1_init(SilcAsn1 asn1);
238 * Initializes a pre-allocated SilcAsn1 context. This call is
239 * equivalent to silc_asn1_alloc except that this takes the pre-allocated
240 * context as argument.
244 * SilcAsn1Struct asn1;
245 * if (!silc_asn1_init(&asn1))
249 SilcBool silc_asn1_init(SilcAsn1 asn1);
251 /****f* silcasn1/SilcASN1API/silc_asn1_uninit
255 * void silc_asn1_uninit(SilcAsn1 asn1);
259 * Uninitializes a pre-allocated SilcAsn1 context. Use this function
260 * instead of silc_asn1_free if you used silc_asn1_init.
263 void silc_asn1_uninit(SilcAsn1 asn1);
265 /****f* silcasn1/SilcASN1API/silc_asn1_encode
269 * SilcBool silc_asn1_encode(SilcAsn1 asn1, SilcBuffer dest, ...);
273 * Encodes ASN.1 encoded buffer into `dest', from variable argument
274 * list of ASN.1 types. The variable argument list forms the ASN.1
275 * trees and nodes that are encoded into the `dest'. By default, the
276 * memory for `dest' is allocated from the `asn1', and the buffer becomes
277 * invalid either by calling silc_asn1_free, silc_asn1_uninit, or when
278 * silc_asn1_encode is called for the next time.
280 * If the SILC_ASN1_OPTS macro with SILC_ASN1_ALLOC option is given then
281 * the `dest' is dynamically allocated and caller must free it by itself.
282 * Alternatively if SILC_ASN1_ACCUMUL is given then memory is accumulated
283 * from `asn1' for `dest' and it is freed only when silc_asn1_free or
284 * silc_asn1_uninit is called. Next call to silc_asn1_encode will not
285 * cancel the previous result, but will accumulate more memory for new
288 * The variable argument list is constructed by using various
289 * macros, for example SILC_ASN1_SEQUENCE, etc. The variable argument
290 * list must always be ended with SILC_ASN1_END type.
292 * If encoding is successful this returns TRUE, FALSE on error.
296 * silc_asn1_encode(asn1, buf,
297 * SILC_ASN1_SEQUENCE,
298 * SILC_ASN1_BOOLEAN(bool_val),
299 * SILC_ASN1_OCTET_STRING(string, string_len),
300 * SILC_ASN1_SEQUENCE_T(0, 2),
301 * SILC_ASN1_BOOLEAN_T(SILC_ASN1_EXPLICIT, 100, foo),
303 * SILC_ASN1_OCTET_STRING_T(0, 1, string2, string2_len),
304 * SILC_ASN1_END, SILC_ASN1_END);
306 * Creates ASN.1 tree that looks something like:
310 * string OCTET-STRING,
312 * foo [100] EXPLICIT BOOLEAN }
313 * string2 [1] OCTET-STRING }
316 SilcBool silc_asn1_encode(SilcAsn1 asn1, SilcBuffer dest, ...);
318 /****f* silcasn1/SilcASN1API/silc_asn1_decode
322 * SilcBool silc_asn1_decode(SilcAsn1 asn1, SilcBuffer src, ...);
326 * Decodes the ASN.1 encoded buffer `src' by the ASN.1 types sent
327 * as argument. The ASN.1 types sent as argument must be found from
328 * the `src' for this function to decode successfully.
330 * The memory allocated for the results are allocated from `asn1' and
331 * they become invalid if `asn1' becomes invalid. Next (second) call
332 * to this function does NOT invalidate the previous results. However,
333 * third call to this function does invalidate the results of the first
334 * call but not second. On the other hand, fourth call invalidates
335 * the results of the second call but not third, fifth call invalidates
336 * the results of the third call but not fourth, and so on. This allows
337 * efficient decoding, when silc_asn1_decode must be called multiple times
338 * to decode all data, without new memory allocations. However, caller
339 * must be cautios and understand that the every second call invalidates
340 * the results of every second previous results.
342 * If the SILC_ASN1_OPTS macro with SILC_ASN1_ALLOC option is given then
343 * all results are dynamically allocated and caller must free them by
344 * itself. Alternatively if SILC_ASN1_ACCUMUL is given then memory is
345 * accumulated from `asn1' for results and they are freed only when the
346 * silc_asn1_free or silc_asn1_uninit is called. Next calls to the
347 * silc_asn1_decode will NOT invalidate the old results, but will
348 * accumulate more memory for new results. If the SILC_ASN1_OPTS is not
349 * given at all then the default allocation method (decribed above)
352 * If caller needs to store the results even after `asn1' becomes invalid
353 * then call must either use SILC_ASN1_ALLOC option or duplicate the
358 * SilcBool bool_val, foo;
359 * unsigned char *string, string2;
360 * SilcUInt32 string_len, string2_len;
362 * silc_asn1_decode(asn1, tree,
363 * SILC_ASN1_SEQUENCE,
364 * SILC_ASN1_BOOLEAN(&bool_val),
365 * SILC_ASN1_OCTET_STRING(&string, &string_len),
366 * SILC_ASN1_SEQUENCE_T(0, 2),
367 * SILC_ASN1_BOOLEAN_T(SILC_ASN1_EXPLICIT, 100, &foo),
369 * SILC_ASN1_OCTET_STRING_T(0, 1, &str2, &str2_len),
370 * SILC_ASN1_END, SILC_ASN1_END);
373 SilcBool silc_asn1_decode(SilcAsn1 asn1, SilcBuffer src, ...);
375 /****f* silcasn1/SilcASN1API/SILC_ASN1_OPTS
379 * SILC_ASN1_OPTS(opts)
383 * The `opts' is SilcAsn1Options. This macro can be used to set
384 * options for silc_asn1_encode and silc_asn1_decode functions.
388 * Only the SILC_ASN1_ALLOC and SILC_ASN1_ACCUMUL flags may be
389 * set with this macro.
391 * This macro must be the first macro in the variable argument list
396 * silc_asn1_decode(asn1, tree,
397 * SILC_ASN1_OPTS(SILC_ASN1_ALLOC),
398 * SILC_ASN1_SEQUENCE,
399 * SILC_ASN1_BOOLEAN(&bool_val),
400 * SILC_ASN1_OCTET_STRING(&string, &string_len),
401 * SILC_ASN1_END, SILC_ASN1_END);
404 #define SILC_ASN1_OPTS(opts) SILC_ASN1_TAG_OPTS, (opts)
406 /****f* silcasn1/SilcASN1API/SILC_ASN1_ANY
411 * SILC_ASN1_ANY(buffer)
412 * SILC_ASN1_ANY_T(opts, tag, buffer)
415 * SILC_ASN1_ANY(&buffer)
416 * SILC_ASN1_ANY_T(opts, tag, &buffer)
420 * Macro used to encode or decode another ASN.1 node. The buffer type
421 * is SilcBuffer. This macro can be used for example to split large
422 * tree into multiple nodes, and then decoding the nodes separately from
425 * The `opts' is SilcAsn1Options. The `tag' is a tag number.
429 * // Encode node of two boolean values
430 * silc_asn1_encode(asn1, node,
431 * SILC_ASN1_BOOLEAN(val1),
432 * SILC_ASN1_BOOLEAN(val2),
435 * // Encode tree with the node
436 * silc_asn1_encode(asn1, tree,
437 * SILC_ASN1_SEQUENCE_T(SILC_ASN1_PRIVATE, 101),
438 * SILC_ASN1_ANY(node),
439 * SILC_ASN1_BOOLEAN(boolval),
440 * SILC_ASN1_END, SILC_ASN1_END);
443 #define SILC_ASN1_ANY(x) SILC_ASN1_U1(ANY, x)
444 #define SILC_ASN1_ANY_T(o, t, x) SILC_ASN1_T1(ANY, o, t, x)
446 /****f* silcasn1/SilcASN1API/SILC_ASN1_ANY_PRIMITIVE
451 * SILC_ASN1_ANY_PRIMITIVE(tag, buffer)
452 * SILC_ASN1_ANY_PRIMITIVE_T(opts, tag, buffer)
455 * SILC_ASN1_ANY_PRIMITIVE(tag, &buffer)
456 * SILC_ASN1_ANY_PRIMITIVE_T(opts, tag, &buffer)
460 * Special macro used to encode pre-encoded primitive data blob. The data
461 * can be any primitive type that is already encoded in correct format.
462 * The caller is responsible of making sure the data is formatted
463 * correctly. When decoding this returns the raw data blob and the caller
464 * must know of what type and format it is. The buffer type is SilcBuffer.
466 * This macro can be used in cases when the data to be encoded is already
467 * in encoded format, and it only needs to be added to ASN.1 tree. The
468 * SILC_ASN1_ANY cannot be used with primitives when tagging implicitly,
469 * in these cases this macro can be used.
471 * The `opts' is SilcAsn1Options. The `tag' is a tag number.
475 * // Get MP integer in encoded format
476 * mpbuf = mp_get_octet_string(mp);
478 * // Encode the MP integer data to the tree
479 * silc_asn1_encode(asn1, tree,
480 * SILC_ASN1_ANY_PRIMITIVE(SILC_ASN1_TAG_INTEGER, mpbuf),
483 * // Decode the MP integer data from the tree
484 * silc_asn1_decode(asn1, tree,
485 * SILC_ASN1_ANY_PRIMITIVE(SILC_ASN1_TAG_INTEGER, &buffer),
489 #define SILC_ASN1_ANY_PRIMITIVE(t, x) SILC_ASN1_T1(ANY_PRIMITIVE, 0, t, x)
490 #define SILC_ASN1_ANY_PRIMITIVE_T(o, t, x) SILC_ASN1_T1(ANY_PRIMITIVE, o, t, x)
492 /****f* silcasn1/SilcASN1API/SILC_ASN1_SEQUENCE
498 * SILC_ASN1_SEQUENCE_T(opts, tag)
502 * SILC_ASN1_SEQUENCE_T(opts, tag)
506 * Macro used to encode or decode sequence. The sequence must be
507 * terminated with SILC_ASN1_END.
509 * The `opts' is SilcAsn1Options. The `tag' is a tag number.
513 * silc_asn1_encode(asn1, tree,
514 * SILC_ASN1_SEQUENCE,
515 * SILC_ASN1_ANY(node),
516 * SILC_ASN1_BOOLEAN(boolval),
517 * SILC_ASN1_END, SILC_ASN1_END);
520 #define SILC_ASN1_SEQUENCE SILC_ASN1_U0(SEQUENCE)
521 #define SILC_ASN1_SEQUENCE_T(o, t) SILC_ASN1_T0(SEQUENCE, o, t)
523 /****f* silcasn1/SilcASN1API/SILC_ASN1_SET
529 * SILC_ASN1_SET_T(opts, tag)
533 * SILC_ASN1_SET_T(opts, tag)
537 * Macro used to encode or decode set. The set must be terminated
538 * with SILC_ASN1_END.
540 * The `opts' is SilcAsn1Options. The `tag' is a tag number.
544 * silc_asn1_encode(asn1, tree,
545 * SILC_ASN1_SET_T(SILC_ASN1_EXPLICIT, 0),
546 * SILC_ASN1_BOOLEAN(boolval),
547 * SILC_ASN1_END, SILC_ASN1_END);
550 #define SILC_ASN1_SET SILC_ASN1_U0(SET)
551 #define SILC_ASN1_SET_T(o, t) SILC_ASN1_T0(SET, o, t)
553 /****f* silcasn1/SilcASN1API/SILC_ASN1_SEQUENCE_OF
558 * SILC_ASN1_SEQUENCE_OF(bufarray, numbufs)
562 * Macro used to decode sequence of specified type. This returns
563 * an array of SilcBuffers and number of buffers in the array. The
564 * SILC_ASN1_CHOICE macro may also be used with this macro.
568 * This macro must be used either with SILC_ASN1_ALLOC or SILC_ASN1_ACCUMUL
569 * flags. Do not use this macro without flags.
576 * // Decode sequence of sequences. Each returned buffer in the array
578 * silc_asn1_decode(asn1, exts,
579 * SILC_ASN1_OPTS(SILC_ASN1_ACCUMUL),
580 * SILC_ASN1_SEQUENCE_OF(&bufs, &count),
581 * SILC_ASN1_TAG_SEQUENCE,
582 * SILC_ASN1_END, SILC_ASN1_END);
585 #define SILC_ASN1_SEQUENCE_OF(x, c) SILC_ASN1_U2(SEQUENCE_OF, x, c)
587 /****f* silcasn1/SilcASN1API/SILC_ASN1_SET_OF
592 * SILC_ASN1_SET_OF(bufarray, numbufs)
596 * Macro used to decode set of specified type. This returns
597 * an array of SilcBuffers and number of buffers in the array. The
598 * SILC_ASN1_CHOICE macro may also be used with this macro.
602 * This macro must be used either with SILC_ASN1_ALLOC or SILC_ASN1_ACCUMUL
603 * flags. Do not use this macro without flags.
607 * // Decode set of sequences. Each returned buffer in the array
609 * silc_asn1_decode(asn1, exts,
610 * SILC_ASN1_OPTS(SILC_ASN1_ALLOC),
611 * SILC_ASN1_SET_OF(&bufs, &count),
612 * SILC_ASN1_TAG_SEQUENCE,
613 * SILC_ASN1_END, SILC_ASN1_END);
616 #define SILC_ASN1_SET_OF(x, c) SILC_ASN1_U2(SEQUENCE_OF, x, c)
618 /****f* silcasn1/SilcASN1API/SILC_ASN1_CHOICE
627 * Macro used to specify choices in decoding. The choice list must
628 * be terminated with SILC_ASN1_END. There is no limit how many choices
629 * can be specified in the list.
633 * // Decode timeval that is either UTC or generalized time
634 * silc_asn1_decode(asn1, tree,
635 * SILC_ASN1_SEQUENCE,
637 * SILC_ASN1_UTC_TIME(&timeval),
638 * SILC_ASN1_GEN_TIME(&timeval),
640 * SILC_ASN1_END, SILC_ASN1_END);
643 #define SILC_ASN1_CHOICE SILC_ASN1_U0(CHOICE)
645 /****f* silcasn1/SilcASN1API/SILC_ASN1_BOOLEAN
650 * SILC_ASN1_BOOLEAN(boolval)
651 * SILC_ASN1_BOOLEAN_T(opts, tag, boolval)
654 * SILC_ASN1_BOOLEAN(&boolval)
655 * SILC_ASN1_BOOLEAN_T(opts, tag, &boolval)
659 * Macro used to encode or decode boolean value. Type boolean type
662 * The `opts' is SilcAsn1Options. The `tag' is a tag number.
665 #define SILC_ASN1_BOOLEAN(x) SILC_ASN1_U1(BOOLEAN, x)
666 #define SILC_ASN1_BOOLEAN_T(o, t, x) SILC_ASN1_T1(BOOLEAN, o, t, x)
668 /****f* silcasn1/SilcASN1API/SILC_ASN1_INT
673 * SILC_ASN1_INT(integer)
674 * SILC_ASN1_INT_T(opts, tag, integer)
677 * SILC_ASN1_INT(&integer)
678 * SILC_ASN1_INT_T(opts, tag, &integer);
682 * Macro used to encode or decode multiple precision integer. The
683 * integer type is SilcMPInt.
685 * The `opts' is SilcAsn1Options. The `tag' is a tag number.
688 #define SILC_ASN1_INT(x) SILC_ASN1_U1(INTEGER, x)
689 #define SILC_ASN1_INT_T(o, t, x) SILC_ASN1_T1(INTEGER, o, t, x)
691 /****f* silcasn1/SilcASN1API/SILC_ASN1_ENUM
696 * SILC_ASN1_ENUM(enum)
697 * SILC_ASN1_ENUM_T(opts, tag, enum)
700 * SILC_ASN1_ENUM(&enum)
701 * SILC_ASN1_ENUM_T(opts, tag, &enum);
705 * Macro used to encode or decode enumeration value. The enumeration
708 * The `opts' is SilcAsn1Options. The `tag' is a tag number.
711 #define SILC_ASN1_ENUM(x) SILC_ASN1_U1(ENUM, x)
712 #define SILC_ASN1_ENUM_T(o, t, x) SILC_ASN1_T1(ENUM, o, t, x)
714 /****f* silcasn1/SilcASN1API/SILC_ASN1_BIT_STRING
719 * SILC_ASN1_BIT_STRING(str, str_len)
720 * SILC_ASN1_BIT_STRING_T(opts, tag, str, str_len)
723 * SILC_ASN1_BIT_STRING(&str, &str_len)
724 * SILC_ASN1_BIT_STRING_T(opts, tag, &str, &str_len)
728 * Macro used to encode or decode bit string. The string length in
729 * encoding must be in bits (bytes * 8). The decoded length is in
730 * bits as well. The string type is unsigned char and string length
733 * The `opts' is SilcAsn1Options. The `tag' is a tag number.
736 #define SILC_ASN1_BIT_STRING(x, xl) SILC_ASN1_U2(BIT_STRING, x, xl)
737 #define SILC_ASN1_BIT_STRING_T(o, t, x, xl) SILC_ASN1_T2(BIT_STRING, o, t, x, xl)
739 /****f* silcasn1/SilcASN1API/SILC_ASN1_NULL
745 * SILC_ASN1_NULL_T(opts, tag)
749 * SILC_ASN1_NULL_T(opts, tag)
753 * Macro used to encode or decode null value.
755 * The `opts' is SilcAsn1Options. The `tag' is a tag number.
758 #define SILC_ASN1_NULL SILC_ASN1_U0(NULL)
759 #define SILC_ASN1_NULL_T(o, t) SILC_ASN1_T0(NULL, 0, t)
761 /****f* silcasn1/SilcASN1API/SILC_ASN1_OID
767 * SILC_ASN1_OID_T(opts, tag, oid)
770 * SILC_ASN1_OID(&oid)
771 * SILC_ASN1_OID_T(opts, tag, &oid)
775 * Macro used to encode or decode OID string. The OID string type
776 * is NULL terminated char. Its length can be determinted with strlen().
778 * The `opts' is SilcAsn1Options. The `tag' is a tag number.
781 #define SILC_ASN1_OID(x) SILC_ASN1_U1(OID, x)
782 #define SILC_ASN1_OID_T(o, t, x) SILC_ASN1_UT(OID, o, t, x)
784 /****f* silcasn1/SilcASN1API/SILC_ASN1_OCTET_STRING
789 * SILC_ASN1_OCTET_STRING(str, str_len)
790 * SILC_ASN1_OCTET_STRING_T(opts, tag, str, str_len)
793 * SILC_ASN1_OCTET_STRING(&str, &str_len)
794 * SILC_ASN1_OCTET_STRING_T(opts, tag, &str, &str_len)
798 * Macro used to encode or decode octet string. The string type is
799 * unsigned char and string length SilcUInt32.
801 * The `opts' is SilcAsn1Options. The `tag' is a tag number.
805 * The string must be in UTF-8 encoding when encoding. The decoded
806 * string will be in UTF-8 encoding. The actual data is encoded to
807 * or decoded from 8-bit ASCII.
810 #define SILC_ASN1_OCTET_STRING(x, xl) SILC_ASN1_U2(OCTET_STRING, x, xl)
811 #define SILC_ASN1_OCTET_STRING_T(o, t, x, xl) SILC_ASN1_T2(OCTET_STRING, o, t, x, xl)
813 /****f* silcasn1/SilcASN1API/SILC_ASN1_UTF8_STRING
818 * SILC_ASN1_UTF8_STRING(str, str_len)
819 * SILC_ASN1_UTF8_STRING_T(opts, tag, str, str_len)
822 * SILC_ASN1_UTF8_STRING(&str, &str_len)
823 * SILC_ASN1_UTF8_STRING_T(opts, tag, &str, &str_len)
827 * Macro used to encode or decode UTF-8 string. The string type is
828 * unsigned char and string length SilcUInt32.
830 * The `opts' is SilcAsn1Options. The `tag' is a tag number.
834 * The string must be in UTF-8 encoding when encoding. The decoded
835 * string will be in UTF-8 encoding. The data is also encoded to
836 * or decoded from UTF-8.
839 #define SILC_ASN1_UTF8_STRING(x, xl) SILC_ASN1_U2(UTF8_STRING, x, xl)
840 #define SILC_ASN1_UTF8_STRING_T(o, t, x, xl) SILC_ASN1_T2(UTF8_STRING, o, t, x, xl)
842 /****f* silcasn1/SilcASN1API/SILC_ASN1_NUMERIC_STRING
847 * SILC_ASN1_NUMERIC_STRING(str, str_len)
848 * SILC_ASN1_NUMERIC_STRING_T(opts, tag, str, str_len)
851 * SILC_ASN1_NUMERIC_STRING(&str, &str_len)
852 * SILC_ASN1_NUMERIC_STRING_T(opts, tag, &str, &str_len)
856 * Macro used to encode or decode numerical string. The string type is
857 * unsigned char and string length SilcUInt32.
859 * The `opts' is SilcAsn1Options. The `tag' is a tag number.
863 * The string must be in UTF-8 encoding when encoding. The decoded
864 * string will be in UTF-8 encoding. The actual data is encoded to
865 * or decoded from numerical.
868 #define SILC_ASN1_NUMERIC_STRING(x, xl) SILC_ASN1_U2(NUMERIC_STRING, x, xl)
869 #define SILC_ASN1_NUMERIC_STRING_T(o, t, x, xl) SILC_ASN1_T2(NUMERIC_STRING, o, t, x, xl)
871 /****f* silcasn1/SilcASN1API/SILC_ASN1_PRINTABLE_STRING
876 * SILC_ASN1_PRINTABLE_STRING(str, str_len)
877 * SILC_ASN1_PRINTABLE_STRING_T(opts, tag, str, str_len)
880 * SILC_ASN1_PRINTABLE_STRING(&str, &str_len)
881 * SILC_ASN1_PRINTABLE_STRING_T(opts, tag, &str, &str_len)
885 * Macro used to encode or decode printable string. The string type is
886 * unsigned char and string length SilcUInt32.
888 * The `opts' is SilcAsn1Options. The `tag' is a tag number.
892 * The string must be in UTF-8 encoding when encoding. The decoded
893 * string will be in UTF-8 encoding. The actual data is encoded to
894 * or decoded from printable.
897 #define SILC_ASN1_PRINTABLE_STRING(x, xl) SILC_ASN1_U2(PRINTABLE_STRING, x, xl)
898 #define SILC_ASN1_PRINTABLE_STRING_T(o, t, x, xl) SILC_ASN1_T2(PRINTABLE_STRING, o, t, x, xl)
900 /****f* silcasn1/SilcASN1API/SILC_ASN1_TELETEX_STRING
905 * SILC_ASN1_TELETEX_STRING(str, str_len)
906 * SILC_ASN1_TELETEX_STRING_T(opts, tag, str, str_len)
909 * SILC_ASN1_TELETEX_STRING(&str, &str_len)
910 * SILC_ASN1_TELETEX_STRING_T(opts, tag, &str, &str_len)
914 * Macro used to encode or decode teletex (T61) string. The string type is
915 * unsigned char and string length SilcUInt32.
917 * The `opts' is SilcAsn1Options. The `tag' is a tag number.
921 * The string must be in UTF-8 encoding when encoding. The decoded
922 * string will be in UTF-8 encoding. The actual data is encoded to
923 * or decoded from teletex (T61).
926 #define SILC_ASN1_TELETEX_STRING(x, xl) SILC_ASN1_U2(TELETEX_STRING, x, xl)
927 #define SILC_ASN1_TELETEX_STRING_T(o, t, x, xl) SILC_ASN1_T2(TELETEX_STRING, o, t, x, xl)
929 /****f* silcasn1/SilcASN1API/SILC_ASN1_IA5_STRING
934 * SILC_ASN1_IA5_STRING(str, str_len)
935 * SILC_ASN1_IA5_STRING_T(opts, tag, str, str_len)
938 * SILC_ASN1_IA5_STRING(&str, &str_len)
939 * SILC_ASN1_IA5_STRING_T(opts, tag, &str, &str_len)
943 * Macro used to encode or decode US ASCII (IA5) string. The string type
944 * is unsigned char and string length SilcUInt32.
946 * The `opts' is SilcAsn1Options. The `tag' is a tag number.
950 * The string must be in UTF-8 encoding when encoding. The decoded
951 * string will be in UTF-8 encoding. The actual data is encoded to
952 * or decoded from US ASCII (IA5).
955 #define SILC_ASN1_IA5_STRING(x, xl) SILC_ASN1_U2(IA5_STRING, x, xl)
956 #define SILC_ASN1_IA5_STRING_T(o, t, x, xl) SILC_ASN1_T2(IA5_STRING, o, t, x, xl)
958 /****f* silcasn1/SilcASN1API/SILC_ASN1_VISIBLE_STRING
963 * SILC_ASN1_VISIBLE_STRING(str, str_len)
964 * SILC_ASN1_VISIBLE_STRING_T(opts, tag, str, str_len)
967 * SILC_ASN1_VISIBLE_STRING(&str, &str_len)
968 * SILC_ASN1_VISIBLE_STRING_T(opts, tag, &str, &str_len)
972 * Macro used to encode or decode visible string. The string type is
973 * unsigned char and string length SilcUInt32.
975 * The `opts' is SilcAsn1Options. The `tag' is a tag number.
979 * The string must be in UTF-8 encoding when encoding. The decoded
980 * string will be in UTF-8 encoding. The actual data is encoded to
981 * or decoded from visible.
984 #define SILC_ASN1_VISIBLE_STRING(x, xl) SILC_ASN1_U2(VISIBLE_STRING, x, xl)
985 #define SILC_ASN1_VISIBLE_STRING_T(o, t, x, xl) SILC_ASN1_T2(VISIBLE_STRING, o, t, x, xl)
987 /****f* silcasn1/SilcASN1API/SILC_ASN1_UNIVERSAL_STRING
992 * SILC_ASN1_UNIVERSAL_STRING(str, str_len)
993 * SILC_ASN1_UNIVERSAL_STRING_T(opts, tag, str, str_len)
996 * SILC_ASN1_UNIVERSAL_STRING(&str, &str_len)
997 * SILC_ASN1_UNIVERSAL_STRING_T(opts, tag, &str, &str_len)
1001 * Macro used to encode or decode universal (UCS-4) string. The string
1002 * type is unsigned char and string length SilcUInt32.
1004 * The `opts' is SilcAsn1Options. The `tag' is a tag number.
1008 * The string must be in UTF-8 encoding when encoding. The decoded
1009 * string will be in UTF-8 encoding. The actual data is encoded to
1010 * or decoded from universal (UCS-4).
1013 #define SILC_ASN1_UNIVERSAL_STRING(x, xl) SILC_ASN1_U2(UNIVERSAL_STRING, x, xl)
1014 #define SILC_ASN1_UNIVERSAL_STRING_T(o, t, x, xl) SILC_ASN1_T2(UNIVERSAL_STRING, o, t, x, xl)
1016 /****f* silcasn1/SilcASN1API/SILC_ASN1_BMP_STRING
1021 * SILC_ASN1_BMP_STRING(str, str_len)
1022 * SILC_ASN1_BMP_STRING_T(opts, tag, str, str_len)
1025 * SILC_ASN1_BMP_STRING(&str, &str_len)
1026 * SILC_ASN1_BMP_STRING_T(opts, tag, &str, &str_len)
1030 * Macro used to encode or decode BMP (UCS-2) string. The string type is
1031 * unsigned char and string length SilcUInt32.
1033 * The `opts' is SilcAsn1Options. The `tag' is a tag number.
1037 * The string must be in UTF-8 encoding when encoding. The decoded
1038 * string will be in UTF-8 encoding. The actual data is encoded to
1039 * or decoded from BMP (UCS-2)
1042 #define SILC_ASN1_BMP_STRING(x, xl) SILC_ASN1_U2(BMP_STRING, x, xl)
1043 #define SILC_ASN1_BMP_STRING_T(o, t, x, xl) SILC_ASN1_T2(BMP_STRING, o, t, x, xl)
1045 /****f* silcasn1/SilcASN1API/SILC_ASN1_UNRESTRICTED_STRING
1050 * SILC_ASN1_UNRESTRICTED_STRING(str, str_len)
1051 * SILC_ASN1_UNRESTRICTED_STRING_T(opts, tag, str, str_len)
1054 * SILC_ASN1_UNRESTRICTED_STRING(&str, &str_len)
1055 * SILC_ASN1_UNRESTRICTED_STRING_T(opts, tag, &str, &str_len)
1059 * Macro used to encode or decode unrestricted string. The string type is
1060 * unsigned char and string length SilcUInt32.
1062 * The `opts' is SilcAsn1Options. The `tag' is a tag number.
1066 * The string must be in UTF-8 encoding when encoding. The decoded
1067 * string will be in UTF-8 encoding. The actual data is encoded to
1068 * or decoded from unrestricted. NOTE: this implementation use 8-bit ASCII.
1071 #define SILC_ASN1_UNRESTRICTED_STRING(x, xl) SILC_ASN1_U2(UNRESTRICTED_STRING, x, xl)
1072 #define SILC_ASN1_UNRESTRICTED_STRING_T(o, t, x, xl) SILC_ASN1_T2(UNRESTRICTED_STRING, o, t, x, xl)
1074 /****f* silcasn1/SilcASN1API/SILC_ASN1_GENERAL_STRING
1079 * SILC_ASN1_GENERAL_STRING(str, str_len)
1080 * SILC_ASN1_GENERAL_STRING_T(opts, tag, str, str_len)
1083 * SILC_ASN1_GENERAL_STRING(&str, &str_len)
1084 * SILC_ASN1_GENERAL_STRING_T(opts, tag, &str, &str_len)
1088 * Macro used to encode or decode general string. The string type is
1089 * unsigned char and string length SilcUInt32.
1091 * The `opts' is SilcAsn1Options. The `tag' is a tag number.
1095 * The string must be in UTF-8 encoding when encoding. The decoded
1096 * string will be in UTF-8 encoding. The actual data is encoded to
1097 * or decoded from general. NOTE: this implementation use 8-bit ASCII.
1100 #define SILC_ASN1_GENERAL_STRING(x, xl) SILC_ASN1_U2(GENERAL_STRING, x, xl)
1101 #define SILC_ASN1_GENERAL_STRING_T(o, t, x, xl) SILC_ASN1_T2(GENERAL_STRING, o, t, x, xl)
1103 /****f* silcasn1/SilcASN1API/SILC_ASN1_UTC_TIME
1108 * SILC_ASN1_UTC_TIME(timeval)
1109 * SILC_ASN1_UTC_TIME_T(opts, tag, timeval)
1112 * SILC_ASN1_UTC_TIME(&str, &timeval)
1113 * SILC_ASN1_UTC_TIME_T(opts, tag, &timeval)
1117 * Macro used to encode or decode universal (UTC) time value. The
1118 * time value type is SilcTime.
1120 * The `opts' is SilcAsn1Options. The `tag' is a tag number.
1123 #define SILC_ASN1_UTC_TIME(x) SILC_ASN1_U1(UTC_TIME, x)
1124 #define SILC_ASN1_UTC_TIME_T(o, t, x) SILC_ASN1_T1(UTC_TIME, o, t, x)
1126 /****f* silcasn1/SilcASN1API/SILC_ASN1_GEN_TIME
1131 * SILC_ASN1_GEN_TIME(timeval)
1132 * SILC_ASN1_GEN_TIME_T(opts, tag, timeval)
1135 * SILC_ASN1_GEN_TIME(&str, &timeval)
1136 * SILC_ASN1_GEN_TIME_T(opts, tag, &timeval)
1140 * Macro used to encode or decode generalized time value. The
1141 * time value type is SilcTime.
1143 * The `opts' is SilcAsn1Options. The `tag' is a tag number.
1146 #define SILC_ASN1_GEN_TIME(x) SILC_ASN1_U1(GENERALIZED_TIME, x)
1147 #define SILC_ASN1_GEN_TIME_T(o, t, x) SILC_ASN1_T1(GENERALIZED_TIME, o, t, x)
1149 /****f* silcasn1/SilcASN1API/SILC_ASN1_END
1157 * The SILC_ASN1_END is used to terminate the variable argument list in
1158 * silc_asn1_encode and silc_asn1_decode functions. It is also used to
1159 * terminate SILC_ASN1_SEQUENCE, SILC_ASN1_SEQUENCE_T, SILC_ASN1_SET,
1160 * SILC_ASN1_SET_T, SILC_ASN1_SEQUENCE_OF, SILC_ASN1_SET_OF and
1161 * SILC_ASN1_CHOICE macros.
1164 #define SILC_ASN1_END 0
1166 #endif /* SILCASN1_H */