• R/O
  • SSH
  • HTTPS

sf-04webserver: Commit


Commit MetaInfo

Revisión449 (tree)
Tiempo2011-08-23 00:28:19
Autoryuh

Log Message

(empty log message)

Cambiar Resumen

Diferencia incremental

--- 1xx/04WebServer/trunk/AuthenticateManager.cpp (revision 448)
+++ 1xx/04WebServer/trunk/AuthenticateManager.cpp (revision 449)
@@ -2,7 +2,8 @@
22 #include "AuthenticateManager.h"
33 #include "TextTools.h"
44 #include "Base64.h"
5-#include "openssl\rc4.h"
5+#include "CryptTools.h"
6+#include "DigestAuthenticate.h"
67
78 #define PRIVATE_KEY_LENGTH 8
89 #define TIME_LENGTH 16
@@ -25,10 +26,13 @@
2526 void CAuthenticateManager::Start(CWorkspaceAccess setting)
2627 {
2728 // スクランブルキーを設定
28- m_scrambleKey = (DWORD)CTime::GetCurrentTime().GetTime() + GetTickCount();
29+ srand((unsigned int)CTime::GetCurrentTime().GetTime() + GetTickCount());
30+ m_scrambleKey.AppendDoubleWord(rand());
31+ m_scrambleKey.AppendDoubleWord(rand());
32+ m_scrambleKey.AppendDoubleWord(rand());
33+ m_scrambleKey.AppendDoubleWord(rand());
2934
3035 // プライベートキー取得
31- srand(m_scrambleKey);
3236 for(int i=0;i<PRIVATE_KEY_LENGTH;i++)
3337 m_privateKey += (TCHAR)((rand() % 27) + _T('a'));
3438
@@ -35,7 +39,10 @@
3539 // Nonce利用可能期間
3640 m_expireTime = setting.GetKeyInt(_T("Authenticate::NonceLifeTime"), 5); // 5分間
3741
38-CheckNonce(CreateNonce());
42+
43+ CWorkspace test;
44+ CDigestAuthenticate::ParseAuthOptionLine("Digest username=\",hoge\", realm=\"Secret, Zone,\", nonce=\"RMH1usDrAwA=6dc290ea3304de42a7347e0a94089ff5912ce0de\", uri=\"/~68user/net/sample/http-auth-digest/secret.html\", algorithm=MD5, qop=auth, nc=00000001, cnonce=\"e79e26e0d17c978d\", response=\"0d73182c1602ce8749feeb4b89389019\"", test.GetAccess(""));
45+//CheckNonce(CreateNonce());
3946 }
4047
4148 /*!
@@ -48,15 +55,10 @@
4855 CBinaryData bSrc;
4956 bSrc.AppendString(src);
5057
51- // 暗号化準備
58+ // RC4
5259 CBinaryData crypted;
53- crypted.ReSize(bSrc.GetSize());
60+ CCryptTools::CryptRC4(bSrc, crypted, m_scrambleKey);
5461
55- // RC4
56- RC4_KEY rc4key;
57- RC4_set_key(&rc4key, sizeof(m_scrambleKey), (unsigned char *)&m_scrambleKey);
58- RC4(&rc4key, bSrc.GetSize(), (unsigned char *)bSrc.GetPtr(), (unsigned char *)crypted.GetPtr());
59-
6062 // B64
6163 CString b64;
6264 CBase64::Encode64bin(crypted, b64);
@@ -76,13 +78,8 @@
7678
7779 // 暗号化準備
7880 CBinaryData bSrc;
79- bSrc.ReSize(crypted.GetSize());
81+ CCryptTools::CryptRC4(crypted, bSrc, m_scrambleKey);
8082
81- // RC4
82- RC4_KEY rc4key;
83- RC4_set_key(&rc4key, sizeof(m_scrambleKey), (unsigned char *)&m_scrambleKey);
84- RC4(&rc4key, crypted.GetSize(), (unsigned char *)crypted.GetPtr(), (unsigned char *)bSrc.GetPtr());
85-
8683 // 長さチェック
8784 CString src = bSrc.GetString();
8885 if(src.GetLength() < NONCE_MIN_LENGTH)
@@ -111,17 +108,3 @@
111108 return TRUE;
112109 }
113110
114-/*!
115- 認証チェック
116-
117- \return TRUE:OK, FALSE:NG
118-*/
119-int CAuthenticateManager::CheckAuth(CString nonce, CString user, CString realm, CString passwd, CString cnonce, CString nc, CString qop, CString method, CString uri, CString tag)
120-{
121- // nonceチェック
122- if(!CheckNonce(nonce, tag))
123- return FALSE;
124-
125-
126- return 0;
127-}
--- 1xx/04WebServer/trunk/TextTools.h (revision 448)
+++ 1xx/04WebServer/trunk/TextTools.h (revision 449)
@@ -22,6 +22,12 @@
2222 //! トークン全て切り出し
2323 static void GetAllToken(CString str, CStringArray &tokens, CString div, int trim = FALSE);
2424
25+ //! トークンの切り出し(ダブルコーテーションによる文字列に対応)
26+ static int GetTokenDoubleQuotation(CString &str, CString &token, CString div, int trim = FALSE);
27+
28+ //! トークン全て切り出し
29+ static void GetAllTokenDoubleQuotation(CString str, CStringArray &tokens, CString div, int trim = FALSE);
30+
2531 //////////////////////////////////////////////////////////////
2632 // ワイルドカード比較
2733 //////////////////////////////////////////////////////////////
--- 1xx/04WebServer/trunk/DigestAuthenticate.cpp (nonexistent)
+++ 1xx/04WebServer/trunk/DigestAuthenticate.cpp (revision 449)
@@ -0,0 +1,68 @@
1+#include "StdAfx.h"
2+#include "DigestAuthenticate.h"
3+#include "TextTools.h"
4+#include "Base64.h"
5+#include "CryptTools.h"
6+
7+/*!
8+ ハッシュ取得
9+*/
10+CString CDigestAuthenticate::GetAuthDigestResponse(CString nonce, CString user, CString realm, CString passwd, CString nc, CString cnonce, CString qop, CString method, CString uri, CString tag)
11+{
12+ // A1文字列(MD5-HEX)
13+ CString a1 = CCryptTools::GetMD5HexFromStr(user + _T(":") + realm + _T(":") + passwd);
14+
15+ // A2文字列(MD5-HEX)
16+ CString a2 = CCryptTools::GetMD5HexFromStr(method + _T(":") + uri);
17+
18+ // Response文字列(MD5-HEX)
19+ CString response = CCryptTools::GetMD5HexFromStr(a1 + _T(":") + nonce + _T(":") + nc + _T(":") + cnonce + _T(":") + qop + _T(":") + a2);
20+ return(response);
21+}
22+
23+
24+/*!
25+ Authorization オプション文字列を分解
26+*/
27+void CDigestAuthenticate::ParseAuthOptionLine(CString optionLine, CWorkspaceAccess responseInfo)
28+{
29+ // 前処理
30+ optionLine.Trim();
31+
32+ // 認証方法
33+ CString authMethod;
34+ CTextTools::GetToken(optionLine, authMethod, _T(" "), TRUE);
35+ authMethod.MakeLower();
36+ responseInfo.SetKeyStr(_T("AuthMethod"), authMethod);
37+
38+ // 詳細を取得
39+ CWorkspaceAccess options = responseInfo.GetAccess(_T("Options"));
40+ CStringArray optionArray;
41+ CTextTools::GetAllTokenDoubleQuotation(optionLine, optionArray, _T(","), TRUE);
42+
43+ // 詳細を分解
44+ for(int i=0; i<optionArray.GetSize(); i++)
45+ {
46+ CString pair = optionArray[i];
47+ CString key;
48+ CTextTools::GetToken(pair, key, _T("="), TRUE);
49+ pair.Trim();
50+
51+ // 追加
52+ if(!key.IsEmpty() && !pair.IsEmpty())
53+ {
54+ // ダブルコーテーションを処理
55+ if(pair.Left(1) == _T("\""))
56+ pair = pair.Mid(1);
57+ if(pair.Right(1) == _T("\""))
58+ pair = pair.Left(pair.GetLength() - 1);
59+
60+ // ダブルコーテーションが無ければ追加
61+ if(key.Find(_T("\"")) == -1 && pair.Find(_T("\"")) == -1)
62+ options.SetKeyStr(key, pair);
63+ }
64+ }
65+}
66+
67+
68+
--- 1xx/04WebServer/trunk/Base64.h (revision 448)
+++ 1xx/04WebServer/trunk/Base64.h (revision 449)
@@ -32,11 +32,11 @@
3232 static CString Decode64(CString b64str);
3333
3434 private:
35- //! 16進数文字に変換(1文字ずつ変換)
35+ //! 16進数文字に変換(1文字ずつ変換)
3636 static TCHAR GetHexChar(int val);
3737
38- //! 16進数文字を数字に(2文字ずつ変換)
39- static unsigned char GetHexVal(TCHAR hex[2]);
38+ //! 16進数文字を数字に(1文字ずつ変換)
39+ static int GetHexVal(TCHAR hex);
4040
4141 static int GetEncodedLength(int len);
4242 static int _Encode(char *encoded,const unsigned char *string, int len);
--- 1xx/04WebServer/trunk/DigestAuthenticate.h (nonexistent)
+++ 1xx/04WebServer/trunk/DigestAuthenticate.h (revision 449)
@@ -0,0 +1,16 @@
1+#pragma once
2+#include "AuthenticateManager.h"
3+#include "Workspace.h"
4+
5+/*!
6+ ダイジェスト認証クラス
7+*/
8+class CDigestAuthenticate
9+{
10+public:
11+ //! ハッシュ取得
12+ static CString GetAuthDigestResponse(CString nonce, CString user, CString realm, CString passwd, CString nc, CString cnonce, CString qop, CString method, CString uri, CString tag = _T(""));
13+
14+ //! Authorization オプション文字列を分解
15+ static void ParseAuthOptionLine(CString optionLine, CWorkspaceAccess responseInfo);
16+};
--- 1xx/04WebServer/trunk/AuthenticateManager.h (revision 448)
+++ 1xx/04WebServer/trunk/AuthenticateManager.h (revision 449)
@@ -1,5 +1,6 @@
11 #pragma once
22 #include "Workspace.h"
3+#include "BinaryData.h"
34
45 /*!
56 認証マネージャ
@@ -23,15 +24,12 @@
2324 //! nonceチェック
2425 int CheckNonce(CString nonce, CString tag = _T(""));
2526
26- //! 認証チェック
27- int CheckAuth(CString nonce, CString user, CString realm, CString passwd, CString cnonce, CString nc, CString qop, CString method, CString uri, CString tag = _T(""));
28-
2927 protected:
3028 /////////////////////////////////////////////////////////////////////////////////////////////////////
3129 // メンバ変数
3230 /////////////////////////////////////////////////////////////////////////////////////////////////////
3331 //! nonce暗号化キー
34- DWORD m_scrambleKey;
32+ CBinaryData m_scrambleKey;
3533
3634 //! プライベートキー
3735 CString m_privateKey;
--- 1xx/04WebServer/trunk/CryptTools.cpp (nonexistent)
+++ 1xx/04WebServer/trunk/CryptTools.cpp (revision 449)
@@ -0,0 +1,62 @@
1+#include "StdAfx.h"
2+#include "CryptTools.h"
3+#include "Base64.h"
4+#include "openssl/md5.h"
5+
6+
7+/*!
8+ 暗号化、復号化
9+*/
10+void CCryptTools::CryptRC4(CBinaryData &srcData, CBinaryData &cryptedData, CBinaryData &key)
11+{
12+ // 鍵設定
13+ RC4_KEY rc4key;
14+ RC4_set_key(&rc4key, key.GetSize(), (unsigned char *)key.GetPtr());
15+
16+ // バッファサイズ変更
17+ cryptedData.ReSize(srcData.GetSize());
18+
19+ // 暗号化
20+ RC4(&rc4key, srcData.GetSize(), (unsigned char *)srcData.GetPtr(), (unsigned char *)cryptedData.GetPtr());
21+}
22+
23+/*!
24+ ハッシュ取得
25+*/
26+void CCryptTools::GetMD5(CBinaryData &srcData, CBinaryData &hash)
27+{
28+ // バッファ準備
29+ hash.ReSize(MD5_DIGEST_LENGTH);
30+
31+ // MD5実行
32+ MD5((unsigned char *)srcData.GetPtr(), srcData.GetSize(), (unsigned char *)hash.GetPtr());
33+}
34+
35+
36+/*!
37+ ハッシュ取得(HEX)
38+*/
39+CString CCryptTools::GetMD5Hex(CBinaryData &srcData)
40+{
41+ // ハッシュ生成
42+ CBinaryData hash;
43+ GetMD5(srcData, hash);
44+
45+ // HEXへ
46+ CString ret;
47+ CBase64::EncodeHEXbin(hash, ret);
48+
49+ return(ret);
50+}
51+
52+/*!
53+ ハッシュ取得(HEX)
54+*/
55+CString CCryptTools::GetMD5HexFromStr(CString srcStr)
56+{
57+ CBinaryData temp;
58+ temp.AppendString(srcStr);
59+
60+ return(GetMD5Hex(temp));
61+}
62+
--- 1xx/04WebServer/trunk/Base64.cpp (revision 448)
+++ 1xx/04WebServer/trunk/Base64.cpp (revision 449)
@@ -49,7 +49,7 @@
4949 {
5050 destPtr[0] = GetHexChar(*srcPtr >> 4);
5151 destPtr[1] = GetHexChar(*srcPtr & 0x0f);
52- destPtr++;
52+ destPtr += 2;
5353 srcPtr++;
5454 }
5555 dest.ReleaseBufferSetLength(encodedLen);
@@ -62,7 +62,39 @@
6262 */
6363 int CBase64::DecodeHEXbin(CString src, CBinaryData &dest)
6464 {
65- return 0;
65+ // 長さチェック
66+ int srcLen = src.GetLength();
67+ if((srcLen % 2) != 0) // 奇数長さはエラー
68+ return(-1);
69+
70+ // デコード後の長さ
71+ int decodedLen = srcLen / 2;
72+ dest.ReSize(decodedLen);
73+
74+ // 小文字に
75+ src.MakeLower();
76+
77+ // バッファ用意
78+ TCHAR *srcPtr = src.GetBuffer();
79+ unsigned char *destPtr = (unsigned char *)dest.GetPtr();
80+
81+ // デコード
82+ for(int i=0;i<decodedLen; i++)
83+ {
84+ // 変換してみる
85+ int hVal = GetHexVal(srcPtr[0]);
86+ int lVal = GetHexVal(srcPtr[1]);
87+
88+ // 変換エラー
89+ if(hVal < 0 || lVal < 0)
90+ return(-1);
91+
92+ *destPtr = (hVal<<4) + lVal;
93+ destPtr++;
94+ srcPtr += 2;
95+ }
96+
97+ return(0);
6698 }
6799
68100 /*!
@@ -74,22 +106,27 @@
74106 if(val <= 0)
75107 return(_T('0'));
76108 if(val >= 15)
77- return(_T('F'));
109+ return(_T('f'));
78110
79111 // 変換
80112 if(val <= 9)
81113 return(_T('0') + val);
82- return(_T('A') + val - 10);
114+ return(_T('a') + val - 10);
83115 }
84116
85117 /*!
86- 16進数文字を数字に(2文字ずつ変換)
118+ 16進数文字を数字に(1文字ずつ変換)
119+ 小文字のみ対応
87120 */
88-_inline unsigned char CBase64::GetHexVal(TCHAR hex[2])
121+_inline int CBase64::GetHexVal(TCHAR hex)
89122 {
90- unsigned char ret = 0;
123+ if(hex >= _T('0') && hex <= _T('9'))
124+ return(hex - _T('0'));
125+ if(hex >= _T('a') && hex <= _T('f'))
126+ return(hex - _T('a') + 10);
91127
92- if(hex[0] <= _T('0')
128+ // 範囲外
129+ return(-1);
93130 }
94131
95132
--- 1xx/04WebServer/trunk/CryptTools.h (nonexistent)
+++ 1xx/04WebServer/trunk/CryptTools.h (revision 449)
@@ -0,0 +1,23 @@
1+#pragma once
2+#include "BinaryData.h"
3+#include "openssl\rc4.h"
4+
5+/*!
6+ 暗号化ツール
7+*/
8+class CCryptTools
9+{
10+public:
11+ //! 暗号化、復号化
12+ static void CryptRC4(CBinaryData &srcData, CBinaryData &cryptedData, CBinaryData &key);
13+
14+ //! ハッシュ取得
15+ static void GetMD5(CBinaryData &srcData, CBinaryData &hash);
16+
17+ //! ハッシュ取得(HEX)
18+ static CString GetMD5Hex(CBinaryData &srcData);
19+
20+ //! ハッシュ取得(HEX)
21+ static CString GetMD5HexFromStr(CString srcStr);
22+};
23+
--- 1xx/04WebServer/trunk/TextTools.cpp (revision 448)
+++ 1xx/04WebServer/trunk/TextTools.cpp (revision 449)
@@ -54,14 +54,17 @@
5454 //////////////////////////////////////////////////////////////////////
5555 int CTextTools::GetToken(CString &str, CString &token, CString div, int trim)
5656 {
57+ // 空っぽ?
58+ if(str.IsEmpty())
59+ return(0);
60+
61+ // divの長さ
5762 int tlen = div.GetLength();
63+
64+ // トークンを検出
5865 int index = str.Find(div);
59-
6066 if(index == -1)
6167 {
62- if(str.IsEmpty())
63- return(0);
64-
6568 token = str;
6669 if(trim)
6770 token.Trim();
@@ -88,11 +91,89 @@
8891 tokens.RemoveAll();
8992
9093 CString token;
91- while(GetToken(str, token, div))
94+ while(GetToken(str, token, div, trim))
9295 tokens.Add(token);
9396 }
9497
98+/*!
99+ トークンの切り出し(ダブルコーテーションによる文字列に対応)
100+*/
101+int CTextTools::GetTokenDoubleQuotation(CString &str, CString &token, CString div, int trim)
102+{
103+ // 空っぽ?
104+ if(str.IsEmpty())
105+ return(0);
95106
107+ // divの長さ
108+ int tlen = div.GetLength();
109+
110+ // トークンを検出
111+ int curPos = 0;
112+ while(1)
113+ {
114+ int divIndex = str.Find(div, curPos);
115+ if(divIndex == -1)
116+ {
117+ // 全てがトークン
118+ token = str;
119+
120+ // トリム
121+ if(trim)
122+ token.Trim();
123+
124+ // 残りを削除
125+ str.Empty();
126+ return(1);
127+ }
128+
129+ // ダブルコーテーションを検索
130+ int dqIndex = str.Find(_T("\""), curPos);
131+ if(dqIndex != -1 && dqIndex < divIndex) // divよりダブルコーテーションが手前にある
132+ {
133+ // 閉じる方を検索
134+ dqIndex = str.Find(_T("\""), dqIndex + 1);
135+ if(dqIndex == -1)
136+ {
137+ // 全てがトークン
138+ token = str;
139+
140+ // トリム
141+ if(trim)
142+ token.Trim();
143+
144+ // 残りを削除
145+ str.Empty();
146+ return(1);
147+ }
148+ curPos = dqIndex + 1;
149+ }
150+ else
151+ {
152+ // 切り出し
153+ token = str.Left(divIndex);
154+ if(trim)
155+ token.Trim();
156+
157+ // 削除
158+ str = str.Mid(divIndex + tlen);
159+ return(1);
160+ }
161+ }
162+}
163+
164+/*!
165+ トークン全て切り出し
166+*/
167+void CTextTools::GetAllTokenDoubleQuotation(CString str, CStringArray &tokens, CString div, int trim)
168+{
169+ tokens.RemoveAll();
170+
171+ CString token;
172+ while(GetTokenDoubleQuotation(str, token, div, trim))
173+ tokens.Add(token);
174+}
175+
176+
96177 //////////////////////////////////////////////////////////////
97178 // ワイルドカード比較
98179 //////////////////////////////////////////////////////////////
Show on old repository browser