SILC Crypto Toolkit 1.2 Beta1
[crypto.git] / lib / silcasn1 / silcber.h
1 /*
2
3   silcber.h
4
5   Author: Pekka Riikonen <priikone@silcnet.org>
6
7   Copyright (C) 2003 - 2008 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 /****d* silcasn1/SilcBerClass
39  *
40  * NAME
41  *
42  *    typedef enum { ... } SilcBerClass;
43  *
44  * DESCRIPTION
45  *
46  *    Defines the BER classes.
47  *
48  * SOURCE
49  */
50 typedef enum {
51   SILC_BER_CLASS_UNIVERSAL       = 0x00,   /* Universal */
52   SILC_BER_CLASS_APPLICATION     = 0x01,   /* Application */
53   SILC_BER_CLASS_CONTEXT         = 0x02,   /* Context-specific */
54   SILC_BER_CLASS_PRIVATE         = 0x03,   /* Private */
55 } SilcBerClass;
56 /***/
57
58 /****d* silcasn1/SilcBerEncoding
59  *
60  * NAME
61  *
62  *    typedef enum { ... } SilcBerEncoding;
63  *
64  * DESCRIPTION
65  *
66  *    Defines the BER encoding type.
67  *
68  * SOURCE
69  */
70 typedef enum {
71   SILC_BER_ENC_PRIMITIVE         = 0x00,
72   SILC_BER_ENC_CONSTRUCTED       = 0x01,
73 } SilcBerEncoding;
74 /***/
75
76 /****f* silcasn1/silc_ber_encode
77  *
78  * SYNOPSIS
79  *
80  *    SilcBool
81  *    silc_ber_encode(SilcBuffer ber, SilcBerClass ber_class,
82  *                    SilcBerEncoding encoding, SilcUInt32 tag,
83  *                    const unsigned char *data, SilcUInt32 data_len,
84  *                    SilcBool indefinite);
85  *
86  * DESCRIPTION
87  *
88  *    Encodes a BER data block into the `ber', which must already have
89  *    sufficient space allocated.  Caller can use silc_ber_encoded_len
90  *    function to determine how much to allocate space before calling this
91  *    function.  If the `indefinite' is TRUE then the BER block will not
92  *    include the length of the data in the BER block.
93  *
94  ***/
95 SilcBool silc_ber_encode(SilcBuffer ber, SilcBerClass ber_class,
96                          SilcBerEncoding encoding, SilcUInt32 tag,
97                          const unsigned char *data, SilcUInt32 data_len,
98                          SilcBool indefinite);
99
100 /****f* silcasn1/silc_ber_decode
101  *
102  * SYNOPSIS
103  *
104  *    SilcBool
105  *    silc_ber_decode(SilcBuffer ber, SilcBerClass *ber_class,
106  *                    SilcBerEncoding *encoding, SilcUInt32 *tag,
107  *                    const unsigned char **data, SilcUInt32 *data_len,
108  *                    SilcBool *indefinite, SilcUInt32 *identifier_len);
109  *
110  * DESCRIPTION
111  *
112  *    Decodesa a BER data from the buffer `ber'.  Returns the class,
113  *    encoding and the tag number for the BER data into `ber_class',
114  *    `encoding' and `tag'.  A pointer to the start of the data area is
115  *    returned into `data'.  If the length of the data is available from
116  *    the BER data the length is returned into `data_len'.  If the
117  *    `indefinite' is TRUE then the length found in `data_len' was found
118  *    by finding end-of-contents octets from the BER data.  The
119  *    `identifier_len' is the length of the BER header, and the length
120  *    of the entire BER object is `identifier_len' + `data_len'.
121  *
122  ***/
123 SilcBool silc_ber_decode(SilcBuffer ber, SilcBerClass *ber_class,
124                          SilcBerEncoding *encoding, SilcUInt32 *tag,
125                          const unsigned char **data, SilcUInt32 *data_len,
126                          SilcBool *indefinite, SilcUInt32 *identifier_len);
127
128 /****f* silcasn1/silc_ber_encoded_len
129  *
130  * SYNOPSIS
131  *
132  *    SilcUInt32 silc_ber_encoded_len(SilcUInt32 tag, SilcUInt32 data_len,
133  *                                    SilcBool indefinite);
134  *
135  * DESCRIPTION
136  *
137  *    Calculates the length of the encoded BER data object.  This utility
138  *    function can be used to calculate how much to allocate space before
139  *    encoding with silc_ber_encode.
140  *
141  ***/
142 SilcUInt32 silc_ber_encoded_len(SilcUInt32 tag, SilcUInt32 data_len,
143                                 SilcBool indefinite);
144
145 #endif /* SILCBER_H */