silcclient: auto-negotiation of private message key using SKE over SILCnet
[silc.git] / lib / silcclient / client_internal.h
1 /*
2
3   client_internal.h
4
5   Author: Pekka Riikonen <priikone@silcnet.org>
6
7   Copyright (C) 1997 - 2014 Pekka Riikonen
8
9   This program is free software; you can redistribute it and/or modify
10   it under the terms of the GNU General Public License as published by
11   the Free Software Foundation; version 2 of the License.
12
13   This program is distributed in the hope that it will be useful,
14   but WITHOUT ANY WARRANTY; without even the implied warranty of
15   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16   GNU General Public License for more details.
17
18 */
19
20 #ifndef CLIENT_INTERNAL_H
21 #define CLIENT_INTERNAL_H
22
23 #include "command.h"
24 #include "command_reply.h"
25 #include "client_connect.h"
26 #include "client_register.h"
27 #include "client_entry.h"
28 #include "client_prvmsg.h"
29 #include "client_channel.h"
30 #include "client_notify.h"
31 #include "client_keyagr.h"
32 #include "client_ftp.h"
33 #include "client_listener.h"
34
35 /****************************** Definitions *********************************/
36
37 /* Packet retry counter and timer defines, for exponential backoff algorithm.
38    Meaningful with UDP transport when packets may get lost. */
39 #define SILC_CLIENT_RETRY_COUNT   4      /* Max packet retry count */
40 #define SILC_CLIENT_RETRY_MUL     2      /* Retry timer interval growth */
41 #define SILC_CLIENT_RETRY_RAND    2      /* Randomizer, timeout += rnd % 2 */
42 #define SILC_CLIENT_RETRY_MIN     1      /* Min retry timeout, seconds */
43 #define SLIC_CLIENT_RETRY_MAX     16     /* Max retry timeout, seconds */
44
45 /********************************** Types ***********************************/
46
47 /* Public key verification context */
48 typedef struct {
49   SilcSKE ske;
50   SilcSKEVerifyCbCompletion completion;
51   SilcPublicKey public_key;
52   void *completion_context;
53   void *context;
54   SilcBool aborted;
55 } *SilcVerifyKeyContext;
56
57 /* Command and command reply context used to hold registered commands
58    in the SILC client. */
59 typedef struct SilcClientCommandStruct {
60   struct SilcClientCommandStruct *next;
61   SilcCommand cmd;                    /* Command type */
62   SilcFSMStateCallback command;       /* Command function */
63   SilcFSMStateCallback reply;         /* Command reply callback */
64   char *name;                         /* Name of the command (optional) */
65   SilcUInt8 max_args;                 /* Maximum arguments (optional)  */
66 } *SilcClientCommand;
67
68 /* Command reply callback structure */
69 typedef struct SilcClientCommandReplyCallbackStruct  {
70   struct SilcClientCommandReplyCallbackStruct *next;
71   SilcClientCommandReply reply;       /* Command reply callback */
72   void *context;                      /* Command reply context */
73   unsigned int do_not_call     : 1;   /* Set to not call the callback */
74 } *SilcClientCommandReplyCallback;
75
76 /* Command context given as argument to command state functions.  This same
77    context is used when calling, sending and procesing command and command
78    reply. */
79 typedef struct SilcClientCommandContextStruct {
80   struct SilcClientCommandContextStruct *next;
81   SilcClientConnection conn;          /* Connection */
82   SilcFSMThreadStruct thread;         /* FSM thread for command call */
83
84   SilcCommand cmd;                    /* Command */
85   SilcUInt16 cmd_ident;               /* Command identifier */
86   SilcUInt32 argc;                    /* Number of arguments */
87   unsigned char **argv;               /* Arguments, may be NULL */
88   SilcUInt32 *argv_lens;              /* Argument lengths, may be NULL */
89   SilcUInt32 *argv_types;             /* Argument types, may be NULL */
90
91   SilcList reply_callbacks;           /* Command reply callbacks */
92   SilcStatus status;                  /* Current command reply status */
93   SilcStatus error;                   /* Current command reply error */
94
95   void *context;                      /* Context for free use */
96   unsigned int called        : 1;     /* Set when called by application */
97   unsigned int verbose       : 1;     /* Verbose with 'say' client operation */
98   unsigned int resolved      : 1;     /* Set when resolving something */
99 } *SilcClientCommandContext;
100
101 /* Internal context for the client->internal pointer in the SilcClient. */
102 struct SilcClientInternalStruct {
103   SilcFSMStruct fsm;                     /* Client's FSM */
104   SilcFSMEventStruct wait_event;         /* Event signaller */
105   SilcClientOperations *ops;             /* Client operations */
106   SilcClientParams *params;              /* Client parameters */
107   SilcPacketEngine packet_engine;        /* Packet engine */
108   SilcMutex lock;                        /* Client lock */
109   SilcList commands;                     /* Registered commands */
110   SilcDList ftp_sessions;                /* FTP sessions */
111   char *silc_client_version;             /* Version set by application */
112   SilcClientRunning running;             /* Running/Stopped callback */
113   void *running_context;                 /* Context for runnign callback */
114   SilcAtomic32 conns;                    /* Number of connections in client */
115   SilcUInt16 next_session_id;            /* Next FTP session ID */
116
117   /* Events */
118   unsigned int stop              : 1;    /* Stop client */
119   unsigned int run_callback      : 1;    /* Call running/stopped callback */
120   unsigned int connection_closed : 1;    /* A connection closed */
121 };
122
123 /* Internal context for conn->internal in SilcClientConnection. */
124 struct SilcClientConnectionInternalStruct {
125   SilcClientConnectionParams params;     /* Connection parameters */
126   SilcFSMStruct fsm;                     /* Connection FSM */
127   SilcFSMThreadStruct event_thread;      /* FSM thread for events */
128   SilcFSMEventStruct wait_event;         /* Event signaller */
129   SilcSchedule schedule;                 /* Connection's scheduler */
130   SilcMutex lock;                        /* Connection lock */
131   SilcSKE ske;                           /* Key exchange protocol */
132   SilcSKERekeyMaterial rekey;            /* Rekey material */
133   SilcList thread_pool;                  /* Packet thread pool */
134   SilcList pending_commands;             /* Pending commands list */
135   SilcHash hash;                         /* Negotiated hash function */
136   SilcHash sha1hash;                     /* SHA-1 default hash context */
137   SilcBuffer local_idp;                  /* Local ID Payload */
138   SilcBuffer remote_idp;                 /* Remote ID Payload */
139   SilcAsyncOperation op;                 /* Protocols async operation */
140   SilcAsyncOperation cop;                /* Async operation for application */
141   SilcHashTable attrs;                   /* Configured user attributes */
142   SilcStream user_stream;                /* Low level stream in connecting */
143   char *disconnect_message;              /* Disconnection message */
144   char *away_message;                    /* Away message */
145
146   SilcIDCache client_cache;              /* Client entry cache */
147   SilcIDCache channel_cache;             /* Channel entry cache */
148   SilcIDCache server_cache;              /* Server entry cache */
149
150   SilcUInt32 remote_version;             /* Remote SILC protocol version */
151   SilcAtomic16 cmd_ident;                /* Current command identifier */
152   SilcUInt8 retry_count;                 /* Packet retry counter */
153   SilcUInt8 retry_timer;                 /* Packet retry timer */
154   SilcClientConnectionStatus status;     /* Connection callback status */
155   SilcStatus error;                      /* Connection callback error */
156   SilcUInt32 ake_generation;             /* next AKE rekey generation */
157
158   /* Events */
159   unsigned int connect            : 1;   /* Connect remote host */
160   unsigned int disconnected       : 1;   /* Disconnect remote connection */
161   unsigned int key_exchange       : 1;   /* Start key exchange */
162   unsigned int rekeying           : 1;   /* Start rekey */
163
164   /* Flags */
165   unsigned int verbose            : 1;   /* Notify application */
166   unsigned int registering        : 1;   /* Set when registering to network */
167   unsigned int rekey_responder    : 1;   /* Set when rekeying as responder */
168   unsigned int auth_request       : 1;   /* Set when requesting auth method */
169 };
170
171 SILC_FSM_STATE(silc_client_connection_st_run);
172 SILC_FSM_STATE(silc_client_connection_st_packet);
173 SILC_FSM_STATE(silc_client_connection_st_close);
174 SILC_FSM_STATE(silc_client_error);
175 SILC_FSM_STATE(silc_client_disconnect);
176 SILC_FSM_STATE(silc_client_st_stop);
177
178 void silc_client_del_connection(SilcClient client, SilcClientConnection conn);
179 void silc_client_fsm_destructor(SilcFSM fsm, void *fsm_context,
180                                 void *destructor_context);
181 void silc_client_command_free(SilcClientCommandContext cmd);
182 SilcClientConnection
183 silc_client_add_connection(SilcClient client,
184                            SilcConnectionType conn_type,
185                            SilcBool connect,
186                            SilcClientConnectionParams *params,
187                            SilcPublicKey public_key,
188                            SilcPrivateKey private_key,
189                            char *remote_host, int port,
190                            SilcClientConnectCallback callback,
191                            void *context);
192 SilcBuffer silc_client_attributes_process(SilcClient client,
193                                           SilcClientConnection conn,
194                                           SilcDList attrs);
195
196 #endif /* CLIENT_INTERNAL_H */