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
85 void RAND_Init_For_SoftEther();
\r
86 void RAND_Free_For_SoftEther();
\r
91 #define MIN_SIGN_HASH_SIZE (15 + SHA1_SIZE)
\r
92 #define SIGN_HASH_SIZE (MIN_SIGN_HASH_SIZE)
\r
95 #define HASHED_DATA(p) (((UCHAR *)p) + 15)
\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
129 NAME *subject_name;
\r
135 bool is_compatible_bit;
\r
159 #define MD5_SIZE 16
\r
160 #define SHA1_SIZE 20
\r
163 extern LOCK **ssl_lock_obj;
\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
182 UINT HashPtrToUINT(void *p);
\r
185 BIO *BufToBio(BUF *b);
\r
186 BUF *BioToBuf(BIO *bio);
\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
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
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
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
281 bool RsaGen(K **priv, K **pub, UINT bit);
\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
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
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
317 #endif // ENCRYPT_C
\r
319 #endif // ENCRYPT_H
\r