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
87 typedef bool (PA_INIT)(SESSION *s);
\r
88 typedef CANCEL *(PA_GETCANCEL)(SESSION *s);
\r
89 typedef UINT (PA_GETNEXTPACKET)(SESSION *s, void **data);
\r
90 typedef bool (PA_PUTPACKET)(SESSION *s, void *data, UINT size);
\r
91 typedef void (PA_FREE)(SESSION *s);
\r
94 typedef void (CLIENT_STATUS_PRINTER)(SESSION *s, wchar_t *status);
\r
99 char ClientProductName[64]; // クライアント製品名
\r
100 UINT ClientProductVer; // クライアントバージョン
\r
101 UINT ClientProductBuild; // クライアントビルド番号
\r
102 char ServerProductName[64]; // サーバー製品名
\r
103 UINT ServerProductVer; // サーバーバージョン
\r
104 UINT ServerProductBuild; // サーバービルド番号
\r
105 char ClientOsName[64]; // クライアント OS 名
\r
106 char ClientOsVer[128]; // クライアント OS バージョン
\r
107 char ClientOsProductId[64]; // クライアント OS プロダクト ID
\r
108 char ClientHostname[64]; // クライアントホスト名
\r
109 UINT ClientIpAddress; // クライアント IP アドレス
\r
110 UINT ClientPort; // クライアントポート番号
\r
111 char ServerHostname[64]; // サーバーホスト名
\r
112 UINT ServerIpAddress; // サーバー IP アドレス
\r
113 UINT ServerPort; // サーバーポート番号
\r
114 char ProxyHostname[64]; // プロキシホスト名
\r
115 UINT ProxyIpAddress; // プロキシ IP アドレス
\r
116 UINT ProxyPort; // プロキシポート番号
\r
117 char HubName[64]; // HUB 名
\r
118 UCHAR UniqueId[16]; // ユニーク ID
\r
120 UCHAR ClientIpAddress6[16]; // クライアント IPv6 アドレス
\r
121 UCHAR ServerIpAddress6[16]; // サーバー IP アドレス
\r
122 UCHAR ProxyIpAddress6[16]; // プロキシ IP アドレス
\r
123 char Padding[304 - (16 * 3)]; // パディング
\r
127 struct PACKET_ADAPTER
\r
130 PA_GETCANCEL *GetCancel;
\r
131 PA_GETNEXTPACKET *GetNextPacket;
\r
132 PA_PUTPACKET *PutPacket;
\r
141 REF *ref; // 参照カウンタ
\r
142 CEDAR *Cedar; // Cedar
\r
143 bool LocalHostSession; // ローカルホストセッション
\r
144 bool ServerMode; // サーバーモードセッション
\r
145 bool LinkModeClient; // リンクモードクライアント
\r
146 bool LinkModeServer; // リンクモードサーバー
\r
147 bool SecureNATMode; // SecureNAT セッション
\r
148 bool BridgeMode; // Bridge セッション
\r
149 bool VirtualHost; // 仮想ホストモード
\r
150 bool L3SwitchMode; // Layer-3 スイッチモード
\r
151 THREAD *Thread; // 管理スレッド
\r
152 CONNECTION *Connection; // コネクション
\r
153 CLIENT_OPTION *ClientOption; // クライアント接続オプション
\r
154 CLIENT_AUTH *ClientAuth; // クライアント認証データ
\r
155 volatile bool Halt; // 停止フラグ
\r
156 volatile bool CancelConnect; // 接続のキャンセル
\r
157 EVENT *HaltEvent; // 停止イベント
\r
160 CANCEL *Cancel1; // キャンセルオブジェクト 1
\r
161 CANCEL *Cancel2; // キャンセルオブジェクト 2
\r
162 PACKET_ADAPTER *PacketAdapter; // パケットアダプタ
\r
163 UCHAR UdpSendKey[16]; // UDP 送信用暗号化鍵
\r
164 UCHAR UdpRecvKey[16]; // UDP 受信用暗号化鍵
\r
165 UINT ClientStatus; // クライアントステータス
\r
166 bool RetryFlag; // リトライフラグ (クライアント)
\r
167 bool ForceStopFlag; // 強制停止フラグ (クライアント)
\r
168 UINT CurrentRetryCount; // 現在のリトライカウンタ (クライアント)
\r
169 UINT RetryInterval; // リトライ間隔 (クライアント)
\r
170 bool ConnectSucceed; // 接続成功フラグ (クライアント)
\r
171 bool SessionTimeOuted; // セッションがタイムアウトした
\r
172 UINT Timeout; // タイムアウト時間
\r
173 UINT64 NextConnectionTime; // 次に追加コネクションを張る時刻
\r
174 IP ServerIP; // サーバーの IP アドレス
\r
175 bool ClientModeAndUseVLan; // クライアントモードで仮想 LAN カードを使用
\r
176 bool UseSSLDataEncryption; // SSL データ暗号化を使用する
\r
177 LOCK *TrafficLock; // トラフィックデータロック
\r
178 LINK *Link; // リンクオブジェクトへの参照
\r
179 SNAT *SecureNAT; // SecureNAT オブジェクトへの参照
\r
180 BRIDGE *Bridge; // Bridge オブジェクトへの参照
\r
181 NODE_INFO NodeInfo; // ノード情報
\r
182 UINT64 LastIncrementTraffic; // 最後にユーザーのトラフィックデータを更新した時刻
\r
183 bool AdministratorMode; // 管理者モード
\r
184 LIST *CancelList; // キャンセルリスト
\r
185 L3IF *L3If; // Layer-3 インターフェイス
\r
186 IP DefaultDns; // デフォルトの DNS サーバーの IP アドレス
\r
187 bool IPv6Session; // IPv6 セッション (物理的な通信が IPv6 である)
\r
188 UINT VLanId; // VLAN ID
\r
190 UINT64 CreatedTime; // 作成日時
\r
191 UINT64 LastCommTime; // 最終通信日時
\r
192 TRAFFIC *Traffic; // トラフィックデータ
\r
193 TRAFFIC *OldTraffic; // 古いトラフィックデータ
\r
194 UINT64 TotalSendSize; // 合計送信データサイズ
\r
195 UINT64 TotalRecvSize; // 合計受信データサイズ
\r
196 UINT64 TotalSendSizeReal; // 合計送信データサイズ (無圧縮)
\r
197 UINT64 TotalRecvSizeReal; // 合計受信データサイズ (無圧縮)
\r
198 char *Name; // セッション名
\r
199 char *Username; // ユーザー名
\r
200 char UserNameReal[MAX_USERNAME_LEN + 1]; // ユーザー名 (本物)
\r
201 char GroupName[MAX_USERNAME_LEN + 1]; // グループ名
\r
202 POLICY *Policy; // ポリシー
\r
203 UCHAR SessionKey[SHA1_SIZE]; // セッションキー
\r
204 UINT SessionKey32; // 32bit のセッションキー
\r
205 UINT MaxConnection; // 最大同時接続 TCP コネクション数
\r
206 bool UseEncrypt; // 暗号化通信を使用
\r
207 bool UseFastRC4; // 高速 RC4 暗号化を使用
\r
208 bool UseCompress; // データ圧縮を使用
\r
209 bool HalfConnection; // ハーフコネクションモード
\r
210 bool QoS; // VoIP / QoS
\r
211 bool NoSendSignature; // シグネチャを送信しない
\r
212 UINT64 FirstConnectionEstablisiedTime; // 最初のコネクションの接続完了時刻
\r
213 UINT64 CurrentConnectionEstablishTime; // このコネクションの接続完了時刻
\r
214 UINT NumConnectionsEatablished; // これまでに確立したコネクション数
\r
216 ACCOUNT *Account; // クライアント アカウント
\r
217 UINT VLanDeviceErrorCount; // 仮想 LAN カードでエラーが発生した回数
\r
218 bool Win32HideConnectWindow; // 接続ウインドウを非表示にする
\r
219 bool Win32HideNicInfoWindow; // NIC 情報ウインドウを非表示にする
\r
220 bool UserCanceled; // ユーザーによってキャンセルされた
\r
221 UINT64 LastTryAddConnectTime; // 最後にコネクションの追加を試行しようとした時刻
\r
223 bool IsMonitorMode; // モニタモードか否か
\r
224 bool IsBridgeMode; // ブリッジモードか否か
\r
225 bool UseClientLicense; // 割り当てられたクライアントライセンス数
\r
226 bool UseBridgeLicense; // 割り当てられたブリッジライセンス数
\r
228 COUNTER *LoggingRecordCount; // ロギング中のレコード数のカウンタ
\r
230 bool Client_NoSavePassword; // パスワードの保存を禁止
\r
231 wchar_t *Client_Message; // サーバーから送信されてきたメッセージ
\r
233 LIST *DelayedPacketList; // 遅延パケットリスト
\r
237 UINT64 LastDLinkSTPPacketSendTick; // 最後の D-Link STP パケット送出時刻
\r
238 UCHAR LastDLinkSTPPacketDataHash[MD5_SIZE]; // 最後の D-Link STP パケットハッシュ
\r
242 struct UI_PASSWORD_DLG
\r
244 UINT Type; // パスワードの種類
\r
245 char Username[MAX_USERNAME_LEN + 1]; // ユーザー名
\r
246 char Password[MAX_PASSWORD_LEN + 1]; // パスワード
\r
247 char ServerName[MAX_HOST_NAME_LEN + 1]; // サーバー名
\r
248 UINT RetryIntervalSec; // リトライまでの時間
\r
249 EVENT *CancelEvent; // ダイアログ表示をキャンセルするイベント
\r
250 bool ProxyServer; // プロキシサーバーに関する認証
\r
251 UINT64 StartTick; // 開始時刻
\r
252 bool AdminMode; // 管理モード
\r
253 bool ShowNoSavePassword; // パスワードを保存しないチェックボックスを表示するかどうか
\r
254 bool NoSavePassword; // パスワードを保存しないモード
\r
255 SOCK *Sock; // ソケット
\r
261 char ServerName[MAX_HOST_NAME_LEN + 1]; // サーバー名
\r
262 char HubName[MAX_HUBNAME_LEN + 1]; // 仮想 HUB 名
\r
263 wchar_t *Msg; // 本文
\r
264 SOCK *Sock; // ソケット
\r
265 bool Halt; // 閉じるフラグ
\r
271 wchar_t AccountName[MAX_SIZE]; // 接続設定名
\r
272 char NicName[MAX_SIZE]; // 仮想 NIC 名
\r
274 SOCK *Sock; // ソケット
\r
275 bool Halt; // 閉じるフラグ
\r
276 ROUTE_CHANGE *RouteChange; // ルーティングテーブル変更通知
\r
277 UINT CurrentIcon; // 現在のアイコン
\r
278 UINT64 CloseAfterTime; // 自動で閉じる
\r
282 struct UI_CONNECTERROR_DLG
\r
284 EVENT *CancelEvent; // ダイアログ表示をキャンセルするイベント
\r
285 wchar_t AccountName[MAX_ACCOUNT_NAME_LEN + 1]; // アカウント名
\r
286 char ServerName[MAX_HOST_NAME_LEN + 1]; // サーバー名
\r
287 UINT Err; // エラーコード
\r
288 UINT CurrentRetryCount; // 現在のリトライ回数
\r
289 UINT RetryLimit; // リトライ回数のリミット
\r
290 UINT64 StartTick; // 開始時刻
\r
291 UINT RetryIntervalSec; // リトライまでの時間
\r
292 bool HideWindow; // ウインドウを非表示にする
\r
293 SOCK *Sock; // ソケット
\r
296 // サーバー証明書チェックダイアログ
\r
297 struct UI_CHECKCERT
\r
299 wchar_t AccountName[MAX_ACCOUNT_NAME_LEN + 1]; // アカウント名
\r
300 char ServerName[MAX_HOST_NAME_LEN + 1]; // サーバー名
\r
302 X *parent_x; // 親証明書
\r
303 X *old_x; // 前回の証明書
\r
304 bool DiffWarning; // 証明書変造の警告を表示する
\r
305 bool Ok; // 接続許可フラグ
\r
306 bool SaveServerCert; // サーバー証明書を保存する
\r
307 SESSION *Session; // セッション
\r
308 volatile bool Halt; // 停止フラグ
\r
309 SOCK *Sock; // ソケット
\r
314 SESSION *NewClientSessionEx(CEDAR *cedar, CLIENT_OPTION *option, CLIENT_AUTH *auth, PACKET_ADAPTER *pa, struct ACCOUNT *account);
\r
315 SESSION *NewClientSession(CEDAR *cedar, CLIENT_OPTION *option, CLIENT_AUTH *auth, PACKET_ADAPTER *pa);
\r
316 SESSION *NewRpcSession(CEDAR *cedar, CLIENT_OPTION *option);
\r
317 SESSION *NewRpcSessionEx(CEDAR *cedar, CLIENT_OPTION *option, UINT *err, char *client_str);
\r
318 SESSION *NewRpcSessionEx2(CEDAR *cedar, CLIENT_OPTION *option, UINT *err, char *client_str, void *hWnd);
\r
319 SESSION *NewServerSession(CEDAR *cedar, CONNECTION *c, HUB *h, char *username, POLICY *policy);
\r
320 void ClientThread(THREAD *t, void *param);
\r
321 void ReleaseSession(SESSION *s);
\r
322 void CleanupSession(SESSION *s);
\r
323 void StopSession(SESSION *s);
\r
324 void StopSessionEx(SESSION *s, bool no_wait);
\r
325 bool SessionConnect(SESSION *s);
\r
326 bool ClientConnect(CONNECTION *c);
\r
327 int CompareSession(void *p1, void *p2);
\r
328 PACKET_ADAPTER *NewPacketAdapter(PA_INIT *init, PA_GETCANCEL *getcancel, PA_GETNEXTPACKET *getnext,
\r
329 PA_PUTPACKET *put, PA_FREE *free);
\r
330 void FreePacketAdapter(PACKET_ADAPTER *pa);
\r
331 void SessionMain(SESSION *s);
\r
332 void NewSessionKey(CEDAR *cedar, UCHAR *session_key, UINT *session_key_32);
\r
333 SESSION *GetSessionFromKey(CEDAR *cedar, UCHAR *session_key);
\r
334 SESSION *GetSessionFromKey32(CEDAR *cedar, UINT key32);
\r
335 void DebugPrintSessionKey(UCHAR *session_key);
\r
336 void ClientAdditionalConnectChance(SESSION *s);
\r
337 void SessionAdditionalConnect(SESSION *s);
\r
338 void ClientAdditionalThread(THREAD *t, void *param);
\r
339 void PrintSessionTotalDataSize(SESSION *s);
\r
340 void AddTrafficForSession(SESSION *s, TRAFFIC *t);
\r
341 void IncrementUserTraffic(HUB *hub, char *username, SESSION *s);
\r
342 void Notify(SESSION *s, UINT code);
\r
343 void PrintStatus(SESSION *s, wchar_t *str);
\r
344 LIST *NewCancelList();
\r
345 void ReleaseCancelList(LIST *o);
\r
346 void AddCancelList(LIST *o, CANCEL *c);
\r
347 void CancelList(LIST *o);
\r
348 bool CompareNodeInfo(NODE_INFO *a, NODE_INFO *b);
\r
349 bool IsPriorityHighestPacketForQoS(void *data, UINT size);
\r
350 UINT GetNextDelayedPacketTickDiff(SESSION *s);
\r
352 #endif // SESSION_H
\r