source: lab.git/Dev/utvpn/utvpn-unix-v101-7101-public/src/Mayaqua/Secure.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: 12.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// Secure.h
79// Secure.c のヘッダ
80
81#ifndef SECURE_H
82#define SECURE_H
83
84// 定数
85#define MAX_SEC_DATA_SIZE       4096
86
87// PKCS#11 関係の型宣言
88#ifndef SECURE_C
89typedef struct CK_FUNCTION_LIST *CK_FUNCTION_LIST_PTR;
90typedef struct SEC_DATA_WIN32   SEC_DATA_WIN32;
91typedef struct CK_TOKEN_INFO    CK_TOKEN_INFO;
92typedef struct CK_DATE          CK_DATE;
93#endif  // SECURE_C
94
95// セキュアデバイス
96struct SECURE_DEVICE
97{
98    UINT Id;                                // デバイス ID
99    UINT Type;                              // 種類
100    char *DeviceName;                       // デバイス名
101    char *Manufacturer;                     // 製造元
102    char *ModuleName;                       // モジュール名
103};
104
105// セキュアデバイスの種類
106#define SECURE_IC_CARD              0       // IC カード
107#define SECURE_USB_TOKEN            1       // USB トークン
108
109// セキュアデバイス情報
110struct SEC_INFO
111{
112    wchar_t *Label;                         // ラベル
113    wchar_t *ManufacturerId;                    // 製造元 ID
114    wchar_t *Model;                         // モデル
115    wchar_t *SerialNumber;                      // シリアル番号
116    UINT MaxSession;                        // 最大セッション数
117    UINT MaxRWSession;                      // 最大 R/W セッション数
118    UINT MinPinLen;                         // 最小 PIN 文字列長
119    UINT MaxPinLen;                         // 最大 PIN 文字列長
120    UINT TotalPublicMemory;                 // 合計メモリ容量 (Public)
121    UINT FreePublicMemory;                  // 空きメモリ容量 (Private)
122    UINT TotalPrivateMemory;                // 合計メモリ容量 (Public)
123    UINT FreePrivateMemory;                 // 空きメモリ容量 (Private)
124    char *HardwareVersion;                  // ハードウェアバージョン
125    char *FirmwareVersion;                  // ファームウェアバージョン
126};
127
128// セキュアデバイス構造体
129struct SECURE
130{
131    LOCK *lock;                             // ロック
132    SECURE_DEVICE *Dev;                     // デバイス情報
133    UINT Error;                             // 最後に発生したエラー
134    struct CK_FUNCTION_LIST *Api;           // API
135    bool Initialized;                       // 初期化フラグ
136    UINT NumSlot;                           // スロット数
137    UINT *SlotIdList;                       // スロット ID リスト
138    bool SessionCreated;                    // セッション作成フラグ
139    UINT SessionId;                         // セッション ID
140    UINT SessionSlotNumber;                 // セッションのスロット ID
141    bool LoginFlag;                         // ログイン済みフラグ
142    SEC_INFO *Info;                         // トークン情報
143    LIST *EnumCache;                        // 列挙キャッシュ
144
145    // ドライバごとに異なる挙動をするための属性値
146    bool IsEPass1000;                       // ePass 1000
147    bool IsReadOnly;                        // 読み取り専用モード
148
149#ifdef  OS_WIN32
150    struct SEC_DATA_WIN32 *Data;            // データ
151#endif  // OS_WIN32
152};
153
154// セキュアデバイスオブジェクト構造体
155struct SEC_OBJ
156{
157    UINT Type;                              // オブジェクトの種類
158    UINT Object;                            // オブジェクトハンドル
159    bool Private;                           // プライベートフラグ
160    char *Name;                             // 名前
161};
162
163#define SEC_ERROR_NOERROR               0   // エラー無し
164#define SEC_ERROR_INVALID_SLOT_NUMBER   1   // スロット番号が不正
165#define SEC_ERROR_OPEN_SESSION          2   // セッション作成失敗
166#define SEC_ERROR_SESSION_EXISTS        3   // すでにセッションが存在する
167#define SEC_ERROR_NO_PIN_STR            4   // PIN 文字列が指定されていない
168#define SEC_ERROR_ALREADY_LOGIN         5   // すでにログインしている
169#define SEC_ERROR_BAD_PIN_CODE          6   // PIN コードが不正
170#define SEC_ERROR_NO_SESSION            7   // セッションが存在しない
171#define SEC_ERROR_DATA_TOO_BIG          8   // データが大きすぎる
172#define SEC_ERROR_NOT_LOGIN             9   // ログインしていない
173#define SEC_ERROR_BAD_PARAMETER         10  // パラメータ不正
174#define SEC_ERROR_HARDWARE_ERROR        11  // ハードウェアエラー
175#define SEC_ERROR_OBJ_NOT_FOUND         12  // オブジェクトが見つからない
176#define SEC_ERROR_INVALID_CERT          13  // 証明書が不正
177
178
179#define SEC_DATA                        0   // データ
180#define SEC_X                           1   // 証明書
181#define SEC_K                           2   // 秘密鍵
182#define SEC_P                           3   // 公開鍵
183
184
185
186// 関数プロトタイプ
187void InitSecure();
188void FreeSecure();
189void InitSecureDeviceList();
190void FreeSecureDeviceList();
191bool IsDeviceSupported(SECURE_DEVICE *dev);
192LIST *GetSupportedDeviceList();
193LIST *GetSecureDeviceList();
194bool CheckSecureDeviceId(UINT id);
195SECURE_DEVICE *GetSecureDevice(UINT id);
196SECURE *OpenSec(UINT id);
197void CloseSec(SECURE *sec);
198bool OpenSecSession(SECURE *sec, UINT slot_number);
199void CloseSecSession(SECURE *sec);
200bool LoginSec(SECURE *sec, char *pin);
201void LogoutSec(SECURE *sec);
202void PrintSecInfo(SECURE *sec);
203LIST *EnumSecObject(SECURE *sec);
204void FreeSecObject(SEC_OBJ *obj);
205void FreeEnumSecObject(LIST *o);
206SEC_OBJ *FindSecObject(SECURE *sec, char *name, UINT type);
207bool CheckSecObject(SECURE *sec, char *name, UINT type);
208bool DeleteSecObjectByName(SECURE *sec, char *name, UINT type);
209SEC_OBJ *CloneSecObject(SEC_OBJ *obj);
210LIST *CloneEnumSecObject(LIST *o);
211void EraseEnumSecObjectCache(SECURE *sec);
212void DeleteSecObjFromEnumCache(SECURE *sec, char *name, UINT type);
213void AddSecObjToEnumCache(SECURE *sec, char *name, UINT type, bool private_obj, UINT object);
214bool WriteSecData(SECURE *sec, bool private_obj, char *name, void *data, UINT size);
215int ReadSecDataFromObject(SECURE *sec, SEC_OBJ *obj, void *data, UINT size);
216int ReadSecData(SECURE *sec, char *name, void *data, UINT size);
217bool DeleteSecObject(SECURE *sec, SEC_OBJ *obj);
218bool DeleteSecData(SECURE *sec, char *name);
219void UINT64ToCkDate(void *p_ck_date, UINT64 time64);
220bool WriteSecCert(SECURE *sec, bool private_obj, char *name, X *x);
221bool DeleteSecCert(SECURE *sec, char *name);
222X *ReadSecCertFromObject(SECURE *sec, SEC_OBJ *obj);
223X *ReadSecCert(SECURE *sec, char *name);
224bool WriteSecKey(SECURE *sec, bool private_obj, char *name, K *k);
225bool DeleteSecKey(SECURE *sec, char *name);
226bool SignSecByObject(SECURE *sec, SEC_OBJ *obj, void *dst, void *src, UINT size);
227bool SignSec(SECURE *sec, char *name, void *dst, void *src, UINT size);
228bool ChangePin(SECURE *sec, char *old_pin, char *new_pin);
229void TestSec();
230void TestSecMain(SECURE *sec);
231bool IsJPKI(bool id);
232
233bool LoadSecModule(SECURE *sec);
234void FreeSecModule(SECURE *sec);
235void GetSecInfo(SECURE *sec);
236void FreeSecInfo(SECURE *sec);
237SEC_INFO *TokenInfoToSecInfo(void *p_t);
238void FreeSecInfoMemory(SEC_INFO *s);
239
240#ifdef  OS_WIN32
241
242bool Win32IsDeviceSupported(SECURE_DEVICE *dev);
243bool Win32LoadSecModule(SECURE *sec);
244void Win32FreeSecModule(SECURE *sec);
245
246#endif  // OS_WIN32
247
248
249#ifdef  SECURE_C
250// 内部データ構造関連
251
252// サポートしているセキュアデバイスリスト
253static LIST *SecureDeviceList = NULL;
254
255// サポートしているハードウェアリスト
256// Q. なぜこのような静的なリストになっているのか? 動的に追加できないのか?
257// A. 今のところ、手抜きのためこのような実装になっている。
258SECURE_DEVICE SupportedList[] =
259{
260    {1,     SECURE_IC_CARD,     "Standard-9 IC Card",   "Dai Nippon Printing",  "DNPS9P11.DLL"},
261    {2,     SECURE_USB_TOKEN,   "ePass 1000",           "Feitian Technologies", "EP1PK111.DLL"},
262    {3,     SECURE_IC_CARD,     "DNP Felica",           "Dai Nippon Printing",  "DNPFP11.DLL"},
263    {4,     SECURE_USB_TOKEN,   "eToken",               "Aladdin",              "ETPKCS11.DLL"},
264    {5,     SECURE_IC_CARD,     "Standard-9 IC Card",   "Fujitsu",              "F3EZSCL2.DLL"},
265    {6,     SECURE_IC_CARD,     "ASECard",              "Athena",               "ASEPKCS.DLL"},
266    {7,     SECURE_IC_CARD,     "Gemplus IC Card",      "Gemplus",              "PK2PRIV.DLL"},
267    {8,     SECURE_IC_CARD,     "1-Wire & iButton",     "DALLAS SEMICONDUCTOR", "DSPKCS.DLL"},
268    {9,     SECURE_IC_CARD,     "JPKI IC Card",         "Japanese Government",  "JPKIPKCS11.DLL"},
269    {10,    SECURE_IC_CARD,     "LGWAN IC Card",        "Japanese Government",  "P11STD9.DLL"},
270    {11,    SECURE_IC_CARD,     "LGWAN IC Card",        "Japanese Government",  "P11STD9A.DLL"},
271    {12,    SECURE_USB_TOKEN,   "iKey 1000",            "Rainbow Technologies", "K1PK112.DLL"},
272    {13,    SECURE_IC_CARD,     "JPKI IC Card #2",      "Japanese Government",  "libmusclepkcs11.dll"},
273    {14,    SECURE_USB_TOKEN,   "SafeSign",             "A.E.T.",               "aetpkss1.dll"},
274    {15,    SECURE_USB_TOKEN,   "LOCK STAR-PKI",        "Logicaltech Co.,LTD",  "LTPKCS11.dll"},
275    {16,    SECURE_USB_TOKEN,   "ePass 2000",           "Feitian Technologies", "ep2pk11.dll"},
276    {17,    SECURE_IC_CARD,     "myuToken",             "iCanal Inc.",          "icardmodpk.dll"},
277};
278
279#ifdef  OS_WIN32
280
281// Win32 用内部データ
282typedef struct SEC_DATA_WIN32
283{
284    HINSTANCE hInst;
285} SEC_DATA_WIN32;
286
287#endif  // OS_WIN32
288
289#endif  // SECURE_C
290
291#endif  // SECURE_H
292
293
294
Note: See TracBrowser for help on using the repository browser.