X-Git-Url: http://git.silcnet.org/gitweb/?a=blobdiff_plain;f=lib%2Fsilcclient%2Fclient_internal.h;h=4155d61ed93e77a40f49d779d8f81329e2a96bb8;hb=413da0f8686910f5e627393157566ae729ca99c4;hp=294e003a165ce76048daabc25a3fd4920fc76ec5;hpb=a818c5b5411bbc4436d1c5f011236985c96bb787;p=silc.git diff --git a/lib/silcclient/client_internal.h b/lib/silcclient/client_internal.h index 294e003a..4155d61e 100644 --- a/lib/silcclient/client_internal.h +++ b/lib/silcclient/client_internal.h @@ -1,10 +1,10 @@ /* - client_internal.h + client_internal.h Author: Pekka Riikonen - 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 @@ -20,6 +20,27 @@ #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,19 +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); @@ -166,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); @@ -190,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, @@ -199,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