Protocol version 1.2 integrations
[silc.git] / lib / silcclient / client_internal.h
index be5c05b168efa490478f25d77756f550123888b2..098054804d5fc71d000d9155af996b02606cb7f5 100644 (file)
 #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 {
@@ -75,8 +96,6 @@ struct SilcClientInternalStruct {
 
   /* Generic cipher and hash objects. */
   SilcCipher none_cipher;
-  SilcHash md5hash;
-  SilcHash sha1hash;
   SilcHmac md5hmac;
   SilcHmac sha1hmac;
 
@@ -84,12 +103,61 @@ 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
@@ -104,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 */
@@ -143,7 +211,17 @@ do {                                                               \
 /* Prototypes */
 
 SILC_TASK_CALLBACK_GLOBAL(silc_client_packet_process);
-int silc_client_packet_send_real(SilcClient client,
+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);
+bool silc_client_packet_send_real(SilcClient client,
                                 SilcSocketConnection sock,
                                 bool force_send);
 void silc_client_ftp_free_sessions(SilcClient client,
@@ -151,22 +229,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);
@@ -218,5 +286,9 @@ void silc_client_resume_session(SilcClient client,
                                SilcClientConnection conn,
                                SilcClientResumeSessionCallback callback,
                                void *context);
+SilcBuffer silc_client_attributes_process(SilcClient client,
+                                         SilcSocketConnection sock,
+                                         SilcDList attrs);
+SILC_TASK_CALLBACK_GLOBAL(silc_client_rekey_callback);
 
 #endif