/*
- client.h
+ client.h
- Author: Pekka Riikonen <priikone@poseidon.pspt.fi>
+ Author: Pekka Riikonen <priikone@silcnet.org>
- Copyright (C) 1997 - 2001 Pekka Riikonen
+ Copyright (C) 1997 - 2002 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
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
+ the Free Software Foundation; version 2 of the License.
+
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
#define CLIENT_H
/* Forward declarations */
-typedef struct SilcClientStruct *SilcClient;
-typedef struct SilcClientConnectionStruct *SilcClientConnection;
-typedef struct SilcClientPingStruct SilcClientPing;
-typedef struct SilcClientAwayStruct SilcClientAway;
-typedef struct SilcClientKeyAgreementStruct *SilcClientKeyAgreement;
-
-#include "idlist.h"
-#include "command.h"
-#include "silcapi.h"
+typedef struct SilcClientInternalStruct *SilcClientInternal;
/* 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;
+ SilcUInt32 enc_key_len;
int ske_group;
bool pfs;
- uint32 timeout;
+ SilcUInt32 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 {
/* Decoded local ID so that the above defined ID would not have
to be decoded for every packet. */
unsigned char *local_id_data;
- uint32 local_id_data_len;
+ SilcUInt32 local_id_data_len;
/* Own client entry. */
SilcClientEntry local_entry;
/* Decoded remote ID so that the above defined ID would not have
to be decoded for every packet. */
unsigned char *remote_id_data;
- uint32 remote_id_data_len;
+ SilcUInt32 remote_id_data_len;
/*
* Common data
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
SilcDList pending_commands;
/* Current command identifier, 0 not used */
- uint16 cmd_ident;
+ SilcUInt16 cmd_ident;
/* Requested pings. */
SilcClientPing *ping;
- uint32 ping_count;
+ 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;
+
/* Pointer back to the SilcClient. This object is passed to the application
and the actual client object is accesible through this pointer. */
SilcClient client;
/* Main client structure. */
struct SilcClientStruct {
- /*
- * Public data. All the following pointers must be set by the allocator
- * of this structure.
- */
+ char *username; /* Username, must be set by application */
+ char *nickname; /* Nickname, may be set by application */
+ char *hostname; /* hostname, must be set by application */
+ char *realname; /* Real name, must be set be application */
- /* Users's username, hostname and realname. */
- char *username;
- char *hostname;
- char *realname;
+ SilcPublicKey public_key; /* Public key of user, set by application */
+ SilcPrivateKey private_key; /* Private key of user, set by application */
+ SilcPKCS pkcs; /* PKCS allocated by application */
- /* Private and public key of the user. */
- SilcPKCS pkcs;
- SilcPublicKey public_key;
- SilcPrivateKey private_key;
-
- /* Application specific user data pointer. Client library does not
- touch this. */
- void *application;
-
- /*
- * Private data. Following pointers are used internally by the client
- * library and should be considered read-only fields.
- */
-
- /* All client operations that are implemented in the application. */
- SilcClientOperations *ops;
-
- /* SILC client scheduler and task queues */
- SilcSchedule schedule;
- SilcTaskQueue io_queue;
- SilcTaskQueue timeout_queue;
- SilcTaskQueue generic_queue;
-
- /* Table of connections in client. All the connection data is saved here. */
- SilcClientConnection *conns;
- 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;
- uint32 sockets_count;
-
- /* Generic cipher and hash objects. These can be used and referenced
- by the application as well. */
- SilcCipher none_cipher;
- SilcHash md5hash;
- SilcHash sha1hash;
- SilcHmac md5hmac;
- SilcHmac sha1hmac;
+ SilcSchedule schedule; /* Scheduler, automatically allocated by
+ the client library. */
/* Random Number Generator. Application should use this as its primary
random number generator. */
SilcRng rng;
-};
-/* Macros */
-
-/* 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); \
-} while(0)
-
-#define SILC_CLIENT_SET_CONNECTION_FOR_INPUT(s, fd) \
-do { \
- silc_schedule_set_listen_fd((s), (fd), (1L << SILC_TASK_READ)); \
-} while(0)
-
-#define SILC_CLIENT_SET_CONNECTION_FOR_OUTPUT(s, fd) \
-do { \
- silc_schedule_set_listen_fd((s), (fd), ((1L << SILC_TASK_READ) | \
- (1L << SILC_TASK_WRITE))); \
-} while(0)
-
-/* Finds socket connection object by file descriptor */
-#define SILC_CLIENT_GET_SOCK(__x, __fd, __sock) \
-do { \
- int __i; \
- \
- for (__i = 0; __i < (__x)->conns_count; __i++) \
- if ((__x)->conns[__i] && \
- (__x)->conns[__i]->sock->sock == (__fd)) \
- break; \
- \
- if (__i >= (__x)->conns_count) { \
- (__sock) = NULL; \
- for (__i = 0; __i < (__x)->sockets_count; __i++) \
- if ((__x)->sockets[__i] && \
- (__x)->sockets[__i]->sock == (__fd)) \
- (__sock) = (__x)->sockets[__i]; \
- } else \
- (__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,
- SilcSocketConnection sock,
- SilcPacketType type,
- void *dst_id,
- SilcIdType dst_id_type,
- SilcCipher cipher,
- SilcHmac hmac,
- unsigned char *data,
- uint32 data_len,
- int force_send);
-void silc_client_disconnected_by_server(SilcClient client,
- SilcSocketConnection sock,
- SilcBuffer message);
-void silc_client_error_by_server(SilcClient client,
- SilcSocketConnection sock,
- SilcBuffer message);
-void silc_client_receive_new_id(SilcClient client,
- SilcSocketConnection sock,
- SilcIDPayload idp);
-SilcChannelEntry silc_client_new_channel_id(SilcClient client,
- SilcSocketConnection sock,
- char *channel_name,
- uint32 mode,
- SilcIDPayload idp);
-void silc_client_save_channel_key(SilcClientConnection conn,
- 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,
- SilcPacketContext *packet);
-void silc_client_remove_from_channels(SilcClient client,
- SilcClientConnection conn,
- SilcClientEntry client_entry);
-void silc_client_replace_from_channels(SilcClient client,
- SilcClientConnection conn,
- SilcClientEntry old,
- SilcClientEntry new);
-void silc_client_process_failure(SilcClient client,
- SilcSocketConnection sock,
- SilcPacketContext *packet);
-void silc_client_key_agreement(SilcClient client,
- SilcSocketConnection sock,
- SilcPacketContext *packet);
-void silc_client_notify_by_server(SilcClient client,
- SilcSocketConnection sock,
- SilcPacketContext *packet);
-void silc_client_private_message(SilcClient client,
- SilcSocketConnection sock,
- SilcPacketContext *packet);
+ /* Application specific user data pointer. Client library does not
+ touch this. This the context sent as argument to silc_client_alloc. */
+ void *application;
+
+ /* Internal data for client library. Application cannot access this
+ data at all. */
+ SilcClientInternal internal;
+};
#endif