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 // Cedar 通信モジュールプログラムコード
\r
84 #include "CedarPch.h"
\r
86 static UINT init_cedar_counter = 0;
\r
87 static REF *cedar_log_ref = NULL;
\r
88 static LOG *cedar_log;
\r
90 // 現在サポートされている Windows のバージョンかどうか取得する
\r
91 // (以前、XP までしか想定していないコードを Vista (Longhorn) で動作させたときに
\r
92 // OS ごと大変おかしくなってしまったことがあるので、バージョンチェックは
\r
93 // 必ず行うようにした。ただし、警告メッセージを画面に表示するだけであり、
\r
94 // 動作は一応できるようにしている。)
\r
95 bool IsSupportedWinVer(RPC_WINVER *v)
\r
103 if (v->IsWindows == false)
\r
108 if (v->IsNT == false)
\r
118 if (v->VerMajor <= 4)
\r
124 if (v->VerMajor == 5 && v->VerMinor == 0)
\r
127 if (v->ServicePack <= 4)
\r
134 if (v->VerMajor == 5 && v->VerMinor == 1)
\r
137 if (v->ServicePack <= 3)
\r
144 if (v->VerMajor == 5 && v->VerMinor == 2)
\r
146 // Windows XP x64, Windows Server 2003
\r
147 if (v->ServicePack <= 2)
\r
154 if (v->VerMajor == 6 && v->VerMinor == 0)
\r
156 // Windows Vista, Server 2008
\r
157 if (v->ServicePack <= 2)
\r
164 if (v->VerMajor == 6 && v->VerMinor == 1)
\r
166 // Windows 7, Server 2008 R2
\r
167 if (v->ServicePack <= 0)
\r
177 // Windows のバージョンを取得する
\r
178 void GetWinVer(RPC_WINVER *v)
\r
189 Zero(v, sizeof(RPC_WINVER));
\r
190 StrCpy(v->Title, sizeof(v->Title), GetOsInfo()->OsProductName);
\r
195 void FreeTinyLog(TINY_LOG *t)
\r
204 DeleteLock(t->Lock);
\r
209 void WriteTinyLog(TINY_LOG *t, char *str)
\r
219 GetDateTimeStrMilli64(dt, sizeof(dt), LocalTime64());
\r
220 StrCat(dt, sizeof(dt), ": ");
\r
224 WriteBuf(b, dt, StrLen(dt));
\r
225 WriteBuf(b, str, StrLen(str));
\r
226 WriteBuf(b, "\r\n", 2);
\r
230 FileWrite(t->io, b->Buf, b->Size);
\r
239 TINY_LOG *NewTinyLog()
\r
241 char name[MAX_PATH];
\r
247 MakeDir(TINY_LOG_DIRNAME);
\r
249 Format(name, sizeof(name), TINY_LOG_FILENAME,
\r
250 st.wYear, st.wMonth, st.wDay, st.wHour, st.wMinute, st.wSecond);
\r
252 t = ZeroMalloc(sizeof(TINY_LOG));
\r
254 StrCpy(t->FileName, sizeof(t->FileName), name);
\r
255 t->io = FileCreate(name);
\r
256 t->Lock = NewLock();
\r
261 // 非 SSL リストのエントリの比較
\r
262 int CompareNoSslList(void *p1, void *p2)
\r
265 if (p1 == NULL || p2 == NULL)
\r
269 n1 = *(NON_SSL **)p1;
\r
270 n2 = *(NON_SSL **)p2;
\r
271 if (n1 == NULL || n2 == NULL)
\r
275 return CmpIpAddr(&n1->IpAddress, &n2->IpAddress);
\r
278 // 指定された IP アドレスが非 SSL リストに存在するかどうかチェック
\r
279 bool IsInNoSsl(CEDAR *c, IP *ip)
\r
283 if (c == NULL || ip == NULL)
\r
288 LockList(c->NonSslList);
\r
290 NON_SSL *n = SearchNoSslList(c, ip);
\r
294 if (n->EntryExpires > Tick64() && n->Count > NON_SSL_MIN_COUNT)
\r
296 n->EntryExpires = Tick64() + (UINT64)NON_SSL_ENTRY_EXPIRES;
\r
301 UnlockList(c->NonSslList);
\r
306 // 非 SSL リストのエントリをデクリメント
\r
307 void DecrementNoSsl(CEDAR *c, IP *ip, UINT num_dec)
\r
310 if (c == NULL || ip == NULL)
\r
315 LockList(c->NonSslList);
\r
317 NON_SSL *n = SearchNoSslList(c, ip);
\r
321 if (n->Count >= num_dec)
\r
323 n->Count -= num_dec;
\r
327 UnlockList(c->NonSslList);
\r
330 // 非 SSL リストにエントリを追加
\r
331 bool AddNoSsl(CEDAR *c, IP *ip)
\r
336 if (c == NULL || ip == NULL)
\r
341 LockList(c->NonSslList);
\r
345 n = SearchNoSslList(c, ip);
\r
349 n = ZeroMalloc(sizeof(NON_SSL));
\r
350 Copy(&n->IpAddress, ip, sizeof(IP));
\r
353 Add(c->NonSslList, n);
\r
356 n->EntryExpires = Tick64() + (UINT64)NON_SSL_ENTRY_EXPIRES;
\r
360 if (n->Count > NON_SSL_MIN_COUNT)
\r
365 UnlockList(c->NonSslList);
\r
371 void DeleteOldNoSsl(CEDAR *c)
\r
381 o = NewListFast(NULL);
\r
383 for (i = 0;i < LIST_NUM(c->NonSslList);i++)
\r
385 NON_SSL *n = LIST_DATA(c->NonSslList, i);
\r
387 if (n->EntryExpires <= Tick64())
\r
393 for (i = 0;i < LIST_NUM(o);i++)
\r
395 NON_SSL *n = LIST_DATA(o, i);
\r
397 Delete(c->NonSslList, n);
\r
405 NON_SSL *SearchNoSslList(CEDAR *c, IP *ip)
\r
409 if (c == NULL || ip == NULL)
\r
414 Zero(&t, sizeof(t));
\r
415 Copy(&t.IpAddress, ip, sizeof(IP));
\r
417 n = Search(c->NonSslList, &t);
\r
428 void InitNoSslList(CEDAR *c)
\r
436 c->NonSslList = NewList(CompareNoSslList);
\r
440 void FreeNoSslList(CEDAR *c)
\r
449 for (i = 0;i < LIST_NUM(c->NonSslList);i++)
\r
451 NON_SSL *n = LIST_DATA(c->NonSslList, i);
\r
456 ReleaseList(c->NonSslList);
\r
457 c->NonSslList = NULL;
\r
461 void CedarLog(char *str)
\r
469 if (cedar_log_ref == NULL)
\r
474 tmp = CopyStr(str);
\r
476 // このあたりは急いで実装したのでコードがあまり美しくない。
\r
477 if (StrLen(tmp) > 1)
\r
479 if (tmp[StrLen(tmp) - 1] == '\n')
\r
481 tmp[StrLen(tmp) - 1] = 0;
\r
483 if (StrLen(tmp) > 1)
\r
485 if (tmp[StrLen(tmp) - 1] == '\r')
\r
487 tmp[StrLen(tmp) - 1] = 0;
\r
492 InsertStringRecord(cedar_log, tmp);
\r
498 void StartCedarLog()
\r
500 if (cedar_log_ref == NULL)
\r
502 cedar_log_ref = NewRef();
\r
506 AddRef(cedar_log_ref);
\r
509 cedar_log = NewLog("debug_log", "debug", LOG_SWITCH_DAY);
\r
513 void StopCedarLog()
\r
515 if (cedar_log_ref == NULL)
\r
520 if (Release(cedar_log_ref) == 0)
\r
522 FreeLog(cedar_log);
\r
524 cedar_log_ref = NULL;
\r
528 // トラフィックのパケットサイズを取得する
\r
529 UINT64 GetTrafficPacketSize(TRAFFIC *t)
\r
537 return t->Recv.BroadcastBytes + t->Recv.UnicastBytes +
\r
538 t->Send.BroadcastBytes + t->Send.UnicastBytes;
\r
541 // トラフィックのパケット数を取得する
\r
542 UINT64 GetTrafficPacketNum(TRAFFIC *t)
\r
550 return t->Recv.BroadcastCount + t->Recv.UnicastCount +
\r
551 t->Send.BroadcastCount + t->Send.UnicastCount;
\r
554 // 非表示パスワードの内容が変更されたかどうかチェックする
\r
555 bool IsHiddenPasswordChanged(char *str)
\r
563 if (StrCmpi(str, HIDDEN_PASSWORD) == 0)
\r
574 void InitHiddenPassword(char *str, UINT size)
\r
582 StrCpy(str, size, HIDDEN_PASSWORD);
\r
585 // 証明書が仮想 HUB に登録されている CA によって署名されているかどうか確認する
\r
586 bool CheckSignatureByCaLinkMode(SESSION *s, X *x)
\r
592 if (s == NULL || x == NULL)
\r
597 if (s->LinkModeClient == false || (k = s->Link) == NULL)
\r
604 if (h->HubDb != NULL)
\r
606 LockList(h->HubDb->RootCertList);
\r
609 root_cert = GetIssuerFromList(h->HubDb->RootCertList, x);
\r
610 if (root_cert != NULL)
\r
615 UnlockList(h->HubDb->RootCertList);
\r
621 // 証明書が Cedar に登録されている CA によって署名されているかどうか確認する
\r
622 bool CheckSignatureByCa(CEDAR *cedar, X *x)
\r
626 if (cedar == NULL || x == NULL)
\r
631 // 指定された証明書を署名した CA を取得
\r
632 ca = FindCaSignedX(cedar->CaList, x);
\r
644 // 指定された証明書を署名した CA を取得
\r
645 X *FindCaSignedX(LIST *o, X *x)
\r
649 if (o == NULL || x == NULL)
\r
659 for (i = 0;i < LIST_NUM(o);i++)
\r
661 X *ca = LIST_DATA(o, i);
\r
662 if (CheckXDateNow(ca))
\r
664 if (CompareName(ca->subject_name, x->issuer_name))
\r
666 K *k = GetKFromX(ca);
\r
669 if (CheckSignature(x, k))
\r
676 else if (CompareX(ca, x))
\r
693 // Cedar から CA を削除する
\r
694 bool DeleteCa(CEDAR *cedar, UINT ptr)
\r
698 if (cedar == NULL || ptr == 0)
\r
703 LockList(cedar->CaList);
\r
707 for (i = 0;i < LIST_NUM(cedar->CaList);i++)
\r
709 X *x = LIST_DATA(cedar->CaList, i);
\r
711 if (POINTER_TO_KEY(x) == ptr)
\r
713 Delete(cedar->CaList, x);
\r
722 UnlockList(cedar->CaList);
\r
727 // Cedar に CA を追加する
\r
728 void AddCa(CEDAR *cedar, X *x)
\r
731 if (cedar == NULL || x == NULL)
\r
736 LockList(cedar->CaList);
\r
741 for (i = 0;i < LIST_NUM(cedar->CaList);i++)
\r
743 X *exist_x = LIST_DATA(cedar->CaList, i);
\r
744 if (CompareX(exist_x, x))
\r
753 Insert(cedar->CaList, CloneX(x));
\r
756 UnlockList(cedar->CaList);
\r
759 // Cedar からコネクションを削除する
\r
760 void DelConnection(CEDAR *cedar, CONNECTION *c)
\r
763 if (cedar == NULL || c == NULL)
\r
768 LockList(cedar->ConnectionList);
\r
770 Debug("Connection %s Deleted from Cedar.\n", c->Name);
\r
771 if (Delete(cedar->ConnectionList, c))
\r
773 ReleaseConnection(c);
\r
776 UnlockList(cedar->ConnectionList);
\r
779 // 現在の未確立コネクション数を取得する
\r
780 UINT GetUnestablishedConnections(CEDAR *cedar)
\r
791 LockList(cedar->ConnectionList);
\r
793 for (i = 0;i < LIST_NUM(cedar->ConnectionList);i++)
\r
795 CONNECTION *c = LIST_DATA(cedar->ConnectionList, i);
\r
799 case CONNECTION_TYPE_CLIENT:
\r
800 case CONNECTION_TYPE_INIT:
\r
801 case CONNECTION_TYPE_LOGIN:
\r
802 case CONNECTION_TYPE_ADDITIONAL:
\r
805 case CONNECTION_STATUS_ACCEPTED:
\r
806 case CONNECTION_STATUS_NEGOTIATION:
\r
807 case CONNECTION_STATUS_USERAUTH:
\r
815 UnlockList(cedar->ConnectionList);
\r
817 return ret + Count(cedar->AcceptingSockets);
\r
820 // Cedar にコネクションを追加する
\r
821 void AddConnection(CEDAR *cedar, CONNECTION *c)
\r
823 char tmp[MAX_SIZE];
\r
826 if (cedar == NULL || c == NULL)
\r
831 //新しいコネクションの名前を決定する
\r
832 i = Inc(cedar->ConnectionIncrement);
\r
833 Format(tmp, sizeof(tmp), "CID-%u", i);
\r
837 c->Name = CopyStr(tmp);
\r
841 LockList(cedar->ConnectionList);
\r
843 Add(cedar->ConnectionList, c);
\r
845 Debug("Connection %s Inserted to Cedar.\n", c->Name);
\r
847 UnlockList(cedar->ConnectionList);
\r
851 void StopAllConnection(CEDAR *c)
\r
855 CONNECTION **connections;
\r
862 LockList(c->ConnectionList);
\r
864 connections = ToArray(c->ConnectionList);
\r
865 num = LIST_NUM(c->ConnectionList);
\r
866 DeleteAll(c->ConnectionList);
\r
868 UnlockList(c->ConnectionList);
\r
870 for (i = 0;i < num;i++)
\r
872 StopConnection(connections[i], false);
\r
873 ReleaseConnection(connections[i]);
\r
878 // CEDAR から HUB を削除
\r
879 void DelHub(CEDAR *c, HUB *h)
\r
881 DelHubEx(c, h, false);
\r
883 void DelHubEx(CEDAR *c, HUB *h, bool no_lock)
\r
886 if (c == NULL || h == NULL)
\r
891 if (no_lock == false)
\r
896 if (Delete(c->HubList, h))
\r
901 if (no_lock == false)
\r
908 void AddHub(CEDAR *c, HUB *h)
\r
911 if (c == NULL || h == NULL)
\r
919 // HUB 数はここではチェックしないことにする
\r
920 if (LIST_NUM(c->HubList) >= MAX_HUBS)
\r
928 // 同一名の HUB が存在しないかどうかチェック
\r
929 if (IsHub(c, h->Name))
\r
937 Insert(c->HubList, h);
\r
943 // CEDAR のすべての HUB を停止
\r
944 void StopAllHub(CEDAR *c)
\r
956 hubs = ToArray(c->HubList);
\r
957 num = LIST_NUM(c->HubList);
\r
958 DeleteAll(c->HubList);
\r
962 for (i = 0;i < num;i++)
\r
965 ReleaseHub(hubs[i]);
\r
972 void AddListener(CEDAR *c, LISTENER *r)
\r
975 if (c == NULL || r == NULL)
\r
980 LockList(c->ListenerList);
\r
982 Add(c->ListenerList, r);
\r
985 UnlockList(c->ListenerList);
\r
988 // CEDAR のすべてのリスナーを停止
\r
989 void StopAllListener(CEDAR *c)
\r
999 LockList(c->ListenerList);
\r
1001 array = ToArray(c->ListenerList);
\r
1002 num = LIST_NUM(c->ListenerList);
\r
1003 DeleteAll(c->ListenerList);
\r
1005 UnlockList(c->ListenerList);
\r
1007 for (i = 0;i < num;i++)
\r
1009 StopListener(array[i]);
\r
1010 ReleaseListener(array[i]);
\r
1016 void StopCedar(CEDAR *c)
\r
1028 StopAllListener(c);
\r
1030 StopAllConnection(c);
\r
1033 // すべての L3 スイッチを解放
\r
1038 void CleanupCedar(CEDAR *c)
\r
1047 FreeCedarLayer3(c);
\r
1050 for (i = 0;i < LIST_NUM(c->HubList);i++)
\r
1052 HUB *h = LIST_DATA(c->HubList, i);
\r
1055 for (i = 0;i < LIST_NUM(c->CaList);i++)
\r
1057 X *x = LIST_DATA(c->CaList, i);
\r
1060 ReleaseList(c->CaList);
\r
1062 ReleaseList(c->ListenerList);
\r
1063 ReleaseList(c->HubList);
\r
1064 ReleaseList(c->ConnectionList);
\r
1065 //CleanupUDPEntry(c);
\r
1066 ReleaseList(c->UDPEntryList);
\r
1067 DeleteLock(c->lock);
\r
1068 DeleteCounter(c->ConnectionIncrement);
\r
1069 DeleteCounter(c->CurrentSessions);
\r
1071 if (c->DebugLog != NULL)
\r
1073 FreeLog(c->DebugLog);
\r
1078 FreeX(c->ServerX);
\r
1082 FreeK(c->ServerK);
\r
1085 if (c->CipherList)
\r
1087 Free(c->CipherList);
\r
1090 for (i = 0;i < LIST_NUM(c->TrafficDiffList);i++)
\r
1092 TRAFFIC_DIFF *d = LIST_DATA(c->TrafficDiffList, i);
\r
1098 ReleaseList(c->TrafficDiffList);
\r
1100 Free(c->ServerStr);
\r
1101 Free(c->MachineName);
\r
1103 Free(c->HttpUserAgent);
\r
1104 Free(c->HttpAccept);
\r
1105 Free(c->HttpAcceptLanguage);
\r
1106 Free(c->HttpAcceptEncoding);
\r
1108 FreeTraffic(c->Traffic);
\r
1110 DeleteLock(c->TrafficLock);
\r
1112 FreeNetSvcList(c);
\r
1114 Free(c->VerString);
\r
1115 Free(c->BuildInfo);
\r
1117 FreeLocalBridgeList(c);
\r
1119 DeleteCounter(c->AssignedBridgeLicense);
\r
1120 DeleteCounter(c->AssignedClientLicense);
\r
1124 DeleteLock(c->CedarSuperLock);
\r
1126 DeleteCounter(c->AcceptingSockets);
\r
1132 void ReleaseCedar(CEDAR *c)
\r
1140 if (Release(c->ref) == 0)
\r
1146 // CipherList のセット
\r
1147 void SetCedarCipherList(CEDAR *cedar, char *name)
\r
1150 if (cedar == NULL)
\r
1155 if (cedar->CipherList != NULL)
\r
1157 Free(cedar->CipherList);
\r
1161 cedar->CipherList = CopyStr(name);
\r
1165 cedar->CipherList = NULL;
\r
1170 int CompareNetSvc(void *p1, void *p2)
\r
1173 if (p1 == NULL || p2 == NULL)
\r
1177 n1 = *(NETSVC **)p1;
\r
1178 n2 = *(NETSVC **)p2;
\r
1179 if (n1 == NULL || n2 == NULL)
\r
1183 if (n1->Port > n2->Port)
\r
1187 else if (n1->Port < n2->Port)
\r
1191 else if (n1->Udp > n2->Udp)
\r
1195 else if (n1->Udp < n2->Udp)
\r
1203 void InitNetSvcList(CEDAR *cedar)
\r
1205 char filename[MAX_PATH] = "/etc/services";
\r
1208 if (cedar == NULL)
\r
1215 Format(filename, sizeof(filename), "%s\\drivers\\etc\\services", MsGetSystem32Dir());
\r
1218 cedar->NetSvcList = NewList(CompareNetSvc);
\r
1220 b = ReadDump(filename);
\r
1228 char *s = CfgReadNextLine(b);
\r
1237 TOKEN_LIST *t = ParseToken(s, " \t/");
\r
1238 if (t->NumTokens >= 3)
\r
1240 NETSVC *n = ZeroMalloc(sizeof(NETSVC));
\r
1241 n->Name = CopyStr(t->Token[0]);
\r
1242 n->Udp = (StrCmpi(t->Token[2], "udp") == 0 ? true : false);
\r
1243 n->Port = ToInt(t->Token[1]);
\r
1244 Add(cedar->NetSvcList, n);
\r
1255 char *GetSvcName(CEDAR *cedar, bool udp, UINT port)
\r
1260 if (cedar == NULL)
\r
1265 t.Udp = (udp == 0 ? false : true);
\r
1268 LockList(cedar->NetSvcList);
\r
1270 NETSVC *n = Search(cedar->NetSvcList, &t);
\r
1276 UnlockList(cedar->NetSvcList);
\r
1282 void FreeNetSvcList(CEDAR *cedar)
\r
1286 if (cedar == NULL)
\r
1291 for (i = 0;i < LIST_NUM(cedar->NetSvcList);i++)
\r
1293 NETSVC *n = LIST_DATA(cedar->NetSvcList, i);
\r
1297 ReleaseList(cedar->NetSvcList);
\r
1301 void SetCedarCert(CEDAR *c, X *server_x, K *server_k)
\r
1304 if (server_x == NULL || server_k == NULL)
\r
1311 if (c->ServerX != NULL)
\r
1313 FreeX(c->ServerX);
\r
1316 if (c->ServerK != NULL)
\r
1318 FreeK(c->ServerK);
\r
1321 c->ServerX = CloneX(server_x);
\r
1322 c->ServerK = CloneK(server_k);
\r
1328 void EnableDebugLog(CEDAR *c)
\r
1331 if (c == NULL || c->DebugLog != NULL)
\r
1336 c->DebugLog = NewLog("cedar_debug_log", "cedar", LOG_SWITCH_NO);
\r
1339 // CEDAR を VPN Bridge にする
\r
1340 void SetCedarVpnBridge(CEDAR *c)
\r
1350 Free(c->ServerStr);
\r
1351 c->ServerStr = CopyStr(CEDAR_BRIDGE_STR);
\r
1355 CEDAR *NewCedar(X *server_x, K *server_k)
\r
1358 char tmp[MAX_SIZE];
\r
1359 char tmp2[MAX_SIZE];
\r
1362 c = ZeroMalloc(sizeof(CEDAR));
\r
1364 c->AcceptingSockets = NewCounter();
\r
1366 c->CedarSuperLock = NewLock();
\r
1368 #ifdef BETA_NUMBER
\r
1369 c->Beta = BETA_NUMBER;
\r
1370 #endif // BETA_NUMBER
\r
1374 c->AssignedBridgeLicense = NewCounter();
\r
1375 c->AssignedClientLicense = NewCounter();
\r
1377 Rand(c->UniqueId, sizeof(c->UniqueId));
\r
1379 c->CreatedTick = Tick64();
\r
1381 c->lock = NewLock();
\r
1382 c->ref = NewRef();
\r
1384 c->CurrentTcpConnections = GetNumTcpConnectionsCounter();
\r
1386 c->ListenerList = NewList(CompareListener);
\r
1387 c->UDPEntryList = NewList(CompareUDPEntry);
\r
1388 c->HubList = NewList(CompareHub);
\r
1389 c->ConnectionList = NewList(CompareConnection);
\r
1391 c->ConnectionIncrement = NewCounter();
\r
1392 c->CurrentSessions = NewCounter();
\r
1394 if (server_k && server_x)
\r
1396 c->ServerK = CloneK(server_k);
\r
1397 c->ServerX = CloneX(server_x);
\r
1400 c->Version = CEDAR_VER;
\r
1401 c->Build = CEDAR_BUILD;
\r
1402 c->ServerStr = CopyStr(CEDAR_SERVER_STR);
\r
1404 GetMachineName(tmp, sizeof(tmp));
\r
1405 c->MachineName = CopyStr(tmp);
\r
1407 c->HttpUserAgent = CopyStr(DEFAULT_USER_AGENT);
\r
1408 c->HttpAccept = CopyStr(DEFAULT_ACCEPT);
\r
1409 c->HttpAcceptLanguage = CopyStr("ja");
\r
1410 c->HttpAcceptEncoding = CopyStr(DEFAULT_ENCODING);
\r
1412 c->Traffic = NewTraffic();
\r
1413 c->TrafficLock = NewLock();
\r
1414 c->CaList = NewList(CompareCert);
\r
1416 c->TrafficDiffList = NewList(NULL);
\r
1418 SetCedarCipherList(c, "RC4-MD5");
\r
1420 c->ClientId = _II("CLIENT_ID");
\r
1422 InitNetSvcList(c);
\r
1424 InitLocalBridgeList(c);
\r
1426 InitCedarLayer3(c);
\r
1428 #ifdef ALPHA_VERSION
\r
1429 beta_str = "Alpha";
\r
1430 #else // ALPHA_VERSION
\r
1431 beta_str = "Release Candidate";
\r
1432 #endif // ALPHA_VERSION
\r
1434 ToStr(tmp2, c->Beta);
\r
1436 Format(tmp, sizeof(tmp), "Version %u.%02u Build %u %s %s (%s)",
\r
1437 CEDAR_VER / 100, CEDAR_VER - (CEDAR_VER / 100) * 100,
\r
1439 c->Beta == 0 ? "" : beta_str,
\r
1440 c->Beta == 0 ? "" : tmp2,
\r
1447 Zero(&st, sizeof(st));
\r
1449 st.wYear = BUILD_DATE_Y;
\r
1450 st.wMonth = BUILD_DATE_M;
\r
1451 st.wDay = BUILD_DATE_D;
\r
1453 c->BuiltDate = SystemToUINT64(&st);
\r
1456 c->VerString = CopyStr(tmp);
\r
1458 Format(tmp, sizeof(tmp), "Compiled %04u/%02u/%02u %02u:%02u:%02u by %s at %s",
\r
1459 BUILD_DATE_Y, BUILD_DATE_M, BUILD_DATE_D, BUILD_DATE_HO, BUILD_DATE_MI, BUILD_DATE_SE, BUILDER_NAME, BUILD_PLACE);
\r
1461 c->BuildInfo = CopyStr(tmp);
\r
1466 // 指定した日付よりも遅い日付にビルドされたものであるかどうか取得
\r
1467 bool IsLaterBuild(CEDAR *c, UINT64 t)
\r
1469 SYSTEMTIME sb, st;
\r
1477 Zero(&sb, sizeof(sb));
\r
1478 Zero(&st, sizeof(st));
\r
1480 UINT64ToSystem(&sb, c->BuiltDate);
\r
1481 UINT64ToSystem(&st, t);
\r
1484 sb.wHour = sb.wMinute = sb.wSecond = sb.wMilliseconds = 0;
\r
1485 st.wHour = st.wMinute = st.wSecond = st.wMilliseconds = 0;
\r
1487 b = SystemToUINT64(&sb);
\r
1488 t = SystemToUINT64(&st);
\r
1501 void AddTraffic(TRAFFIC *dst, TRAFFIC *diff)
\r
1504 if (dst == NULL || diff == NULL)
\r
1509 dst->Recv.BroadcastBytes += diff->Recv.BroadcastBytes;
\r
1510 dst->Recv.BroadcastCount += diff->Recv.BroadcastCount;
\r
1511 dst->Recv.UnicastBytes += diff->Recv.UnicastBytes;
\r
1512 dst->Recv.UnicastCount += diff->Recv.UnicastCount;
\r
1514 dst->Send.BroadcastBytes += diff->Send.BroadcastBytes;
\r
1515 dst->Send.BroadcastCount += diff->Send.BroadcastCount;
\r
1516 dst->Send.UnicastBytes += diff->Send.UnicastBytes;
\r
1517 dst->Send.UnicastCount += diff->Send.UnicastCount;
\r
1521 TRAFFIC *NewTraffic()
\r
1526 t = ZeroMalloc(sizeof(TRAFFIC));
\r
1531 void FreeTraffic(TRAFFIC *t)
\r
1543 // Cedar 通信モジュールの初期化
\r
1546 if ((init_cedar_counter++) > 0)
\r
1555 // Cedar 通信モジュールの解放
\r
1558 if ((--init_cedar_counter) > 0)
\r