* tar xzf utvpn-src-unix-v101-7101-public-2010.06.27.tar.gz
[lab.git] / utvpn / utvpn-unix-v101-7101-public / src / Mayaqua / Encrypt.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 // Encrypt.h\r
79 // Encrypt.c のヘッダ\r
80 \r
81 #ifndef ENCRYPT_H\r
82 #define ENCRYPT_H\r
83 \r
84 // OpenSSL の関数\r
85 void RAND_Init_For_SoftEther();\r
86 void RAND_Free_For_SoftEther();\r
87 \r
88 \r
89 \r
90 // 定数\r
91 #define MIN_SIGN_HASH_SIZE              (15 + SHA1_SIZE)\r
92 #define SIGN_HASH_SIZE                  (MIN_SIGN_HASH_SIZE)\r
93 \r
94 // マクロ\r
95 #define HASHED_DATA(p)                  (((UCHAR *)p) + 15)\r
96 \r
97 \r
98 \r
99 // 暗号化コンテキスト\r
100 struct CRYPT\r
101 {\r
102         int x, y;\r
103         int state[256];\r
104 };\r
105 \r
106 // 証明書内の名前\r
107 struct NAME\r
108 {\r
109         wchar_t *CommonName;            // CN\r
110         wchar_t *Organization;          // O\r
111         wchar_t *Unit;                          // OU\r
112         wchar_t *Country;                       // C\r
113         wchar_t *State;                         // ST\r
114         wchar_t *Local;                         // L\r
115 };\r
116 \r
117 // シリアル番号\r
118 struct X_SERIAL\r
119 {\r
120         UINT size;\r
121         UCHAR *data;\r
122 };\r
123 \r
124 // 証明書\r
125 struct X\r
126 {\r
127         X509 *x509;\r
128         NAME *issuer_name;\r
129         NAME *subject_name;\r
130         bool root_cert;\r
131         UINT64 notBefore;\r
132         UINT64 notAfter;\r
133         X_SERIAL *serial;\r
134         bool do_not_free;\r
135         bool is_compatible_bit;\r
136         UINT bits;\r
137 };\r
138 \r
139 // 鍵\r
140 struct K\r
141 {\r
142         EVP_PKEY *pkey;\r
143         bool private_key;\r
144 };\r
145 \r
146 // PKCS#12\r
147 struct P12\r
148 {\r
149         PKCS12 *pkcs12;\r
150 };\r
151 \r
152 // CEL\r
153 struct X_CRL\r
154 {\r
155         X509_CRL *Crl;\r
156 };\r
157 \r
158 // 定数\r
159 #define MD5_SIZE        16\r
160 #define SHA1_SIZE       20\r
161 \r
162 // OpenSSL のロック\r
163 extern LOCK **ssl_lock_obj;\r
164 \r
165 // 関数プロトタイプ\r
166 CRYPT *NewCrypt(void *key, UINT size);\r
167 void FreeCrypt(CRYPT *c);\r
168 void SetKey(CRYPT *c, void *key, UINT size);\r
169 void Encrypt(CRYPT *c, void *dst, void *src, UINT size);\r
170 void InternalEncrypt(CRYPT *c, void *dst, void *src, UINT size);\r
171 void Hash(void *dst, void *src, UINT size, bool sha1);\r
172 void HashSha1(void *dst, void *src, UINT size);\r
173 void InternalHash(void *dst, void *src, UINT size, bool sha1);\r
174 void InitCryptLibrary();\r
175 void Rand(void *buf, UINT size);\r
176 void Rand128(void *buf);\r
177 UINT64 Rand64();\r
178 UINT Rand32();\r
179 USHORT Rand16();\r
180 UCHAR Rand8();\r
181 bool Rand1();\r
182 UINT HashPtrToUINT(void *p);\r
183 \r
184 void CertTest();\r
185 BIO *BufToBio(BUF *b);\r
186 BUF *BioToBuf(BIO *bio);\r
187 BIO *NewBio();\r
188 void FreeBio(BIO *bio);\r
189 X *BioToX(BIO *bio, bool text);\r
190 X *BufToX(BUF *b, bool text);\r
191 void FreeX509(X509 *x509);\r
192 void FreeX(X *x);\r
193 BIO *XToBio(X *x, bool text);\r
194 BUF *XToBuf(X *x, bool text);\r
195 K *BioToK(BIO *bio, bool private_key, bool text, char *password);\r
196 int PKeyPasswordCallbackFunction(char *buf, int bufsize, int verify, void *param);\r
197 void FreePKey(EVP_PKEY *pkey);\r
198 void FreeK(K *k);\r
199 K *BufToK(BUF *b, bool private_key, bool text, char *password);\r
200 bool IsEncryptedK(BUF *b, bool private_key);\r
201 bool IsBase64(BUF *b);\r
202 BIO *KToBio(K *k, bool text, char *password);\r
203 BUF *KToBuf(K *k, bool text, char *password);\r
204 X *FileToX(char *filename);\r
205 X *FileToXW(wchar_t *filename);\r
206 bool XToFile(X *x, char *filename, bool text);\r
207 bool XToFileW(X *x, wchar_t *filename, bool text);\r
208 K *FileToK(char *filename, bool private_key, char *password);\r
209 K *FileToKW(wchar_t *filename, bool private_key, char *password);\r
210 bool KToFile(K *k, char *filename, bool text, char *password);\r
211 bool KToFileW(K *k, wchar_t *filename, bool text, char *password);\r
212 bool CheckXandK(X *x, K *k);\r
213 bool CompareX(X *x1, X *x2);\r
214 NAME *X509NameToName(void *xn);\r
215 wchar_t *GetUniStrFromX509Name(void *xn, int nid);\r
216 void LoadXNames(X *x);\r
217 void FreeXNames(X *x);\r
218 void FreeName(NAME *n);\r
219 bool CompareName(NAME *n1, NAME *n2);\r
220 K *GetKFromX(X *x);\r
221 bool CheckSignature(X *x, K *k);\r
222 X *X509ToX(X509 *x509);\r
223 bool CheckX(X *x, X *x_issuer);\r
224 bool Asn1TimeToSystem(SYSTEMTIME *s, void *asn1_time);\r
225 bool StrToSystem(SYSTEMTIME *s, char *str);\r
226 UINT64 Asn1TimeToUINT64(void *asn1_time);\r
227 bool SystemToAsn1Time(void *asn1_time, SYSTEMTIME *s);\r
228 bool UINT64ToAsn1Time(void *asn1_time, UINT64 t);\r
229 bool SystemToStr(char *str, UINT size, SYSTEMTIME *s);\r
230 void LoadXDates(X *x);\r
231 bool CheckXDate(X *x, UINT64 current_system_time);\r
232 bool CheckXDateNow(X *x);\r
233 NAME *NewName(wchar_t *common_name, wchar_t *organization, wchar_t *unit,\r
234                           wchar_t *country, wchar_t *state, wchar_t *local);\r
235 void *NameToX509Name(NAME *nm);\r
236 void FreeX509Name(void *xn);\r
237 bool AddX509Name(void *xn, int nid, wchar_t *str);\r
238 X509 *NewRootX509(K *pub, K *priv, NAME *name, UINT days, X_SERIAL *serial);\r
239 X *NewRootX(K *pub, K *priv, NAME *name, UINT days, X_SERIAL *serial);\r
240 X509 *NewX509(K *pub, K *priv, X *ca, NAME *name, UINT days, X_SERIAL *serial);\r
241 X *NewX(K *pub, K *priv, X *ca, NAME *name, UINT days, X_SERIAL *serial);\r
242 UINT GetDaysUntil2038();\r
243 X_SERIAL *NewXSerial(void *data, UINT size);\r
244 void FreeXSerial(X_SERIAL *serial);\r
245 char *ByteToStr(BYTE *src, UINT src_size);\r
246 P12 *BioToP12(BIO *bio);\r
247 P12 *PKCS12ToP12(PKCS12 *pkcs12);\r
248 P12 *BufToP12(BUF *b);\r
249 BIO *P12ToBio(P12 *p12);\r
250 BUF *P12ToBuf(P12 *p12);\r
251 void FreePKCS12(PKCS12 *pkcs12);\r
252 void FreeP12(P12 *p12);\r
253 P12 *FileToP12(char *filename);\r
254 P12 *FileToP12W(wchar_t *filename);\r
255 bool P12ToFile(P12 *p12, char *filename);\r
256 bool P12ToFileW(P12 *p12, wchar_t *filename);\r
257 bool ParseP12(P12 *p12, X **x, K **k, char *password);\r
258 bool IsEncryptedP12(P12 *p12);\r
259 P12 *NewP12(X *x, K *k, char *password);\r
260 X *CloneX(X *x);\r
261 K *CloneK(K *k);\r
262 void FreeCryptLibrary();\r
263 void GetPrintNameFromX(wchar_t *str, UINT size, X *x);\r
264 void GetPrintNameFromXA(char *str, UINT size, X *x);\r
265 void GetPrintNameFromName(wchar_t *str, UINT size, NAME *name);\r
266 void GetAllNameFromX(wchar_t *str, UINT size, X *x);\r
267 void GetAllNameFromA(char *str, UINT size, X *x);\r
268 void GetAllNameFromName(wchar_t *str, UINT size, NAME *name);\r
269 void GetAllNameFromNameEx(wchar_t *str, UINT size, NAME *name);\r
270 void GetAllNameFromXEx(wchar_t *str, UINT size, X *x);\r
271 void GetAllNameFromXExA(char *str, UINT size, X *x);\r
272 BUF *BigNumToBuf(BIGNUM *bn);\r
273 BIGNUM *BinToBigNum(void *data, UINT size);\r
274 BIGNUM *BufToBigNum(BUF *b);\r
275 X_SERIAL *CloneXSerial(X_SERIAL *src);\r
276 bool CompareXSerial(X_SERIAL *s1, X_SERIAL *s2);\r
277 void GetXDigest(X *x, UCHAR *buf, bool sha1);\r
278 NAME *CopyName(NAME *n);\r
279 \r
280 \r
281 bool RsaGen(K **priv, K **pub, UINT bit);\r
282 bool RsaCheck();\r
283 bool RsaCheckEx();\r
284 bool RsaPublicEncrypt(void *dst, void *src, UINT size, K *k);\r
285 bool RsaPrivateDecrypt(void *dst, void *src, UINT size, K *k);\r
286 bool RsaPrivateEncrypt(void *dst, void *src, UINT size, K *k);\r
287 bool RsaPublicDecrypt(void *dst, void *src, UINT size, K *k);\r
288 bool RsaSign(void *dst, void *src, UINT size, K *k);\r
289 bool RsaSignEx(void *dst, void *src, UINT size, K *k, UINT bits);\r
290 bool HashForSign(void *dst, UINT dst_size, void *src, UINT src_size);\r
291 bool RsaVerify(void *data, UINT data_size, void *sign, K *k);\r
292 bool RsaVerifyEx(void *data, UINT data_size, void *sign, K *k, UINT bits);\r
293 UINT RsaPublicSize(K *k);\r
294 void RsaPublicToBin(K *k, void *data);\r
295 BUF *RsaPublicToBuf(K *k);\r
296 K *RsaBinToPublic(void *data, UINT size);\r
297 \r
298 X_CRL *FileToXCrl(char *filename);\r
299 X_CRL *FileToXCrlW(wchar_t *filename);\r
300 X_CRL *BufToXCrl(BUF *b);\r
301 void FreeXCrl(X_CRL *r);\r
302 bool IsXRevokedByXCrl(X *x, X_CRL *r);\r
303 bool IsXRevoked(X *x);\r
304 \r
305 \r
306 \r
307 void OpenSSL_InitLock();\r
308 void OpenSSL_FreeLock();\r
309 void OpenSSL_Lock(int mode, int n, const char *file, int line);\r
310 unsigned long OpenSSL_Id(void);\r
311 void FreeOpenSSLThreadState();\r
312 \r
313 #ifdef  ENCRYPT_C\r
314 // 内部関数\r
315 \r
316 \r
317 #endif  // ENCRYPT_C\r
318 \r
319 #endif  // ENCRYPT_H\r
320 \r