source: lab.git/Dev/utvpn/utvpn-unix-v101-7101-public/src/Ham/Ham.c @ 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: 11.9 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// Ham.c
79// Hamster テストプログラム
80// (UT-VPN の動作テストを行うための CUI プログラム。)
81
82
83
84#define HAM_C
85
86#ifdef  WIN32
87#define HAM_WIN32
88#define _WIN32_WINNT        0x0502
89#define WINVER              0x0502
90#include <winsock2.h>
91#include <Ws2tcpip.h>
92#include <windows.h>
93#include <DbgHelp.h>
94#include <Iphlpapi.h>
95#include <wtsapi32.h>
96#include "../pencore/resource.h"
97#endif
98
99#include <stdio.h>
100#include <stdlib.h>
101#include <string.h>
102#include <wchar.h>
103#include <stdarg.h>
104#include <time.h>
105#include <errno.h>
106#include <math.h>
107#include <openssl/ssl.h>
108#include <openssl/err.h>
109#include <openssl/rand.h>
110#include <openssl/engine.h>
111#include <openssl/bio.h>
112#include <openssl/x509.h>
113#include <openssl/pkcs7.h>
114#include <openssl/pkcs12.h>
115#include <openssl/rc4.h>
116#include <openssl/md5.h>
117#include <openssl/sha.h>
118#include <Mayaqua/Mayaqua.h>
119#include <Cedar/Cedar.h>
120#include "Ham.h"
121
122// テスト関数一覧定義
123typedef void (TEST_PROC)(UINT num, char **arg);
124
125typedef struct TEST_LIST
126{
127    char *command_str;
128    TEST_PROC *proc;
129} TEST_LIST;
130
131typedef struct TESTST
132{
133    USHORT a:4, b:4;
134} TESTST;
135
136void test(UINT num, char **arg)
137{
138}
139
140// デバッグ
141void debug(UINT num, char **arg)
142{
143    // カーネル状態の表示
144    if (g_debug)
145    {
146        PrintKernelStatus();
147    }
148
149    // デバッグ情報の表示
150    if (g_memcheck)
151    {
152        PrintDebugInformation();
153    }
154}
155
156void client_test(UINT num, char **arg)
157{
158#ifdef  OS_WIN32
159    MsWriteCallingServiceManagerProcessId("utvpnclient", MsGetCurrentProcessId());
160#endif  // OS_WIN32
161
162    Print("Client Test.\n");
163    CtStartClient();
164    GetLine(NULL, 0);
165    CtStopClient();
166
167#ifdef  OS_WIN32
168    MsWriteCallingServiceManagerProcessId("utvpnclient", 0);
169#endif  // OS_WIN32
170}
171
172void server_test(UINT num, char **arg)
173{
174    UINT p[] = {52, 80, 8080, 3128};
175    Print("Server Test.\n");
176
177    if (num != 0)
178    {
179        SERVER_CONFIG_FILE_NAME = "@vpn_member_server.config";
180    }
181
182    StInit();
183
184    StStartServer(false);
185
186    GetLine(NULL, 0);
187
188    if (0 && num != 0)
189    {
190        UINT ports[] = {443, 992};
191        UCHAR password[SHA1_SIZE];
192        Hash(password, "", 0, true);
193        SiSetServerType(StGetServer(), SERVER_TYPE_FARM_MEMBER, 0x0100007f,
194            sizeof(ports) / sizeof(ports[0]), ports, "pc1.sec.softether.co.jp", 5555, password, 0, false);
195        GetLine(NULL, 0);
196    }
197
198    if (0 && num == 0)
199    {
200        HUB *h = GetHub(StGetServer()->Cedar, "DEFAULT");
201        SetHubOffline(h);
202        GetLine(NULL, 0);
203        SetHubOnline(h);
204        GetLine(NULL, 0);
205        ReleaseHub(h);
206    }
207
208    StStopServer();
209
210    StFree();
211}
212
213void disablevlan(UINT num, char **arg)
214{
215#ifdef  OS_WIN32
216    bool ok;
217    if (num < 1)
218    {
219        Print("NO NAME.\n");
220        return;
221    }
222
223    ok = MsDisableVLan(arg[0]);
224
225#ifdef  VISTA_HAM
226    if (ok == false)
227    {
228        _exit(1);
229    }
230    else
231    {
232        _exit(0);
233    }
234#endif
235#endif  // OS_WIN32
236}
237
238void enablevlan(UINT num, char **arg)
239{
240#ifdef  OS_WIN32
241    bool ok;
242    if (num < 1)
243    {
244        Print("NO NAME.\n");
245        return;
246    }
247
248    ok = MsEnableVLan(arg[0]);
249
250#ifdef  VISTA_HAM
251    if (ok == false)
252    {
253        _exit(1);
254    }
255    else
256    {
257        _exit(0);
258    }
259#endif
260#endif  // OS_WIN32
261}
262
263void instvlan(UINT num, char **arg)
264{
265#ifdef  OS_WIN32
266    KAKUSHI *k = NULL;
267    bool ok;
268    if (num < 1)
269    {
270        Print("NO NAME.\n");
271        return;
272    }
273
274    InitWinUi(L"VPN", _SS("DEFAULT_FONT"), _II("DEFAULT_FONT_SIZE"));
275
276    if (MsIsNt())
277    {
278        k = InitKakushi();
279    }
280
281    ok = MsInstallVLan(VLAN_ADAPTER_NAME_TAG, VLAN_CONNECTION_NAME, arg[0]);
282
283    FreeKakushi(k);
284
285    FreeWinUi();
286
287#ifdef  VISTA_HAM
288    if (ok == false)
289    {
290        _exit(1);
291    }
292    else
293    {
294        _exit(0);
295    }
296#endif
297#endif
298}
299
300void upgradevlan(UINT num, char **arg)
301{
302#ifdef  OS_WIN32
303    bool ok;
304    KAKUSHI *k = NULL;
305    if (num < 1)
306    {
307        Print("NO NAME.\n");
308        return;
309    }
310
311    InitWinUi(L"VPN", _SS("DEFAULT_FONT"), _II("DEFAULT_FONT_SIZE"));
312
313    if (MsIsNt())
314    {
315        k = InitKakushi();
316    }
317
318    ok = MsUpgradeVLan(VLAN_ADAPTER_NAME_TAG, VLAN_CONNECTION_NAME, arg[0]);
319
320    FreeKakushi(k);
321
322    FreeWinUi();
323
324#ifdef  VISTA_HAM
325    if (ok == false)
326    {
327        _exit(1);
328    }
329    else
330    {
331        _exit(0);
332    }
333#endif
334#endif
335}
336
337void uninstvlan(UINT num, char **arg)
338{
339#ifdef  OS_WIN32
340    bool ok;
341    if (num < 1)
342    {
343        Print("NO NAME.\n");
344        return;
345    }
346
347    ok = MsUninstallVLan(arg[0]);
348
349#ifdef  VISTA_HAM
350    if (ok == false)
351    {
352        _exit(1);
353    }
354    else
355    {
356        _exit(0);
357    }
358#endif
359#endif
360}
361
362void sm_test(UINT num, char **arg)
363{
364#ifdef  OS_WIN32
365    SMExec();
366#endif
367}
368
369void cm_test(UINT num, char **arg)
370{
371#ifdef  OS_WIN32
372    CMExec();
373#endif
374}
375
376TEST_LIST test_list[] =
377{
378    {"cc", client_test},
379    {"ss", server_test},
380    {"instvlan", instvlan},
381    {"uninstvlan", uninstvlan},
382    {"upgradevlan", upgradevlan},
383    {"enablevlan", enablevlan},
384    {"disablevlan", disablevlan},
385    {"cm", cm_test},
386    {"sm", sm_test},
387    {"test", test},
388};
389
390// テスト関数
391void TestMain(char *cmd)
392{
393    char tmp[MAX_SIZE];
394    bool first = true;
395    bool exit_now = false;
396
397    Print("SoftEther UT-VPN Hamster Tester\n\n"
398        "Copyright (C) 2004-2010 SoftEther Corporation.\nCopyright (C) 2004-2010 University of Tsukuba, Japan.\n"
399        "Copyright (C) 2003-2010 Daiyuu Nobori.\nAll Rights Reserved.\n\n");
400
401#ifdef  OS_WIN32
402    MsSetEnableMinidump(false);
403#endif  // OS_WIN32
404
405    while (true)
406    {
407        Print("TEST>");
408        if (first && StrLen(cmd) != 0 && g_memcheck == false)
409        {
410            first = false;
411            StrCpy(tmp, sizeof(tmp), cmd);
412            exit_now = true;
413            Print("%s\n", cmd);
414        }
415        else
416        {
417            GetLine(tmp, sizeof(tmp));
418        }
419        Trim(tmp);
420        if (StrLen(tmp) != 0)
421        {
422            UINT i, num;
423            bool b = false;
424            TOKEN_LIST *token = ParseCmdLine(tmp);
425            char *cmd = token->Token[0];
426            if (!StrCmpi(cmd, "exit") || !StrCmpi(cmd, "quit") || !StrCmpi(cmd, "q"))
427            {
428                FreeToken(token);
429                break;
430            }
431            if (StartWith(tmp, "utvpncmd"))
432            {
433                wchar_t *s = CopyStrToUni(tmp);
434                CommandMain(s);
435                Free(s);
436            }
437            else
438            {
439                num = sizeof(test_list) / sizeof(TEST_LIST);
440                for (i = 0;i < num;i++)
441                {
442                    if (!StrCmpi(test_list[i].command_str, cmd))
443                    {
444                        char **arg = Malloc(sizeof(char *) * (token->NumTokens - 1));
445                        UINT j;
446                        for (j = 0;j < token->NumTokens - 1;j++)
447                        {
448                            arg[j] = CopyStr(token->Token[j + 1]);
449                        }
450                        test_list[i].proc(token->NumTokens - 1, arg);
451                        for (j = 0;j < token->NumTokens - 1;j++)
452                        {
453                            Free(arg[j]);
454                        }
455                        Free(arg);
456                        b = true;
457                        Print("\n");
458                        break;
459                    }
460                }
461                if (b == false)
462                {
463                    Print("Invalid Command: %s\n\n", cmd);
464                }
465            }
466            FreeToken(token);
467
468            if (exit_now)
469            {
470                break;
471            }
472        }
473    }
474    Print("Exiting...\n\n");
475}
476
477#ifdef  WIN32
478// winmain 関数
479int PASCAL WinMain(HINSTANCE hInst, HINSTANCE hPrev, char *CmdLine, int CmdShow)
480{
481    main(0, NULL);
482}
483#endif
484
485// main 関数
486int main(int argc, char *argv[])
487{
488    bool memchk = false;
489    UINT i;
490    char cmd[MAX_SIZE];
491    char *s;
492
493    printf("Starting Test Program...\n");
494
495    cmd[0] = 0;
496    if (argc >= 2)
497    {
498        for (i = 1;i < (UINT)argc;i++)
499        {
500            s = argv[i];
501            if (s[0] == '/')
502            {
503                if (!StrCmpi(s, "/memcheck"))
504                {
505                    memchk = true;
506                }
507            }
508            else
509            {
510                StrCpy(cmd, sizeof(cmd), &s[0]);
511            }
512        }
513    }
514
515    InitMayaqua(memchk, true, argc, argv);
516    EnableProbe(true);
517    InitCedar();
518    SetHamMode();
519    TestMain(cmdline);
520    FreeCedar();
521    FreeMayaqua();
522
523    return 0;
524}
525
Note: See TracBrowser for help on using the repository browser.