* copy vendor drop to trunk
[lab.git] / Dev / utvpn / utvpn-unix-v101-7101-public / src / Cedar / Connection.h
1 // SoftEther UT-VPN SourceCode\r
2 // \r
3 // Copyright (C) 2004-2010 SoftEther Corporation.\r
4 // Copyright (C) 2004-2010 University of Tsukuba, Japan.\r
5 // Copyright (C) 2003-2010 Daiyuu Nobori.\r
6 // All Rights Reserved.\r
7 // \r
8 // http://utvpn.tsukuba.ac.jp/\r
9 // \r
10 // This program is free software; you can redistribute it and/or\r
11 // modify it under the terms of the GNU General Public License\r
12 // version 2 as published by the Free Software Foundation.\r
13 // \r
14 // This program is distributed in the hope that it will be useful,\r
15 // but WITHOUT ANY WARRANTY; without even the implied warranty of\r
16 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\r
17 // GNU General Public License for more details.\r
18 // \r
19 // You should have received a copy of the GNU General Public License version 2\r
20 // along with this program; if not, write to the Free Software\r
21 // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\r
22 // \r
23 // このファイルは GPL バージョン 2 ライセンスで公開されています。\r
24 // 誰でもこのファイルの内容を複製、改変したり、改変したバージョンを再配布\r
25 // することができます。ただし、原著作物を改変した場合は、原著作物の著作権表示\r
26 // を除去することはできません。改変した著作物を配布する場合は、改変実施者の\r
27 // 著作権表示を原著作物の著作権表示に付随して記載するようにしてください。\r
28 // \r
29 // この SoftEther UT-VPN オープンソース・プロジェクトは、日本国の\r
30 // ソフトイーサ株式会社 (SoftEther Corporation, http://www.softether.co.jp/ )\r
31 // および筑波大学 (University of Tsukuba, http://www.tsukuba.ac.jp/ ) によって\r
32 // ホストされています。\r
33 // 本プログラムの配布者は、本プログラムを、業としての利用以外のため、\r
34 // および、試験または研究のために利用が行われることを想定して配布\r
35 // しています。\r
36 // SoftEther UT-VPN プロジェクトの Web サイトは http://utvpn.tsukuba.ac.jp/ に\r
37 // あります。\r
38 // 本ソフトウェアの不具合の修正、機能改良、セキュリティホールの修復などのコード\r
39 // の改変を行った場合で、その成果物を SoftEther UT-VPN プロジェクトに提出して\r
40 // いただける場合は、 http://utvpn.tsukuba.ac.jp/ までソースコードを送付して\r
41 // ください。SoftEther UT-VPN プロジェクトの本体リリースまたはブランチリリース\r
42 // に組み込みさせていただきます。\r
43 // \r
44 // GPL に基づいて原著作物が提供される本ソフトウェアの改良版を配布、販売する\r
45 // 場合は、そのソースコードを GPL に基づいて誰にでも開示する義務が生じます。\r
46 // \r
47 // 本ソフトウェアに関連する著作権、特許権、商標権はソフトイーサ株式会社\r
48 // (SoftEther Corporation) およびその他の著作権保持者が保有しています。\r
49 // ソフトイーサ株式会社等はこれらの権利を放棄していません。本ソフトウェアの\r
50 // 二次著作物を配布、販売する場合は、これらの権利を侵害しないようにご注意\r
51 // ください。\r
52 // \r
53 // お願い: どのような通信ソフトウェアにも通常は必ず未発見の\r
54 // セキュリティホールが潜んでいます。本ソースコードをご覧いただいた結果、\r
55 // UT-VPN にセキュリティホールを発見された場合は、当該セキュリティホールの\r
56 // 情報を不特定多数に開示される前に、必ず、ソフトイーサ株式会社\r
57 // および脆弱性情報の届出を受け付ける公的機関まで通報いただき、\r
58 // 公益保護にご協力いただきますようお願い申し上げます。\r
59 // \r
60 // ソフトイーサ株式会社は、当該セキュリティホールについて迅速に対処を\r
61 // 行い、UT-VPN および UT-VPN に関連するソフトウェアのユーザー・顧客\r
62 // を保護するための努力を行います。\r
63 // \r
64 // ソフトイーサへの届出先: http://www.softether.co.jp/jp/contact/\r
65 // 日本国内の脆弱性情報届出受付公的機関:\r
66 //         独立行政法人 情報処理推進機構\r
67 //         http://www.ipa.go.jp/security/vuln/report/\r
68 // \r
69 // 上記各事項について不明な点は、ソフトイーサ株式会社までご連絡ください。\r
70 // 連絡先: http://www.softether.co.jp/jp/contact/\r
71 \r
72 // -----------------------------------------------\r
73 // [ChangeLog]\r
74 // 2010.05.20\r
75 //  新規リリース by SoftEther\r
76 // -----------------------------------------------\r
77 \r
78 // Connection.h\r
79 // Connection.c のヘッダ\r
80 \r
81 #ifndef CONNECTION_H\r
82 #define CONNECTION_H\r
83 \r
84 #define KEEP_ALIVE_STRING                               "Internet Connection Keep Alive Packet"\r
85 \r
86 // KEEP CONNECT 構造体\r
87 struct KEEP\r
88 {\r
89         LOCK *lock;                                                                             // ロック\r
90         bool Server;                                                                    // サーバーモード\r
91         volatile bool Halt;                                                             // 停止フラグ\r
92         bool Enable;                                                                    // 有効フラグ\r
93         char ServerName[MAX_HOST_NAME_LEN + 1];                 // サーバー名\r
94         UINT ServerPort;                                                                // サーバーポート番号\r
95         bool UdpMode;                                                                   // UDP モード\r
96         UINT Interval;                                                                  // パケット送出間隔\r
97         THREAD *Thread;                                                                 // 接続スレッド\r
98         EVENT *HaltEvent;                                                               // 停止イベント\r
99         CANCEL *Cancel;                                                                 // キャンセル\r
100 };\r
101 \r
102 // 構造体\r
103 struct SECURE_SIGN\r
104 {\r
105         char SecurePublicCertName[MAX_SECURE_DEVICE_FILE_LEN + 1];      // セキュアデバイス証明書名\r
106         char SecurePrivateKeyName[MAX_SECURE_DEVICE_FILE_LEN + 1];      // セキュアデバイス秘密鍵名\r
107         X *ClientCert;                                  // クライアント証明書\r
108         UCHAR Random[SHA1_SIZE];                // 署名元乱数値\r
109         UCHAR Signature[128];                   // 署名済データ\r
110         UINT UseSecureDeviceId;\r
111         UINT BitmapId;                                  // ビットマップ ID\r
112 };\r
113 \r
114 // 関数型宣言\r
115 typedef bool (CHECK_CERT_PROC)(SESSION *s, CONNECTION *c, X *server_x, bool *expired);\r
116 typedef bool (SECURE_SIGN_PROC)(SESSION *s, CONNECTION *c, SECURE_SIGN *sign);\r
117 \r
118 // RC4 鍵ペア\r
119 struct RC4_KEY_PAIR\r
120 {\r
121         UCHAR ServerToClientKey[16];\r
122         UCHAR ClientToServerKey[16];\r
123 };\r
124 \r
125 // クライアントオプション\r
126 struct CLIENT_OPTION\r
127 {\r
128         wchar_t AccountName[MAX_ACCOUNT_NAME_LEN + 1];  // 接続設定名\r
129         char Hostname[MAX_HOST_NAME_LEN + 1];                   // ホスト名\r
130         UINT Port;                                                                              // ポート番号\r
131         UINT PortUDP;                                                                   // UDP ポート番号 (0…TCPのみ使用)\r
132         UINT ProxyType;                                                                 // プロキシの種類\r
133         char ProxyName[MAX_HOST_NAME_LEN + 1];                  // プロキシサーバー名\r
134         UINT ProxyPort;                                                                 // プロキシサーバーのポート番号\r
135         char ProxyUsername[MAX_PROXY_USERNAME_LEN + 1]; // 最大ユーザー名長\r
136         char ProxyPassword[MAX_PROXY_PASSWORD_LEN + 1]; // 最大パスワード長\r
137         UINT NumRetry;                                                                  // 自動リトライ回数\r
138         UINT RetryInterval;                                                             // リトライ間隔\r
139         char HubName[MAX_HUBNAME_LEN + 1];                              // HUB 名\r
140         UINT MaxConnection;                                                             // 最大同時接続 TCP コネクション数\r
141         bool UseEncrypt;                                                                // 暗号化通信を使用\r
142         bool UseCompress;                                                               // データ圧縮を使用\r
143         bool HalfConnection;                                                    // TCP でハーフコネクションを利用する\r
144         bool NoRoutingTracking;                                                 // ルーティング追跡を無効にする\r
145         char DeviceName[MAX_DEVICE_NAME_LEN + 1];               // VLAN デバイス名\r
146         UINT AdditionalConnectionInterval;                              // 追加コネクション確立時の接続試行間隔\r
147         UINT ConnectionDisconnectSpan;                                  // コネクション切断間隔\r
148         bool HideStatusWindow;                                                  // 状況ウインドウを非表示にする\r
149         bool HideNicInfoWindow;                                                 // NIC 状態ウインドウを非表示にする\r
150         bool RequireMonitorMode;                                                // モニタポートモード\r
151         bool RequireBridgeRoutingMode;                                  // ブリッジまたはルーティングモード\r
152         bool DisableQoS;                                                                // VoIP / QoS 機能を無効化する\r
153         bool FromAdminPack;                                                             // Administration Pack 用\r
154         bool NoTls1;                                                                    // TLS 1.0 を使用しない\r
155 };\r
156 \r
157 // クライアント認証データ\r
158 struct CLIENT_AUTH\r
159 {\r
160         UINT AuthType;                                                                  // 認証の種類\r
161         char Username[MAX_USERNAME_LEN + 1];                    // ユーザー名\r
162         UCHAR HashedPassword[SHA1_SIZE];                                // ハッシュされたパスワード\r
163         char PlainPassword[MAX_PASSWORD_LEN + 1];               // パスワード\r
164         X *ClientX;                                                                             // クライアント証明書\r
165         K *ClientK;                                                                             // クライアント秘密鍵\r
166         char SecurePublicCertName[MAX_SECURE_DEVICE_FILE_LEN + 1];      // セキュアデバイス証明書名\r
167         char SecurePrivateKeyName[MAX_SECURE_DEVICE_FILE_LEN + 1];      // セキュアデバイス秘密鍵名\r
168         CHECK_CERT_PROC *CheckCertProc;                                 // サーバー証明書確認用プロシージャ\r
169         SECURE_SIGN_PROC *SecureSignProc;                               // セキュリティ署名用プロシージャ\r
170 };\r
171 \r
172 // TCP ソケットデータ構造体\r
173 struct TCPSOCK\r
174 {\r
175         SOCK *Sock;                                             // ソケット\r
176         FIFO *RecvFifo;                                 // 受信バッファ\r
177         FIFO *SendFifo;                                 // 送信バッファ\r
178         UINT Mode;                                              // 読み取りモード\r
179         UINT WantSize;                                  // 要求しているデータサイズ\r
180         UINT NextBlockNum;                              // 次に読み取れるブロック数の合計\r
181         UINT NextBlockSize;                             // 次に読み取る予定のブロックサイズ\r
182         UINT CurrentPacketNum;                  // 現在のパケット番号\r
183         UINT64 LastCommTime;                    // 最後に通信を行った時刻\r
184         UINT LateCount;                                 // 遅延回数\r
185         UINT Direction;                                 // 方向\r
186         UINT64 NextKeepAliveTime;               // 次に KeepAlive パケットを送信する時刻\r
187         RC4_KEY_PAIR Rc4KeyPair;                // RC4 キーペア\r
188         CRYPT *SendKey;                                 // 送信鍵\r
189         CRYPT *RecvKey;                                 // 受信鍵\r
190         UINT64 DisconnectTick;                  // このコネクションを切断する予定の時刻\r
191 };\r
192 \r
193 // TCP 通信データ構造体\r
194 struct TCP\r
195 {\r
196         LIST *TcpSockList;                              // TCP ソケットリスト\r
197 };\r
198 \r
199 // UDP 通信データ構造体\r
200 struct UDP\r
201 {\r
202         SOCK *s;                                                // UDP ソケット (送信用)\r
203         IP ip;                                                  // 送信先 IP アドレス\r
204         UINT port;                                              // 送信先ポート番号\r
205         UINT64 NextKeepAliveTime;               // 次に KeepAlive パケットを送信する時刻\r
206         UINT64 Seq;                                             // パケットシーケンス番号\r
207         UINT64 RecvSeq;\r
208         QUEUE *BufferQueue;                             // 送信予定バッファのキュー\r
209 };\r
210 \r
211 // データブロック\r
212 struct BLOCK\r
213 {\r
214         BOOL Compressed;                                // 圧縮フラグ\r
215         UINT Size;                                              // ブロックサイズ\r
216         UINT SizeofData;                                // データサイズ\r
217         UCHAR *Buf;                                             // バッファ\r
218         bool PriorityQoS;                               // VoIP / QoS 機能用優先パケット\r
219 };\r
220 \r
221 // コネクション構造体\r
222 struct CONNECTION\r
223 {\r
224         LOCK *lock;                                             // ロック\r
225         REF *ref;                                               // 参照カウンタ\r
226         CEDAR *Cedar;                                   // Cedar\r
227         struct SESSION *Session;                // セッション\r
228         UINT Protocol;                                  // プロトコル\r
229         SOCK *FirstSock;                                // ネゴシエーション用のソケット\r
230         TCP *Tcp;                                               // TCP 通信データ構造体\r
231         UDP *Udp;                                               // UDP 通信データ構造体\r
232         bool ServerMode;                                // サーバーモード\r
233         UINT Status;                                    // 状態\r
234         char *Name;                                             // コネクション名\r
235         THREAD *Thread;                                 // スレッド\r
236         volatile bool Halt;                             // 停止フラグ\r
237         UCHAR Random[SHA1_SIZE];                // 認証用乱数\r
238         UINT ServerVer;                                 // サーバーバージョン\r
239         UINT ServerBuild;                               // サーバービルド番号\r
240         UINT ClientVer;                                 // クライアントバージョン\r
241         UINT ClientBuild;                               // クライアントビルド番号\r
242         char ServerStr[MAX_SERVER_STR_LEN + 1]; // サーバー文字列\r
243         char ClientStr[MAX_CLIENT_STR_LEN + 1]; // クライアント文字列\r
244         UINT Err;                                               // エラー値\r
245         bool ClientConnectError_NoSavePassword; // 指定されたユーザー名に関してパスワードを保存しない\r
246         QUEUE *ReceivedBlocks;                  // 受信したブロック キュー\r
247         QUEUE *SendBlocks;                              // 送信する予定のブロック キュー\r
248         QUEUE *SendBlocks2;                             // 送信キュー (優先度高)\r
249         COUNTER *CurrentNumConnection;  // 現在のコネクション数のカウンタ\r
250         LIST *ConnectingThreads;                // 接続中のスレッドのリスト\r
251         LIST *ConnectingSocks;                  // 接続中のソケットのリスト\r
252         bool flag1;                                             // フラグ 1\r
253         UCHAR *RecvBuf;                                 // 受信バッファ\r
254         char ServerName[MAX_HOST_NAME_LEN + 1]; // サーバー名\r
255         UINT ServerPort;                                // ポート番号\r
256         bool RestoreServerNameAndPort;  // サーバー名とポート番号を元に戻すフラグ\r
257         bool UseTicket;                                 // チケット使用フラグ\r
258         UCHAR Ticket[SHA1_SIZE];                // チケット\r
259         UINT CurrentSendQueueSize;              // 送信キューの合計サイズ\r
260         X *ServerX;                                             // サーバー証明書\r
261         X *ClientX;                                             // クライアント証明書\r
262         char *CipherName;                               // 暗号化アルゴリズム名\r
263         UINT64 ConnectedTick;                   // 接続された時刻\r
264         IP ClientIp;                                    // クライアント IP アドレス\r
265         char ClientHostname[MAX_HOST_NAME_LEN + 1];     // クライアントホスト名\r
266         UINT Type;                                              // 種類\r
267         bool DontUseTls1;                               // TLS 1.0 を使用しない\r
268         void *hWndForUI;                                // 親ウインドウ\r
269 };\r
270 \r
271 \r
272 \r
273 // 関数プロトタイプ\r
274 \r
275 CONNECTION *NewClientConnection(SESSION *s);\r
276 CONNECTION *NewClientConnectionEx(SESSION *s, char *client_str, UINT client_ver, UINT client_build);\r
277 CONNECTION *NewServerConnection(CEDAR *cedar, SOCK *s, THREAD *t);\r
278 void ReleaseConnection(CONNECTION *c);\r
279 void CleanupConnection(CONNECTION *c);\r
280 int CompareConnection(void *p1, void *p2);\r
281 void StopConnection(CONNECTION *c, bool no_wait);\r
282 void ConnectionAccept(CONNECTION *c);\r
283 void StartTunnelingMode(CONNECTION *c);\r
284 void EndTunnelingMode(CONNECTION *c);\r
285 void DisconnectTcpSockets(CONNECTION *c);\r
286 void ConnectionReceive(CONNECTION *c, CANCEL *c1, CANCEL *c2);\r
287 void ConnectionSend(CONNECTION *c);\r
288 TCPSOCK *NewTcpSock(SOCK *s);\r
289 void FreeTcpSock(TCPSOCK *ts);\r
290 BLOCK *NewBlock(void *data, UINT size, int compress);\r
291 void FreeBlock(BLOCK *b);\r
292 void StopAllAdditionalConnectThread(CONNECTION *c);\r
293 UINT GenNextKeepAliveSpan(CONNECTION *c);\r
294 void SendKeepAlive(CONNECTION *c, TCPSOCK *ts);\r
295 void DisconnectUDPSockets(CONNECTION *c);\r
296 void PutUDPPacketData(CONNECTION *c, void *data, UINT size);\r
297 void SendDataWithUDP(SOCK *s, CONNECTION *c);\r
298 void InsertReveicedBlockToQueue(CONNECTION *c, BLOCK *block);\r
299 void InitTcpSockRc4Key(TCPSOCK *ts, bool server_mode);\r
300 UINT TcpSockRecv(SESSION *s, TCPSOCK *ts, void *data, UINT size);\r
301 UINT TcpSockSend(SESSION *s, TCPSOCK *ts, void *data, UINT size);\r
302 void WriteSendFifo(SESSION *s, TCPSOCK *ts, void *data, UINT size);\r
303 void WriteRecvFifo(SESSION *s, TCPSOCK *ts, void *data, UINT size);\r
304 CLIENT_AUTH *CopyClientAuth(CLIENT_AUTH *a);\r
305 BUF *NewKeepPacket(bool server_mode);\r
306 void KeepThread(THREAD *thread, void *param);\r
307 KEEP *StartKeep();\r
308 void StopKeep(KEEP *k);\r
309 void InRpcSecureSign(SECURE_SIGN *t, PACK *p);\r
310 void OutRpcSecureSign(PACK *p, SECURE_SIGN *t);\r
311 void FreeRpcSecureSign(SECURE_SIGN *t);\r
312 void NormalizeEthMtu(BRIDGE *b, CONNECTION *c, UINT packet_size);\r
313 \r
314 \r
315 \r
316 #endif  // CONNECTION_H\r
317 \r