5 Author: Pekka Riikonen <priikone@poseidon.pspt.fi>
7 Copyright (C) 1997 - 2000 Pekka Riikonen
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; either version 2 of the License, or
12 (at your option) any later version.
14 This program is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public License for more details.
24 /* Forward declarations */
25 typedef struct SilcServerListStruct SilcServerList;
26 typedef struct SilcClientListStruct SilcClientList;
27 typedef struct SilcChannelListStruct SilcChannelList;
30 SILC Server list object.
32 This list holds information about servers in SILC network. However,
33 contents of this list is highly dependent of what kind of server we are
34 (normal server or router server) and whether the list is used as a local
35 list or a global list. These factors dictates the contents of this list.
37 This list is defined as follows:
39 Server type List type Contents
40 =======================================================================
41 server local list Server itself
42 server global list NULL
43 router local list All servers is the cell
44 router global list All servers in the SILC network
46 Following short description of the fields:
50 Logical name of the server. There is no limit of the length of the
51 server name. This is usually the same name as defined in DNS.
55 Type of the server. SILC_SERVER or SILC_ROUTER are the possible
60 ID of the server. This includes all the relevant information about
61 the server SILC will ever need. These are also the informations
62 that is broadcasted between servers and routers in the SILC network.
64 struct SilcServerListStruct *router
66 This is a pointer back to the server list. This is the router server
67 where this server is connected to. If this is the router itself and
68 it doesn't have a route this is NULL.
72 SilcCipher receive_key
76 A pointer, usually, to the socket list for fast referencing to
77 the data used in connection with this server. This may be anything
78 but as just said, this is usually pointer to the socket connection
82 struct SilcServerListStruct {
87 /* Pointer to the router */
88 struct SilcServerListStruct *router;
92 SilcCipher receive_key;
94 SilcPublicKey public_key;
96 unsigned char *hmac_key;
97 unsigned int hmac_key_len;
102 struct SilcServerListStruct *next;
103 struct SilcServerListStruct *prev;
107 SILC Client list object.
109 This list holds information about connected clients ie. users in the SILC
110 network. The contents of this list is depended on whether we are normal
111 server or router server and whether the list is a local or global list.
113 This list is defined as follows:
115 Server type List type Contents
116 =======================================================================
117 server local list All clients in server
118 server global list NULL
119 router local list All clients in cell
120 router global list All clients in SILC
122 Following short description of the fields:
126 Client's (meaning user's) real name. This is defined in following
129 Server type List type Contents
130 ====================================================
131 server local list User's name
132 router local list NULL
133 router global list NULL
135 Router doesn't hold this information since it is not vital data
136 for the router. If this information is needed by the client it is
137 fetched when it is needed.
141 Information about user. This is free information and can be virtually
142 anything. This is defined in following manner:
144 Server type List type Contents
145 ====================================================
146 server local list User's information
147 router local list NULL
148 router global list NULL
150 Router doesn't hold this information since it is not vital data
151 for the router. If this information is needed by the client it is
152 fetched when it is needed.
156 ID of the client. This includes all the information SILC will ever
157 need. Notice that no nickname of the user is saved anywhere. This is
158 beacuse of SilcClientID includes 88 bit hash value of the user's
159 nickname which can be used to track down specific user by their
160 nickname. Nickname is not relevant information that would need to be
165 Client's mode. Client maybe for example server operator or
166 router operator (SILC operator).
168 SilcServerList *router
170 This is a pointer to the server list. This is the router server whose
171 cell this client is coming from. This is used to route messages to
174 SilcCipher session_key
176 The actual session key established by key exchange protcol between
177 connecting parties. This is used for both encryption and decryption.
181 PKCS of the client. This maybe NULL.
184 unsigned char *hmac_key
185 unsigned int hmac_key_len
187 MAC key used to compute MAC's for packets.
191 A pointer, usually, to the socket list for fast referencing to
192 the data used in connection with this client. This may be anything
193 but as just said, this is usually pointer to the socket connection
197 struct SilcClientListStruct {
204 /* Pointer to the router */
205 SilcServerList *router;
207 /* Pointers to channels this client has joined */
208 SilcChannelList **channel;
209 unsigned int channel_count;
213 SilcCipher receive_key;
216 unsigned char *hmac_key;
217 unsigned int hmac_key_len;
219 /* Connection data */
222 struct SilcClientListStruct *next;
223 struct SilcClientListStruct *prev;
227 SILC Channel Client list structure.
229 This list used only by the SilcChannelList object and it holds information
230 about current clients (ie. users) on channel. Following short description
233 SilcClientList client
235 Pointer to the client list. This is the client currently on channel.
239 Client's current mode on the channel.
242 typedef struct SilcChannelClientListStruct {
243 SilcClientList *client;
245 } SilcChannelClientList;
248 SILC Channel list object.
250 This list holds information about channels in SILC network. The contents
251 of this list is depended on whether we are normal server or router server
252 and whether the list is a local or global list.
254 This list is defined as follows:
256 Server type List type Contents
257 =======================================================================
258 server local list All channels in server
259 server global list NULL
260 router local list All channels in cell
261 router global list All channels in SILC
263 Following short description of the fields:
267 Logical name of the channel.
271 Current mode of the channel.
275 ID of the channel. This includes all the information SILC will ever
280 Boolean value to tell whether there are users outside this server
281 on this channel. This is set to TRUE if router sends message to
282 the server that there are users outside your server on your
283 channel as well. This way server knows that messages needs to be
284 sent to the router for further routing. If this is a normal
285 server and this channel is not created on this server this field
286 is always TRUE. If this server is a router this field is ignored.
290 Current topic of the channel.
292 SilcServerList *router
294 This is a pointer to the server list. This is the router server
295 whose cell this channel belongs to. This is used to route messages
301 SilcCipher receive_key
304 struct SilcChannelListStruct {
311 /* List of users on channel */
312 SilcChannelClientList *user_list;
313 unsigned int user_list_count;
315 /* Pointer to the router */
316 SilcServerList *router;
319 SilcCipher channel_key;
321 unsigned int key_len;
322 unsigned char iv[SILC_CIPHER_MAX_IV_SIZE];
324 struct SilcChannelListStruct *next;
325 struct SilcChannelListStruct *prev;
331 As for remainder these lists are defined as follows:
333 List Server type List type Contents
334 =======================================================================
335 servers server local list Server itself
336 servers server global list NULL
337 servers router local list All servers in cell
338 servers router global list All servers in SILC
340 clients server local list All clients in server
341 clients server global list NULL
342 clients router local list All clients in cell
343 clients router global list All clients in SILC
345 channels server local list All channels in server
346 channels server global list NULL
347 channels router local list All channels in cell
348 channels router global list All channels in SILC
350 As seen on the list normal server never defines a global list. This is
351 because of normal server don't know anything about anything global data,
352 they get it from the router if and when they need it. Routers, on the
353 other hand, always define local and global lists because routers really
354 know all the relevant data in the SILC network.
357 typedef struct SilcIDListStruct {
358 SilcServerList *servers;
359 SilcClientList *clients;
360 SilcChannelList *channels;
362 /* ID Caches. Caches are used to perform fast search on the ID's. */
363 SilcIDCache *server_cache[96];
364 unsigned int server_cache_count[96];
365 SilcIDCache *client_cache[96];
366 unsigned int client_cache_count[96];
367 SilcIDCache *channel_cache[96];
368 unsigned int channel_cache_count[96];
371 typedef SilcIDListObject *SilcIDList;
374 Temporary ID List object.
376 This is used during authentication phases where we still don't
377 know what kind of connection remote connection is, hence, we
378 will use this structure instead until we know what type of
379 connection remote end is.
381 This is not in any list. This is always individually allocated
387 SilcCipher receive_key;
389 SilcPublicKey public_key;
392 unsigned char *hmac_key;
393 unsigned int hmac_key_len;
399 void silc_idlist_add_server(SilcServerList **list,
400 char *server_name, int server_type,
401 SilcServerID *id, SilcServerList *router,
402 SilcCipher send_key, SilcCipher receive_key,
403 SilcPKCS public_key, SilcHmac hmac,
404 SilcServerList **new_idlist);
405 void silc_idlist_add_client(SilcClientList **list, char *nickname,
406 char *username, char *userinfo,
407 SilcClientID *id, SilcServerList *router,
408 SilcCipher send_key, SilcCipher receive_key,
409 SilcPKCS public_key, SilcHmac hmac,
410 SilcClientList **new_idlist);
411 void silc_idlist_del_client(SilcClientList **list, SilcClientList *entry);
413 silc_idlist_find_client_by_nickname(SilcClientList *list,
417 silc_idlist_find_client_by_hash(SilcClientList *list,
418 char *nickname, SilcHash hash);
420 silc_idlist_find_client_by_id(SilcClientList *list, SilcClientID *id);
421 void silc_idlist_add_channel(SilcChannelList **list,
422 char *channel_name, int mode,
423 SilcChannelID *id, SilcServerList *router,
424 SilcCipher channel_key,
425 SilcChannelList **new_idlist);
427 silc_idlist_find_channel_by_id(SilcChannelList *list, SilcChannelID *id);
428 void silc_idlist_del_channel(SilcChannelList **list, SilcChannelList *entry);