Moved SILC id utility functions from utility library.
[silc.git] / lib / silccore / silcid.h
index e2416fe0d024bc867bd79931b0ed4d0fc79f2249..9f8c84e7dcb278484276968430248a3da91836ce 100644 (file)
@@ -1,24 +1,23 @@
-/****h* silccore/silcid.h
- *
- * NAME
- *
- * silcid.h
- *
- * COPYRIGHT
- *
- * Author: Pekka Riikonen <priikone@poseidon.pspt.fi>
- *
- * Copyright (C) 1997 - 2000 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; either version 2 of the License, or
- * (at your option) any later version.
- *
- * 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.
+/*
+
+  silcid.h
+
+  Author: Pekka Riikonen <priikone@silcnet.org>
+
+  Copyright (C) 1997 - 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
+  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* silccore/SILC ID Interface
  *
  * DESCRIPTION
  *
  * way to distinguish the ID's from other ID's. The ID's supports both
  * IPv4 and IPv6.
  *
+ * This file also includes the implementation of the SILC ID Payload
+ * parsing and encoding.
+ *
  ***/
 
 #ifndef SILCID_H
 #define SILCID_H
 
+/* The ID Lenghts. These are IPv4 based and should be noted if used directly
+   that these cannot be used with IPv6. */
+#define SILC_ID_SERVER_LEN     (64 / 8)
+#define SILC_ID_CLIENT_LEN     (128 / 8)
+#define SILC_ID_CHANNEL_LEN    (64 / 8)
+
+#define CLIENTID_HASH_LEN       (88 / 8) /* Client ID's 88 bit MD5 hash */
+
 /****d* silccore/SilcIDAPI/SilcIdType
  *
  * NAME
- * 
- *    typedef uint16 SilcIdType;
+ *
+ *    typedef SilcUInt16 SilcIdType;
  *
  * DESCRIPTION
  *
  *
  * SOURCE
  */
-typedef uint16 SilcIdType;
+typedef SilcUInt16 SilcIdType;
 
 /* The SILC ID Types */
-#define SILC_ID_NONE 0
-#define SILC_ID_SERVER 1
-#define SILC_ID_CLIENT 2
-#define SILC_ID_CHANNEL 3
+#define SILC_ID_NONE        0
+#define SILC_ID_SERVER      1
+#define SILC_ID_CLIENT      2
+#define SILC_ID_CHANNEL     3
 /***/
 
-/* The ID Lenghts. These are IPv4 based and should be noted if used directly
-   that these cannot be used with IPv6. */
-#define SILC_ID_SERVER_LEN     (64 / 8)
-#define SILC_ID_CLIENT_LEN     (128 / 8)
-#define SILC_ID_CHANNEL_LEN    (64 / 8)
-
-#define CLIENTID_HASH_LEN       (88 / 8) /* Client ID's 88 bit MD5 hash */
-
 /****s* silccore/SilcIDAPI/SilcIDIP
  *
  * NAME
- * 
+ *
  *    typedef struct { ... } SilcIDIP;
  *
  * DESCRIPTION
@@ -80,39 +82,39 @@ typedef uint16 SilcIdType;
  *
  * SOURCE
  */
-typedef struct {
+typedef struct SilcIDIPStruct {
   unsigned char data[16];      /* IP data (in MSB first order) */
-  uint8 data_len;              /* Length of the data (4 or 16) */
+  SilcUInt8 data_len;          /* Length of the data (4 or 16) */
 } SilcIDIP;
 /***/
 
 /****s* silccore/SilcIDAPI/SilcServerID
  *
  * NAME
- * 
+ *
  *    typedef struct { ... } SilcServerID;
  *
  * DESCRIPTION
  *
  *    64 or 160 bit SilcServerID structure:
- *  
+ *
  *     n bit IP address
  *    16 bit port
  *    16 bit random number
  *
  * SOURCE
  */
-typedef struct {
+typedef struct SilcServerIDStruct {
   SilcIDIP ip;                 /* n bit IP address */
-  uint16 port;                 /* 16 bit port */
-  uint16 rnd;                  /* 16 bit random number */
+  SilcUInt16 port;             /* 16 bit port */
+  SilcUInt16 rnd;              /* 16 bit random number */
 } SilcServerID;
 /***/
 
 /****s* silccore/SilcIDAPI/SilcClientID
  *
  * NAME
- * 
+ *
  *    typedef struct { ... } SilcClientID;
  *
  * DESCRIPTION
@@ -121,11 +123,11 @@ typedef struct {
  *
  *      n bit ServerID IP address [bits 1-32 or bits 1-128]
  *      8 bit random number
- *     88 bit hash value from nickname
+ *     88 bit hash value from lowercase nickname
  *
  * SOURCE
  */
-typedef struct {
+typedef struct SilcClientIDStruct {
   SilcIDIP ip;                                 /* n bit IP address */
   unsigned char rnd;                           /* 8 bit random number */
   unsigned char hash[CLIENTID_HASH_LEN];       /* 88 bit MD5 hash */
@@ -135,7 +137,7 @@ typedef struct {
 /****s* silccore/SilcIDAPI/SilcChannelID
  *
  * NAME
- * 
+ *
  *    typedef struct { ... } SilcChannelID;
  *
  * DESCRIPTION
@@ -148,19 +150,64 @@ typedef struct {
  *
  * SOURCE
  */
-typedef struct {
-  SilcIDIP ip;                                 /* n bit IP address */
-  uint16 port;                                 /* 16 bit port */
-  uint16 rnd;                                  /* 16 bit random number */
+typedef struct SilcChannelIDStruct {
+  SilcIDIP ip;                 /* n bit IP address */
+  SilcUInt16 port;             /* 16 bit port */
+  SilcUInt16 rnd;              /* 16 bit random number */
 } SilcChannelID;
 /***/
 
+/****s* silccore/SilcIDAPI/SilcID
+ *
+ * NAME
+ *
+ *    typedef struct { ... } SilcID;
+ *
+ * DESCRIPTION
+ *
+ *    The generic ID structure that can represent SilcClientID, SilcServerID
+ *    and SilcChannelID.  The silc_id_payload_parse_id returns the ID in the
+ *    SilcID structure.  Other routines except either SilcClientID,
+ *    SilcServerID or SilcChannelID as a void pointer.
+ *
+ * SOURCE
+ */
+typedef struct SilcIDStruct {
+  union {
+    SilcServerID server_id;
+    SilcChannelID channel_id;
+    SilcClientID client_id;
+  } u;
+  SilcIdType type;
+} SilcID;
+/***/
+
 /* Macros */
 
+/****d* silccore/SilcIDAPI/SILC_ID_GET_ID
+ *
+ * NAME
+ *
+ *    #define SILC_ID_GET_ID ...
+ *
+ * DESCRIPTION
+ *
+ *    Returns the ID type specific pointer from the SilcID structure.  As
+ *    the SilcID is able to house all types of IDs this macro can be used
+ *    to get the specific ID from the structure by its type.
+ *
+ * SOURCE
+ */
+#define SILC_ID_GET_ID(id)                                             \
+  ((id).type == SILC_ID_CLIENT  ? (void *)&(id).u.client_id :          \
+   (id).type == SILC_ID_SERVER  ? (void *)&(id).u.server_id :          \
+   (void *)&(id).u.channel_id)
+/***/
+
 /****d* silccore/SilcIDAPI/SILC_ID_COMPARE
  *
  * NAME
- * 
+ *
  *    #define SILC_ID_COMPARE ...
  *
  * DESCRIPTION
@@ -176,7 +223,7 @@ typedef struct {
 /****d* silccore/SilcIDAPI/SILC_ID_CLIENT_COMPARE
  *
  * NAME
- * 
+ *
  *    #define SILC_ID_CLIENT_COMPARE ...
  *
  * DESCRIPTION
@@ -192,7 +239,7 @@ typedef struct {
 /****d* silccore/SilcIDAPI/SILC_ID_SERVER_COMPARE
  *
  * NAME
- * 
+ *
  *    #define SILC_ID_SERVER_COMPARE ...
  *
  * DESCRIPTION
@@ -208,7 +255,7 @@ typedef struct {
 /****d* silccore/SilcIDAPI/SILC_ID_CHANNEL_COMPARE
  *
  * NAME
- * 
+ *
  *    #define SILC_ID_CHANNEL_COMPARE ...
  *
  * DESCRIPTION
@@ -224,7 +271,7 @@ typedef struct {
 /****d* silccore/SilcIDAPI/SILC_ID_COMPARE_TYPE
  *
  * NAME
- * 
+ *
  *    #define SILC_ID_COMPARE_TYPE ...
  *
  * DESCRIPTION
@@ -242,7 +289,7 @@ typedef struct {
 /****d* silccore/SilcIDAPI/SILC_ID_COMPARE_HASH
  *
  * NAME
- * 
+ *
  *    #define SILC_ID_COMPARE_HASH ...
  *
  * DESCRIPTION
@@ -258,54 +305,227 @@ typedef struct {
   (!memcmp((id1)->hash, (id2)->hash, CLIENTID_HASH_LEN))
 /***/
 
+/****s* silccore/SilcIDAPI/SilcIDPayload
+ *
+ * NAME
+ *
+ *    typedef struct SilcIDPayloadStruct *SilcIDPayload;
+ *
+ * DESCRIPTION
+ *
+ *    This context is the actual ID Payload and is allocated by
+ *    silc_id_payload_parse and given as argument usually to all
+ *    silc_id_payload_* functions.  It is freed by the function
+ *    silc_id_payload_free.
+ *
+ ***/
+typedef struct SilcIDPayloadStruct *SilcIDPayload;
+
 /* Prototypes */
 
+/****f* silccore/SilcIDAPI/silc_id_payload_parse
+ *
+ * SYNOPSIS
+ *
+ *    SilcIDPayload silc_id_payload_parse(const unsigned char *payload,
+ *                                        SilcUInt32 payload_len);
+ *
+ * DESCRIPTION
+ *
+ *    Parses buffer and return ID payload into payload structure. The
+ *    `buffer' is raw payload buffer.  The caller must free the returned
+ *    payload.
+ *
+ ***/
+SilcIDPayload silc_id_payload_parse(const unsigned char *payload,
+                                   SilcUInt32 payload_len);
+
+/****f* silccore/SilcIDAPI/silc_id_payload_parse_id
+ *
+ * SYNOPSIS
+ *
+ *    SilcBool silc_id_payload_parse_id(const unsigned char *data,
+ *                                      SilcUInt32 len, SilcID *ret_id);
+ *
+ * DESCRIPTION
+ *
+ *    Return ID directly from the raw ID Payload data buffer.  This does
+ *    not allocate any memory.
+ *
+ ***/
+SilcBool silc_id_payload_parse_id(const unsigned char *data, SilcUInt32 len,
+                                 SilcID *ret_id);
+
+/****f* silccore/SilcIDAPI/silc_id_payload_encode
+ *
+ * SYNOPSIS
+ *
+ *    SilcBuffer silc_id_payload_encode(const void *id, SilcIdType type);
+ *
+ * DESCRIPTION
+ *
+ *    Encodes ID Payload. The `id' is the ID of the type `type' to put
+ *    into the payload. Returns the encoded payload buffer.
+ *
+ ***/
+SilcBuffer silc_id_payload_encode(const void *id, SilcIdType type);
+
+/****f* silccore/SilcIDAPI/silc_id_payload_encode_data
+ *
+ * SYNOPSIS
+ *
+ *    SilcBuffer silc_id_payload_encode_data(const unsigned char *id,
+ *                                           uin32 id_len, SilcIdType type);
+ *
+ * DESCRIPTION
+ *
+ *    Encodes ID Payload. The `id' is raw ID data of the length of `id_len'
+ *    of type of `type'. Returns the encoded payload buffer.
+ *
+ ***/
+SilcBuffer silc_id_payload_encode_data(const unsigned char *id,
+                                      SilcUInt32 id_len, SilcIdType type);
+
+/****f* silccore/SilcIDAPI/silc_id_payload_free
+ *
+ * SYNOPSIS
+ *
+ *    void silc_id_payload_free(SilcIDPayload payload);
+ *
+ * DESCRIPTION
+ *
+ *    Frees the ID Payload and all data in it.
+ *
+ ***/
+void silc_id_payload_free(SilcIDPayload payload);
+
+/****f* silccore/SilcIDAPI/silc_id_payload_get_type
+ *
+ * SYNOPSIS
+ *
+ *    SilcIdType silc_id_payload_get_type(SilcIDPayload payload);
+ *
+ * DESCRIPTION
+ *
+ *    Returns the ID type from the ID Payload. The type tells the
+ *    type of the ID in the payload.
+ *
+ ***/
+SilcIdType silc_id_payload_get_type(SilcIDPayload payload);
+
+/****f* silccore/SilcIDAPI/silc_id_payload_get_id
+ *
+ * SYNOPSIS
+ *
+ *    SilcBool silc_id_payload_get_id(SilcIDPayload payload, void *ret_id,
+ *                                    SilcUInt32 ret_id_len);
+ *
+ * DESCRIPTION
+ *
+ *    Returns the ID in the ID Payload. This does not allocate any memory.
+ *
+ ***/
+SilcBool silc_id_payload_get_id(SilcIDPayload payload, void *ret_id,
+                               SilcUInt32 ret_id_len);
+
+/****f* silccore/SilcIDAPI/silc_id_payload_get_data
+ *
+ * SYNOPSIS
+ *
+ *    unsigned char *silc_id_payload_get_data(SilcIDPayload payload);
+ *
+ * DESCRIPTION
+ *
+ *    Returns the raw ID data from the ID Payload. The data is duplicated
+ *    and the caller must free it.
+ *
+ ***/
+unsigned char *silc_id_payload_get_data(SilcIDPayload payload);
+
+/****f* silccore/SilcIDAPI/silc_id_payload_get_len
+ *
+ * SYNOPSIS
+ *
+ *    SilcUInt32 silc_id_payload_get_len(SilcIDPayload payload);
+ *
+ * DESCRIPTION
+ *
+ *    Returns the length of the ID in the ID Payload.
+ *
+ ***/
+SilcUInt32 silc_id_payload_get_len(SilcIDPayload payload);
+
 /****f* silccore/SilcIDAPI/silc_id_id2str
  *
  * SYNOPSIS
  *
- *    unsigned char *silc_id_id2str(void *id, SilcIdType type);
+ *    SilcBool silc_id_id2str(const void *id, SilcIdType type,
+ *                            unsigned char *ret_id, SilcUInt32 ret_id_size,
+ *                            SilcUInt32 *ret_id_len);
  *
  * DESCRIPTION
  *
  *    Converts an ID of type `type' to data. This can be used to
- *    convert the ID's to data for inclusion in the packets.
+ *    convert the ID's to data for inclusion in the packets.  This does
+ *    not allocate any memory.
  *
  ***/
-unsigned char *silc_id_id2str(void *id, SilcIdType type);
+SilcBool silc_id_id2str(const void *id, SilcIdType type,
+                       unsigned char *ret_id, SilcUInt32 ret_id_size,
+                       SilcUInt32 *ret_id_len);
 
 /****f* silccore/SilcIDAPI/silc_id_str2id
  *
  * SYNOPSIS
  *
- *    void *silc_id_str2id(unsigned char *id, uint32 id_len, SilcIdType type);
+ *    SilcBool silc_id_str2id(const unsigned char *id, SilcUInt32 id_len,
+ *                            SilcIdType type, void *ret_id,
+ *                            SilcUInt32 ret_id_size);
  *
  * DESCRIPTION
  *
  *    Converts ID data string to an ID. This can be used to get the
- *    ID out of data that has been taken for example from packet.
+ *    ID out of data that has been taken for example from packet.  This
+ *    does not allocate any memory.
+ *
+ ***/
+SilcBool silc_id_str2id(const unsigned char *id, SilcUInt32 id_len,
+                       SilcIdType type, void *ret_id, SilcUInt32 ret_id_size);
+
+/****f* silccore/SilcIDAPI/silc_id_str2id2
+ *
+ * SYNOPSIS
+ *
+ *    SilcBool silc_id_str2id2(const unsigned char *id, SilcUInt32 id_len,
+ *                             SilcIdType type, SilcID *ret_id);
+ *
+ * DESCRIPTION
+ *
+ *    Same as silc_id_str2id but returns the ID into SilcID structure in
+ *    `ret_id' pointer.  This does not allocate any memory.
  *
  ***/
-void *silc_id_str2id(unsigned char *id, uint32 id_len, SilcIdType type);
+SilcBool silc_id_str2id2(const unsigned char *id, SilcUInt32 id_len,
+                        SilcIdType type, SilcID *ret_id);
 
 /****f* silccore/SilcIDAPI/silc_id_get_len
  *
  * SYNOPSIS
  *
- *    uint32 silc_id_get_len(void *id, SilcIdType type);
+ *    SilcUInt32 silc_id_get_len(const void *id, SilcIdType type);
  *
  * DESCRIPTION
  *
  *    Returns the true length of the ID of the type `type'.
  *
  ***/
-uint32 silc_id_get_len(void *id, SilcIdType type);
+SilcUInt32 silc_id_get_len(const void *id, SilcIdType type);
 
 /****f* silccore/SilcIDAPI/silc_id_dup
  *
  * SYNOPSIS
  *
- *    void *silc_id_dup(void *id, SilcIdType type);
+ *    void *silc_id_dup(const void *id, SilcIdType type);
  *
  * DESCRIPTION
  *
@@ -313,6 +533,83 @@ uint32 silc_id_get_len(void *id, SilcIdType type);
  *    duplicated ID.
  *
  ***/
-void *silc_id_dup(void *id, SilcIdType type);
+void *silc_id_dup(const void *id, SilcIdType type);
+
+/****f* silccore/SilcIDAPI/silc_hash_id
+ *
+ * SYNOPSIS
+ *
+ *    SilcUInt32 silc_hash_id(void *key, void *user_context);
+ *
+ * DESCRIPTION
+ *
+ *    Hash a ID. The `user_context' is the ID type.  Can be used with
+ *    SilcHashTable.
+ *
+ ***/
+SilcUInt32 silc_hash_id(void *key, void *user_context);
+
+/****f* silccore/SilcIDAPI/silc_hash_client_id_hash
+ *
+ * SYNOPSIS
+ *
+ *    SilcUInt32 silc_hash_client_id_hash(void *key, void *user_context)
+ *
+ * DESCRIPTION
+ *
+ *    Hash Client ID's hash.  Can be used with SilcHashTable.
+ *
+ ***/
+SilcUInt32 silc_hash_client_id_hash(void *key, void *user_context);
+
+/****f* silccore/SilcIDAPI/silc_hash_id_compare
+ *
+ * SYNOPSIS
+ *
+ *    SilcBool silc_hash_id_compare(void *key1, void *key2,
+ *                                  void *user_context);
+ *
+ * DESCRIPTION
+ *
+ *    Compares two ID's. May be used as SilcHashTable comparison function.
+ *    The Client ID's compares only the hash of the Client ID not any other
+ *    part of the Client ID. Other ID's are fully compared.  Can be
+ *    used with SilcHashTable.
+ *
+ ***/
+SilcBool silc_hash_id_compare(void *key1, void *key2, void *user_context);
+
+/****f* silccore/SilcIDAPI/silc_hash_id_compare_full
+ *
+ * SYNOPSIS
+ *
+ *    SilcBool silc_hash_id_compare_full(void *key1, void *key2,
+ *                                       void *user_context)
+ *
+ * DESCRIPTION
+ *
+ *    Compares two ID's. May be used as SilcHashTable comparison function.
+ *    To compare full ID's instead of only partial, like the
+ *    silc_hash_id_compare does, use this function.  Can be used with
+ *    SilcHashTable.
+ *
+ ***/
+SilcBool silc_hash_id_compare_full(void *key1, void *key2, void *user_context);
+
+/****f* silccore/SilcIDAPI/silc_hash_client_id_compare
+ *
+ * SYNOPSIS
+ *
+ *    SilcBool silc_hash_client_id_compare(void *key1, void *key2,
+ *                                         void *user_context);
+ *
+ * DESCRIPTION
+ *
+ *    Compare two Client ID's entirely and not just the hash from the ID.
+ *    Can be used with SilcHashTable.
+ *
+ ***/
+SilcBool silc_hash_client_id_compare(void *key1, void *key2,
+                                    void *user_context);
 
 #endif