1 /*
2 
3   client.h
4 
5   Author: Pekka Riikonen <priikone@silcnet.org>
6 
7   Copyright (C) 1997 - 2014 Pekka Riikonen
8 
9   The contents of this file are subject to one of the Licenses specified
10   in the COPYING file;  You may not use this file except in compliance
11   with the License.
12 
13   The software distributed under the License is distributed on an "AS IS"
14   basis, in the hope that it will be useful, but WITHOUT WARRANTY OF ANY
15   KIND, either expressed or implied.  See the COPYING file for more
16   information.
17 
18 */
19 
20 #ifndef CLIENT_H
21 #define CLIENT_H
22 
23 #ifndef SILCCLIENT_H
24 #error "Do not include this header directly"
25 #endif
26 
27 /* Forward declarations */
28 typedef struct SilcClientStruct *SilcClient;
29 typedef struct SilcClientConnectionStruct *SilcClientConnection;
30 typedef struct SilcClientEntryStruct *SilcClientEntry;
31 typedef struct SilcChannelEntryStruct *SilcChannelEntry;
32 typedef struct SilcServerEntryStruct *SilcServerEntry;
33 
34 typedef struct SilcClientKeyAgreementStruct *SilcClientKeyAgreement;
35 typedef struct SilcClientAutonegMessageKeyStruct *SilcClientAutonegMessageKey;
36 typedef struct SilcClientFtpSessionStruct *SilcClientFtpSession;
37 typedef struct SilcClientCommandReplyContextStruct
38                                            *SilcClientCommandReplyContext;
39 typedef struct SilcChannelUserStruct *SilcChannelUser;
40 typedef struct SilcClientInternalStruct *SilcClientInternal;
41 typedef struct SilcClientConnectionInternalStruct
42      *SilcClientConnectionInternal;
43 typedef struct SilcChannelPrivateKeyStruct *SilcChannelPrivateKey;
44 
45 /* Internal client entry context */
46 typedef struct SilcClientEntryInternalStruct {
47   void *prv_waiter;		/* Private message packet waiter */
48   SilcRwLock lock;		/* Read/write lock */
49   SilcCipher send_key;		/* Private message key for sending */
50   SilcCipher receive_key;	/* Private message key for receiving */
51   SilcHmac hmac_send;		/* Private mesage key HMAC for sending */
52   SilcHmac hmac_receive;	/* Private mesage key HMAC for receiving */
53   unsigned char *key;		/* Valid if application provided the key */
54   SilcUInt32 key_len;		/* Key data length */
55   SilcClientKeyAgreement ke;	/* Current key agreement context or NULL */
56   SilcAsyncOperation op;	/* Asynchronous operation with this client */
57 
58   SilcClientAutonegMessageKey ake; /* Current auto-negotiation context */
59   SilcInt64 ake_rekey;		/* Next private message key auto-negotation */
60   SilcUInt32 ake_generation;	/* current AKE rekey generation */
61 
62   SilcAtomic32 refcnt;		/* Reference counter */
63   SilcAtomic32 deleted;	        /* Flag indicating whether the client object is
64 				   already scheduled for deletion */
65   SilcUInt16 resolve_cmd_ident;	/* Command identifier when resolving */
66 
67   /* Flags */
68   unsigned int valid       : 1;	/* FALSE if this entry is not valid.  Entry
69 				   without nickname is not valid. */
70   unsigned int generated   : 1; /* TRUE if library generated `key' */
71   unsigned int prv_resp    : 1; /* TRUE if we are responder when using
72 				   private message keys. */
73   unsigned int no_ake      : 1;	/* TRUE if client doesn't support
74 				   auto-negotiation of private message key,
75 				   or it doesn't work. */
76 } SilcClientEntryInternal;
77 
78 /* Internal channel entry context */
79 typedef struct SilcChannelEntryInternalStruct {
80   SilcRwLock lock;		             /* Read/write lock */
81 
82   /* SilcChannelEntry status information */
83   SilcDList old_channel_keys;
84   SilcDList old_hmacs;
85 
86   /* Channel private keys */
87   SilcDList private_keys;		     /* List of private keys or NULL */
88   SilcChannelPrivateKey curr_key;	     /* Current private key */
89 
90   /* Channel keys */
91   SilcCipher send_key;                       /* The channel key */
92   SilcCipher receive_key;                    /* The channel key */
93   SilcHmac hmac;			     /* Current HMAC */
94   unsigned char iv[SILC_CIPHER_MAX_IV_SIZE]; /* Current IV */
95 
96   SilcAtomic32 refcnt;		             /* Reference counter */
97   SilcAtomic32 deleted;                      /* Flag indicating whether the
98 						channel object is already
99 						scheduled for deletion */
100   SilcUInt16 resolve_cmd_ident;		     /* Channel information resolving
101 						identifier. This is used when
102 						resolving users, and other
103 						stuff that relates to the
104 						channel. Not used for the
105 						channel resolving itself. */
106 } SilcChannelEntryInternal;
107 
108 /* Internal server entry context */
109 typedef struct SilcServerEntryInternalStruct {
110   SilcRwLock lock;		             /* Read/write lock */
111   SilcUInt16 resolve_cmd_ident;		     /* Resolving identifier */
112   SilcAtomic32 refcnt;		             /* Reference counter */
113   SilcAtomic32 deleted;	                     /* Flag indicating whether the
114 						server object is already
115 						scheduled for deletion. */
116 } SilcServerEntryInternal;
117 
118 #endif /* CLIENT_H */
119