int CheckPasswordValidity( char* Password, int length, const char* HashStr, int StretchCount );\r
void CreatePasswordHash( char* Password, int length, char* HashStr, int StretchCount );\r
void SetHashSalt( DWORD salt );\r
+// 全設定暗号化対応\r
+void SetHashSalt1(void* Salt, int Length);\r
\r
-DWORD GetRandamDWRODValue(void);\r
+DWORD GetRandamDWORDValue(void);\r
\r
// 全設定暗号化対応\r
void GetMaskWithHMACSHA1(DWORD IV, const char* Salt, int SaltLength, void* pHash);\r
int salt = 0;\r
// 全設定暗号化対応\r
int stretch = 0;\r
+ unsigned char salt1[16];\r
\r
- if( ReadIntValueFromReg(hKey3, "CredentialSalt", &salt)){\r
- SetHashSalt( salt );\r
- }\r
- if( ReadStringFromReg(hKey3, "CredentialCheck", checkbuf, sizeof( checkbuf )) == FFFTP_SUCCESS ){\r
- // 全設定暗号化対応\r
+ // 全設定暗号化対応\r
+// if( ReadIntValueFromReg(hKey3, "CredentialSalt", &salt)){\r
+// SetHashSalt( salt );\r
+// }\r
+// if( ReadStringFromReg(hKey3, "CredentialCheck", checkbuf, sizeof( checkbuf )) == FFFTP_SUCCESS ){\r
// switch( CheckPasswordValidity( SecretKey, SecretKeyLength, checkbuf ) ){\r
+// case 0: /* not match */\r
+// IsMasterPasswordError = PASSWORD_UNMATCH;\r
+// break;\r
+// case 1: /* match */\r
+// IsMasterPasswordError = PASSWORD_OK;\r
+// break;\r
+// case 2: /* invalid hash */\r
+// default:\r
+// IsMasterPasswordError = BAD_PASSWORD_HASH;\r
+// break;\r
+// }\r
+// }\r
+ if(ReadStringFromReg(hKey3, "CredentialCheck1", checkbuf, sizeof(checkbuf)) == FFFTP_SUCCESS)\r
+ {\r
+ if(ReadBinaryFromReg(hKey3, "CredentialSalt1", &salt1, sizeof(salt1)) == FFFTP_SUCCESS)\r
+ SetHashSalt1(&salt1, 16);\r
+ else\r
+ SetHashSalt1(NULL, 0);\r
ReadIntValueFromReg(hKey3, "CredentialStretch", &stretch);\r
- switch( CheckPasswordValidity( SecretKey, SecretKeyLength, checkbuf, stretch ) ){\r
- case 0: /* not match */\r
+ switch(CheckPasswordValidity(SecretKey, SecretKeyLength, checkbuf, stretch))\r
+ {\r
+ case 0:\r
IsMasterPasswordError = PASSWORD_UNMATCH;\r
break;\r
- case 1: /* match */\r
+ case 1:\r
+ IsMasterPasswordError = PASSWORD_OK;\r
+ break;\r
+ default:\r
+ IsMasterPasswordError = BAD_PASSWORD_HASH;\r
+ break;\r
+ }\r
+ }\r
+ else if(ReadStringFromReg(hKey3, "CredentialCheck", checkbuf, sizeof(checkbuf)) == FFFTP_SUCCESS)\r
+ {\r
+ if(ReadIntValueFromReg(hKey3, "CredentialSalt", &salt) == FFFTP_SUCCESS)\r
+ SetHashSalt(salt);\r
+ else\r
+ SetHashSalt1(NULL, 0);\r
+ switch(CheckPasswordValidity(SecretKey, SecretKeyLength, checkbuf, 0))\r
+ {\r
+ case 0:\r
+ IsMasterPasswordError = PASSWORD_UNMATCH;\r
+ break;\r
+ case 1:\r
IsMasterPasswordError = PASSWORD_OK;\r
break;\r
- case 2: /* invalid hash */\r
default:\r
IsMasterPasswordError = BAD_PASSWORD_HASH;\r
break;\r
{\r
char buf[48];\r
int salt = GetTickCount();\r
+ // 全設定暗号化対応\r
+ unsigned char salt1[16];\r
+ FILETIME ft[4];\r
\r
WriteIntValueToReg(hKey3, "Version", VER_NUM);\r
- WriteIntValueToReg(hKey3, "CredentialSalt", salt);\r
- \r
- SetHashSalt( salt );\r
- /* save password hash */\r
// 全設定暗号化対応\r
+// WriteIntValueToReg(hKey3, "CredentialSalt", salt);\r
+// \r
+// SetHashSalt( salt );\r
+// /* save password hash */\r
// CreatePasswordHash( SecretKey, SecretKeyLength, buf );\r
+// WriteStringToReg(hKey3, "CredentialCheck", buf);\r
if(EncryptAllSettings == YES)\r
{\r
+ GetProcessTimes(GetCurrentProcess(), &ft[0], &ft[1], &ft[2], &ft[3]);\r
+ memcpy(&salt1[0], &salt, 4);\r
+ memcpy(&salt1[4], &ft[0].dwLowDateTime, 4);\r
+ memcpy(&salt1[8], &ft[2].dwLowDateTime, 4);\r
+ memcpy(&salt1[12], &ft[3].dwLowDateTime, 4);\r
+ SetHashSalt1(&salt1, 16);\r
+ WriteBinaryToReg(hKey3, "CredentialSalt1", &salt1, sizeof(salt1));\r
WriteIntValueToReg(hKey3, "CredentialStretch", 65535);\r
- CreatePasswordHash( SecretKey, SecretKeyLength, buf, 65535 );\r
+ CreatePasswordHash(SecretKey, SecretKeyLength, buf, 65535);\r
+ WriteStringToReg(hKey3, "CredentialCheck1", buf);\r
}\r
else\r
{\r
- WriteIntValueToReg(hKey3, "CredentialStretch", 0);\r
- CreatePasswordHash( SecretKey, SecretKeyLength, buf, 0 );\r
+ SetHashSalt( salt );\r
+ WriteIntValueToReg(hKey3, "CredentialSalt", salt);\r
+ CreatePasswordHash(SecretKey, SecretKeyLength, buf, 0);\r
+ WriteStringToReg(hKey3, "CredentialCheck", buf);\r
}\r
- WriteStringToReg(hKey3, "CredentialCheck", buf);\r
\r
// 全設定暗号化対応\r
WriteIntValueToReg(hKey3, "EncryptAll", EncryptAllSettings);\r
SaveIntNum(hKey5, "SFTP", Hist.UseSFTP, DefaultHist.UseSFTP);\r
EncodePassword(Hist.PrivateKey, Str);\r
SaveStr(hKey5, "PKey", Str, DefaultHist.PrivateKey);\r
+ SaveIntNum(hKey5, "NoWeak", Hist.NoWeakEncryption, DefaultHist.NoWeakEncryption);\r
// 同時接続対応\r
SaveIntNum(hKey5, "ThreadCount", Hist.MaxThreadCount, DefaultHist.MaxThreadCount);\r
SaveIntNum(hKey5, "ReuseCmdSkt", Hist.ReuseCmdSkt, DefaultHist.ReuseCmdSkt);\r
CloseSubKey(hKey4);\r
}\r
DeleteSubKey(hKey3, "Options");\r
+ DeleteValue(hKey3, "CredentialSalt");\r
+ DeleteValue(hKey3, "CredentialCheck");\r
+ }\r
+ else\r
+ {\r
+ if(OpenSubKey(hKey3, "EncryptedOptions", &hKey4) == FFFTP_SUCCESS)\r
+ {\r
+ for(i = 0; ; i++)\r
+ {\r
+ sprintf(Str, "Host%d", i);\r
+ if(DeleteSubKey(hKey4, Str) != FFFTP_SUCCESS)\r
+ break;\r
+ }\r
+ for(i = 0; ; i++)\r
+ {\r
+ sprintf(Str, "History%d", i);\r
+ if(DeleteSubKey(hKey4, Str) != FFFTP_SUCCESS)\r
+ break;\r
+ }\r
+ CloseSubKey(hKey4);\r
+ }\r
+ DeleteSubKey(hKey3, "EncryptedOptions");\r
+ DeleteValue(hKey3, "CredentialSalt1");\r
+ DeleteValue(hKey3, "CredentialStretch");\r
+ DeleteValue(hKey3, "CredentialCheck1");\r
}\r
CloseReg(hKey3);\r
}\r
IniKanjiCode = KANJI_SJIS;\r
\r
// 全設定暗号化対応\r
- if(Version >= 1990)\r
+ if(GetMasterPasswordStatus() == PASSWORD_OK)\r
{\r
- if(GetMasterPasswordStatus() == PASSWORD_OK)\r
+ ReadIntValueFromReg(hKey3, "EncryptAll", &EncryptAllSettings);\r
+ sprintf(Buf, "%d", EncryptAllSettings);\r
+ ReadStringFromReg(hKey3, "EncryptAllDetector", Str, 255);\r
+ DecodePassword(Str, Buf2);\r
+ EncryptSettings = EncryptAllSettings;\r
+ memset(&EncryptSettingsChecksum, 0, 20);\r
+ if(strcmp(Buf, Buf2) != 0)\r
{\r
- ReadIntValueFromReg(hKey3, "EncryptAll", &EncryptAllSettings);\r
- sprintf(Buf, "%d", EncryptAllSettings);\r
- ReadStringFromReg(hKey3, "EncryptAllDetector", Str, 255);\r
- DecodePassword(Str, Buf2);\r
- EncryptSettings = EncryptAllSettings;\r
- memset(&EncryptSettingsChecksum, 0, 20);\r
- if(strcmp(Buf, Buf2) != 0)\r
+ switch(DialogBox(GetFtpInst(), MAKEINTRESOURCE(corruptsettings_dlg), GetMainHwnd(), AnyButtonDialogProc))\r
{\r
- switch(DialogBox(GetFtpInst(), MAKEINTRESOURCE(corruptsettings_dlg), GetMainHwnd(), AnyButtonDialogProc))\r
- {\r
- case IDCANCEL:\r
- Terminate();\r
- break;\r
- case IDABORT:\r
- CloseReg(hKey3);\r
- ClearRegistry();\r
- ClearIni();\r
- Restart();\r
- Terminate();\r
- break;\r
- case IDRETRY:\r
- EncryptSettingsError = YES;\r
- break;\r
- case IDIGNORE:\r
- break;\r
- }\r
+ case IDCANCEL:\r
+ Terminate();\r
+ break;\r
+ case IDABORT:\r
+ CloseReg(hKey3);\r
+ ClearRegistry();\r
+ ClearIni();\r
+ Restart();\r
+ Terminate();\r
+ break;\r
+ case IDRETRY:\r
+ EncryptSettingsError = YES;\r
+ break;\r
+ case IDIGNORE:\r
+ break;\r
}\r
}\r
}\r
strcpy(Str, "");\r
ReadStringFromReg(hKey5, "PKey", Str, PRIVATE_KEY_LEN*4+1);\r
DecodePassword(Str, Hist.PrivateKey);\r
+ ReadIntValueFromReg(hKey5, "NoWeak", &Hist.NoWeakEncryption);\r
// 同時接続対応\r
ReadIntValueFromReg(hKey5, "ThreadCount", &Hist.MaxThreadCount);\r
ReadIntValueFromReg(hKey5, "ReuseCmdSkt", &Hist.ReuseCmdSkt);\r
// 再転送対応\r
ReadIntValueFromReg(hKey5, "ErrMode", &Hist.TransferErrorMode);\r
ReadIntValueFromReg(hKey5, "ErrNotify", &Hist.TransferErrorNotify);\r
+ // セッションあたりの転送量制限対策\r
+ ReadIntValueFromReg(hKey5, "ErrReconnect", &Hist.TransferErrorReconnect);\r
\r
CloseSubKey(hKey5);\r
AddHistoryToHistory(&Hist);\r
/* PAD部分を乱数で埋める StrPad[StrLen](が有効な場合) は NUL */\r
for(StrPadIndex = StrLen + 1; StrPadIndex < StrPadLen;)\r
{\r
- RandValue = GetRandamDWRODValue();\r
+ RandValue = GetRandamDWORDValue();\r
for(RandByteCount = 0; RandByteCount < 4; RandByteCount++)\r
{\r
if(StrPadIndex < StrPadLen)\r
// IVの初期化\r
for(IvIndex = 0; IvIndex < AES_BLOCK_SIZE;)\r
{\r
- RandValue = GetRandamDWRODValue();\r
+ RandValue = GetRandamDWORDValue();\r
for(RandByteCount = 0; RandByteCount < 4; RandByteCount++)\r
{\r
if(IvIndex < AES_BLOCK_SIZE)\r
\r
void SetHashSalt( DWORD salt )\r
{\r
- unsigned char* pos = &SecretKey[strlen(SecretKey) + 1];\r
+ // 全設定暗号化対応\r
+// unsigned char* pos = &SecretKey[strlen(SecretKey) + 1];\r
+ unsigned char c[4];\r
+ unsigned char* pos = &c[0];\r
*pos++ = ( salt >> 24 ) & 0xff;\r
*pos++ = ( salt >> 16 ) & 0xff;\r
*pos++ = ( salt >> 8 ) & 0xff;\r
*pos++ = ( salt ) & 0xff;\r
\r
- SecretKeyLength = strlen( SecretKey ) + 5;\r
+// SecretKeyLength = strlen( SecretKey ) + 5;\r
+ SetHashSalt1(&c, 4);\r
}\r
\r
+// 全設定暗号化対応\r
+void SetHashSalt1(void* Salt, int Length)\r
+{\r
+ void* p;\r
+ if(Salt != NULL)\r
+ {\r
+ p = &SecretKey[strlen(SecretKey) + 1];\r
+ memcpy(p, Salt, Length);\r
+ SecretKeyLength = (int)strlen(SecretKey) + 1 + Length;\r
+ }\r
+ else\r
+ SecretKeyLength = (int)strlen(SecretKey) + 1;\r
+}\r
+\r
+\r
/*----------- 乱数生成をする -------------------------------------------------\r
*\r
* Parameter\r
* Return Value\r
* ランダムな値:コンパイラVS2005/動作環境WinXP以上では rand_s から取得する\r
*----------------------------------------------------------------------------*/\r
-DWORD GetRandamDWRODValue(void)\r
+DWORD GetRandamDWORDValue(void)\r
{\r
DWORD rndValue;\r
int errorCode;\r