ed05c9c95a85ff438088ec7d3f3028d77ce19713
[silc.git] / apps / silcd / server.c
1 /*
2
3   server.c
4
5   Author: Pekka Riikonen <priikone@poseidon.pspt.fi>
6
7   Copyright (C) 1997 - 2000 Pekka Riikonen
8
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.
13   
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.
18
19 */
20 /*
21  * This is the actual SILC server than handles everything relating to
22  * servicing the SILC connections. This is also a SILC router as a router 
23  * is also normal server.
24  */
25 /* $Id$ */
26
27 #include "serverincludes.h"
28 #include "server_internal.h"
29
30 /* Static prototypes */
31 SILC_TASK_CALLBACK(silc_server_connect_router);
32 SILC_TASK_CALLBACK(silc_server_connect_to_router);
33 SILC_TASK_CALLBACK(silc_server_connect_to_router_second);
34 SILC_TASK_CALLBACK(silc_server_connect_to_router_final);
35 SILC_TASK_CALLBACK(silc_server_accept_new_connection);
36 SILC_TASK_CALLBACK(silc_server_accept_new_connection_second);
37 SILC_TASK_CALLBACK(silc_server_accept_new_connection_final);
38 SILC_TASK_CALLBACK(silc_server_packet_process);
39 SILC_TASK_CALLBACK(silc_server_packet_parse_real);
40 SILC_TASK_CALLBACK(silc_server_timeout_remote);
41
42 /* Allocates a new SILC server object. This has to be done before the server
43    can be used. After allocation one must call silc_server_init to initialize
44    the server. The new allocated server object is returned to the new_server
45    argument. */
46
47 int silc_server_alloc(SilcServer *new_server)
48 {
49   SilcServer server;
50
51   SILC_LOG_DEBUG(("Allocating new server object"));
52
53   server = silc_calloc(1, sizeof(*server));
54   server->server_type = SILC_SERVER;
55   server->standalone = TRUE;
56   server->local_list = silc_calloc(1, sizeof(*server->local_list));
57   server->global_list = silc_calloc(1, sizeof(*server->global_list));
58   server->pending_commands = silc_dlist_init();
59 #ifdef SILC_SIM
60   server->sim = silc_dlist_init();
61 #endif
62
63   *new_server = server;
64
65   return TRUE;
66 }
67
68 /* Free's the SILC server object. This is called at the very end before
69    the program ends. */
70
71 void silc_server_free(SilcServer server)
72 {
73   if (server) {
74 #ifdef SILC_SIM
75     SilcSimContext *sim;
76 #endif
77
78     if (server->local_list)
79       silc_free(server->local_list);
80     if (server->global_list)
81       silc_free(server->global_list);
82     if (server->rng)
83       silc_rng_free(server->rng);
84
85 #ifdef SILC_SIM
86     while ((sim = silc_dlist_get(server->sim)) != SILC_LIST_END) {
87       silc_dlist_del(server->sim, sim);
88       silc_sim_free(sim);
89     }
90     silc_dlist_uninit(server->sim);
91 #endif
92
93     if (server->params)
94       silc_free(server->params);
95
96     if (server->pending_commands)
97       silc_dlist_uninit(server->pending_commands);
98
99     silc_math_primegen_uninit(); /* XXX */
100     silc_free(server);
101   }
102 }
103
104 /* Initializes the entire SILC server. This is called always before running
105    the server. This is called only once at the initialization of the program.
106    This binds the server to its listenning port. After this function returns 
107    one should call silc_server_run to start the server. This returns TRUE 
108    when everything is ok to run the server. Configuration file must be
109    read and parsed before calling this. */
110
111 int silc_server_init(SilcServer server)
112 {
113   int *sock = NULL, sock_count = 0, i;
114   SilcServerID *id;
115   SilcServerEntry id_entry;
116
117   SILC_LOG_DEBUG(("Initializing server"));
118   assert(server);
119   assert(server->config);
120
121   /* XXX After server is made as Silc Server Library this can be given
122      as argument, for now this is hard coded */
123   server->params = silc_calloc(1, sizeof(*server->params));
124   server->params->retry_count = SILC_SERVER_RETRY_COUNT;
125   server->params->retry_interval_min = SILC_SERVER_RETRY_INTERVAL_MIN;
126   server->params->retry_interval_max = SILC_SERVER_RETRY_INTERVAL_MAX;
127   server->params->retry_keep_trying = FALSE;
128   server->params->protocol_timeout = 60;
129   server->params->require_reverse_mapping = FALSE;
130
131   /* Set log files where log message should be saved. */
132   server->config->server = server;
133   silc_config_server_setlogfiles(server->config);
134  
135   /* Register all configured ciphers, PKCS and hash functions. */
136   silc_config_server_register_ciphers(server->config);
137   silc_config_server_register_pkcs(server->config);
138   silc_config_server_register_hashfuncs(server->config);
139
140   /* Initialize random number generator for the server. */
141   server->rng = silc_rng_alloc();
142   silc_rng_init(server->rng);
143   silc_math_primegen_init(); /* XXX */
144
145   /* Initialize hash functions for server to use */
146   silc_hash_alloc("md5", &server->md5hash);
147   silc_hash_alloc("sha1", &server->sha1hash);
148
149   /* Initialize none cipher */
150   silc_cipher_alloc("none", &server->none_cipher);
151
152   /* XXXXX Generate RSA key pair */
153   {
154     unsigned char *public_key;
155     unsigned char *private_key;
156     unsigned int pk_len, prv_len;
157     struct stat st;
158
159     if (stat("pubkey.pub", &st) < 0 && stat("privkey.prv", &st) < 0) {
160
161       if (silc_pkcs_alloc("rsa", &server->pkcs) == FALSE) {
162         SILC_LOG_ERROR(("Could not create RSA key pair"));
163         goto err0;
164       }
165       
166       if (server->pkcs->pkcs->init(server->pkcs->context, 
167                                    1024, server->rng) == FALSE) {
168         SILC_LOG_ERROR(("Could not generate RSA key pair"));
169         goto err0;
170       }
171       
172       public_key = server->pkcs->pkcs->get_public_key(server->pkcs->context,
173                                                       &pk_len);
174       private_key = server->pkcs->pkcs->get_private_key(server->pkcs->context,
175                                                         &prv_len);
176       
177       SILC_LOG_HEXDUMP(("public key"), public_key, pk_len);
178       SILC_LOG_HEXDUMP(("private key"), private_key, prv_len);
179       
180       server->public_key = 
181         silc_pkcs_public_key_alloc("rsa", "UN=root, HN=dummy",
182                                    public_key, pk_len);
183       server->private_key = 
184         silc_pkcs_private_key_alloc("rsa", private_key, prv_len);
185       
186       /* XXX Save keys */
187       silc_pkcs_save_public_key("pubkey.pub", server->public_key,
188                                 SILC_PKCS_FILE_PEM);
189       silc_pkcs_save_private_key("privkey.prv", server->private_key, NULL,
190                                  SILC_PKCS_FILE_BIN);
191
192       memset(public_key, 0, pk_len);
193       memset(private_key, 0, prv_len);
194       silc_free(public_key);
195       silc_free(private_key);
196     } else {
197       silc_pkcs_load_public_key("pubkey.pub", &server->public_key,
198                                 SILC_PKCS_FILE_PEM);
199       silc_pkcs_load_private_key("privkey.prv", &server->private_key,
200                                  SILC_PKCS_FILE_BIN);
201     }
202   }
203
204   /* Create a listening server. Note that our server can listen on
205      multiple ports. All listeners are created here and now. */
206   /* XXX Still check this whether to use server_info or listen_port. */
207   sock_count = 0;
208   while(server->config->listen_port) {
209     int tmp;
210
211     tmp = silc_net_create_server(server->config->listen_port->port,
212                                  server->config->listen_port->host);
213     if (tmp < 0)
214       goto err0;
215
216     sock = silc_realloc(sock, (sizeof(int *) * (sock_count + 1)));
217     sock[sock_count] = tmp;
218     server->config->listen_port = server->config->listen_port->next;
219     sock_count++;
220   }
221
222   /* Initialize ID caches */
223   server->local_list->clients = silc_idcache_alloc(0);
224   server->local_list->servers = silc_idcache_alloc(0);
225   server->local_list->channels = silc_idcache_alloc(0);
226
227   /* These are allocated for normal server as well as these hold some 
228      global information that the server has fetched from its router. For 
229      router these are used as they are supposed to be used on router. */
230   server->global_list->clients = silc_idcache_alloc(0);
231   server->global_list->servers = silc_idcache_alloc(0);
232   server->global_list->channels = silc_idcache_alloc(0);
233
234   /* Allocate the entire socket list that is used in server. Eventually 
235      all connections will have entry in this table (it is a table of 
236      pointers to the actual object that is allocated individually 
237      later). */
238   server->sockets = silc_calloc(SILC_SERVER_MAX_CONNECTIONS,
239                                 sizeof(*server->sockets));
240
241   for (i = 0; i < sock_count; i++) {
242     SilcSocketConnection newsocket = NULL;
243
244     /* Set socket to non-blocking mode */
245     silc_net_set_socket_nonblock(sock[i]);
246     server->sock = sock[i];
247     
248     /* Create a Server ID for the server. */
249     silc_id_create_server_id(sock[i], server->rng, &id);
250     if (!id) {
251       goto err0;
252     }
253     
254     server->id = id;
255     server->id_string = silc_id_id2str(id, SILC_ID_SERVER);
256     server->id_string_len = silc_id_get_len(SILC_ID_SERVER);
257     server->id_type = SILC_ID_SERVER;
258     server->server_name = server->config->server_info->server_name;
259
260     /* Add ourselves to the server list. We don't have a router yet 
261        beacuse we haven't established a route yet. It will be done later. 
262        For now, NULL is sent as router. This allocates new entry to
263        the ID list. */
264     id_entry = 
265       silc_idlist_add_server(server->local_list,
266                              server->config->server_info->server_name,
267                              server->server_type, server->id, NULL, NULL);
268     if (!id_entry) {
269       SILC_LOG_ERROR(("Could not add ourselves to cache"));
270       goto err0;
271     }
272     
273     /* Add ourselves also to the socket table. The entry allocated above
274        is sent as argument for fast referencing in the future. */
275     silc_socket_alloc(sock[i], SILC_SOCKET_TYPE_SERVER, id_entry, 
276                       &newsocket);
277     if (!newsocket)
278       goto err0;
279
280     server->sockets[sock[i]] = newsocket;
281
282     /* Put the allocated socket pointer also to the entry allocated above 
283        for fast back-referencing to the socket list. */
284     id_entry->connection = (void *)server->sockets[sock[i]];
285     server->id_entry = id_entry;
286   }
287
288   /* Register the task queues. In SILC we have by default three task queues. 
289      One task queue for non-timeout tasks which perform different kind of 
290      I/O on file descriptors, timeout task queue for timeout tasks, and,
291      generic non-timeout task queue whose tasks apply to all connections. */
292   silc_task_queue_alloc(&server->io_queue, TRUE);
293   if (!server->io_queue) {
294     goto err0;
295   }
296   silc_task_queue_alloc(&server->timeout_queue, TRUE);
297   if (!server->timeout_queue) {
298     goto err1;
299   }
300   silc_task_queue_alloc(&server->generic_queue, TRUE);
301   if (!server->generic_queue) {
302     goto err1;
303   }
304
305   /* Register protocols */
306   silc_server_protocols_register();
307
308   /* Initialize the scheduler */
309   silc_schedule_init(&server->io_queue, &server->timeout_queue, 
310                      &server->generic_queue, 
311                      SILC_SERVER_MAX_CONNECTIONS);
312   
313   /* Add the first task to the queue. This is task that is executed by
314      timeout. It expires as soon as the caller calls silc_server_run. This
315      task performs authentication protocol and key exchange with our
316      primary router. */
317   silc_task_register(server->timeout_queue, sock[0], 
318                      silc_server_connect_to_router,
319                      (void *)server, 0, 1,
320                      SILC_TASK_TIMEOUT,
321                      SILC_TASK_PRI_NORMAL);
322
323   /* Add listener task to the queue. This task receives new connections to the 
324      server. This task remains on the queue until the end of the program. */
325   silc_task_register(server->io_queue, sock[0],
326                      silc_server_accept_new_connection,
327                      (void *)server, 0, 0, 
328                      SILC_TASK_FD,
329                      SILC_TASK_PRI_NORMAL);
330   server->listenning = TRUE;
331
332   /* If server connections has been configured then we must be router as
333      normal server cannot have server connections, only router connections. */
334   if (server->config->servers)
335     server->server_type = SILC_ROUTER;
336
337   SILC_LOG_DEBUG(("Server initialized"));
338
339   /* We are done here, return succesfully */
340   return TRUE;
341
342   silc_task_queue_free(server->timeout_queue);
343  err1:
344   silc_task_queue_free(server->io_queue);
345  err0:
346   for (i = 0; i < sock_count; i++)
347     silc_net_close_server(sock[i]);
348
349   return FALSE;
350 }
351
352 /* Stops the SILC server. This function is used to shutdown the server. 
353    This is usually called after the scheduler has returned. After stopping 
354    the server one should call silc_server_free. */
355
356 void silc_server_stop(SilcServer server)
357 {
358   SILC_LOG_DEBUG(("Stopping server"));
359
360   /* Stop the scheduler, although it might be already stopped. This
361      doesn't hurt anyone. This removes all the tasks and task queues,
362      as well. */
363   silc_schedule_stop();
364   silc_schedule_uninit();
365
366   silc_server_protocols_unregister();
367
368   SILC_LOG_DEBUG(("Server stopped"));
369 }
370
371 /* The heart of the server. This runs the scheduler thus runs the server. 
372    When this returns the server has been stopped and the program will
373    be terminated. */
374
375 void silc_server_run(SilcServer server)
376 {
377   SILC_LOG_DEBUG(("Running server"));
378
379   /* Start the scheduler, the heart of the SILC server. When this returns
380      the program will be terminated. */
381   silc_schedule();
382 }
383
384 /* Timeout callback that will be called to retry connecting to remote
385    router. This is used by both normal and router server. This will wait
386    before retrying the connecting. The timeout is generated by exponential
387    backoff algorithm. */
388
389 SILC_TASK_CALLBACK(silc_server_connect_to_router_retry)
390 {
391   SilcServerConnection sconn = (SilcServerConnection)context;
392   SilcServer server = sconn->server;
393
394   SILC_LOG_INFO(("Retrying connecting to a router"));
395
396   /* Calculate next timeout */
397   if (sconn->retry_count >= 1) {
398     sconn->retry_timeout = sconn->retry_timeout * SILC_SERVER_RETRY_MULTIPLIER;
399     if (sconn->retry_timeout > SILC_SERVER_RETRY_INTERVAL_MAX)
400       sconn->retry_timeout = SILC_SERVER_RETRY_INTERVAL_MAX;
401   } else {
402     sconn->retry_timeout = server->params->retry_interval_min;
403   }
404   sconn->retry_count++;
405   sconn->retry_timeout = sconn->retry_timeout +
406     silc_rng_get_rn32(server->rng) % SILC_SERVER_RETRY_RANDOMIZER;
407
408   /* If we've reached max retry count, give up. */
409   if (sconn->retry_count > server->params->retry_count && 
410       server->params->retry_keep_trying == FALSE) {
411     SILC_LOG_ERROR(("Could not connect to router, giving up"));
412     return;
413   }
414
415   /* Wait one before retrying */
416   silc_task_register(server->timeout_queue, fd, silc_server_connect_router,
417                      context, sconn->retry_timeout, 
418                      server->params->retry_interval_min_usec,
419                      SILC_TASK_TIMEOUT, SILC_TASK_PRI_NORMAL);
420 }
421
422 /* Generic routine to use connect to a router. */
423
424 SILC_TASK_CALLBACK(silc_server_connect_router)
425 {    
426   SilcServerConnection sconn = (SilcServerConnection)context;
427   SilcServer server = sconn->server;
428   SilcSocketConnection newsocket;
429   SilcProtocol protocol;
430   SilcServerKEInternalContext *proto_ctx;
431   int sock;
432
433   /* Connect to remote host */
434   sock = silc_net_create_connection(sconn->remote_port, 
435                                     sconn->remote_host);
436   if (sock < 0) {
437     SILC_LOG_ERROR(("Could not connect to router"));
438     silc_task_register(server->timeout_queue, fd, 
439                        silc_server_connect_to_router_retry,
440                        context, 0, 1, SILC_TASK_TIMEOUT, 
441                        SILC_TASK_PRI_NORMAL);
442     return;
443   }
444
445   /* Set socket options */
446   silc_net_set_socket_nonblock(sock);
447   silc_net_set_socket_opt(sock, SOL_SOCKET, SO_REUSEADDR, 1);
448
449   /* Create socket connection for the connection. Even though we
450      know that we are connecting to a router we will mark the socket
451      to be unknown connection until we have executed authentication
452      protocol. */
453   silc_socket_alloc(sock, SILC_SOCKET_TYPE_UNKNOWN, NULL, &newsocket);
454   server->sockets[sock] = newsocket;
455   newsocket->hostname = sconn->remote_host;
456   newsocket->port = sconn->remote_port;
457   sconn->sock = newsocket;
458
459   /* Allocate internal protocol context. This is sent as context
460      to the protocol. */
461   proto_ctx = silc_calloc(1, sizeof(*proto_ctx));
462   proto_ctx->server = (void *)server;
463   proto_ctx->context = (void *)sconn;
464   proto_ctx->sock = newsocket;
465   proto_ctx->rng = server->rng;
466   proto_ctx->responder = FALSE;
467       
468   /* Perform key exchange protocol. silc_server_connect_to_router_second
469      will be called after the protocol is finished. */
470   silc_protocol_alloc(SILC_PROTOCOL_SERVER_KEY_EXCHANGE, 
471                       &protocol, proto_ctx,
472                       silc_server_connect_to_router_second);
473   newsocket->protocol = protocol;
474       
475   /* Register a timeout task that will be executed if the protocol
476      is not executed within set limit. */
477   proto_ctx->timeout_task = 
478     silc_task_register(server->timeout_queue, sock, 
479                        silc_server_timeout_remote,
480                        server, server->params->protocol_timeout,
481                        server->params->protocol_timeout_usec,
482                        SILC_TASK_TIMEOUT,
483                        SILC_TASK_PRI_LOW);
484
485   /* Register the connection for network input and output. This sets
486      that scheduler will listen for incoming packets for this connection 
487      and sets that outgoing packets may be sent to this connection as 
488      well. However, this doesn't set the scheduler for outgoing traffic,
489      it will be set separately by calling SILC_SET_CONNECTION_FOR_OUTPUT,
490      later when outgoing data is available. */
491   context = (void *)server;
492   SILC_REGISTER_CONNECTION_FOR_IO(sock);
493   
494   /* Run the protocol */
495   protocol->execute(server->timeout_queue, 0, protocol, sock, 0, 0);
496 }
497   
498 /* This function connects to our primary router or if we are a router this
499    establishes all our primary routes. This is called at the start of the
500    server to do authentication and key exchange with our router - called
501    from schedule. */
502
503 SILC_TASK_CALLBACK(silc_server_connect_to_router)
504 {
505   SilcServer server = (SilcServer)context;
506   SilcServerConnection sconn;
507
508   SILC_LOG_DEBUG(("Connecting to router(s)"));
509
510   /* If we are normal SILC server we need to connect to our cell's
511      router. */
512   if (server->server_type == SILC_SERVER) {
513     SILC_LOG_DEBUG(("We are normal server"));
514
515     /* Create connection to the router, if configured. */
516     if (server->config->routers) {
517
518       /* Allocate connection object for hold connection specific stuff. */
519       sconn = silc_calloc(1, sizeof(*sconn));
520       sconn->server = server;
521       sconn->remote_host = server->config->routers->host;
522       sconn->remote_port = server->config->routers->port;
523
524       silc_task_register(server->timeout_queue, fd, 
525                          silc_server_connect_router,
526                          (void *)sconn, 0, 1, SILC_TASK_TIMEOUT, 
527                          SILC_TASK_PRI_NORMAL);
528       return;
529     }
530   }
531
532   /* If we are a SILC router we need to establish all of our primary
533      routes. */
534   if (server->server_type == SILC_ROUTER) {
535     SilcConfigServerSectionServerConnection *ptr;
536
537     SILC_LOG_DEBUG(("We are router"));
538
539     /* Create the connections to all our routes */
540     ptr = server->config->routers;
541     while (ptr) {
542
543       SILC_LOG_DEBUG(("Router connection [%s] %s:%d",
544                       ptr->initiator ? "Initiator" : "Responder",
545                       ptr->host, ptr->port));
546
547       if (ptr->initiator) {
548         /* Allocate connection object for hold connection specific stuff. */
549         sconn = silc_calloc(1, sizeof(*sconn));
550         sconn->server = server;
551         sconn->remote_host = ptr->host;
552         sconn->remote_port = ptr->port;
553
554         silc_task_register(server->timeout_queue, fd, 
555                            silc_server_connect_router,
556                            (void *)sconn, 0, 1, SILC_TASK_TIMEOUT, 
557                            SILC_TASK_PRI_NORMAL);
558       }
559
560       if (!ptr->next)
561         return;
562
563       ptr = ptr->next;
564     }
565   }
566
567   SILC_LOG_DEBUG(("No router(s), server will be standalone"));
568   
569   /* There wasn't a configured router, we will continue but we don't
570      have a connection to outside world.  We will be standalone server. */
571   server->standalone = TRUE;
572 }
573
574 /* Second part of connecting to router(s). Key exchange protocol has been
575    executed and now we will execute authentication protocol. */
576
577 SILC_TASK_CALLBACK(silc_server_connect_to_router_second)
578 {
579   SilcProtocol protocol = (SilcProtocol)context;
580   SilcServerKEInternalContext *ctx = 
581     (SilcServerKEInternalContext *)protocol->context;
582   SilcServer server = (SilcServer)ctx->server;
583   SilcServerConnection sconn = (SilcServerConnection)ctx->context;
584   SilcSocketConnection sock = NULL;
585   SilcServerConnAuthInternalContext *proto_ctx;
586
587   SILC_LOG_DEBUG(("Start"));
588
589   if (protocol->state == SILC_PROTOCOL_STATE_ERROR) {
590     /* Error occured during protocol */
591     silc_protocol_free(protocol);
592     if (ctx->packet)
593       silc_packet_context_free(ctx->packet);
594     if (ctx->ske)
595       silc_ske_free(ctx->ske);
596     if (ctx->dest_id)
597       silc_free(ctx->dest_id);
598     silc_free(ctx);
599     sock->protocol = NULL;
600     silc_server_disconnect_remote(server, sock, "Server closed connection: "
601                                   "Key exchange failed");
602     return;
603   }
604   
605   /* Allocate internal context for the authentication protocol. This
606      is sent as context for the protocol. */
607   proto_ctx = silc_calloc(1, sizeof(*proto_ctx));
608   proto_ctx->server = (void *)server;
609   proto_ctx->context = (void *)sconn;
610   proto_ctx->sock = sock = server->sockets[fd];
611   proto_ctx->ske = ctx->ske;       /* Save SKE object from previous protocol */
612   proto_ctx->dest_id_type = ctx->dest_id_type;
613   proto_ctx->dest_id = ctx->dest_id;
614
615   /* Resolve the authentication method used in this connection */
616   proto_ctx->auth_meth = SILC_PROTOCOL_CONN_AUTH_PASSWORD;
617   if (server->config->routers) {
618     SilcConfigServerSectionServerConnection *conn = NULL;
619
620     /* Check if we find a match from user configured connections */
621     conn = silc_config_server_find_router_conn(server->config,
622                                                sock->hostname,
623                                                sock->port);
624     if (conn) {
625       /* Match found. Use the configured authentication method */
626       proto_ctx->auth_meth = conn->auth_meth;
627       if (conn->auth_data) {
628         proto_ctx->auth_data = strdup(conn->auth_data);
629         proto_ctx->auth_data_len = strlen(conn->auth_data);
630       }
631     } else {
632       /* No match found. */
633       /* XXX */
634     }
635   } else {
636     /* XXX */
637   }
638
639   /* Free old protocol as it is finished now */
640   silc_protocol_free(protocol);
641   if (ctx->packet)
642     silc_packet_context_free(ctx->packet);
643   silc_free(ctx);
644   sock->protocol = NULL;
645
646   /* Allocate the authentication protocol. This is allocated here
647      but we won't start it yet. We will be receiving party of this
648      protocol thus we will wait that connecting party will make
649      their first move. */
650   silc_protocol_alloc(SILC_PROTOCOL_SERVER_CONNECTION_AUTH, 
651                       &sock->protocol, proto_ctx, 
652                       silc_server_connect_to_router_final);
653
654   /* Register timeout task. If the protocol is not executed inside
655      this timelimit the connection will be terminated. Currently
656      this is 15 seconds and is hard coded limit (XXX). */
657   proto_ctx->timeout_task = 
658     silc_task_register(server->timeout_queue, sock->sock, 
659                        silc_server_timeout_remote,
660                        (void *)server, 15, 0,
661                        SILC_TASK_TIMEOUT,
662                        SILC_TASK_PRI_LOW);
663
664   /* Run the protocol */
665   sock->protocol->execute(server->timeout_queue, 0, 
666                           sock->protocol, sock->sock, 0, 0);
667 }
668
669 /* Finalizes the connection to router. Registers a server task to the
670    queue so that we can accept new connections. */
671
672 SILC_TASK_CALLBACK(silc_server_connect_to_router_final)
673 {
674   SilcProtocol protocol = (SilcProtocol)context;
675   SilcServerConnAuthInternalContext *ctx = 
676     (SilcServerConnAuthInternalContext *)protocol->context;
677   SilcServer server = (SilcServer)ctx->server;
678   SilcServerConnection sconn = (SilcServerConnection)ctx->context;
679   SilcSocketConnection sock = ctx->sock;
680   SilcServerEntry id_entry;
681   SilcBuffer packet;
682   unsigned char *id_string;
683
684   SILC_LOG_DEBUG(("Start"));
685
686   if (protocol->state == SILC_PROTOCOL_STATE_ERROR) {
687     /* Error occured during protocol */
688     if (ctx->dest_id)
689       silc_free(ctx->dest_id);
690     silc_server_disconnect_remote(server, sock, "Server closed connection: "
691                                   "Authentication failed");
692     goto out;
693   }
694
695   /* Add a task to the queue. This task receives new connections to the 
696      server. This task remains on the queue until the end of the program. */
697   if (!server->listenning) {
698     silc_task_register(server->io_queue, server->sock, 
699                        silc_server_accept_new_connection,
700                        (void *)server, 0, 0, 
701                        SILC_TASK_FD,
702                        SILC_TASK_PRI_NORMAL);
703     server->listenning = TRUE;
704   }
705
706   /* Send NEW_SERVER packet to the router. We will become registered
707      to the SILC network after sending this packet. */
708   id_string = silc_id_id2str(server->id, SILC_ID_SERVER);
709   packet = silc_buffer_alloc(2 + 2 + SILC_ID_SERVER_LEN + 
710                              strlen(server->server_name));
711   silc_buffer_pull_tail(packet, SILC_BUFFER_END(packet));
712   silc_buffer_format(packet,
713                      SILC_STR_UI_SHORT(SILC_ID_SERVER_LEN),
714                      SILC_STR_UI_XNSTRING(id_string, SILC_ID_SERVER_LEN),
715                      SILC_STR_UI_SHORT(strlen(server->server_name)),
716                      SILC_STR_UI_XNSTRING(server->server_name,
717                                           strlen(server->server_name)),
718                      SILC_STR_END);
719
720   /* Send the packet */
721   silc_server_packet_send(server, ctx->sock, SILC_PACKET_NEW_SERVER, 0,
722                           packet->data, packet->len, TRUE);
723   silc_buffer_free(packet);
724   silc_free(id_string);
725
726   SILC_LOG_DEBUG(("Connected to router %s", sock->hostname));
727
728   /* Add the connected router to local server list */
729   server->standalone = FALSE;
730   id_entry = silc_idlist_add_server(server->local_list, sock->hostname,
731                                     SILC_ROUTER, ctx->dest_id, NULL, sock);
732   if (!id_entry) {
733     if (ctx->dest_id)
734       silc_free(ctx->dest_id);
735     silc_server_disconnect_remote(server, sock, "Server closed connection: "
736                                   "Authentication failed");
737     goto out;
738   }
739
740   silc_idlist_add_data(id_entry, (SilcIDListData)sock->user_data);
741   silc_free(sock->user_data);
742   sock->user_data = (void *)id_entry;
743   sock->type = SILC_SOCKET_TYPE_ROUTER;
744   server->id_entry->router = id_entry;
745   server->router = id_entry;
746   server->router->data.registered = TRUE;
747
748  out:
749   /* Free the temporary connection data context */
750   if (sconn)
751     silc_free(sconn);
752
753   /* Free the protocol object */
754   silc_protocol_free(protocol);
755   if (ctx->packet)
756     silc_packet_context_free(ctx->packet);
757   if (ctx->ske)
758     silc_ske_free(ctx->ske);
759   silc_free(ctx);
760   sock->protocol = NULL;
761 }
762
763 /* Accepts new connections to the server. Accepting new connections are
764    done in three parts to make it async. */
765
766 SILC_TASK_CALLBACK(silc_server_accept_new_connection)
767 {
768   SilcServer server = (SilcServer)context;
769   SilcSocketConnection newsocket;
770   SilcServerKEInternalContext *proto_ctx;
771   int sock;
772
773   SILC_LOG_DEBUG(("Accepting new connection"));
774
775   sock = silc_net_accept_connection(server->sock);
776   if (sock < 0) {
777     SILC_LOG_ERROR(("Could not accept new connection: %s", strerror(errno)));
778     return;
779   }
780
781   /* Check max connections */
782   if (sock > SILC_SERVER_MAX_CONNECTIONS) {
783     if (server->config->redirect) {
784       /* XXX Redirecting connection to somewhere else now?? */
785       /*silc_server_send_notify("Server is full, trying to redirect..."); */
786     } else {
787       SILC_LOG_ERROR(("Refusing connection, server is full"));
788     }
789     return;
790   }
791
792   /* Set socket options */
793   silc_net_set_socket_nonblock(sock);
794   silc_net_set_socket_opt(sock, SOL_SOCKET, SO_REUSEADDR, 1);
795
796   /* We don't create a ID yet, since we don't know what type of connection
797      this is yet. But, we do add the connection to the socket table. */
798   silc_socket_alloc(sock, SILC_SOCKET_TYPE_UNKNOWN, NULL, &newsocket);
799   server->sockets[sock] = newsocket;
800
801   /* XXX This MUST be done async as this will block the entire server
802      process. Either we have to do our own resolver stuff or in the future
803      we can use threads. */
804   /* Perform name and address lookups for the remote host. */
805   silc_net_check_host_by_sock(sock, &newsocket->hostname, &newsocket->ip);
806   if ((server->params->require_reverse_mapping && !newsocket->hostname) ||
807       !newsocket->ip) {
808     SILC_LOG_ERROR(("IP/DNS lookup failed"));
809     return;
810   }
811   if (!newsocket->hostname)
812     newsocket->hostname = strdup(newsocket->ip);
813
814   SILC_LOG_INFO(("Incoming connection from %s (%s)", newsocket->hostname,
815                  newsocket->ip));
816
817   /* Allocate internal context for key exchange protocol. This is
818      sent as context for the protocol. */
819   proto_ctx = silc_calloc(1, sizeof(*proto_ctx));
820   proto_ctx->server = context;
821   proto_ctx->sock = newsocket;
822   proto_ctx->rng = server->rng;
823   proto_ctx->responder = TRUE;
824
825   /* Prepare the connection for key exchange protocol. We allocate the
826      protocol but will not start it yet. The connector will be the
827      initiator of the protocol thus we will wait for initiation from 
828      there before we start the protocol. */
829   silc_protocol_alloc(SILC_PROTOCOL_SERVER_KEY_EXCHANGE, 
830                       &newsocket->protocol, proto_ctx, 
831                       silc_server_accept_new_connection_second);
832
833   /* Register a timeout task that will be executed if the connector
834      will not start the key exchange protocol within 60 seconds. For
835      now, this is a hard coded limit. After 60 secs the connection will
836      be closed if the key exchange protocol has not been started. */
837   proto_ctx->timeout_task = 
838     silc_task_register(server->timeout_queue, newsocket->sock, 
839                        silc_server_timeout_remote,
840                        context, 60, 0,
841                        SILC_TASK_TIMEOUT,
842                        SILC_TASK_PRI_LOW);
843
844   /* Register the connection for network input and output. This sets
845      that scheduler will listen for incoming packets for this connection 
846      and sets that outgoing packets may be sent to this connection as well.
847      However, this doesn't set the scheduler for outgoing traffic, it
848      will be set separately by calling SILC_SET_CONNECTION_FOR_OUTPUT,
849      later when outgoing data is available. */
850   SILC_REGISTER_CONNECTION_FOR_IO(sock);
851 }
852
853 /* Second part of accepting new connection. Key exchange protocol has been
854    performed and now it is time to do little connection authentication
855    protocol to figure out whether this connection is client or server
856    and whether it has right to access this server (especially server
857    connections needs to be authenticated). */
858
859 SILC_TASK_CALLBACK(silc_server_accept_new_connection_second)
860 {
861   SilcProtocol protocol = (SilcProtocol)context;
862   SilcServerKEInternalContext *ctx = 
863     (SilcServerKEInternalContext *)protocol->context;
864   SilcServer server = (SilcServer)ctx->server;
865   SilcSocketConnection sock = NULL;
866   SilcServerConnAuthInternalContext *proto_ctx;
867
868   SILC_LOG_DEBUG(("Start"));
869
870   if (protocol->state == SILC_PROTOCOL_STATE_ERROR) {
871     /* Error occured during protocol */
872     silc_protocol_free(protocol);
873     if (ctx->packet)
874       silc_packet_context_free(ctx->packet);
875     if (ctx->ske)
876       silc_ske_free(ctx->ske);
877     if (ctx->dest_id)
878       silc_free(ctx->dest_id);
879     silc_free(ctx);
880     if (sock)
881       sock->protocol = NULL;
882     silc_server_disconnect_remote(server, sock, "Server closed connection: "
883                                   "Key exchange failed");
884     return;
885   }
886
887   /* Allocate internal context for the authentication protocol. This
888      is sent as context for the protocol. */
889   proto_ctx = silc_calloc(1, sizeof(*proto_ctx));
890   proto_ctx->server = (void *)server;
891   proto_ctx->sock = sock = server->sockets[fd];
892   proto_ctx->ske = ctx->ske;    /* Save SKE object from previous protocol */
893   proto_ctx->responder = TRUE;
894   proto_ctx->dest_id_type = ctx->dest_id_type;
895   proto_ctx->dest_id = ctx->dest_id;
896
897   /* Free old protocol as it is finished now */
898   silc_protocol_free(protocol);
899   if (ctx->packet)
900     silc_packet_context_free(ctx->packet);
901   silc_free(ctx);
902   sock->protocol = NULL;
903
904   /* Allocate the authentication protocol. This is allocated here
905      but we won't start it yet. We will be receiving party of this
906      protocol thus we will wait that connecting party will make
907      their first move. */
908   silc_protocol_alloc(SILC_PROTOCOL_SERVER_CONNECTION_AUTH, 
909                       &sock->protocol, proto_ctx, 
910                       silc_server_accept_new_connection_final);
911
912   /* Register timeout task. If the protocol is not executed inside
913      this timelimit the connection will be terminated. Currently
914      this is 60 seconds and is hard coded limit (XXX). */
915   proto_ctx->timeout_task = 
916     silc_task_register(server->timeout_queue, sock->sock, 
917                        silc_server_timeout_remote,
918                        (void *)server, 60, 0,
919                        SILC_TASK_TIMEOUT,
920                        SILC_TASK_PRI_LOW);
921 }
922
923 /* Final part of accepting new connection. The connection has now
924    been authenticated and keys has been exchanged. We also know whether
925    this is client or server connection. */
926
927 SILC_TASK_CALLBACK(silc_server_accept_new_connection_final)
928 {
929   SilcProtocol protocol = (SilcProtocol)context;
930   SilcServerConnAuthInternalContext *ctx = 
931     (SilcServerConnAuthInternalContext *)protocol->context;
932   SilcServer server = (SilcServer)ctx->server;
933   SilcSocketConnection sock = ctx->sock;
934   void *id_entry = NULL;
935
936   SILC_LOG_DEBUG(("Start"));
937
938   if (protocol->state == SILC_PROTOCOL_STATE_ERROR) {
939     /* Error occured during protocol */
940     silc_protocol_free(protocol);
941     if (ctx->packet)
942       silc_packet_context_free(ctx->packet);
943     if (ctx->ske)
944       silc_ske_free(ctx->ske);
945     if (ctx->dest_id)
946       silc_free(ctx->dest_id);
947     silc_free(ctx);
948     if (sock)
949       sock->protocol = NULL;
950     silc_server_disconnect_remote(server, sock, "Server closed connection: "
951                                   "Authentication failed");
952     return;
953   }
954
955   sock->type = ctx->conn_type;
956   switch(sock->type) {
957   case SILC_SOCKET_TYPE_CLIENT:
958     {
959       SilcClientEntry client;
960
961       SILC_LOG_DEBUG(("Remote host is client"));
962       SILC_LOG_INFO(("Connection from %s (%s) is client", sock->hostname,
963                      sock->ip));
964
965       /* Add the client to the client ID cache. The nickname and Client ID
966          and other information is created after we have received NEW_CLIENT
967          packet from client. */
968       client = silc_idlist_add_client(server->local_list, 
969                                       NULL, NULL, NULL, NULL, NULL, sock);
970       if (!client) {
971         SILC_LOG_ERROR(("Could not add new client to cache"));
972         silc_free(sock->user_data);
973         break;
974       }
975
976       id_entry = (void *)client;
977       break;
978     }
979   case SILC_SOCKET_TYPE_SERVER:
980   case SILC_SOCKET_TYPE_ROUTER:
981     {
982       SilcServerEntry new_server;
983
984       SILC_LOG_DEBUG(("Remote host is %s", 
985                       sock->type == SILC_SOCKET_TYPE_SERVER ? 
986                       "server" : "router"));
987       SILC_LOG_INFO(("Connection from %s (%s) is %s", sock->hostname,
988                      sock->ip, sock->type == SILC_SOCKET_TYPE_SERVER ? 
989                      "server" : "router"));
990
991       /* Add the server into server cache. The server name and Server ID
992          is updated after we have received NEW_SERVER packet from the
993          server. We mark ourselves as router for this server if we really
994          are router. */
995       new_server = 
996         silc_idlist_add_server(server->local_list, NULL,
997                                sock->type == SILC_SOCKET_TYPE_SERVER ?
998                                SILC_SERVER : SILC_ROUTER, NULL, 
999                                sock->type == SILC_SOCKET_TYPE_SERVER ?
1000                                server->id_entry : NULL, sock);
1001       if (!new_server) {
1002         SILC_LOG_ERROR(("Could not add new server to cache"));
1003         silc_free(sock->user_data);
1004         break;
1005       }
1006
1007       id_entry = (void *)new_server;
1008       
1009       /* There is connection to other server now, if it is router then
1010          we will have connection to outside world.  If we are router but
1011          normal server connected to us then we will remain standalone,
1012          if we are standlone. */
1013       if (server->standalone && sock->type == SILC_SOCKET_TYPE_ROUTER) {
1014         SILC_LOG_DEBUG(("We are not standalone server anymore"));
1015         server->standalone = FALSE;
1016         if (!server->id_entry->router) {
1017           server->id_entry->router = id_entry;
1018           server->router = id_entry;
1019         }
1020       }
1021       break;
1022     }
1023   default:
1024     break;
1025   }
1026
1027   /* Add the common data structure to the ID entry. */
1028   if (id_entry)
1029     silc_idlist_add_data(id_entry, (SilcIDListData)sock->user_data);
1030       
1031   /* Add to sockets internal pointer for fast referencing */
1032   silc_free(sock->user_data);
1033   sock->user_data = id_entry;
1034
1035   /* Connection has been fully established now. Everything is ok. */
1036   SILC_LOG_DEBUG(("New connection authenticated"));
1037
1038   silc_protocol_free(protocol);
1039   if (ctx->packet)
1040     silc_packet_context_free(ctx->packet);
1041   if (ctx->ske)
1042     silc_ske_free(ctx->ske);
1043   if (ctx->dest_id)
1044     silc_free(ctx->dest_id);
1045   silc_free(ctx);
1046   sock->protocol = NULL;
1047 }
1048
1049 /* This function is used to read packets from network and send packets to
1050    network. This is usually a generic task. */
1051
1052 SILC_TASK_CALLBACK(silc_server_packet_process)
1053 {
1054   SilcServer server = (SilcServer)context;
1055   SilcSocketConnection sock = server->sockets[fd];
1056   SilcIDListData idata;
1057   SilcCipher cipher = NULL;
1058   SilcHmac hmac = NULL;
1059   int ret;
1060
1061   if (!sock)
1062     return;
1063
1064   SILC_LOG_DEBUG(("Processing packet"));
1065
1066   /* Packet sending */
1067
1068   if (type == SILC_TASK_WRITE) {
1069     if (sock->outbuf->data - sock->outbuf->head)
1070       silc_buffer_push(sock->outbuf, sock->outbuf->data - sock->outbuf->head);
1071
1072     ret = silc_server_packet_send_real(server, sock, TRUE);
1073
1074     /* If returned -2 could not write to connection now, will do
1075        it later. */
1076     if (ret == -2)
1077       return;
1078     
1079     /* The packet has been sent and now it is time to set the connection
1080        back to only for input. When there is again some outgoing data 
1081        available for this connection it will be set for output as well. 
1082        This call clears the output setting and sets it only for input. */
1083     SILC_SET_CONNECTION_FOR_INPUT(fd);
1084     SILC_UNSET_OUTBUF_PENDING(sock);
1085
1086     silc_buffer_clear(sock->outbuf);
1087     return;
1088   }
1089
1090   /* Packet receiving */
1091
1092   /* Read some data from connection */
1093   ret = silc_packet_receive(sock);
1094   if (ret < 0)
1095     return;
1096     
1097   /* EOF */
1098   if (ret == 0) {
1099     SILC_LOG_DEBUG(("Read EOF"));
1100       
1101     /* If connection is disconnecting already we will finally
1102        close the connection */
1103     if (SILC_IS_DISCONNECTING(sock)) {
1104       if (sock->user_data)
1105         silc_server_free_sock_user_data(server, sock);
1106       silc_server_close_connection(server, sock);
1107       return;
1108     }
1109       
1110     SILC_LOG_DEBUG(("Premature EOF from connection %d", sock->sock));
1111
1112     if (sock->user_data)
1113       silc_server_free_sock_user_data(server, sock);
1114     silc_server_close_connection(server, sock);
1115     return;
1116   }
1117
1118   /* If connection is disconnecting or disconnected we will ignore
1119      what we read. */
1120   if (SILC_IS_DISCONNECTING(sock) || SILC_IS_DISCONNECTED(sock)) {
1121     SILC_LOG_DEBUG(("Ignoring read data from invalid connection"));
1122     return;
1123   }
1124
1125   /* Get keys and stuff from ID entry */
1126   idata = (SilcIDListData)sock->user_data;
1127   if (idata) {
1128     idata->last_receive = time(NULL);
1129     cipher = idata->receive_key;
1130     hmac = idata->hmac;
1131   }
1132  
1133   /* Process the packet. This will call the parser that will then
1134      decrypt and parse the packet. */
1135   silc_packet_receive_process(sock, cipher, hmac, silc_server_packet_parse, 
1136                               server);
1137 }
1138
1139 /* Parses whole packet, received earlier. */
1140
1141 SILC_TASK_CALLBACK(silc_server_packet_parse_real)
1142 {
1143   SilcPacketParserContext *parse_ctx = (SilcPacketParserContext *)context;
1144   SilcServer server = (SilcServer)parse_ctx->context;
1145   SilcSocketConnection sock = parse_ctx->sock;
1146   SilcPacketContext *packet = parse_ctx->packet;
1147   int ret;
1148
1149   SILC_LOG_DEBUG(("Start"));
1150
1151   /* Decrypt the received packet */
1152   ret = silc_packet_decrypt(parse_ctx->cipher, parse_ctx->hmac, 
1153                             packet->buffer, packet);
1154   if (ret < 0)
1155     goto out;
1156
1157   if (ret == 0) {
1158     /* Parse the packet. Packet type is returned. */
1159     ret = silc_packet_parse(packet);
1160   } else {
1161     /* Parse the packet header in special way as this is "special"
1162        packet type. */
1163     ret = silc_packet_parse_special(packet);
1164   }
1165
1166   if (ret == SILC_PACKET_NONE)
1167     goto out;
1168
1169   if (server->server_type == SILC_ROUTER) {
1170     /* Route the packet if it is not destined to us. Other ID types but
1171        server are handled separately after processing them. */
1172     if (packet->dst_id_type == SILC_ID_SERVER && 
1173         sock->type != SILC_SOCKET_TYPE_CLIENT &&
1174         SILC_ID_SERVER_COMPARE(packet->dst_id, server->id_string)) {
1175       
1176       /* Route the packet to fastest route for the destination ID */
1177       void *id = silc_id_str2id(packet->dst_id, packet->dst_id_type);
1178       silc_server_packet_route(server,
1179                                silc_server_route_get(server, id,
1180                                                      packet->dst_id_type),
1181                                packet);
1182       silc_free(id);
1183       goto out;
1184     }
1185     
1186     /* Broadcast packet if it is marked as broadcast packet and it is
1187        originated from router and we are router. */
1188     if (sock->type == SILC_SOCKET_TYPE_ROUTER &&
1189         packet->flags & SILC_PACKET_FLAG_BROADCAST) {
1190       silc_server_packet_broadcast(server, server->router->connection, packet);
1191     }
1192   }
1193
1194   /* Parse the incoming packet type */
1195   silc_server_packet_parse_type(server, sock, packet);
1196
1197  out:
1198   silc_buffer_clear(sock->inbuf);
1199   silc_packet_context_free(packet);
1200   silc_free(parse_ctx);
1201 }
1202
1203 /* Parser callback called by silc_packet_receive_process. This merely
1204    registers timeout that will handle the actual parsing when appropriate. */
1205
1206 void silc_server_packet_parse(SilcPacketParserContext *parser_context)
1207 {
1208   SilcServer server = (SilcServer)parser_context->context;
1209   SilcSocketConnection sock = parser_context->sock;
1210
1211   switch (sock->type) {
1212   case SILC_SOCKET_TYPE_CLIENT:
1213   case SILC_SOCKET_TYPE_UNKNOWN:
1214     /* Parse the packet with timeout */
1215     silc_task_register(server->timeout_queue, sock->sock,
1216                        silc_server_packet_parse_real,
1217                        (void *)parser_context, 0, 100000,
1218                        SILC_TASK_TIMEOUT,
1219                        SILC_TASK_PRI_NORMAL);
1220     break;
1221   case SILC_SOCKET_TYPE_SERVER:
1222   case SILC_SOCKET_TYPE_ROUTER:
1223     /* Packets from servers are parsed as soon as possible */
1224     silc_task_register(server->timeout_queue, sock->sock,
1225                        silc_server_packet_parse_real,
1226                        (void *)parser_context, 0, 1,
1227                        SILC_TASK_TIMEOUT,
1228                        SILC_TASK_PRI_NORMAL);
1229     break;
1230   default:
1231     return;
1232   }
1233 }
1234
1235 /* Parses the packet type and calls what ever routines the packet type
1236    requires. This is done for all incoming packets. */
1237
1238 void silc_server_packet_parse_type(SilcServer server, 
1239                                    SilcSocketConnection sock,
1240                                    SilcPacketContext *packet)
1241 {
1242   SilcPacketType type = packet->type;
1243
1244   SILC_LOG_DEBUG(("Parsing packet type %d", type));
1245
1246   /* Parse the packet type */
1247   switch(type) {
1248   case SILC_PACKET_DISCONNECT:
1249     SILC_LOG_DEBUG(("Disconnect packet"));
1250     break;
1251
1252   case SILC_PACKET_SUCCESS:
1253     /*
1254      * Success received for something. For now we can have only
1255      * one protocol for connection executing at once hence this
1256      * success message is for whatever protocol is executing currently.
1257      */
1258     SILC_LOG_DEBUG(("Success packet"));
1259     if (sock->protocol) {
1260       sock->protocol->execute(server->timeout_queue, 0,
1261                               sock->protocol, sock->sock, 0, 0);
1262     }
1263     break;
1264
1265   case SILC_PACKET_FAILURE:
1266     /*
1267      * Failure received for something. For now we can have only
1268      * one protocol for connection executing at once hence this
1269      * failure message is for whatever protocol is executing currently.
1270      */
1271     SILC_LOG_DEBUG(("Failure packet"));
1272     if (sock->protocol) {
1273       /* XXX Audit the failure type */
1274       sock->protocol->state = SILC_PROTOCOL_STATE_FAILURE;
1275       sock->protocol->execute(server->timeout_queue, 0,
1276                               sock->protocol, sock->sock, 0, 0);
1277     }
1278     break;
1279
1280   case SILC_PACKET_REJECT:
1281     SILC_LOG_DEBUG(("Reject packet"));
1282     return;
1283     break;
1284
1285   case SILC_PACKET_NOTIFY:
1286     /*
1287      * Received notify packet. Server can receive notify packets from
1288      * router. Server then relays the notify messages to clients if needed.
1289      */
1290     SILC_LOG_DEBUG(("Notify packet"));
1291     silc_server_notify(server, sock, packet);
1292     break;
1293
1294     /* 
1295      * Channel packets
1296      */
1297   case SILC_PACKET_CHANNEL_MESSAGE:
1298     /*
1299      * Received channel message. Channel messages are special packets
1300      * (although probably most common ones) thus they are handled
1301      * specially.
1302      */
1303     SILC_LOG_DEBUG(("Channel Message packet"));
1304     silc_server_channel_message(server, sock, packet);
1305     break;
1306
1307   case SILC_PACKET_CHANNEL_KEY:
1308     /*
1309      * Received key for channel. As channels are created by the router
1310      * the keys are as well. We will distribute the key to all of our
1311      * locally connected clients on the particular channel. Router
1312      * never receives this channel and thus is ignored.
1313      */
1314     SILC_LOG_DEBUG(("Channel Key packet"));
1315     silc_server_channel_key(server, sock, packet);
1316     break;
1317
1318     /*
1319      * Command packets
1320      */
1321   case SILC_PACKET_COMMAND:
1322     /*
1323      * Recived command. Processes the command request and allocates the
1324      * command context and calls the command.
1325      */
1326     SILC_LOG_DEBUG(("Command packet"));
1327     silc_server_command_process(server, sock, packet);
1328     break;
1329
1330   case SILC_PACKET_COMMAND_REPLY:
1331     /*
1332      * Received command reply packet. Received command reply to command. It
1333      * may be reply to command sent by us or reply to command sent by client
1334      * that we've routed further.
1335      */
1336     SILC_LOG_DEBUG(("Command Reply packet"));
1337     silc_server_command_reply(server, sock, packet);
1338     break;
1339
1340     /*
1341      * Private Message packets
1342      */
1343   case SILC_PACKET_PRIVATE_MESSAGE:
1344     /*
1345      * Received private message packet. The packet is coming from either
1346      * client or server.
1347      */
1348     SILC_LOG_DEBUG(("Private Message packet"));
1349     silc_server_private_message(server, sock, packet);
1350     break;
1351
1352   case SILC_PACKET_PRIVATE_MESSAGE_KEY:
1353     /*
1354      * Private message key packet.
1355      */
1356     break;
1357
1358     /*
1359      * Key Exchange protocol packets
1360      */
1361   case SILC_PACKET_KEY_EXCHANGE:
1362     SILC_LOG_DEBUG(("KE packet"));
1363     if (sock->protocol && sock->protocol->protocol->type 
1364         == SILC_PROTOCOL_SERVER_KEY_EXCHANGE) {
1365
1366       SilcServerKEInternalContext *proto_ctx = 
1367         (SilcServerKEInternalContext *)sock->protocol->context;
1368
1369       proto_ctx->packet = silc_packet_context_dup(packet);
1370
1371       /* Let the protocol handle the packet */
1372       sock->protocol->execute(server->timeout_queue, 0, 
1373                               sock->protocol, sock->sock, 0, 100000);
1374     } else {
1375       SILC_LOG_ERROR(("Received Key Exchange packet but no key exchange "
1376                       "protocol active, packet dropped."));
1377
1378       /* XXX Trigger KE protocol?? Rekey actually, maybe. */
1379     }
1380     break;
1381
1382   case SILC_PACKET_KEY_EXCHANGE_1:
1383     SILC_LOG_DEBUG(("KE 1 packet"));
1384     if (sock->protocol && sock->protocol->protocol->type 
1385         == SILC_PROTOCOL_SERVER_KEY_EXCHANGE) {
1386
1387       SilcServerKEInternalContext *proto_ctx = 
1388         (SilcServerKEInternalContext *)sock->protocol->context;
1389
1390       if (proto_ctx->packet)
1391         silc_packet_context_free(proto_ctx->packet);
1392
1393       proto_ctx->packet = silc_packet_context_dup(packet);
1394       proto_ctx->dest_id_type = packet->src_id_type;
1395       proto_ctx->dest_id = silc_id_str2id(packet->src_id, packet->src_id_type);
1396
1397       /* Let the protocol handle the packet */
1398       sock->protocol->execute(server->timeout_queue, 0, 
1399                               sock->protocol, sock->sock,
1400                               0, 100000);
1401     } else {
1402       SILC_LOG_ERROR(("Received Key Exchange 1 packet but no key exchange "
1403                       "protocol active, packet dropped."));
1404     }
1405     break;
1406
1407   case SILC_PACKET_KEY_EXCHANGE_2:
1408     SILC_LOG_DEBUG(("KE 2 packet"));
1409     if (sock->protocol && sock->protocol->protocol->type 
1410         == SILC_PROTOCOL_SERVER_KEY_EXCHANGE) {
1411
1412       SilcServerKEInternalContext *proto_ctx = 
1413         (SilcServerKEInternalContext *)sock->protocol->context;
1414
1415       if (proto_ctx->packet)
1416         silc_packet_context_free(proto_ctx->packet);
1417
1418       proto_ctx->packet = silc_packet_context_dup(packet);
1419       proto_ctx->dest_id_type = packet->src_id_type;
1420       proto_ctx->dest_id = silc_id_str2id(packet->src_id, packet->src_id_type);
1421
1422       /* Let the protocol handle the packet */
1423       sock->protocol->execute(server->timeout_queue, 0, 
1424                               sock->protocol, sock->sock,
1425                               0, 100000);
1426     } else {
1427       SILC_LOG_ERROR(("Received Key Exchange 2 packet but no key exchange "
1428                       "protocol active, packet dropped."));
1429     }
1430     break;
1431
1432   case SILC_PACKET_CONNECTION_AUTH_REQUEST:
1433     /*
1434      * Connection authentication request packet. When we receive this packet
1435      * we will send to the other end information about our mandatory
1436      * authentication method for the connection. This packet maybe received
1437      * at any time. 
1438      */
1439     SILC_LOG_DEBUG(("Connection authentication request packet"));
1440     break;
1441
1442     /*
1443      * Connection Authentication protocol packets
1444      */
1445   case SILC_PACKET_CONNECTION_AUTH:
1446     /* Start of the authentication protocol. We receive here the 
1447        authentication data and will verify it. */
1448     SILC_LOG_DEBUG(("Connection auth packet"));
1449     if (sock->protocol && sock->protocol->protocol->type 
1450         == SILC_PROTOCOL_SERVER_CONNECTION_AUTH) {
1451
1452       SilcServerConnAuthInternalContext *proto_ctx = 
1453         (SilcServerConnAuthInternalContext *)sock->protocol->context;
1454
1455       proto_ctx->packet = silc_packet_context_dup(packet);
1456
1457       /* Let the protocol handle the packet */
1458       sock->protocol->execute(server->timeout_queue, 0, 
1459                               sock->protocol, sock->sock, 0, 0);
1460     } else {
1461       SILC_LOG_ERROR(("Received Connection Auth packet but no authentication "
1462                       "protocol active, packet dropped."));
1463     }
1464     break;
1465
1466   case SILC_PACKET_NEW_ID:
1467     /*
1468      * Received New ID packet. This includes some new ID that has been
1469      * created. It may be for client, server or channel. This is the way
1470      * to distribute information about new registered entities in the
1471      * SILC network.
1472      */
1473     SILC_LOG_DEBUG(("New ID packet"));
1474     silc_server_new_id(server, sock, packet);
1475     break;
1476
1477   case SILC_PACKET_NEW_CLIENT:
1478     /*
1479      * Received new client packet. This includes client information that
1480      * we will use to create initial client ID. After creating new
1481      * ID we will send it to the client.
1482      */
1483     SILC_LOG_DEBUG(("New Client packet"));
1484     silc_server_new_client(server, sock, packet);
1485     break;
1486
1487   case SILC_PACKET_NEW_SERVER:
1488     /*
1489      * Received new server packet. This includes Server ID and some other
1490      * information that we may save. This is received after server has 
1491      * connected to us.
1492      */
1493     SILC_LOG_DEBUG(("New Server packet"));
1494     silc_server_new_server(server, sock, packet);
1495     break;
1496
1497   case SILC_PACKET_NEW_CHANNEL:
1498     /*
1499      * Received new channel packet. Information about new channel in the
1500      * network are distributed using this packet.
1501      */
1502     SILC_LOG_DEBUG(("New Channel packet"));
1503     silc_server_new_channel(server, sock, packet);
1504     break;
1505
1506   case SILC_PACKET_NEW_CHANNEL_USER:
1507     /*
1508      * Received new channel user packet. Information about new users on a
1509      * channel are distributed between routers using this packet.  The
1510      * router receiving this will redistribute it and also sent JOIN notify
1511      * to local clients on the same channel. Normal server sends JOIN notify
1512      * to its local clients on the channel.
1513      */
1514     SILC_LOG_DEBUG(("New Channel User packet"));
1515     silc_server_new_channel_user(server, sock, packet);
1516     break;
1517
1518   case SILC_PACKET_NEW_CHANNEL_LIST:
1519     /*
1520      * List of new channel packets received. This is usually received when
1521      * existing server or router connects to us and distributes information
1522      * of all channels it has.
1523      */
1524     break;
1525
1526   case SILC_PACKET_NEW_CHANNEL_USER_LIST:
1527     /*
1528      * List of new channel user packets received. This is usually received
1529      * when existing server or router connects to us and distributes 
1530      * information of all channel users it has.
1531      */
1532     break;
1533
1534   case SILC_PACKET_REPLACE_ID:
1535     /*
1536      * Received replace ID packet. This sends the old ID that is to be
1537      * replaced with the new one included into the packet. Client must not
1538      * send this packet.
1539      */
1540     SILC_LOG_DEBUG(("Replace ID packet"));
1541     silc_server_replace_id(server, sock, packet);
1542     break;
1543
1544   case SILC_PACKET_REMOVE_ID:
1545     /*
1546      * Received remove ID Packet. 
1547      */
1548     SILC_LOG_DEBUG(("Remove ID packet"));
1549     silc_server_remove_id(server, sock, packet);
1550     break;
1551
1552   case SILC_PACKET_REMOVE_CHANNEL_USER:
1553     /*
1554      * Received packet to remove user from a channel. Routers notify other
1555      * routers about a user leaving a channel.
1556      */
1557     SILC_LOG_DEBUG(("Remove Channel User packet"));
1558     silc_server_remove_channel_user(server, sock, packet);
1559     break;
1560
1561   default:
1562     SILC_LOG_ERROR(("Incorrect packet type %d, packet dropped", type));
1563     break;
1564   }
1565   
1566 }
1567
1568 /* Closes connection to socket connection */
1569
1570 void silc_server_close_connection(SilcServer server,
1571                                   SilcSocketConnection sock)
1572 {
1573
1574   SILC_LOG_DEBUG(("Closing connection %d", sock->sock));
1575
1576   /* We won't listen for this connection anymore */
1577   silc_schedule_unset_listen_fd(sock->sock);
1578
1579   /* Unregister all tasks */
1580   silc_task_unregister_by_fd(server->io_queue, sock->sock);
1581   silc_task_unregister_by_fd(server->timeout_queue, sock->sock);
1582
1583   /* Close the actual connection */
1584   silc_net_close_connection(sock->sock);
1585   server->sockets[sock->sock] = NULL;
1586   silc_socket_free(sock);
1587 }
1588
1589 /* Sends disconnect message to remote connection and disconnects the 
1590    connection. */
1591
1592 void silc_server_disconnect_remote(SilcServer server,
1593                                    SilcSocketConnection sock,
1594                                    const char *fmt, ...)
1595 {
1596   va_list ap;
1597   unsigned char buf[4096];
1598
1599   memset(buf, 0, sizeof(buf));
1600   va_start(ap, fmt);
1601   vsprintf(buf, fmt, ap);
1602   va_end(ap);
1603
1604   SILC_LOG_DEBUG(("Disconnecting remote host"));
1605
1606   /* Notify remote end that the conversation is over. The notify message
1607      is tried to be sent immediately. */
1608   silc_server_packet_send(server, sock, SILC_PACKET_DISCONNECT, 0,  
1609                           buf, strlen(buf), TRUE);
1610
1611   /* Mark the connection to be disconnected */
1612   SILC_SET_DISCONNECTED(sock);
1613   silc_server_close_connection(server, sock);
1614 }
1615
1616 /* Free's user_data pointer from socket connection object. This also sends
1617    appropriate notify packets to the network to inform about leaving
1618    entities. */
1619
1620 void silc_server_free_sock_user_data(SilcServer server, 
1621                                      SilcSocketConnection sock)
1622 {
1623   SILC_LOG_DEBUG(("Start"));
1624
1625   switch(sock->type) {
1626   case SILC_SOCKET_TYPE_CLIENT:
1627     {
1628       SilcClientEntry user_data = (SilcClientEntry)sock->user_data;
1629
1630       /* Remove client from all channels */
1631       silc_server_remove_from_channels(server, sock, user_data);
1632
1633       /* XXX must take some info to history before freeing */
1634
1635       /* Send REMOVE_ID packet to routers. */
1636       if (!server->standalone && server->router)
1637         silc_server_send_remove_id(server, server->router->connection,
1638                                    server->server_type == SILC_SERVER ?
1639                                    FALSE : TRUE, user_data->id, 
1640                                    SILC_ID_CLIENT_LEN, SILC_ID_CLIENT);
1641
1642       /* Free the client entry and everything in it */
1643       silc_idlist_del_data(user_data);
1644       silc_idlist_del_client(server->local_list, user_data);
1645       break;
1646     }
1647   case SILC_SOCKET_TYPE_SERVER:
1648   case SILC_SOCKET_TYPE_ROUTER:
1649     {
1650       SilcServerEntry user_data = (SilcServerEntry)sock->user_data;
1651
1652       /* Send REMOVE_ID packet to routers. */
1653       if (!server->standalone && server->router)
1654         silc_server_send_remove_id(server, server->router->connection,
1655                                    server->server_type == SILC_SERVER ?
1656                                    FALSE : TRUE, user_data->id, 
1657                                    SILC_ID_CLIENT_LEN, SILC_ID_CLIENT);
1658
1659       /* Free the server entry */
1660       silc_idlist_del_data(user_data);
1661       silc_idlist_del_server(server->local_list, user_data);
1662       break;
1663     }
1664   default:
1665     {
1666       SilcUnknownEntry user_data = (SilcUnknownEntry)sock->user_data;
1667
1668       silc_idlist_del_data(user_data);
1669       silc_free(user_data);
1670       break;
1671     }
1672   }
1673
1674   sock->user_data = NULL;
1675 }
1676
1677 /* Checks whether given channel has global users.  If it does this returns
1678    TRUE and FALSE if there is only locally connected clients on the channel. */
1679
1680 int silc_server_channel_has_global(SilcChannelEntry channel)
1681 {
1682   SilcChannelClientEntry chl;
1683
1684   silc_list_start(channel->user_list);
1685   while ((chl = silc_list_get(channel->user_list)) != SILC_LIST_END) {
1686     if (chl->client->router)
1687       return TRUE;
1688   }
1689
1690   return FALSE;
1691 }
1692
1693 /* Checks whether given channel has locally connected users.  If it does this
1694    returns TRUE and FALSE if there is not one locally connected client. */
1695
1696 int silc_server_channel_has_local(SilcChannelEntry channel)
1697 {
1698   SilcChannelClientEntry chl;
1699
1700   silc_list_start(channel->user_list);
1701   while ((chl = silc_list_get(channel->user_list)) != SILC_LIST_END) {
1702     if (!chl->client->router)
1703       return TRUE;
1704   }
1705
1706   return FALSE;
1707 }
1708
1709 /* Removes client from all channels it has joined. This is used when client
1710    connection is disconnected. If the client on a channel is last, the
1711    channel is removed as well. This sends the SIGNOFF notify types. */
1712
1713 void silc_server_remove_from_channels(SilcServer server, 
1714                                       SilcSocketConnection sock,
1715                                       SilcClientEntry client)
1716 {
1717   SilcChannelEntry channel;
1718   SilcChannelClientEntry chl;
1719   SilcBuffer chidp, clidp;
1720
1721   SILC_LOG_DEBUG(("Start"));
1722
1723   if (!client || !client->id)
1724     return;
1725
1726   clidp = silc_id_payload_encode(client->id, SILC_ID_CLIENT);
1727
1728   /* Remove the client from all channels. The client is removed from
1729      the channels' user list. */
1730   silc_list_start(client->channels);
1731   while ((chl = silc_list_get(client->channels)) != SILC_LIST_END) {
1732     channel = chl->channel;
1733     chidp = silc_id_payload_encode(channel->id, SILC_ID_CHANNEL);
1734
1735     /* Remove from list */
1736     silc_list_del(client->channels, chl);
1737
1738     /* If this client is last one on the channel the channel
1739        is removed all together. */
1740     if (silc_list_count(channel->user_list) < 2) {
1741
1742       /* However, if the channel has marked global users then the 
1743          channel is not created locally, and this does not remove the
1744          channel globally from SILC network, in this case we will
1745          notify that this client has left the channel. */
1746       if (channel->global_users)
1747         silc_server_send_notify_to_channel(server, channel, FALSE,
1748                                            SILC_NOTIFY_TYPE_SIGNOFF, 1,
1749                                            clidp->data, clidp->len);
1750       
1751       silc_idlist_del_channel(server->local_list, channel);
1752       continue;
1753     }
1754
1755     /* Remove from list */
1756     silc_list_del(channel->user_list, chl);
1757     silc_free(chl);
1758
1759     /* Send notify to channel about client leaving SILC and thus
1760        the entire channel. */
1761     silc_server_send_notify_to_channel(server, channel, FALSE,
1762                                        SILC_NOTIFY_TYPE_SIGNOFF, 1,
1763                                        clidp->data, clidp->len);
1764     silc_buffer_free(chidp);
1765   }
1766
1767   silc_buffer_free(clidp);
1768 }
1769
1770 /* Removes client from one channel. This is used for example when client
1771    calls LEAVE command to remove itself from the channel. Returns TRUE
1772    if channel still exists and FALSE if the channel is removed when
1773    last client leaves the channel. If `notify' is FALSE notify messages
1774    are not sent. */
1775
1776 int silc_server_remove_from_one_channel(SilcServer server, 
1777                                         SilcSocketConnection sock,
1778                                         SilcChannelEntry channel,
1779                                         SilcClientEntry client,
1780                                         int notify)
1781 {
1782   SilcChannelEntry ch;
1783   SilcChannelClientEntry chl;
1784   SilcBuffer clidp;
1785
1786   SILC_LOG_DEBUG(("Start"));
1787
1788   clidp = silc_id_payload_encode(client->id, SILC_ID_CLIENT);
1789
1790   /* Remove the client from the channel. The client is removed from
1791      the channel's user list. */
1792   silc_list_start(client->channels);
1793   while ((chl = silc_list_get(client->channels)) != SILC_LIST_END) {
1794     if (chl->channel != channel)
1795       continue;
1796
1797     ch = chl->channel;
1798
1799     /* Remove from list */
1800     silc_list_del(client->channels, chl);
1801
1802     /* If this client is last one on the channel the channel
1803        is removed all together. */
1804     if (silc_list_count(channel->user_list) < 2) {
1805       /* Notify about leaving client if this channel has global users. */
1806       if (notify && channel->global_users)
1807         silc_server_send_notify_to_channel(server, channel, FALSE,
1808                                            SILC_NOTIFY_TYPE_LEAVE, 1,
1809                                            clidp->data, clidp->len);
1810       
1811       silc_idlist_del_channel(server->local_list, channel);
1812       silc_buffer_free(clidp);
1813       return FALSE;
1814     }
1815
1816     /* Remove from list */
1817     silc_list_del(channel->user_list, chl);
1818     silc_free(chl);
1819
1820     /* If there is no global users on the channel anymore mark the channel
1821        as local channel. */
1822     if (server->server_type == SILC_SERVER &&
1823         !silc_server_channel_has_global(channel))
1824       channel->global_users = FALSE;
1825
1826     /* If tehre is not at least one local user on the channel then we don't
1827        need the channel entry anymore, we can remove it safely. */
1828     if (server->server_type == SILC_SERVER &&
1829         !silc_server_channel_has_local(channel)) {
1830       silc_idlist_del_channel(server->local_list, channel);
1831       silc_buffer_free(clidp);
1832       return FALSE;
1833     }
1834
1835     /* Send notify to channel about client leaving the channel */
1836     if (notify)
1837       silc_server_send_notify_to_channel(server, channel, FALSE,
1838                                          SILC_NOTIFY_TYPE_LEAVE, 1,
1839                                          clidp->data, clidp->len);
1840     break;
1841   }
1842
1843   silc_buffer_free(clidp);
1844   return TRUE;
1845 }
1846
1847 /* Returns TRUE if the given client is on the channel.  FALSE if not. 
1848    This works because we assure that the user list on the channel is
1849    always in up to date thus we can only check the channel list from 
1850    `client' which is faster than checking the user list from `channel'. */
1851
1852 int silc_server_client_on_channel(SilcClientEntry client,
1853                                   SilcChannelEntry channel)
1854 {
1855   SilcChannelClientEntry chl;
1856
1857   if (!client || !channel)
1858     return FALSE;
1859
1860   silc_list_start(client->channels);
1861   while ((chl = silc_list_get(client->channels)) != SILC_LIST_END)
1862     if (chl->channel == channel)
1863       return TRUE;
1864
1865   return FALSE;
1866 }
1867
1868 /* Timeout callback. This is called if connection is idle or for some
1869    other reason is not responding within some period of time. This 
1870    disconnects the remote end. */
1871
1872 SILC_TASK_CALLBACK(silc_server_timeout_remote)
1873 {
1874   SilcServerConnection sconn = (SilcServerConnection)context;
1875   SilcSocketConnection sock = sconn->server->sockets[fd];
1876
1877   silc_server_disconnect_remote(sconn->server, sock, 
1878                                 "Server closed connection: "
1879                                 "Connection timeout");
1880 }
1881
1882 /* Creates new channel. Sends NEW_CHANNEL packet to primary route. This
1883    function may be used only by router. In real SILC network all channels
1884    are created by routers thus this function is never used by normal
1885    server. */
1886
1887 SilcChannelEntry silc_server_create_new_channel(SilcServer server, 
1888                                                 SilcServerID *router_id,
1889                                                 char *cipher, 
1890                                                 char *channel_name)
1891 {
1892   SilcChannelID *channel_id;
1893   SilcChannelEntry entry;
1894   SilcCipher key;
1895
1896   SILC_LOG_DEBUG(("Creating new channel"));
1897
1898   if (!cipher)
1899     cipher = "twofish";
1900
1901   /* Allocate cipher */
1902   silc_cipher_alloc(cipher, &key);
1903
1904   channel_name = strdup(channel_name);
1905
1906   /* Create the channel */
1907   silc_id_create_channel_id(router_id, server->rng, &channel_id);
1908   entry = silc_idlist_add_channel(server->local_list, channel_name, 
1909                                   SILC_CHANNEL_MODE_NONE, channel_id, 
1910                                   NULL, key);
1911   if (!entry) {
1912     silc_free(channel_name);
1913     return NULL;
1914   }
1915
1916   /* Now create the actual key material */
1917   silc_server_create_channel_key(server, entry, 16);
1918
1919   /* Notify other routers about the new channel. We send the packet
1920      to our primary route. */
1921   if (server->standalone == FALSE) {
1922     silc_server_send_new_channel(server, server->router->connection, TRUE, 
1923                                  channel_name, entry->id, SILC_ID_CHANNEL_LEN);
1924   }
1925
1926   return entry;
1927 }
1928
1929 /* Generates new channel key. This is used to create the initial channel key
1930    but also to re-generate new key for channel. If `key_len' is provided
1931    it is the bytes of the key length. */
1932
1933 void silc_server_create_channel_key(SilcServer server, 
1934                                     SilcChannelEntry channel,
1935                                     unsigned int key_len)
1936 {
1937   int i;
1938   unsigned char channel_key[32];
1939   unsigned int len;
1940
1941   if (!channel->channel_key)
1942     silc_cipher_alloc("twofish", &channel->channel_key);
1943
1944   if (key_len)
1945     len = key_len;
1946   else if (channel->key_len)
1947     len = channel->key_len / 8;
1948   else
1949     len = sizeof(channel_key);
1950
1951   /* Create channel key */
1952   for (i = 0; i < len; i++) channel_key[i] = silc_rng_get_byte(server->rng);
1953   
1954   /* Set the key */
1955   channel->channel_key->cipher->set_key(channel->channel_key->context, 
1956                                         channel_key, len);
1957
1958   /* Remove old key if exists */
1959   if (channel->key) {
1960     memset(channel->key, 0, channel->key_len / 8);
1961     silc_free(channel->key);
1962   }
1963
1964   /* Save the key */
1965   channel->key_len = len * 8;
1966   channel->key = silc_calloc(len, sizeof(*channel->key));
1967   memcpy(channel->key, channel_key, len);
1968   memset(channel_key, 0, sizeof(channel_key));
1969 }
1970
1971 /* Saves the channel key found in the encoded `key_payload' buffer. This 
1972    function is used when we receive Channel Key Payload and also when we're
1973    processing JOIN command reply. Returns entry to the channel. */
1974
1975 SilcChannelEntry silc_server_save_channel_key(SilcServer server,
1976                                               SilcBuffer key_payload,
1977                                               SilcChannelEntry channel)
1978 {
1979   SilcChannelKeyPayload payload = NULL;
1980   SilcChannelID *id = NULL;
1981   unsigned char *tmp;
1982   unsigned int tmp_len;
1983   char *cipher;
1984
1985   /* Decode channel key payload */
1986   payload = silc_channel_key_payload_parse(key_payload);
1987   if (!payload) {
1988     SILC_LOG_ERROR(("Bad channel key payload, dropped"));
1989     channel = NULL;
1990     goto out;
1991   }
1992
1993   /* Get the channel entry */
1994   if (!channel) {
1995
1996     /* Get channel ID */
1997     tmp = silc_channel_key_get_id(payload, &tmp_len);
1998     id = silc_id_str2id(tmp, SILC_ID_CHANNEL);
1999     if (!id) {
2000       channel = NULL;
2001       goto out;
2002     }
2003
2004     channel = silc_idlist_find_channel_by_id(server->local_list, id, NULL);
2005     if (!channel) {
2006       SILC_LOG_ERROR(("Received key for non-existent channel"));
2007       goto out;
2008     }
2009   }
2010
2011   tmp = silc_channel_key_get_key(payload, &tmp_len);
2012   if (!tmp) {
2013     channel = NULL;
2014     goto out;
2015   }
2016
2017   cipher = silc_channel_key_get_cipher(payload, NULL);;
2018   if (!cipher) {
2019     channel = NULL;
2020     goto out;
2021   }
2022
2023   /* Remove old key if exists */
2024   if (channel->key) {
2025     memset(channel->key, 0, channel->key_len / 8);
2026     silc_free(channel->key);
2027     silc_cipher_free(channel->channel_key);
2028   }
2029
2030   /* Create new cipher */
2031   if (!silc_cipher_alloc(cipher, &channel->channel_key)) {
2032     channel = NULL;
2033     goto out;
2034   }
2035
2036   /* Save the key */
2037   channel->key_len = tmp_len * 8;
2038   channel->key = silc_calloc(tmp_len, sizeof(unsigned char));
2039   memcpy(channel->key, tmp, tmp_len);
2040   channel->channel_key->cipher->set_key(channel->channel_key->context, 
2041                                         tmp, tmp_len);
2042
2043  out:
2044   if (id)
2045     silc_free(id);
2046   if (payload)
2047     silc_channel_key_payload_free(payload);
2048
2049   return channel;
2050 }