1 // SoftEther UT-VPN SourceCode
\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
8 // http://utvpn.tsukuba.ac.jp/
\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
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
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
23 // このファイルは GPL バージョン 2 ライセンスで公開されています。
\r
24 // 誰でもこのファイルの内容を複製、改変したり、改変したバージョンを再配布
\r
25 // することができます。ただし、原著作物を改変した場合は、原著作物の著作権表示
\r
26 // を除去することはできません。改変した著作物を配布する場合は、改変実施者の
\r
27 // 著作権表示を原著作物の著作権表示に付随して記載するようにしてください。
\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
33 // 本プログラムの配布者は、本プログラムを、業としての利用以外のため、
\r
34 // および、試験または研究のために利用が行われることを想定して配布
\r
36 // SoftEther UT-VPN プロジェクトの Web サイトは http://utvpn.tsukuba.ac.jp/ に
\r
38 // 本ソフトウェアの不具合の修正、機能改良、セキュリティホールの修復などのコード
\r
39 // の改変を行った場合で、その成果物を SoftEther UT-VPN プロジェクトに提出して
\r
40 // いただける場合は、 http://utvpn.tsukuba.ac.jp/ までソースコードを送付して
\r
41 // ください。SoftEther UT-VPN プロジェクトの本体リリースまたはブランチリリース
\r
44 // GPL に基づいて原著作物が提供される本ソフトウェアの改良版を配布、販売する
\r
45 // 場合は、そのソースコードを GPL に基づいて誰にでも開示する義務が生じます。
\r
47 // 本ソフトウェアに関連する著作権、特許権、商標権はソフトイーサ株式会社
\r
48 // (SoftEther Corporation) およびその他の著作権保持者が保有しています。
\r
49 // ソフトイーサ株式会社等はこれらの権利を放棄していません。本ソフトウェアの
\r
50 // 二次著作物を配布、販売する場合は、これらの権利を侵害しないようにご注意
\r
53 // お願い: どのような通信ソフトウェアにも通常は必ず未発見の
\r
54 // セキュリティホールが潜んでいます。本ソースコードをご覧いただいた結果、
\r
55 // UT-VPN にセキュリティホールを発見された場合は、当該セキュリティホールの
\r
56 // 情報を不特定多数に開示される前に、必ず、ソフトイーサ株式会社
\r
57 // および脆弱性情報の届出を受け付ける公的機関まで通報いただき、
\r
58 // 公益保護にご協力いただきますようお願い申し上げます。
\r
60 // ソフトイーサ株式会社は、当該セキュリティホールについて迅速に対処を
\r
61 // 行い、UT-VPN および UT-VPN に関連するソフトウェアのユーザー・顧客
\r
64 // ソフトイーサへの届出先: http://www.softether.co.jp/jp/contact/
\r
65 // 日本国内の脆弱性情報届出受付公的機関:
\r
67 // http://www.ipa.go.jp/security/vuln/report/
\r
69 // 上記各事項について不明な点は、ソフトイーサ株式会社までご連絡ください。
\r
70 // 連絡先: http://www.softether.co.jp/jp/contact/
\r
72 // -----------------------------------------------
\r
75 // 新規リリース by SoftEther
\r
76 // -----------------------------------------------
\r
79 // Connection.c のヘッダ
\r
81 #ifndef CONNECTION_H
\r
82 #define CONNECTION_H
\r
84 #define KEEP_ALIVE_STRING "Internet Connection Keep Alive Packet"
\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
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
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
119 struct RC4_KEY_PAIR
\r
121 UCHAR ServerToClientKey[16];
\r
122 UCHAR ClientToServerKey[16];
\r
126 struct CLIENT_OPTION
\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
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
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
196 LIST *TcpSockList; // TCP ソケットリスト
\r
202 SOCK *s; // UDP ソケット (送信用)
\r
203 IP ip; // 送信先 IP アドレス
\r
204 UINT port; // 送信先ポート番号
\r
205 UINT64 NextKeepAliveTime; // 次に KeepAlive パケットを送信する時刻
\r
206 UINT64 Seq; // パケットシーケンス番号
\r
208 QUEUE *BufferQueue; // 送信予定バッファのキュー
\r
214 BOOL Compressed; // 圧縮フラグ
\r
215 UINT Size; // ブロックサイズ
\r
216 UINT SizeofData; // データサイズ
\r
217 UCHAR *Buf; // バッファ
\r
218 bool PriorityQoS; // VoIP / QoS 機能用優先パケット
\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
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
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
267 bool DontUseTls1; // TLS 1.0 を使用しない
\r
268 void *hWndForUI; // 親ウインドウ
\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
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
316 #endif // CONNECTION_H
\r