* copy vendor drop to trunk
[lab.git] / Dev / utvpn / utvpn-unix-v101-7101-public / src / Mayaqua / Secure.h
1 // SoftEther UT-VPN SourceCode\r
2 // \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
7 // \r
8 // http://utvpn.tsukuba.ac.jp/\r
9 // \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
13 // \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
18 // \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
22 // \r
23 // このファイルは GPL バージョン 2 ライセンスで公開されています。\r
24 // 誰でもこのファイルの内容を複製、改変したり、改変したバージョンを再配布\r
25 // することができます。ただし、原著作物を改変した場合は、原著作物の著作権表示\r
26 // を除去することはできません。改変した著作物を配布する場合は、改変実施者の\r
27 // 著作権表示を原著作物の著作権表示に付随して記載するようにしてください。\r
28 // \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
32 // ホストされています。\r
33 // 本プログラムの配布者は、本プログラムを、業としての利用以外のため、\r
34 // および、試験または研究のために利用が行われることを想定して配布\r
35 // しています。\r
36 // SoftEther UT-VPN プロジェクトの Web サイトは http://utvpn.tsukuba.ac.jp/ に\r
37 // あります。\r
38 // 本ソフトウェアの不具合の修正、機能改良、セキュリティホールの修復などのコード\r
39 // の改変を行った場合で、その成果物を SoftEther UT-VPN プロジェクトに提出して\r
40 // いただける場合は、 http://utvpn.tsukuba.ac.jp/ までソースコードを送付して\r
41 // ください。SoftEther UT-VPN プロジェクトの本体リリースまたはブランチリリース\r
42 // に組み込みさせていただきます。\r
43 // \r
44 // GPL に基づいて原著作物が提供される本ソフトウェアの改良版を配布、販売する\r
45 // 場合は、そのソースコードを GPL に基づいて誰にでも開示する義務が生じます。\r
46 // \r
47 // 本ソフトウェアに関連する著作権、特許権、商標権はソフトイーサ株式会社\r
48 // (SoftEther Corporation) およびその他の著作権保持者が保有しています。\r
49 // ソフトイーサ株式会社等はこれらの権利を放棄していません。本ソフトウェアの\r
50 // 二次著作物を配布、販売する場合は、これらの権利を侵害しないようにご注意\r
51 // ください。\r
52 // \r
53 // お願い: どのような通信ソフトウェアにも通常は必ず未発見の\r
54 // セキュリティホールが潜んでいます。本ソースコードをご覧いただいた結果、\r
55 // UT-VPN にセキュリティホールを発見された場合は、当該セキュリティホールの\r
56 // 情報を不特定多数に開示される前に、必ず、ソフトイーサ株式会社\r
57 // および脆弱性情報の届出を受け付ける公的機関まで通報いただき、\r
58 // 公益保護にご協力いただきますようお願い申し上げます。\r
59 // \r
60 // ソフトイーサ株式会社は、当該セキュリティホールについて迅速に対処を\r
61 // 行い、UT-VPN および UT-VPN に関連するソフトウェアのユーザー・顧客\r
62 // を保護するための努力を行います。\r
63 // \r
64 // ソフトイーサへの届出先: http://www.softether.co.jp/jp/contact/\r
65 // 日本国内の脆弱性情報届出受付公的機関:\r
66 //         独立行政法人 情報処理推進機構\r
67 //         http://www.ipa.go.jp/security/vuln/report/\r
68 // \r
69 // 上記各事項について不明な点は、ソフトイーサ株式会社までご連絡ください。\r
70 // 連絡先: http://www.softether.co.jp/jp/contact/\r
71 \r
72 // -----------------------------------------------\r
73 // [ChangeLog]\r
74 // 2010.05.20\r
75 //  新規リリース by SoftEther\r
76 // -----------------------------------------------\r
77 \r
78 // Secure.h\r
79 // Secure.c のヘッダ\r
80 \r
81 #ifndef SECURE_H\r
82 #define SECURE_H\r
83 \r
84 // 定数\r
85 #define MAX_SEC_DATA_SIZE               4096\r
86 \r
87 // PKCS#11 関係の型宣言\r
88 #ifndef SECURE_C\r
89 typedef struct CK_FUNCTION_LIST *CK_FUNCTION_LIST_PTR;\r
90 typedef struct SEC_DATA_WIN32   SEC_DATA_WIN32;\r
91 typedef struct CK_TOKEN_INFO    CK_TOKEN_INFO;\r
92 typedef struct CK_DATE                  CK_DATE;\r
93 #endif  // SECURE_C\r
94 \r
95 // セキュアデバイス\r
96 struct SECURE_DEVICE\r
97 {\r
98         UINT Id;                                                                // デバイス ID\r
99         UINT Type;                                                              // 種類\r
100         char *DeviceName;                                               // デバイス名\r
101         char *Manufacturer;                                             // 製造元\r
102         char *ModuleName;                                               // モジュール名\r
103 };\r
104 \r
105 // セキュアデバイスの種類\r
106 #define SECURE_IC_CARD                          0               // IC カード\r
107 #define SECURE_USB_TOKEN                        1               // USB トークン\r
108 \r
109 // セキュアデバイス情報\r
110 struct SEC_INFO\r
111 {\r
112         wchar_t *Label;                                                 // ラベル\r
113         wchar_t *ManufacturerId;                                        // 製造元 ID\r
114         wchar_t *Model;                                                 // モデル\r
115         wchar_t *SerialNumber;                                          // シリアル番号\r
116         UINT MaxSession;                                                // 最大セッション数\r
117         UINT MaxRWSession;                                              // 最大 R/W セッション数\r
118         UINT MinPinLen;                                                 // 最小 PIN 文字列長\r
119         UINT MaxPinLen;                                                 // 最大 PIN 文字列長\r
120         UINT TotalPublicMemory;                                 // 合計メモリ容量 (Public)\r
121         UINT FreePublicMemory;                                  // 空きメモリ容量 (Private)\r
122         UINT TotalPrivateMemory;                                // 合計メモリ容量 (Public)\r
123         UINT FreePrivateMemory;                                 // 空きメモリ容量 (Private)\r
124         char *HardwareVersion;                                  // ハードウェアバージョン\r
125         char *FirmwareVersion;                                  // ファームウェアバージョン\r
126 };\r
127 \r
128 // セキュアデバイス構造体\r
129 struct SECURE\r
130 {\r
131         LOCK *lock;                                                             // ロック\r
132         SECURE_DEVICE *Dev;                                             // デバイス情報\r
133         UINT Error;                                                             // 最後に発生したエラー\r
134         struct CK_FUNCTION_LIST *Api;                   // API\r
135         bool Initialized;                                               // 初期化フラグ\r
136         UINT NumSlot;                                                   // スロット数\r
137         UINT *SlotIdList;                                               // スロット ID リスト\r
138         bool SessionCreated;                                    // セッション作成フラグ\r
139         UINT SessionId;                                                 // セッション ID\r
140         UINT SessionSlotNumber;                                 // セッションのスロット ID\r
141         bool LoginFlag;                                                 // ログイン済みフラグ\r
142         SEC_INFO *Info;                                                 // トークン情報\r
143         LIST *EnumCache;                                                // 列挙キャッシュ\r
144 \r
145         // ドライバごとに異なる挙動をするための属性値\r
146         bool IsEPass1000;                                               // ePass 1000\r
147         bool IsReadOnly;                                                // 読み取り専用モード\r
148 \r
149 #ifdef  OS_WIN32\r
150         struct SEC_DATA_WIN32 *Data;                    // データ\r
151 #endif  // OS_WIN32\r
152 };\r
153 \r
154 // セキュアデバイスオブジェクト構造体\r
155 struct SEC_OBJ\r
156 {\r
157         UINT Type;                                                              // オブジェクトの種類\r
158         UINT Object;                                                    // オブジェクトハンドル\r
159         bool Private;                                                   // プライベートフラグ\r
160         char *Name;                                                             // 名前\r
161 };\r
162 \r
163 #define SEC_ERROR_NOERROR                               0       // エラー無し\r
164 #define SEC_ERROR_INVALID_SLOT_NUMBER   1       // スロット番号が不正\r
165 #define SEC_ERROR_OPEN_SESSION                  2       // セッション作成失敗\r
166 #define SEC_ERROR_SESSION_EXISTS                3       // すでにセッションが存在する\r
167 #define SEC_ERROR_NO_PIN_STR                    4       // PIN 文字列が指定されていない\r
168 #define SEC_ERROR_ALREADY_LOGIN                 5       // すでにログインしている\r
169 #define SEC_ERROR_BAD_PIN_CODE                  6       // PIN コードが不正\r
170 #define SEC_ERROR_NO_SESSION                    7       // セッションが存在しない\r
171 #define SEC_ERROR_DATA_TOO_BIG                  8       // データが大きすぎる\r
172 #define SEC_ERROR_NOT_LOGIN                             9       // ログインしていない\r
173 #define SEC_ERROR_BAD_PARAMETER                 10      // パラメータ不正\r
174 #define SEC_ERROR_HARDWARE_ERROR                11      // ハードウェアエラー\r
175 #define SEC_ERROR_OBJ_NOT_FOUND                 12      // オブジェクトが見つからない\r
176 #define SEC_ERROR_INVALID_CERT                  13      // 証明書が不正\r
177 \r
178 \r
179 #define SEC_DATA                                                0       // データ\r
180 #define SEC_X                                                   1       // 証明書\r
181 #define SEC_K                                                   2       // 秘密鍵\r
182 #define SEC_P                                                   3       // 公開鍵\r
183 \r
184 \r
185 \r
186 // 関数プロトタイプ\r
187 void InitSecure();\r
188 void FreeSecure();\r
189 void InitSecureDeviceList();\r
190 void FreeSecureDeviceList();\r
191 bool IsDeviceSupported(SECURE_DEVICE *dev);\r
192 LIST *GetSupportedDeviceList();\r
193 LIST *GetSecureDeviceList();\r
194 bool CheckSecureDeviceId(UINT id);\r
195 SECURE_DEVICE *GetSecureDevice(UINT id);\r
196 SECURE *OpenSec(UINT id);\r
197 void CloseSec(SECURE *sec);\r
198 bool OpenSecSession(SECURE *sec, UINT slot_number);\r
199 void CloseSecSession(SECURE *sec);\r
200 bool LoginSec(SECURE *sec, char *pin);\r
201 void LogoutSec(SECURE *sec);\r
202 void PrintSecInfo(SECURE *sec);\r
203 LIST *EnumSecObject(SECURE *sec);\r
204 void FreeSecObject(SEC_OBJ *obj);\r
205 void FreeEnumSecObject(LIST *o);\r
206 SEC_OBJ *FindSecObject(SECURE *sec, char *name, UINT type);\r
207 bool CheckSecObject(SECURE *sec, char *name, UINT type);\r
208 bool DeleteSecObjectByName(SECURE *sec, char *name, UINT type);\r
209 SEC_OBJ *CloneSecObject(SEC_OBJ *obj);\r
210 LIST *CloneEnumSecObject(LIST *o);\r
211 void EraseEnumSecObjectCache(SECURE *sec);\r
212 void DeleteSecObjFromEnumCache(SECURE *sec, char *name, UINT type);\r
213 void AddSecObjToEnumCache(SECURE *sec, char *name, UINT type, bool private_obj, UINT object);\r
214 bool WriteSecData(SECURE *sec, bool private_obj, char *name, void *data, UINT size);\r
215 int ReadSecDataFromObject(SECURE *sec, SEC_OBJ *obj, void *data, UINT size);\r
216 int ReadSecData(SECURE *sec, char *name, void *data, UINT size);\r
217 bool DeleteSecObject(SECURE *sec, SEC_OBJ *obj);\r
218 bool DeleteSecData(SECURE *sec, char *name);\r
219 void UINT64ToCkDate(void *p_ck_date, UINT64 time64);\r
220 bool WriteSecCert(SECURE *sec, bool private_obj, char *name, X *x);\r
221 bool DeleteSecCert(SECURE *sec, char *name);\r
222 X *ReadSecCertFromObject(SECURE *sec, SEC_OBJ *obj);\r
223 X *ReadSecCert(SECURE *sec, char *name);\r
224 bool WriteSecKey(SECURE *sec, bool private_obj, char *name, K *k);\r
225 bool DeleteSecKey(SECURE *sec, char *name);\r
226 bool SignSecByObject(SECURE *sec, SEC_OBJ *obj, void *dst, void *src, UINT size);\r
227 bool SignSec(SECURE *sec, char *name, void *dst, void *src, UINT size);\r
228 bool ChangePin(SECURE *sec, char *old_pin, char *new_pin);\r
229 void TestSec();\r
230 void TestSecMain(SECURE *sec);\r
231 bool IsJPKI(bool id);\r
232 \r
233 bool LoadSecModule(SECURE *sec);\r
234 void FreeSecModule(SECURE *sec);\r
235 void GetSecInfo(SECURE *sec);\r
236 void FreeSecInfo(SECURE *sec);\r
237 SEC_INFO *TokenInfoToSecInfo(void *p_t);\r
238 void FreeSecInfoMemory(SEC_INFO *s);\r
239 \r
240 #ifdef  OS_WIN32\r
241 \r
242 bool Win32IsDeviceSupported(SECURE_DEVICE *dev);\r
243 bool Win32LoadSecModule(SECURE *sec);\r
244 void Win32FreeSecModule(SECURE *sec);\r
245 \r
246 #endif  // OS_WIN32\r
247 \r
248 \r
249 #ifdef  SECURE_C\r
250 // 内部データ構造関連\r
251 \r
252 // サポートしているセキュアデバイスリスト\r
253 static LIST *SecureDeviceList = NULL;\r
254 \r
255 // サポートしているハードウェアリスト\r
256 // Q. なぜこのような静的なリストになっているのか? 動的に追加できないのか?\r
257 // A. 今のところ、手抜きのためこのような実装になっている。\r
258 SECURE_DEVICE SupportedList[] =\r
259 {\r
260         {1,             SECURE_IC_CARD,         "Standard-9 IC Card",   "Dai Nippon Printing",  "DNPS9P11.DLL"},\r
261         {2,             SECURE_USB_TOKEN,       "ePass 1000",                   "Feitian Technologies", "EP1PK111.DLL"},\r
262         {3,             SECURE_IC_CARD,         "DNP Felica",                   "Dai Nippon Printing",  "DNPFP11.DLL"},\r
263         {4,             SECURE_USB_TOKEN,       "eToken",                               "Aladdin",                              "ETPKCS11.DLL"},\r
264         {5,             SECURE_IC_CARD,         "Standard-9 IC Card",   "Fujitsu",                              "F3EZSCL2.DLL"},\r
265         {6,             SECURE_IC_CARD,         "ASECard",                              "Athena",                               "ASEPKCS.DLL"},\r
266         {7,             SECURE_IC_CARD,         "Gemplus IC Card",              "Gemplus",                              "PK2PRIV.DLL"},\r
267         {8,             SECURE_IC_CARD,         "1-Wire & iButton",             "DALLAS SEMICONDUCTOR", "DSPKCS.DLL"},\r
268         {9,             SECURE_IC_CARD,         "JPKI IC Card",                 "Japanese Government",  "JPKIPKCS11.DLL"},\r
269         {10,    SECURE_IC_CARD,         "LGWAN IC Card",                "Japanese Government",  "P11STD9.DLL"},\r
270         {11,    SECURE_IC_CARD,         "LGWAN IC Card",                "Japanese Government",  "P11STD9A.DLL"},\r
271         {12,    SECURE_USB_TOKEN,       "iKey 1000",                    "Rainbow Technologies", "K1PK112.DLL"},\r
272         {13,    SECURE_IC_CARD,         "JPKI IC Card #2",              "Japanese Government",  "libmusclepkcs11.dll"},\r
273         {14,    SECURE_USB_TOKEN,       "SafeSign",                             "A.E.T.",                               "aetpkss1.dll"},\r
274         {15,    SECURE_USB_TOKEN,       "LOCK STAR-PKI",                "Logicaltech Co.,LTD",  "LTPKCS11.dll"},\r
275         {16,    SECURE_USB_TOKEN,       "ePass 2000",                   "Feitian Technologies", "ep2pk11.dll"},\r
276         {17,    SECURE_IC_CARD,         "myuToken",                             "iCanal Inc.",                  "icardmodpk.dll"},\r
277 };\r
278 \r
279 #ifdef  OS_WIN32\r
280 \r
281 // Win32 用内部データ\r
282 typedef struct SEC_DATA_WIN32\r
283 {\r
284         HINSTANCE hInst;\r
285 } SEC_DATA_WIN32;\r
286 \r
287 #endif  // OS_WIN32\r
288 \r
289 #endif  // SECURE_C\r
290 \r
291 #endif  // SECURE_H\r
292 \r
293 \r
294 \r