static int StrCatOut(char *Src, int Len, char *Dst);\r
static int StrReadIn(char *Src, int Max, char *Dst);\r
\r
-int CheckPasswordValidity( char* Password, int length, const char* HashStr );\r
-void CreatePasswordHash( char* Password, int length, char* HashStr );\r
+// 全設定暗号化対応\r
+//int CheckPasswordValidity( char* Password, int length, const char* HashStr );\r
+//void CreatePasswordHash( char* Password, int length, char* HashStr );\r
+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
void MaskSettingsData(const char* Salt, int SaltLength, void* Data, DWORD Size, int EscapeZero);\r
void UnmaskSettingsData(const char* Salt, int SaltLength, void* Data, DWORD Size, int EscapeZero);\r
void CalculateSettingsDataChecksum(void* Data, DWORD Size);\r
extern int RemoveOldLog;\r
// バージョン確認\r
extern int ReadOnlySettings;\r
+// ソフトウェア自動更新\r
+extern int AutoCheckForUpdates;\r
+extern int AutoApplyUpdates;\r
+extern int AutoCheckForUptatesInterval;\r
+extern time_t LastAutoCheckForUpdates;\r
\r
/*----- マスタパスワードの設定 ----------------------------------------------\r
*\r
if(i == FFFTP_SUCCESS){\r
char checkbuf[48];\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( 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
+ {\r
+ case 0:\r
+ IsMasterPasswordError = PASSWORD_UNMATCH;\r
+ break;\r
+ case 1:\r
+ IsMasterPasswordError = PASSWORD_OK;\r
+ break;\r
+ default:\r
+ IsMasterPasswordError = BAD_PASSWORD_HASH;\r
+ break;\r
+ }\r
}\r
- if( ReadStringFromReg(hKey3, "CredentialCheck", checkbuf, sizeof( checkbuf )) == FFFTP_SUCCESS ){\r
- switch( CheckPasswordValidity( SecretKey, SecretKeyLength, checkbuf ) ){\r
- case 0: /* not match */\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: /* match */\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
- CreatePasswordHash( SecretKey, SecretKeyLength, buf );\r
- WriteStringToReg(hKey3, "CredentialCheck", buf);\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
+ WriteStringToReg(hKey3, "CredentialCheck1", buf);\r
+ }\r
+ else\r
+ {\r
+ SetHashSalt( salt );\r
+ WriteIntValueToReg(hKey3, "CredentialSalt", salt);\r
+ CreatePasswordHash(SecretKey, SecretKeyLength, buf, 0);\r
+ WriteStringToReg(hKey3, "CredentialCheck", buf);\r
+ }\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
SaveIntNum(hKey5, "SFTP", Host.UseSFTP, DefaultHost.UseSFTP);\r
EncodePassword(Host.PrivateKey, Str);\r
SaveStr(hKey5, "PKey", Str, DefaultHost.PrivateKey);\r
+ SaveIntNum(hKey5, "NoWeak", Host.NoWeakEncryption, DefaultHost.NoWeakEncryption);\r
// 同時接続対応\r
SaveIntNum(hKey5, "ThreadCount", Host.MaxThreadCount, DefaultHost.MaxThreadCount);\r
SaveIntNum(hKey5, "ReuseCmdSkt", Host.ReuseCmdSkt, DefaultHost.ReuseCmdSkt);\r
WriteIntValueToReg(hKey4, "ListRefresh", AutoRefreshFileList);\r
// 古い処理内容を消去\r
WriteIntValueToReg(hKey4, "OldLog", RemoveOldLog);\r
+ // ソフトウェア自動更新\r
+ WriteIntValueToReg(hKey4, "UpdCheck", AutoCheckForUpdates);\r
+ WriteIntValueToReg(hKey4, "UpdApply", AutoApplyUpdates);\r
+ WriteIntValueToReg(hKey4, "UpdInterval", AutoCheckForUptatesInterval);\r
+ WriteBinaryToReg(hKey4, "UpdLastCheck", &LastAutoCheckForUpdates, sizeof(LastAutoCheckForUpdates));\r
}\r
CloseSubKey(hKey4);\r
}\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(MessageBox(GetMainHwnd(), MSGJPN343, "FFFTP", MB_ABORTRETRYIGNORE | MB_DEFBUTTON2))\r
- {\r
- case IDABORT:\r
- CloseReg(hKey3);\r
- ClearRegistry();\r
- ClearIni();\r
- RestartAndTerminate();\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
strcpy(Str, "");\r
ReadStringFromReg(hKey5, "PKey", Str, PRIVATE_KEY_LEN*4+1);\r
DecodePassword(Str, Host.PrivateKey);\r
+ ReadIntValueFromReg(hKey5, "NoWeak", &Host.NoWeakEncryption);\r
// 同時接続対応\r
ReadIntValueFromReg(hKey5, "ThreadCount", &Host.MaxThreadCount);\r
ReadIntValueFromReg(hKey5, "ReuseCmdSkt", &Host.ReuseCmdSkt);\r
ReadIntValueFromReg(hKey4, "ListRefresh", &AutoRefreshFileList);\r
// 古い処理内容を消去\r
ReadIntValueFromReg(hKey4, "OldLog", &RemoveOldLog);\r
+ // ソフトウェア自動更新\r
+ ReadIntValueFromReg(hKey4, "UpdCheck", &AutoCheckForUpdates);\r
+ ReadIntValueFromReg(hKey4, "UpdApply", &AutoApplyUpdates);\r
+ ReadIntValueFromReg(hKey4, "UpdInterval", &AutoCheckForUptatesInterval);\r
+ ReadBinaryFromReg(hKey4, "UpdLastCheck", &LastAutoCheckForUpdates, sizeof(LastAutoCheckForUpdates));\r
\r
CloseSubKey(hKey4);\r
}\r
ReadBinaryFromReg(hKey3, "EncryptAllChecksum", &Checksum, 20);\r
if(memcmp(&Checksum, &EncryptSettingsChecksum, 20) != 0)\r
{\r
- switch(MessageBox(GetMainHwnd(), MSGJPN343, "FFFTP", MB_ABORTRETRYIGNORE | MB_DEFBUTTON2))\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
- RestartAndTerminate();\r
+ Restart();\r
+ Terminate();\r
break;\r
case IDRETRY:\r
EncryptSettingsError = YES;\r
{\r
if(ShellExecute(NULL, "open", "regedit", Tmp, NULL, SW_SHOW) <= (HINSTANCE)32)\r
{\r
- MessageBox(NULL, MSGJPN285, "FFFTP", MB_OK);\r
+ MessageBox(GetMainHwnd(), MSGJPN285, "FFFTP", MB_OK | MB_ICONERROR);\r
}\r
SetCurrentDirectory(CurDir);\r
}\r
{\r
if(ShellExecute(NULL, "open", "regedit", Tmp, NULL, SW_SHOW) <= (HINSTANCE)32)\r
{\r
- MessageBox(NULL, MSGJPN285, "FFFTP", MB_OK);\r
+ MessageBox(GetMainHwnd(), MSGJPN285, "FFFTP", MB_OK | MB_ICONERROR);\r
}\r
else\r
{\r
Ret = YES;\r
}\r
else\r
- MessageBox(NULL, MSGJPN293, "FFFTP", MB_OK);\r
+ // バグ修正\r
+// MessageBox(NULL, MSGJPN293, "FFFTP", MB_OK);\r
+ MessageBox(GetMainHwnd(), MSGJPN293, "FFFTP", MB_OK | MB_ICONERROR);\r
}\r
return(Ret);\r
}\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
Ret = TRUE;\r
}\r
else\r
- MessageBox(NULL, MSGJPN240, "FFFTP", MB_OK);\r
+ // バグ修正\r
+// MessageBox(NULL, MSGJPN240, "FFFTP", MB_OK);\r
+ MessageBox(GetMainHwnd(), MSGJPN240, "FFFTP", MB_OK | MB_ICONERROR);\r
\r
return(Ret);\r
}\r
* 1: 一致\r
* 2: 異常\r
*----------------------------------------------------------------------------*/\r
-int CheckPasswordValidity( char* Password, int length, const char* HashStr )\r
+// 全設定暗号化対応\r
+//int CheckPasswordValidity( char* Password, int length, const char* HashStr )\r
+int CheckPasswordValidity( char* Password, int length, const char* HashStr, int StretchCount )\r
{\r
+ char Buf[MAX_PASSWORD_LEN + 32];\r
ulong hash1[5];\r
ulong hash2[5];\r
\r
\r
/* Password をハッシュする */\r
sha_memory( Password, length, hash2 );\r
+ for(i = 0; i < StretchCount; i++)\r
+ {\r
+ memcpy(&Buf[0], &hash2, 20);\r
+ memcpy(&Buf[20], Password, length);\r
+ sha_memory(Buf, 20 + length, hash2);\r
+ }\r
\r
if( memcmp( (char*)hash1, (char*)hash2, sizeof( hash1 )) == 0 ){\r
return 1;\r
* Return Value\r
* None\r
*----------------------------------------------------------------------------*/\r
-void CreatePasswordHash( char* Password, int length, char* HashStr )\r
+// 全設定暗号化対応\r
+//void CreatePasswordHash( char* Password, int length, char* HashStr )\r
+void CreatePasswordHash( char* Password, int length, char* HashStr, int StretchCount )\r
{\r
+ char Buf[MAX_PASSWORD_LEN + 32];\r
ulong hash[5];\r
int i, j;\r
unsigned char *p = (unsigned char *)HashStr;\r
\r
sha_memory( Password, length, hash );\r
+ for(i = 0; i < StretchCount; i++)\r
+ {\r
+ memcpy(&Buf[0], &hash, 20);\r
+ memcpy(&Buf[20], Password, length);\r
+ sha_memory(Buf, 20 + length, hash);\r
+ }\r
\r
for( i = 0; i < 5; i++ ){\r
ulong rest = hash[i];\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
}\r
\r
// 全設定暗号化対応\r
-// 内部状態推定対策としてハッシュの160ビットのうち80ビットのみを鍵として使用\r
+void GetMaskWithHMACSHA1(DWORD Nonce, const char* Salt, int SaltLength, void* pHash)\r
+{\r
+ BYTE Key[FMAX_PATH*2+1];\r
+ ulong Hash[5];\r
+ DWORD i;\r
+ for(i = 0; i < 16; i++)\r
+ {\r
+ Nonce = ~Nonce;\r
+ Nonce *= 1566083941;\r
+ Nonce = _byteswap_ulong(Nonce);\r
+ memcpy(&Key[i * 4], &Nonce, 4);\r
+ }\r
+ memcpy(&Key[64], Salt, SaltLength);\r
+ memcpy(&Key[64 + SaltLength], SecretKey, SecretKeyLength);\r
+ sha_memory((char*)&Key, 64 + SaltLength + SecretKeyLength, Hash);\r
+ // sha.cはビッグエンディアンのため\r
+ for(i = 0; i < 5; i++)\r
+ Hash[i] = _byteswap_ulong(Hash[i]);\r
+ memcpy(&Key[0], &Hash, 20);\r
+ memset(&Key[20], 0, 44);\r
+ for(i = 0; i < 64; i++)\r
+ Key[i] ^= 0x36;\r
+ sha_memory((char*)&Key, 64, Hash);\r
+ // sha.cはビッグエンディアンのため\r
+ for(i = 0; i < 5; i++)\r
+ Hash[i] = _byteswap_ulong(Hash[i]);\r
+ memcpy(&Key[64], &Hash, 20);\r
+ for(i = 0; i < 64; i++)\r
+ Key[i] ^= 0x6a;\r
+ sha_memory((char*)&Key, 84, Hash);\r
+ // sha.cはビッグエンディアンのため\r
+ for(i = 0; i < 5; i++)\r
+ Hash[i] = _byteswap_ulong(Hash[i]);\r
+ memcpy(pHash, &Hash, 20);\r
+}\r
+\r
void MaskSettingsData(const char* Salt, int SaltLength, void* Data, DWORD Size, int EscapeZero)\r
{\r
- char Key[FMAX_PATH*2+1];\r
BYTE* p;\r
DWORD i;\r
- DWORD j;\r
- ulong Hash[5];\r
- BYTE Mask[10];\r
- memcpy(&Key[0], SecretKey, SecretKeyLength);\r
- memcpy(&Key[SecretKeyLength], Salt, SaltLength);\r
+ BYTE Mask[20];\r
p = (BYTE*)Data;\r
for(i = 0; i < Size; i++)\r
{\r
- if(i % 10 == 0)\r
- {\r
- memcpy(&Key[SecretKeyLength + SaltLength], &i, 4);\r
- sha_memory(Key, SecretKeyLength + SaltLength + 4, Hash);\r
- // sha.cはビッグエンディアンのため\r
- for(j = 0; j < 5; j++)\r
- Hash[j] = _byteswap_ulong(Hash[j]);\r
- memcpy(&Mask, &Hash, 10);\r
- }\r
- if(EscapeZero == NO || (p[i] != 0 && p[i] != Mask[i % 10]))\r
- p[i] ^= Mask[i % 10];\r
+ if(i % 20 == 0)\r
+ GetMaskWithHMACSHA1(i, Salt, SaltLength, &Mask);\r
+ if(EscapeZero == NO || (p[i] != 0 && p[i] != Mask[i % 20]))\r
+ p[i] ^= Mask[i % 20];\r
}\r
}\r
\r
char* p1;\r
char* p2;\r
strcpy(Fname, "FileZilla.xml");\r
- if(SelectFile(GetMainHwnd(), Fname, MSGJPN286, MSGJPN357, "xml", OFN_EXTENSIONDIFFERENT | OFN_OVERWRITEPROMPT, 1) == TRUE)\r
+ if(SelectFile(GetMainHwnd(), Fname, MSGJPN286, MSGJPN356, "xml", OFN_EXTENSIONDIFFERENT | OFN_OVERWRITEPROMPT, 1) == TRUE)\r
{\r
if((f = fopen(Fname, "wt")) != NULL)\r
{\r
fclose(f);\r
}\r
else\r
- MessageBox(NULL, MSGJPN358, "FFFTP", MB_OK);\r
+ MessageBox(GetMainHwnd(), MSGJPN357, "FFFTP", MB_OK | MB_ICONERROR);\r
}\r
}\r
\r