Merged silc_1_0_branch to trunk.
[silc.git] / lib / silcclient / client_internal.h
index 7de59e7f76df2679ee0f8cd8acb593a2beb735e9..4155d61ed93e77a40f49d779d8f81329e2a96bb8 100644 (file)
@@ -1,10 +1,10 @@
 /*
 
-  client_internal.h 
+  client_internal.h
 
   Author: Pekka Riikonen <priikone@silcnet.org>
 
-  Copyright (C) 1997 - 2001 Pekka Riikonen
+  Copyright (C) 1997 - 2001, 2003 Pekka Riikonen
 
   This program is free software; you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
 #ifndef CLIENT_INTERNAL_H
 #define CLIENT_INTERNAL_H
 
+/* 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;
+
+/* 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;
+  SilcUInt32 enc_key_len;
+  int ske_group;
+  bool pfs;
+  SilcUInt32 timeout;
+  void *context;
+} *SilcClientRekey;
+
 /* Internal context for connection process. This is needed as we
    doing asynchronous connecting. */
 typedef struct {
@@ -33,7 +54,7 @@ typedef struct {
   void *context;
 } SilcClientInternalConnectContext;
 
-/* Structure to hold ping time information. Every PING command will 
+/* Structure to hold ping time information. Every PING command will
    add entry of this structure and is removed after reply to the ping
    as been received. */
 struct SilcClientPingStruct {
@@ -44,7 +65,7 @@ struct SilcClientPingStruct {
 
 /* Structure to hold away messages set by user. This is mainly created
    for future extensions where away messages could be set according filters
-   such as nickname and hostname. For now only one away message can 
+   such as nickname and hostname. For now only one away message can
    be set in one connection. */
 struct SilcClientAwayStruct {
   char *away;
@@ -75,8 +96,6 @@ struct SilcClientInternalStruct {
 
   /* Generic cipher and hash objects. */
   SilcCipher none_cipher;
-  SilcHash md5hash;
-  SilcHash sha1hash;
   SilcHmac md5hmac;
   SilcHmac sha1hmac;
 
@@ -84,10 +103,65 @@ struct SilcClientInternalStruct {
   char *silc_client_version;
 };
 
+/* Internal context for conn->internal in SilcClientConnection. */
+struct SilcClientConnectionInternalStruct {
+  /* Keys and stuff negotiated in the SKE protocol */
+  SilcCipher send_key;
+  SilcCipher receive_key;
+  SilcHmac hmac_send;
+  SilcHmac hmac_receive;
+  SilcHash hash;
+  SilcUInt32 psn_send;
+  SilcUInt32 psn_receive;
+
+  /* Client ID and Channel ID cache. Messages transmitted in SILC network
+     are done using different unique ID's. These are the cache for
+     thoses ID's used in the communication. */
+  SilcIDCache client_cache;
+  SilcIDCache channel_cache;
+  SilcIDCache server_cache;
+
+  /* Pending command queue for this connection */
+  SilcDList pending_commands;
+
+  /* Requested pings. */
+  SilcClientPing *ping;
+  SilcUInt32 ping_count;
+
+  /* Set away message */
+  SilcClientAway *away;
+
+  /* Re-key context */
+  SilcClientRekey rekey;
+
+  /* Authentication request context. */
+  SilcClientConnAuthRequest connauth;
+
+  /* File transmission sessions */
+  SilcDList ftp_sessions;
+  SilcUInt32 next_session_id;
+  SilcClientFtpSession active_session;
+
+  /* Requested Attributes */
+  SilcHashTable attrs;
+
+  /* Connection parameters */
+  SilcClientConnectionParams params;
+};
+
+/* Session resuming callback */
+typedef void (*SilcClientResumeSessionCallback)(SilcClient client,
+                                               SilcClientConnection conn,
+                                               bool success,
+                                               void *context);
+
+/* Rekey must be performed at the lastest when this many packets is sent */
+#define SILC_CLIENT_REKEY_THRESHOLD 0xfffffe00
+
 /* Macros */
 
 /* Registers generic task for file descriptor for reading from network and
-   writing to network. As being generic task the actual task is allocated 
+   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 {                                                   \
@@ -98,15 +172,15 @@ do {                                                       \
                         SILC_TASK_PRI_NORMAL);         \
 } while(0)
 
-#define SILC_CLIENT_SET_CONNECTION_FOR_INPUT(s, fd)            \
-do {                                                           \
-  silc_schedule_set_listen_fd((s), (fd), SILC_TASK_READ);      \
+#define SILC_CLIENT_SET_CONNECTION_FOR_INPUT(s, fd)                    \
+do {                                                                   \
+  silc_schedule_set_listen_fd((s), (fd), SILC_TASK_READ, FALSE);       \
 } while(0)
-     
-#define SILC_CLIENT_SET_CONNECTION_FOR_OUTPUT(s, fd)           \
-do {                                                           \
-  silc_schedule_set_listen_fd((s), (fd), (SILC_TASK_READ |     \
-                                         SILC_TASK_WRITE));    \
+
+#define SILC_CLIENT_SET_CONNECTION_FOR_OUTPUT(s, fd)                   \
+do {                                                                   \
+  silc_schedule_set_listen_fd((s), (fd), (SILC_TASK_READ |             \
+                                         SILC_TASK_WRITE), FALSE);     \
 } while(0)
 
 /* Finds socket connection object by file descriptor */
@@ -116,6 +190,7 @@ do {                                                                \
                                                                \
   for (__i = 0; __i < (__x)->internal->conns_count; __i++)     \
     if ((__x)->internal->conns[__i] &&                         \
+       (__x)->internal->conns[__i]->sock &&                    \
        (__x)->internal->conns[__i]->sock->sock == (__fd))      \
       break;                                                   \
                                                                \
@@ -137,6 +212,16 @@ do {                                                               \
 /* Prototypes */
 
 SILC_TASK_CALLBACK_GLOBAL(silc_client_packet_process);
+void silc_client_packet_send(SilcClient client,
+                             SilcSocketConnection sock,
+                             SilcPacketType type,
+                             void *dst_id,
+                             SilcIdType dst_id_type,
+                             SilcCipher cipher,
+                             SilcHmac hmac,
+                             unsigned char *data,
+                             SilcUInt32 data_len,
+                             bool force_send);
 int silc_client_packet_send_real(SilcClient client,
                                 SilcSocketConnection sock,
                                 bool force_send);
@@ -145,22 +230,12 @@ void silc_client_ftp_free_sessions(SilcClient client,
 void silc_client_ftp_session_free(SilcClientFtpSession session);
 void silc_client_ftp_session_free_client(SilcClientConnection conn,
                                         SilcClientEntry client_entry);
-void silc_client_packet_send(SilcClient client, 
-                            SilcSocketConnection sock,
-                            SilcPacketType type, 
-                            void *dst_id,
-                            SilcIdType dst_id_type,
-                            SilcCipher cipher,
-                            SilcHmac hmac,
-                            unsigned char *data, 
-                            SilcUInt32 data_len, 
-                            int force_send);
 void silc_client_close_connection_real(SilcClient client,
                                       SilcSocketConnection sock,
                                       SilcClientConnection conn);
 void silc_client_disconnected_by_server(SilcClient client,
                                        SilcSocketConnection sock,
-                                       SilcBuffer message);
+                                       SilcBuffer packet);
 void silc_client_error_by_server(SilcClient client,
                                 SilcSocketConnection sock,
                                 SilcBuffer message);
@@ -169,18 +244,18 @@ void silc_client_receive_new_id(SilcClient client,
                                SilcIDPayload idp);
 void silc_client_save_channel_key(SilcClient client,
                                  SilcClientConnection conn,
-                                 SilcBuffer key_payload, 
+                                 SilcBuffer key_payload,
                                  SilcChannelEntry channel);
 void silc_client_receive_channel_key(SilcClient client,
                                     SilcSocketConnection sock,
                                     SilcBuffer packet);
-void silc_client_channel_message(SilcClient client, 
-                                SilcSocketConnection sock, 
+void silc_client_channel_message(SilcClient client,
+                                SilcSocketConnection sock,
                                 SilcPacketContext *packet);
 void silc_client_remove_from_channels(SilcClient client,
                                      SilcClientConnection conn,
                                      SilcClientEntry client_entry);
-void silc_client_replace_from_channels(SilcClient client, 
+void silc_client_replace_from_channels(SilcClient client,
                                       SilcClientConnection conn,
                                       SilcClientEntry old,
                                       SilcClientEntry newclient);
@@ -193,8 +268,8 @@ void silc_client_key_agreement(SilcClient client,
 void silc_client_notify_by_server(SilcClient client,
                                  SilcSocketConnection sock,
                                  SilcPacketContext *packet);
-void silc_client_private_message(SilcClient client, 
-                                SilcSocketConnection sock, 
+void silc_client_private_message(SilcClient client,
+                                SilcSocketConnection sock,
                                 SilcPacketContext *packet);
 void silc_client_connection_auth_request(SilcClient client,
                                         SilcSocketConnection sock,
@@ -202,5 +277,21 @@ void silc_client_connection_auth_request(SilcClient client,
 void silc_client_ftp(SilcClient client,
                     SilcSocketConnection sock,
                     SilcPacketContext *packet);
+SilcBuffer silc_client_get_detach_data(SilcClient client,
+                                      SilcClientConnection conn);
+bool silc_client_process_detach_data(SilcClient client,
+                                    SilcClientConnection conn,
+                                    unsigned char **old_id,
+                                    SilcUInt16 *old_id_len);
+void silc_client_resume_session(SilcClient client,
+                               SilcClientConnection conn,
+                               SilcClientResumeSessionCallback callback,
+                               void *context);
+SilcBuffer silc_client_attributes_process(SilcClient client,
+                                         SilcSocketConnection sock,
+                                         SilcDList attrs);
+void silc_client_packet_queue_purge(SilcClient client,
+                                   SilcSocketConnection sock);
+SILC_TASK_CALLBACK_GLOBAL(silc_client_rekey_callback);
 
 #endif