updates.
[silc.git] / lib / silcclient / client.h
index 150236a76486e8e4ce63bb988033f7d5193fb377..a2677b709ad0bf7dbe28d8bff3c0510272f63ea0 100644 (file)
@@ -2,7 +2,7 @@
 
   client.h
 
-  Author: Pekka Riikonen <priikone@poseidon.pspt.fi>
+  Author: Pekka Riikonen <priikone@silcnet.org>
 
   Copyright (C) 1997 - 2001 Pekka Riikonen
 
@@ -32,6 +32,27 @@ typedef struct SilcClientKeyAgreementStruct *SilcClientKeyAgreement;
 #include "command.h"
 #include "silcapi.h"
 
+/* 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;
+} *SilcClientRekey;
+
+/* Context to hold the connection authentication request callbacks that
+   will be called when the server has replied back to our request about
+   current authentication method in the session. */
+typedef struct {
+  SilcConnectionAuthRequest callback;
+  void *context;
+  SilcTask timeout;
+} *SilcClientConnAuthRequest;
+
 /* Connection structure used in client to associate all the important
    connection specific data to this structure. */
 struct SilcClientConnectionStruct {
@@ -46,7 +67,7 @@ struct SilcClientConnectionStruct {
   /* Decoded local ID so that the above defined ID would not have
      to be decoded for every packet. */
   unsigned char *local_id_data;
-  unsigned int local_id_data_len;
+  uint32 local_id_data_len;
 
   /* Own client entry. */
   SilcClientEntry local_entry;
@@ -65,17 +86,17 @@ struct SilcClientConnectionStruct {
   /* Decoded remote ID so that the above defined ID would not have
      to be decoded for every packet. */
   unsigned char *remote_id_data;
-  unsigned int remote_id_data_len;
+  uint32 remote_id_data_len;
 
   /*
    * Common data 
    */
-  /* Keys */
+  /* Keys and stuff negotiated in the SKE protocol */
   SilcCipher send_key;
   SilcCipher receive_key;
-  SilcHmac hmac;
-  unsigned char *hmac_key;
-  unsigned int hmac_key_len;
+  SilcHmac hmac_send;
+  SilcHmac hmac_receive;
+  SilcHash hash;
 
   /* Client ID and Channel ID cache. Messages transmitted in SILC network
      are done using different unique ID's. These are the cache for
@@ -97,15 +118,21 @@ struct SilcClientConnectionStruct {
   SilcDList pending_commands;
 
   /* Current command identifier, 0 not used */
-  unsigned short cmd_ident;
+  uint16 cmd_ident;
 
   /* Requested pings. */
   SilcClientPing *ping;
-  unsigned int ping_count;
+  uint32 ping_count;
 
   /* Set away message */
   SilcClientAway *away;
 
+  /* Re-key context */
+  SilcClientRekey rekey;
+
+  /* Authentication request context. */
+  SilcClientConnAuthRequest connauth;
+
   /* Pointer back to the SilcClient. This object is passed to the application
      and the actual client object is accesible through this pointer. */
   SilcClient client;
@@ -143,21 +170,22 @@ struct SilcClientStruct {
   /* All client operations that are implemented in the application. */
   SilcClientOperations *ops;
 
-  /* SILC client task queues */
-  SilcTaskQueue io_queue;
-  SilcTaskQueue timeout_queue;
-  SilcTaskQueue generic_queue;
+  /* Client Parameters */
+  SilcClientParams *params;
+
+  /* SILC client scheduler */
+  SilcSchedule schedule;
 
   /* Table of connections in client. All the connection data is saved here. */
   SilcClientConnection *conns;
-  unsigned int conns_count;
+  uint32 conns_count;
 
   /* Table of listenning sockets in client.  Client can have listeners
      (like key agreement protocol server) and those sockets are saved here.
      This table is checked always if the connection object cannot be found
      from the `conns' table. */
   SilcSocketConnection *sockets;
-  unsigned int sockets_count;
+  uint32 sockets_count;
 
   /* Generic cipher and hash objects. These can be used and referenced
      by the application as well. */
@@ -170,6 +198,9 @@ struct SilcClientStruct {
   /* Random Number Generator. Application should use this as its primary
      random number generator. */
   SilcRng rng;
+
+  /* Client version. Used to compare to remote host's version strings. */
+  char *silc_client_version;
 };
 
 /* Macros */
@@ -177,25 +208,24 @@ struct SilcClientStruct {
 /* Registers generic task for file descriptor for reading from network and
    writing to network. As being generic task the actual task is allocated 
    only once and after that the same task applies to all registered fd's. */
-#define SILC_CLIENT_REGISTER_CONNECTION_FOR_IO(fd)                     \
-do {                                                                   \
-  SilcTask tmptask = silc_task_register(client->generic_queue, (fd),   \
-                                       silc_client_packet_process,     \
-                                       context, 0, 0,                  \
-                                       SILC_TASK_GENERIC,              \
-                                       SILC_TASK_PRI_NORMAL);          \
-  silc_task_set_iotype(tmptask, SILC_TASK_WRITE);                      \
+#define SILC_CLIENT_REGISTER_CONNECTION_FOR_IO(fd)     \
+do {                                                   \
+  silc_schedule_task_add(client->schedule, (fd),       \
+                        silc_client_packet_process,    \
+                        context, 0, 0,                 \
+                        SILC_TASK_GENERIC,             \
+                        SILC_TASK_PRI_NORMAL);         \
 } while(0)
 
-#define SILC_CLIENT_SET_CONNECTION_FOR_INPUT(fd)               \
+#define SILC_CLIENT_SET_CONNECTION_FOR_INPUT(s, fd)            \
 do {                                                           \
-  silc_schedule_set_listen_fd((fd), (1L << SILC_TASK_READ));   \
-} while(0)                                                     \
+  silc_schedule_set_listen_fd((s), (fd), SILC_TASK_READ);      \
+} while(0)
      
-#define SILC_CLIENT_SET_CONNECTION_FOR_OUTPUT(fd)              \
+#define SILC_CLIENT_SET_CONNECTION_FOR_OUTPUT(s, fd)           \
 do {                                                           \
-  silc_schedule_set_listen_fd((fd), ((1L << SILC_TASK_READ) |  \
-                                    (1L << SILC_TASK_WRITE))); \
+  silc_schedule_set_listen_fd((s), (fd), (SILC_TASK_READ |     \
+                                         SILC_TASK_WRITE));    \
 } while(0)
 
 /* Finds socket connection object by file descriptor */
@@ -218,6 +248,11 @@ do {                                                       \
     (__sock) = (__x)->conns[__i]->sock;                        \
 } while(0)
 
+/* Check whether rekey protocol is active */
+#define SILC_CLIENT_IS_REKEY(sock)                                     \
+  (sock->protocol && sock->protocol->protocol &&                       \
+   sock->protocol->protocol->type == SILC_PROTOCOL_CLIENT_REKEY)
+
 /* Prototypes (some of the prototypes are defined in the silcapi.h) */
 
 void silc_client_packet_send(SilcClient client, 
@@ -228,7 +263,7 @@ void silc_client_packet_send(SilcClient client,
                             SilcCipher cipher,
                             SilcHmac hmac,
                             unsigned char *data, 
-                            unsigned int data_len, 
+                            uint32 data_len, 
                             int force_send);
 void silc_client_disconnected_by_server(SilcClient client,
                                        SilcSocketConnection sock,
@@ -242,7 +277,7 @@ void silc_client_receive_new_id(SilcClient client,
 SilcChannelEntry silc_client_new_channel_id(SilcClient client,
                                            SilcSocketConnection sock,
                                            char *channel_name,
-                                           unsigned int mode, 
+                                           uint32 mode, 
                                            SilcIDPayload idp);
 void silc_client_save_channel_key(SilcClientConnection conn,
                                  SilcBuffer key_payload, 
@@ -259,10 +294,7 @@ void silc_client_remove_from_channels(SilcClient client,
 void silc_client_replace_from_channels(SilcClient client, 
                                       SilcClientConnection conn,
                                       SilcClientEntry old,
-                                      SilcClientEntry new);
-char *silc_client_chmode(unsigned int mode, SilcChannelEntry channel);
-char *silc_client_chumode(unsigned int mode);
-char *silc_client_chumode_char(unsigned int mode);
+                                      SilcClientEntry newclient);
 void silc_client_process_failure(SilcClient client,
                                 SilcSocketConnection sock,
                                 SilcPacketContext *packet);
@@ -275,4 +307,10 @@ void silc_client_notify_by_server(SilcClient client,
 void silc_client_private_message(SilcClient client, 
                                 SilcSocketConnection sock, 
                                 SilcPacketContext *packet);
+void silc_client_connection_auth_request(SilcClient client,
+                                        SilcSocketConnection sock,
+                                        SilcPacketContext *packet);
+void silc_client_ftp(SilcClient client,
+                    SilcSocketConnection sock,
+                    SilcPacketContext *packet);
 #endif