Initial code commit for Toolkit 1.1.
[silc.git] / lib / silcasn1 / silcber.h
1 /*
2
3   silcber.h
4
5   Author: Pekka Riikonen <priikone@silcnet.org>
6
7   Copyright (C) 2003 - 2005 Pekka Riikonen
8
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.
12
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.
17
18 */
19
20 /****h* silcasn1/BER Interface
21  *
22  * DESCRIPTION
23  *
24  * The Basic Encoding Rules (BER) is the data encoding format for the
25  * ASN.1.  This interface provides routines for encoding and decoding
26  * arbitraty BER data blocks.  Naturally, this interface can be used
27  * to encode and decode DER blocks as well.  These routines does not
28  * allocate any memory and have been optimized for general ASN.1 usage.
29  *
30  * References: ITU-T X.690
31  * http://www.itu.int/ITU-T/studygroups/com17/languages/X690_0702.pdf
32  *
33  ***/
34
35 #ifndef SILCBER_H
36 #define SILCBER_H
37
38 typedef enum {
39   SILC_BER_CLASS_UNIVERSAL       = 0x00,   /* Universal */
40   SILC_BER_CLASS_APPLICATION     = 0x01,   /* Application */
41   SILC_BER_CLASS_CONTEXT         = 0x02,   /* Context-specific */
42   SILC_BER_CLASS_PRIVATE         = 0x03,   /* Private */
43 } SilcBerClass;
44
45 typedef enum {
46   SILC_BER_ENC_PRIMITIVE         = 0x00,
47   SILC_BER_ENC_CONSTRUCTED       = 0x01,
48 } SilcBerEncoding;
49
50 /****f* silcasn1/SilcBerAPI/silc_ber_encode
51  *
52  * SYNOPSIS
53  *
54  *    bool silc_ber_encode(SilcBuffer ber, SilcBerClass ber_class,
55  *                         SilcBerEncoding encoding, SilcUInt32 tag,
56  *                         const unsigned char *data, SilcUInt32 data_len,
57  *                         bool indefinite);
58  *
59  * DESCRIPTION
60  *
61  *    Encodes a BER data block into the `ber', which must already have
62  *    sufficient space allocated.  Caller can use silc_ber_encoded_len
63  *    function to determine how much to allocate space before calling this
64  *    function.  If the `indefinite' is TRUE then the BER block will not
65  *    include the length of the data in the BER block.
66  *
67  ***/
68 bool silc_ber_encode(SilcBuffer ber, SilcBerClass ber_class,
69                      SilcBerEncoding encoding, SilcUInt32 tag,
70                      const unsigned char *data, SilcUInt32 data_len,
71                      bool indefinite);
72
73 /****f* silcasn1/SilcBerAPI/silc_ber_decode
74  *
75  * SYNOPSIS
76  *
77  *    bool silc_ber_decode(SilcBuffer ber, SilcBerClass *ber_class,
78  *                         SilcBerEncoding *encoding, SilcUInt32 *tag,
79  *                         const unsigned char **data, SilcUInt32 *data_len,
80  *                         bool *indefinite, SilcUInt32 *identifier_len);
81  *
82  * DESCRIPTION
83  *
84  *    Decodesa a BER data from the buffer `ber'.  Returns the class,
85  *    encoding and the tag number for the BER data into `ber_class',
86  *    `encoding' and `tag'.  A pointer to the start of the data area is
87  *    returned into `data'.  If the length of the data is available from
88  *    the BER data the length is returned into `data_len'.  If the
89  *    `indefinite' is TRUE then the length found in `data_len' was found
90  *    by finding end-of-contents octets from the BER data.  The
91  *    `identifier_len' is the length of the BER header, and the length
92  *    of the entire BER object is `identifier_len' + `data_len'.
93  *
94  ***/
95 bool silc_ber_decode(SilcBuffer ber, SilcBerClass *ber_class,
96                      SilcBerEncoding *encoding, SilcUInt32 *tag,
97                      const unsigned char **data, SilcUInt32 *data_len,
98                      bool *indefinite, SilcUInt32 *identifier_len);
99
100 /****f* silcasn1/SilcBerAPI/silc_ber_encoded_len
101  *
102  * SYNOPSIS
103  *
104  *    SilcUInt32 silc_ber_encoded_len(SilcUInt32 tag, SilcUInt32 data_len,
105  *                                    bool indefinite);
106  *
107  * DESCRIPTION
108  *
109  *    Calculates the length of the encoded BER data object.  This utility
110  *    function can be used to calculate how much to allocate space before
111  *    encoding with silc_ber_encode.
112  *
113  ***/
114 SilcUInt32 silc_ber_encoded_len(SilcUInt32 tag, SilcUInt32 data_len,
115                                 bool indefinite);
116
117 #endif /* SILCBER_H */