OSDN Git Service

Treat SSL 3.0 as a weak encryption method and change not to use it by default.
[ffftp/ffftp.git] / registry.c
index 7f03155..a3809c2 100644 (file)
@@ -93,13 +93,19 @@ static int WriteBinaryToReg(void *Handle, char *Name, void *Bin, int Len);
 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
@@ -226,6 +232,11 @@ extern int AutoRefreshFileList;
 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
@@ -297,19 +308,62 @@ int ValidateMasterPassword(void)
        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
@@ -364,14 +418,38 @@ void SaveRegistry(void)
        {\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
@@ -548,6 +626,7 @@ void SaveRegistry(void)
                                                        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
@@ -637,6 +716,7 @@ void SaveRegistry(void)
                                                        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
@@ -692,6 +772,11 @@ void SaveRegistry(void)
                                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
@@ -717,6 +802,31 @@ void SaveRegistry(void)
                                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
@@ -781,32 +891,33 @@ int LoadRegistry(void)
                        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
@@ -1027,6 +1138,7 @@ int LoadRegistry(void)
                                        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
@@ -1039,6 +1151,8 @@ int LoadRegistry(void)
                                        // 再転送対応\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
@@ -1123,6 +1237,7 @@ int LoadRegistry(void)
                                        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
@@ -1174,6 +1289,11 @@ int LoadRegistry(void)
                        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
@@ -1187,13 +1307,17 @@ int LoadRegistry(void)
                                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
@@ -1401,7 +1525,7 @@ void SaveSettingsToFile(void)
                                        {\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
@@ -1465,7 +1589,7 @@ int LoadSettingsFromFile(void)
                                        {\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
@@ -1484,7 +1608,9 @@ int LoadSettingsFromFile(void)
                        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
@@ -1785,7 +1911,7 @@ static void EncodePassword3(char *Str, char *Buf, const char *Key)
                        /* 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
@@ -1799,7 +1925,7 @@ static void EncodePassword3(char *Str, char *Buf, const char *Key)
                        // 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
@@ -2313,7 +2439,9 @@ static BOOL WriteOutRegToFile(REGDATATBL *Pos)
                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
@@ -3259,8 +3387,11 @@ static char *ScanValue(void *Handle, char *Name)
 *                      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
@@ -3289,6 +3420,12 @@ int CheckPasswordValidity( char* Password, int length, const char* HashStr )
        \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
@@ -3305,13 +3442,22 @@ int CheckPasswordValidity( char* Password, int length, const char* HashStr )
 *      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
@@ -3325,15 +3471,34 @@ void CreatePasswordHash( char* Password, int length, char* HashStr )
 \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
@@ -3341,7 +3506,7 @@ void SetHashSalt( DWORD salt )
 *      Return Value\r
 *              ランダムな値:コンパイラVS2005/動作環境WinXP以上では rand_s から取得する\r
 *----------------------------------------------------------------------------*/\r
-DWORD GetRandamDWRODValue(void)\r
+DWORD GetRandamDWORDValue(void)\r
 {\r
        DWORD rndValue;\r
        int errorCode;\r
@@ -3405,31 +3570,54 @@ DWORD GetRandamDWRODValue(void)
 }\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
@@ -3519,7 +3707,7 @@ void SaveSettingsToFileZillaXml()
        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
@@ -3682,7 +3870,7 @@ void SaveSettingsToFileZillaXml()
                        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