Author: Pekka Riikonen <priikone@poseidon.pspt.fi>
- Copyright (C) 1997 - 2000 Pekka Riikonen
+ Copyright (C) 1997 - 2001 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
typedef struct SilcClientEntryStruct *SilcClientEntry;
typedef struct SilcChannelEntryStruct *SilcChannelEntry;
+/* Context for holding cache information to periodically purge
+ the cache. */
+typedef struct {
+ SilcIDCache cache;
+ SilcSchedule schedule;
+ uint32 timeout;
+} *SilcIDListPurge;
+
+/* Channel key re-key context. */
+typedef struct {
+ void *context;
+ SilcChannelEntry channel;
+ uint32 key_len;
+ SilcTask task;
+} *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;
+
+/* ID List Entry status type and all the types. */
+typedef uint8 SilcIDListStatus;
+#define SILC_IDLIST_STATUS_NONE 0x00 /* No status */
+#define SILC_IDLIST_STATUS_REGISTERED 0x01 /* Entry is registered */
+#define SILC_IDLIST_STATUS_RESOLVED 0x02 /* Entry info is resolved */
+#define SILC_IDLIST_STATUS_RESOLVING 0x04 /* Entry is being resolved
+ with WHOIS or IDENTIFY */
+#define SILC_IDLIST_STATUS_DISABLED 0x08 /* Entry is disabled */
+
+/*
+ Generic ID list data structure.
+
+ This structure is included in all ID list entries and it includes data
+ pointers that are common to all ID entries. This structure is always
+ defined to the first field in the ID entries and is used to explicitly
+ type cast to this type without first explicitly casting to correct ID
+ entry type. Hence, the ID list entry is type casted to this type to
+ get this data from the ID entry (which is usually opaque pointer).
+
+ Note that some of the fields may be NULL.
+
+*/
+typedef struct {
+ /* Send and receive symmetric keys */
+ SilcCipher send_key;
+ SilcCipher receive_key;
+
+ /* HMAC */
+ SilcHmac hmac_send;
+ SilcHmac hmac_receive;
+
+ /* Packet sequence numbers */
+ uint32 psn_send;
+ uint32 psn_receive;
+
+ /* Hash selected in the SKE protocol, NULL if not needed at all */
+ SilcHash hash;
+
+ /* Public key */
+ SilcPublicKey public_key;
+ unsigned char fingerprint[20];
+
+ /* Re-key context */
+ SilcServerRekey rekey;
+
+ long last_receive; /* Time last received data */
+ long last_sent; /* Time last sent data */
+
+ unsigned long created; /* Time when entry was created */
+
+ SilcIDListStatus status; /* Status mask of the entry */
+} *SilcIDListData, SilcIDListDataStruct;
+
/*
SILC Server entry object.
Following short description of the fields:
+ SilcIDListDataStruct data
+
+ Generic data structure to hold data common to all ID entries.
+
char *server_name
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.
the server SILC will ever need. These are also the informations
that is broadcasted between servers and routers in the SILC network.
+ char *server_info
+ char *motd
+
+ Server info (from INFO command) saved temporarily and motd (from
+ MOTD command) saved temporarily.
+
SilcServerEntry router
This is a pointer back to the server list. This is the router server
it doesn't have a route this is NULL.
SilcCipher send_key
-
SilcCipher receive_key
+ Data sending and receiving keys.
+
void *connection
A pointer, usually, to the socket list for fast referencing to
*/
struct SilcServerEntryStruct {
+ /* Generic data structure. DO NOT add anything before this! */
+ SilcIDListDataStruct data;
+
char *server_name;
- int server_type;
+ uint8 server_type;
SilcServerID *id;
-
- /* TRUE when server is registered to server */
- int registered;
+ char *server_info;
+ char *motd;
/* Pointer to the router */
SilcServerEntry router;
- /* Keys */
- SilcCipher send_key;
- SilcCipher receive_key;
- SilcPKCS pkcs;
- SilcPublicKey public_key;
- SilcHmac hmac;
- unsigned char *hmac_key;
- unsigned int hmac_key_len;
-
/* Connection data */
void *connection;
};
+/*
+ SILC Channel Client entry structure.
+
+ This entry used only by the SilcChannelEntry object and it holds
+ information about current clients (ie. users) on channel. Following
+ short description of the fields:
+
+ SilcClientEntry client
+
+ Pointer to the client list. This is the client currently on channel.
+
+ uint32 mode
+
+ Client's current mode on the channel.
+
+ SilcChannelEntry channel
+
+ Back pointer back to channel. As this structure is also used by
+ SilcClientEntry we have this here for fast access to the channel when
+ used by SilcClientEntry.
+
+*/
+typedef struct SilcChannelClientEntryStruct {
+ SilcClientEntry client;
+ uint32 mode;
+ SilcChannelEntry channel;
+} *SilcChannelClientEntry;
+
/*
SILC Client entry object.
Following short description of the fields:
+ SilcIDListDataStruct data
+
+ Generic data structure to hold data common to all ID entries.
+
+ unsigned char *nickname
+
+ The nickname of the client.
+
+ char *servername
+
+ The name of the server where the client is from. MAy be NULL.
+
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
====================================================
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).
- SilcServerEntry router
+ long last_command
- This is a pointer to the server list. This is the router server whose
- cell this client is coming from. This is used to route messages to
- this client.
+ Time of last time client executed command. We are strict and will
+ not allow any command to be exeucted more than once in about
+ 2 seconds. This is result of normal time().
- SilcCipher session_key
+ uint8 fast_command
- The actual session key established by key exchange protcol between
- connecting parties. This is used for both encryption and decryption.
+ Counter to check command bursts. By default, up to 5 commands
+ are allowed before limiting the execution. See command flags
+ for more detail.
- SilcPKCS pkcs
+ SilcServerEntry router
- PKCS of the client. This maybe NULL.
+ This is a pointer to the server list. This is the router server whose
+ cell this client is coming from. This is used to route messages to
+ this client.
- SilcHmac hmac
- unsigned char *hmac_key
- unsigned int hmac_key_len
+ SilcHashTable channels;
- MAC key used to compute MAC's for packets.
+ All the channels this client has joined. The context saved in the
+ hash table shares memory with the channel entrys `user_list' hash
+ table.
void *connection
but as just said, this is usually pointer to the socket connection
list.
+ uint16 resolve_cmd_ident
+
+ Command identifier for the entry when the entry's data.status
+ is SILC_IDLIST_STATUS_RESOLVING. If this entry is asked to be
+ resolved when the status is set then the resolver may attach to
+ this command identifier and handle the process after the resolving
+ is over.
+
*/
struct SilcClientEntryStruct {
- char *nickname;
+ /* Generic data structure. DO NOT add anything before this! */
+ SilcIDListDataStruct data;
+
+ unsigned char *nickname;
+ char *servername;
char *username;
char *userinfo;
SilcClientID *id;
- int mode;
+ uint32 mode;
- /* TRUE when client is registered to server */
- int registered;
+ long last_command;
+ uint8 fast_command;
/* Pointer to the router */
SilcServerEntry router;
- /* Pointers to channels this client has joined */
- SilcChannelEntry *channel;
- unsigned int channel_count;
-
- /* Keys */
- SilcCipher send_key;
- SilcCipher receive_key;
- SilcPKCS pkcs;
- SilcHmac hmac;
- SilcPublicKey public_key;
- unsigned char *hmac_key;
- unsigned int hmac_key_len;
+ /* All channels this client has joined */
+ SilcHashTable channels;
/* Connection data */
void *connection;
-};
-
-/*
- SILC Channel Client entry structure.
-
- This entry used only by the SilcChannelEntry object and it holds
- information about current clients (ie. users) on channel. Following
- short description of the fields:
-
- SilcClientEntry client
-
- Pointer to the client list. This is the client currently on channel.
-
- int mode
-
- Client's current mode on the channel.
-*/
-typedef struct SilcChannelClientEntryStruct {
- SilcClientEntry client;
- int mode;
-} *SilcChannelClientEntry;
+ /* data.status is RESOLVING and this includes the resolving command
+ reply identifier. */
+ uint16 resolve_cmd_ident;
+};
/*
SILC Channel entry object.
Logical name of the channel.
- int mode
+ uint32 mode
- Current mode of the channel.
+ Current mode of the channel. See lib/silccore/silcchannel.h for
+ all modes.
SilcChannelID *id
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
Current topic of the channel.
+ char *cipher
+
+ 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.
+
+ SilcHashTable user_list
+
+ All users joined on this channel. Note that the context saved to
+ this entry shares memory with the client entrys `channels' hash
+ table.
+
SilcServerEntry router
This is a pointer to the server list. This is the router server
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.
Current initial vector. Initial vector is received always along
with the channel packet. By default this is filled with NULL.
+ SilcHmac hmac;
+
+ HMAC of the channel.
+
+ SilcServerChannelRekey rekey
+
+ Channel key re-key context.
+
*/
struct SilcChannelEntryStruct {
char *channel_name;
- 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;
+
+ uint32 user_limit;
+ unsigned char *passphrase;
+ char *invite_list;
+ char *ban_list;
- /* List of users on channel */
- SilcChannelClientEntry user_list;
- unsigned int user_list_count;
+ /* All users on this channel */
+ SilcHashTable user_list;
+ uint32 user_count;
/* Pointer to the router */
SilcServerEntry router;
/* 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;
+
+ unsigned long created;
+ bool disabled;
};
/*
} *SilcIDList;
/*
- Temporary ID Entry object.
+ ID Entry for Unknown connections.
This is used during authentication phases where we still don't know
what kind of connection remote connection is, hence, we will use this
*/
typedef struct {
- SilcCipher send_key;
- SilcCipher receive_key;
- SilcPKCS pkcs;
- SilcPublicKey public_key;
-
- SilcHmac hmac;
- unsigned char *hmac_key;
- unsigned int hmac_key_len;
-
- /* SilcComp comp */
+ /* Generic data structure. DO NOT add anything before this! */
+ SilcIDListDataStruct data;
} *SilcUnknownEntry;
/* Prototypes */
+void silc_idlist_add_data(void *entry, SilcIDListData idata);
+void silc_idlist_del_data(void *entry);
+SILC_TASK_CALLBACK_GLOBAL(silc_idlist_purge);
SilcServerEntry
silc_idlist_add_server(SilcIDList id_list,
char *server_name, int server_type,
SilcServerID *id, SilcServerEntry router,
- SilcCipher send_key, SilcCipher receive_key,
- SilcPKCS pkcs, SilcHmac hmac,
- SilcPublicKey public_key, void *connection);
+ void *connection);
+SilcServerEntry
+silc_idlist_find_server_by_id(SilcIDList id_list, SilcServerID *id,
+ bool registered, SilcIDCacheEntry *ret_entry);
+SilcServerEntry
+silc_idlist_find_server_by_name(SilcIDList id_list, char *name,
+ bool registered, SilcIDCacheEntry *ret_entry);
+SilcServerEntry
+silc_idlist_find_server_by_conn(SilcIDList id_list, char *hostname,
+ int port, bool registered,
+ SilcIDCacheEntry *ret_entry);
+SilcServerEntry
+silc_idlist_replace_server_id(SilcIDList id_list, SilcServerID *old_id,
+ SilcServerID *new_id);
+int silc_idlist_del_server(SilcIDList id_list, SilcServerEntry entry);
SilcClientEntry
-silc_idlist_add_client(SilcIDList id_list, char *nickname, char *username,
+silc_idlist_add_client(SilcIDList id_list, char *nickname, char *username,
char *userinfo, SilcClientID *id,
- SilcServerEntry router,
- SilcCipher send_key, SilcCipher receive_key,
- SilcPKCS pkcs, SilcHmac hmac,
- SilcPublicKey public_key, void *connection);
-void silc_idlist_del_client(SilcIDList id_list, SilcClientEntry entry);
-SilcClientEntry
-silc_idlist_find_client_by_nickname(SilcIDList id_list, char *nickname,
- char *server);
+ SilcServerEntry router, void *connection,
+ int expire);
+int silc_idlist_del_client(SilcIDList id_list, SilcClientEntry 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, unsigned char *hash,
- SilcHash md5hash);
+silc_idlist_find_client_by_id(SilcIDList id_list, SilcClientID *id,
+ bool registered, SilcIDCacheEntry *ret_entry);
SilcClientEntry
-silc_idlist_find_client_by_id(SilcIDList id_list, SilcClientID *id);
+silc_idlist_replace_client_id(SilcIDList id_list, SilcClientID *old_id,
+ SilcClientID *new_id);
+void silc_idlist_client_destructor(SilcIDCache cache,
+ SilcIDCacheEntry entry);
SilcChannelEntry
silc_idlist_add_channel(SilcIDList id_list, char *channel_name, int mode,
SilcChannelID *id, SilcServerEntry router,
- SilcCipher channel_key);
-void silc_idlist_del_channel(SilcIDList id_list, SilcChannelEntry entry);
+ SilcCipher channel_key, SilcHmac hmac,
+ int expire);
+int silc_idlist_del_channel(SilcIDList id_list, SilcChannelEntry entry);
+SilcChannelEntry
+silc_idlist_find_channel_by_name(SilcIDList id_list, char *name,
+ SilcIDCacheEntry *ret_entry);
SilcChannelEntry
-silc_idlist_find_channel_by_name(SilcIDList id_list, char *name);
+silc_idlist_find_channel_by_id(SilcIDList id_list, SilcChannelID *id,
+ SilcIDCacheEntry *ret_entry);
SilcChannelEntry
-silc_idlist_find_channel_by_id(SilcIDList id_list, SilcChannelID *id);
+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,
+ uint32 *channels_count);
#endif