source: lab.git/Dev/utvpn/utvpn-unix-v101-7101-public/src/Cedar/Connection.h @ 86521dd

trunk
Last change on this file since 86521dd was a1bae3e, checked in by mitty <mitty@…>, 12 years ago
  • copy vendor drop to trunk

git-svn-id: https://lab.mitty.jp/svn/lab/trunk@147 7d2118f6-f56c-43e7-95a2-4bb3031d96e7

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