Initial code commit for Toolkit 1.1.
[crypto.git] / lib / silcasn1 / silcber.h
diff --git a/lib/silcasn1/silcber.h b/lib/silcasn1/silcber.h
new file mode 100644 (file)
index 0000000..b4bec70
--- /dev/null
@@ -0,0 +1,117 @@
+/*
+
+  silcber.h
+
+  Author: Pekka Riikonen <priikone@silcnet.org>
+
+  Copyright (C) 2003 - 2005 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
+  the Free Software Foundation; version 2 of the License.
+
+  This program is distributed in the hope that it will be useful,
+  but WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+  GNU General Public License for more details.
+
+*/
+
+/****h* silcasn1/BER Interface
+ *
+ * DESCRIPTION
+ *
+ * The Basic Encoding Rules (BER) is the data encoding format for the
+ * ASN.1.  This interface provides routines for encoding and decoding
+ * arbitraty BER data blocks.  Naturally, this interface can be used
+ * to encode and decode DER blocks as well.  These routines does not
+ * allocate any memory and have been optimized for general ASN.1 usage.
+ *
+ * References: ITU-T X.690
+ * http://www.itu.int/ITU-T/studygroups/com17/languages/X690_0702.pdf
+ *
+ ***/
+
+#ifndef SILCBER_H
+#define SILCBER_H
+
+typedef enum {
+  SILC_BER_CLASS_UNIVERSAL       = 0x00,   /* Universal */
+  SILC_BER_CLASS_APPLICATION     = 0x01,   /* Application */
+  SILC_BER_CLASS_CONTEXT         = 0x02,   /* Context-specific */
+  SILC_BER_CLASS_PRIVATE         = 0x03,   /* Private */
+} SilcBerClass;
+
+typedef enum {
+  SILC_BER_ENC_PRIMITIVE         = 0x00,
+  SILC_BER_ENC_CONSTRUCTED       = 0x01,
+} SilcBerEncoding;
+
+/****f* silcasn1/SilcBerAPI/silc_ber_encode
+ *
+ * SYNOPSIS
+ *
+ *    bool silc_ber_encode(SilcBuffer ber, SilcBerClass ber_class,
+ *                         SilcBerEncoding encoding, SilcUInt32 tag,
+ *                         const unsigned char *data, SilcUInt32 data_len,
+ *                         bool indefinite);
+ *
+ * DESCRIPTION
+ *
+ *    Encodes a BER data block into the `ber', which must already have
+ *    sufficient space allocated.  Caller can use silc_ber_encoded_len
+ *    function to determine how much to allocate space before calling this
+ *    function.  If the `indefinite' is TRUE then the BER block will not
+ *    include the length of the data in the BER block.
+ *
+ ***/
+bool silc_ber_encode(SilcBuffer ber, SilcBerClass ber_class,
+                    SilcBerEncoding encoding, SilcUInt32 tag,
+                    const unsigned char *data, SilcUInt32 data_len,
+                    bool indefinite);
+
+/****f* silcasn1/SilcBerAPI/silc_ber_decode
+ *
+ * SYNOPSIS
+ *
+ *    bool silc_ber_decode(SilcBuffer ber, SilcBerClass *ber_class,
+ *                         SilcBerEncoding *encoding, SilcUInt32 *tag,
+ *                         const unsigned char **data, SilcUInt32 *data_len,
+ *                         bool *indefinite, SilcUInt32 *identifier_len);
+ *
+ * DESCRIPTION
+ *
+ *    Decodesa a BER data from the buffer `ber'.  Returns the class,
+ *    encoding and the tag number for the BER data into `ber_class',
+ *    `encoding' and `tag'.  A pointer to the start of the data area is
+ *    returned into `data'.  If the length of the data is available from
+ *    the BER data the length is returned into `data_len'.  If the
+ *    `indefinite' is TRUE then the length found in `data_len' was found
+ *    by finding end-of-contents octets from the BER data.  The
+ *    `identifier_len' is the length of the BER header, and the length
+ *    of the entire BER object is `identifier_len' + `data_len'.
+ *
+ ***/
+bool silc_ber_decode(SilcBuffer ber, SilcBerClass *ber_class,
+                    SilcBerEncoding *encoding, SilcUInt32 *tag,
+                    const unsigned char **data, SilcUInt32 *data_len,
+                    bool *indefinite, SilcUInt32 *identifier_len);
+
+/****f* silcasn1/SilcBerAPI/silc_ber_encoded_len
+ *
+ * SYNOPSIS
+ *
+ *    SilcUInt32 silc_ber_encoded_len(SilcUInt32 tag, SilcUInt32 data_len,
+ *                                    bool indefinite);
+ *
+ * DESCRIPTION
+ *
+ *    Calculates the length of the encoded BER data object.  This utility
+ *    function can be used to calculate how much to allocate space before
+ *    encoding with silc_ber_encode.
+ *
+ ***/
+SilcUInt32 silc_ber_encoded_len(SilcUInt32 tag, SilcUInt32 data_len,
+                               bool indefinite);
+
+#endif /* SILCBER_H */