updates.
[silc.git] / apps / silcd / idlist.h
index efca0dbf03cfd73ceee9a94840e641f6baba405d..b55820a150e544d75370c16cc1e877a68e53e194 100644 (file)
@@ -33,6 +33,25 @@ typedef struct {
   void *timeout_queue;
 } *SilcIDListPurge;
 
+/* Channel key re-key context. */
+typedef struct {
+  void *context;
+  SilcChannelEntry channel;
+  uint32 key_len;
+} *SilcServerChannelRekey;
+
+/* Generic rekey context for connections */
+typedef struct {
+  /* Current sending encryption key, provided for re-key. The `pfs'
+     is TRUE if the Perfect Forward Secrecy is performed in re-key. */
+  unsigned char *send_enc_key;
+  uint32 enc_key_len;
+  int ske_group;
+  bool pfs;
+  uint32 timeout;
+  void *context;
+} *SilcServerRekey;
+
 /*
    Generic ID list data structure.
 
@@ -51,21 +70,21 @@ typedef struct {
   SilcCipher send_key;
   SilcCipher receive_key;
 
+  /* Re-key context */
+  SilcServerRekey rekey;
+
   /* Hash selected in the SKE protocol, NULL if not needed at all */
   SilcHash hash;
 
-  /* HMAC and raw key data */
+  /* HMAC */
   SilcHmac hmac;
-  unsigned char *hmac_key;
-  unsigned int hmac_key_len;
 
-  /* PKCS and public key */
-  SilcPKCS pkcs;
+  /* Public key */
   SilcPublicKey public_key;
 
   long last_receive;         /* Time last received data */
   long last_sent;           /* Time last sent data */
-  unsigned char registered;  /* Boolean whether connection is registered */
+  bool registered;           /* Boolean whether connection is registered */
 } *SilcIDListData, SilcIDListDataStruct;
 
 /* 
@@ -96,7 +115,7 @@ typedef struct {
        Logical name of the server. There is no limit of the length of the
        server name. This is usually the same name as defined in DNS.
 
-   int server_type
+   uint8 server_type
 
        Type of the server. SILC_SERVER or SILC_ROUTER are the possible
        choices for this.
@@ -137,7 +156,7 @@ struct SilcServerEntryStruct {
   SilcIDListDataStruct data;
 
   char *server_name;
-  int server_type;
+  uint8 server_type;
   SilcServerID *id;
   char *server_info;
   char *motd;
@@ -160,7 +179,7 @@ struct SilcServerEntryStruct {
 
        Pointer to the client list. This is the client currently on channel.
 
-   unsigned int mode
+   uint32 mode
 
        Client's current mode on the channel.
 
@@ -181,7 +200,7 @@ struct SilcServerEntryStruct {
 */
 typedef struct SilcChannelClientEntryStruct {
   SilcClientEntry client;
-  unsigned int mode;
+  uint32 mode;
   SilcChannelEntry channel;
   struct SilcChannelClientEntryStruct *client_list;
   struct SilcChannelClientEntryStruct *channel_list;
@@ -211,8 +230,7 @@ typedef struct SilcChannelClientEntryStruct {
 
    char username
 
-       Client's (meaning user's) real name. This is defined in following 
-       manner:
+       Client's usename. This is defined in the following manner:
 
        Server type   List type      Contents
        ====================================================
@@ -248,7 +266,7 @@ typedef struct SilcChannelClientEntryStruct {
        nickname. Nickname is not relevant information that would need to be 
        saved as plain.
 
-   int mode
+   uint32 mode
 
        Client's mode.  Client maybe for example server operator or
        router operator (SILC operator).
@@ -259,7 +277,7 @@ typedef struct SilcChannelClientEntryStruct {
        not allow any command to be exeucted more than once in about
        2 seconds. This is result of normal time().
 
-   char fast_command
+   uint8 fast_command
 
        Counter to check command bursts.  By default, up to 5 commands
        are allowed before limiting the execution.  See command flags
@@ -291,10 +309,10 @@ struct SilcClientEntryStruct {
   char *username;
   char *userinfo;
   SilcClientID *id;
-  int mode;
+  uint32 mode;
 
   long last_command;
-  char fast_command;
+  uint8 fast_command;
 
   /* Pointer to the router */
   SilcServerEntry router;
@@ -328,7 +346,7 @@ struct SilcClientEntryStruct {
 
        Logical name of the channel.
 
-   unsigned int mode
+   uint32 mode
 
        Current mode of the channel.  See lib/silccore/silcchannel.h for
        all modes.
@@ -338,7 +356,7 @@ struct SilcClientEntryStruct {
        ID of the channel. This includes all the information SILC will ever
        need.
 
-   int global_users
+   bool global_users
  
        Boolean value to tell whether there are users outside this server
        on this channel. This is set to TRUE if router sends message to
@@ -357,6 +375,21 @@ struct SilcClientEntryStruct {
        Default cipher of the channel. If this is NULL then server picks
        the cipher to be used. This can be set at SILC_COMMAND_JOIN.
 
+   char *hmac_name
+
+       Default hmac of the channel. If this is NULL then server picks
+       the cipher to be used. This can be set at SILC_COMMAND_JOIN.
+
+   SilcPublicKey founder_key
+   SilcAuthMethod founder_method
+   unsigned char *founder_passwd
+   uint32 founder_passwd_len
+
+       If the SILC_CMODE_FOUNDER_AUTH has been set then these will include
+       the founder's public key, authentication method and the password
+       if the method is SILC_AUTH_PASSWORD.  If it is SILC_AUTH_PUBLIC_KEY
+       then the `founder_passwd' is NULL.
+
    SilcServerEntry router
 
        This is a pointer to the server list. This is the router server 
@@ -368,7 +401,7 @@ struct SilcClientEntryStruct {
        The key of the channel (the cipher actually).
 
    unsigned char *key
-   unsigned int key_len
+   uint32 key_len
 
        Raw key data of the channel key.
 
@@ -381,24 +414,29 @@ struct SilcClientEntryStruct {
 
        HMAC of the channel.
 
+   SilcServerChannelRekey rekey
+
+       Channel key re-key context.
+
 */
 struct SilcChannelEntryStruct {
   char *channel_name;
-  unsigned int mode;
+  uint32 mode;
   SilcChannelID *id;
-  int global_users;
+  bool global_users;
   char *topic;
   char *cipher;
+  char *hmac_name;
+
+  SilcPublicKey founder_key;
+  SilcAuthMethod founder_method;
+  unsigned char *founder_passwd;
+  uint32 founder_passwd_len;
 
-  /* Data that is related to different channel modes. */
-  struct {
-    unsigned int user_limit;
-    unsigned char *passphrase;
-    unsigned char *ban_list;
-    unsigned char *invite_list;
-    unsigned char *cipher;
-    unsigned int key_len;
-  } mode_data;
+  uint32 user_limit;
+  unsigned char *passphrase;
+  char *invite_list;
+  char *ban_list;
 
   /* List of users on channel */
   SilcList user_list;
@@ -409,9 +447,11 @@ struct SilcChannelEntryStruct {
   /* Channel keys */
   SilcCipher channel_key;
   unsigned char *key;
-  unsigned int key_len;
+  uint32 key_len;
   unsigned char iv[SILC_CIPHER_MAX_IV_SIZE];
   SilcHmac hmac;
+
+  SilcServerChannelRekey rekey;
 };
 
 /* 
@@ -493,24 +533,21 @@ silc_idlist_find_server_by_conn(SilcIDList id_list, char *hostname,
 SilcServerEntry
 silc_idlist_replace_server_id(SilcIDList id_list, SilcServerID *old_id,
                              SilcServerID *new_id);
-void silc_idlist_del_server(SilcIDList id_list, SilcServerEntry entry);
+int silc_idlist_del_server(SilcIDList id_list, SilcServerEntry entry);
 SilcClientEntry
 silc_idlist_add_client(SilcIDList id_list, unsigned char *nickname, 
-                      unsigned int nickname_len, char *username, 
+                      uint32 nickname_len, char *username, 
                       char *userinfo, SilcClientID *id, 
                       SilcServerEntry router, void *connection);
 int silc_idlist_del_client(SilcIDList id_list, SilcClientEntry entry);
-SilcClientEntry *
-silc_idlist_get_clients_by_nickname(SilcIDList id_list, char *nickname,
-                                   char *server, unsigned int *clients_count);
-SilcClientEntry *
-silc_idlist_get_clients_by_hash(SilcIDList id_list, char *nickname,
-                               SilcHash md5hash,
-                               unsigned int *clients_count);
-SilcClientEntry
-silc_idlist_find_client_by_nickname(SilcIDList id_list, char *nickname,
-                                   char *server,
-                                   SilcIDCacheEntry *ret_entry);
+int silc_idlist_get_clients_by_nickname(SilcIDList id_list, char *nickname,
+                                       char *server, 
+                                       SilcClientEntry **clients,
+                                       uint32 *clients_count);
+int silc_idlist_get_clients_by_hash(SilcIDList id_list, char *nickname,
+                                   SilcHash md5hash,
+                                   SilcClientEntry **clients,
+                                   uint32 *clients_count);
 SilcClientEntry
 silc_idlist_find_client_by_hash(SilcIDList id_list, char *nickname,
                                SilcHash md5hash, SilcIDCacheEntry *ret_entry);
@@ -538,6 +575,6 @@ silc_idlist_replace_channel_id(SilcIDList id_list, SilcChannelID *old_id,
                               SilcChannelID *new_id);
 SilcChannelEntry *
 silc_idlist_get_channels(SilcIDList id_list, SilcChannelID *channel_id,
-                        unsigned int *channels_count);
+                        uint32 *channels_count);
 
 #endif