OSDN Git Service

Change the algorithm to encrypt all settings.
authors_kawamoto <s_kawamoto@users.sourceforge.jp>
Sat, 11 Jan 2014 09:47:44 +0000 (18:47 +0900)
committers_kawamoto <s_kawamoto@users.sourceforge.jp>
Sat, 11 Jan 2014 09:47:44 +0000 (18:47 +0900)
Add a confirmation when the settings of a future version exist.
Modify documents.

FFFTP_Eng_Release/FFFTP.exe
Release/FFFTP.exe
common.h
doc/eng/FFFTP.txt
doc/eng/history.txt
doc/jpn/FFFTP.txt
doc/jpn/history.txt
main.c
mesg-eng.h
mesg-jpn.h
registry.c

index b1c0d53..fbb7123 100644 (file)
Binary files a/FFFTP_Eng_Release/FFFTP.exe and b/FFFTP_Eng_Release/FFFTP.exe differ
index fd66fd5..5e31bc5 100644 (file)
Binary files a/Release/FFFTP.exe and b/Release/FFFTP.exe differ
index b5e05b0..092df06 100644 (file)
--- a/common.h
+++ b/common.h
@@ -1802,6 +1802,8 @@ int LoadSettingsFromFile(void);
 // ポータブル版判定\r
 int IsRegAvailable();\r
 int IsIniAvailable();\r
+// バージョン確認\r
+int ReadSettingsVersion();\r
 \r
 /*===== lvtips.c =====*/\r
 \r
index b0391fe..de269a2 100644 (file)
@@ -49,6 +49,9 @@ Changes in Ver.1.99
 \r
 -- Fixed bugs of Select dialog.\r
 \r
+-- Changed to confirm how the settings will be saved when the settings of a\r
+   future version exist in the registry.\r
+\r
 \r
 Outline\r
 -------\r
index c641ae5..4f73095 100644 (file)
@@ -21,6 +21,9 @@ Changes in Ver.1.99
 \r
 -- Fixed bugs of Select dialog.\r
 \r
+-- Changed to confirm how the settings will be saved when the settings of a\r
+   future version exist in the registry.\r
+\r
 Changes in Ver.1.98g\r
 --------------------\r
 \r
index 367d923..b6db789 100644 (file)
@@ -53,6 +53,9 @@ Ver 1.99
 \r
 \81E\91I\91ð\83_\83C\83A\83\8d\83O\82ª\90³\8fí\82É\8b@\94\\82µ\82È\82¢\83o\83O\82ð\8fC\90³\82µ\82Ü\82µ\82½\81B\r
 \r
+\81E\83\8c\83W\83X\83g\83\8a\82É\8f«\97\88\82Ì\83o\81[\83W\83\87\83\93\82Ì\90Ý\92è\82ª\91\8dÝ\82·\82é\8fê\8d\87\82É\90Ý\92è\82Ì\95Û\91\95û\96@\82ð\r
+\81@\8am\94F\82·\82é\82æ\82¤\82É\82µ\82Ü\82µ\82½\81B\r
+\r
 \r
 Ver 1.96d\88È\91O\82Ö\96ß\82·\8fê\8d\87\r
 -----------------------\r
index 1564d99..69b2059 100644 (file)
@@ -25,6 +25,9 @@ FFFTP
 \r
 \81E\91I\91ð\83_\83C\83A\83\8d\83O\82ª\90³\8fí\82É\8b@\94\\82µ\82È\82¢\83o\83O\82ð\8fC\90³\82µ\82Ü\82µ\82½\81B\r
 \r
+\81E\83\8c\83W\83X\83g\83\8a\82É\8f«\97\88\82Ì\83o\81[\83W\83\87\83\93\82Ì\90Ý\92è\82ª\91\8dÝ\82·\82é\8fê\8d\87\82É\90Ý\92è\82Ì\95Û\91\95û\96@\82ð\r
+\81@\8am\94F\82·\82é\82æ\82¤\82É\82µ\82Ü\82µ\82½\81B\r
+\r
 \81¡Ver 1.98g\r
 \r
 \81EWindows 8 (32bit/64bit)\82Å\93®\8dì\82ð\8am\94F\82µ\82Ü\82µ\82½\81B\r
diff --git a/main.c b/main.c
index 9706d52..efc1e6b 100644 (file)
--- a/main.c
+++ b/main.c
@@ -265,6 +265,8 @@ int EncryptAllSettings = NO;
 int AutoRefreshFileList = YES;\r
 // 古い処理内容を消去\r
 int RemoveOldLog = NO;\r
+// バージョン確認\r
+int ReadOnlySettings = NO;\r
 \r
 \r
 \r
@@ -500,13 +502,33 @@ static int InitApp(LPSTR lpszCmdLine, int cmdShow)
                        if(IsRegAvailable() == YES && IsIniAvailable() == NO)\r
                        {\r
                                if(DialogBox(GetFtpInst(), MAKEINTRESOURCE(ini_from_reg_dlg), GetMainHwnd(), ExeEscDialogProc) == YES)\r
-                               {\r
                                        ImportPortable = YES;\r
-                                       ForceIni = NO;\r
-                                       RegType = REGTYPE_REG;\r
+                       }\r
+               }\r
+               // バージョン確認\r
+               if(ReadSettingsVersion() > VER_NUM)\r
+               {\r
+                       if(IsRegAvailable() == YES && IsIniAvailable() == NO)\r
+                       {\r
+                               switch(MessageBox(GetMainHwnd(), MSGJPN351, "FFFTP", MB_YESNOCANCEL | MB_DEFBUTTON2))\r
+                               {\r
+                                       case IDCANCEL:\r
+                                               ReadOnlySettings = YES;\r
+                                               break;\r
+                                       case IDYES:\r
+                                               break;\r
+                                       case IDNO:\r
+                                               ImportPortable = YES;\r
+                                               break;\r
                                }\r
                        }\r
                }\r
+               // ポータブル版判定\r
+               if(ImportPortable == YES)\r
+               {\r
+                       ForceIni = NO;\r
+                       RegType = REGTYPE_REG;\r
+               }\r
 \r
 //             AllocConsole();\r
 \r
index 9a99004..32b1964 100644 (file)
 #define MSGJPN348              _Tu8("EUC", "EUC")\r
 #define MSGJPN349              _Tu8("UTF-8", "UTF-8")\r
 #define MSGJPN350              _Tu8("UTF-8 HFS+", "UTF-8 HFS+")\r
+#define MSGJPN351              _Tu8("The settings of a newer version are detected.\nThe settings may not be read correctly, or they will be changed when they are overwritten for this version.\nChoose 'Yes' to overwrite settings for this version.\nChoose 'No' to save settings to the INI file.\nChoose 'Cancel' to load settings as read only.", "The settings of a newer version are detected.\nThe settings may not be read correctly, or they will be changed when they are overwritten for this version.\nChoose 'Yes' to overwrite settings for this version.\nChoose 'No' to save settings to the INI file.\nChoose 'Cancel' to load settings as read only.")\r
 #if defined(HAVE_TANDEM)\r
 #define MSGJPN2000             _Tu8("NonStop Server", "NonStop Server")\r
 #define MSGJPN2001             _Tu8("OSS<->GUARDIAN Switch(&O)", "OSS<->GUARDIAN Switch(&O)")\r
index 3662749..df5200a 100644 (file)
 #define MSGJPN348              _Tu8("EUC", "EUC")\r
 #define MSGJPN349              _Tu8("UTF-8", "UTF-8")\r
 #define MSGJPN350              _Tu8("UTF-8 HFS+", "UTF-8 HFS+")\r
+#define MSGJPN351              _Tu8("新しいバージョンの設定が検出されました.\nこのバージョンでは一部の設定が正しく読み込まれない、またはこのバージョンで設定を上書きすると設定が変化する可能性があります.\nこのバージョン用に設定を上書きして保存するには「はい」を選択してください.\n設定をレジストリではなくINIファイルに保存するには「いいえ」を選択してください.\n読み取り専用で設定を読み込むには「キャンセル」を選択してください.", "\xE6\x96\xB0\xE3\x81\x97\xE3\x81\x84\xE3\x83\x90\xE3\x83\xBC\xE3\x82\xB8\xE3\x83\xA7\xE3\x83\xB3\xE3\x81\xAE\xE8\xA8\xAD\xE5\xAE\x9A\xE3\x81\x8C\xE6\xA4\x9C\xE5\x87\xBA\xE3\x81\x95\xE3\x82\x8C\xE3\x81\xBE\xE3\x81\x97\xE3\x81\x9F.\n\xE3\x81\x93\xE3\x81\xAE\xE3\x83\x90\xE3\x83\xBC\xE3\x82\xB8\xE3\x83\xA7\xE3\x83\xB3\xE3\x81\xA7\xE3\x81\xAF\xE4\xB8\x80\xE9\x83\xA8\xE3\x81\xAE\xE8\xA8\xAD\xE5\xAE\x9A\xE3\x81\x8C\xE6\xAD\xA3\xE3\x81\x97\xE3\x81\x8F\xE8\xAA\xAD\xE3\x81\xBF\xE8\xBE\xBC\xE3\x81\xBE\xE3\x82\x8C\xE3\x81\xAA\xE3\x81\x84\xE3\x80\x81\xE3\x81\xBE\xE3\x81\x9F\xE3\x81\xAF\xE3\x81\x93\xE3\x81\xAE\xE3\x83\x90\xE3\x83\xBC\xE3\x82\xB8\xE3\x83\xA7\xE3\x83\xB3\xE3\x81\xA7\xE8\xA8\xAD\xE5\xAE\x9A\xE3\x82\x92\xE4\xB8\x8A\xE6\x9B\xB8\xE3\x81\x8D\xE3\x81\x99\xE3\x82\x8B\xE3\x81\xA8\xE8\xA8\xAD\xE5\xAE\x9A\xE3\x81\x8C\xE5\xA4\x89\xE5\x8C\x96\xE3\x81\x99\xE3\x82\x8B\xE5\x8F\xAF\xE8\x83\xBD\xE6\x80\xA7\xE3\x81\x8C\xE3\x81\x82\xE3\x82\x8A\xE3\x81\xBE\xE3\x81\x99.\n\xE3\x81\x93\xE3\x81\xAE\xE3\x83\x90\xE3\x83\xBC\xE3\x82\xB8\xE3\x83\xA7\xE3\x83\xB3\xE7\x94\xA8\xE3\x81\xAB\xE8\xA8\xAD\xE5\xAE\x9A\xE3\x82\x92\xE4\xB8\x8A\xE6\x9B\xB8\xE3\x81\x8D\xE3\x81\x97\xE3\x81\xA6\xE4\xBF\x9D\xE5\xAD\x98\xE3\x81\x99\xE3\x82\x8B\xE3\x81\xAB\xE3\x81\xAF\xE3\x80\x8C\xE3\x81\xAF\xE3\x81\x84\xE3\x80\x8D\xE3\x82\x92\xE9\x81\xB8\xE6\x8A\x9E\xE3\x81\x97\xE3\x81\xA6\xE3\x81\x8F\xE3\x81\xA0\xE3\x81\x95\xE3\x81\x84.\n\xE8\xA8\xAD\xE5\xAE\x9A\xE3\x82\x92\xE3\x83\xAC\xE3\x82\xB8\xE3\x82\xB9\xE3\x83\x88\xE3\x83\xAA\xE3\x81\xA7\xE3\x81\xAF\xE3\x81\xAA\xE3\x81\x8FINI\xE3\x83\x95\xE3\x82\xA1\xE3\x82\xA4\xE3\x83\xAB\xE3\x81\xAB\xE4\xBF\x9D\xE5\xAD\x98\xE3\x81\x99\xE3\x82\x8B\xE3\x81\xAB\xE3\x81\xAF\xE3\x80\x8C\xE3\x81\x84\xE3\x81\x84\xE3\x81\x88\xE3\x80\x8D\xE3\x82\x92\xE9\x81\xB8\xE6\x8A\x9E\xE3\x81\x97\xE3\x81\xA6\xE3\x81\x8F\xE3\x81\xA0\xE3\x81\x95\xE3\x81\x84.\n\xE8\xAA\xAD\xE3\x81\xBF\xE5\x8F\x96\xE3\x82\x8A\xE5\xB0\x82\xE7\x94\xA8\xE3\x81\xA7\xE8\xA8\xAD\xE5\xAE\x9A\xE3\x82\x92\xE8\xAA\xAD\xE3\x81\xBF\xE8\xBE\xBC\xE3\x82\x80\xE3\x81\xAB\xE3\x81\xAF\xE3\x80\x8C\xE3\x82\xAD\xE3\x83\xA3\xE3\x83\xB3\xE3\x82\xBB\xE3\x83\xAB\xE3\x80\x8D\xE3\x82\x92\xE9\x81\xB8\xE6\x8A\x9E\xE3\x81\x97\xE3\x81\xA6\xE3\x81\x8F\xE3\x81\xA0\xE3\x81\x95\xE3\x81\x84.")\r
 #if defined(HAVE_TANDEM)\r
 #define MSGJPN2000             _Tu8("NonStop Server", "NonStop Server")\r
 #define MSGJPN2001             _Tu8("OSS<->GUARDIAN 切り替え(&O)", "OSS<->GUARDIAN \xE5\x88\x87\xE3\x82\x8A\xE6\x9B\xBF\xE3\x81\x88(&O)")\r
index 143f431..8ae5511 100644 (file)
@@ -221,6 +221,8 @@ extern int EncryptAllSettings;
 extern int AutoRefreshFileList;\r
 // 古い処理内容を消去\r
 extern int RemoveOldLog;\r
+// バージョン確認\r
+extern int ReadOnlySettings;\r
 \r
 /*----- マスタパスワードの設定 ----------------------------------------------\r
 *\r
@@ -350,6 +352,10 @@ void SaveRegistry(void)
        if(EncryptSettingsError == YES)\r
                return;\r
 \r
+       // バージョン確認\r
+       if(ReadOnlySettings == YES)\r
+               return;\r
+\r
        SetRegType(RegType);\r
        if(CreateReg("FFFTP", &hKey3) == FFFTP_SUCCESS)\r
        {\r
@@ -372,7 +378,13 @@ void SaveRegistry(void)
                EncryptSettings = EncryptAllSettings;\r
                memset(&EncryptSettingsChecksum, 0, 20);\r
 \r
-               if(CreateSubKey(hKey3, "Options", &hKey4) == FFFTP_SUCCESS)\r
+               // 全設定暗号化対応\r
+//             if(CreateSubKey(hKey3, "Options", &hKey4) == FFFTP_SUCCESS)\r
+               if(EncryptAllSettings == YES)\r
+                       strcpy(Str, "EncryptedOptions");\r
+               else\r
+                       strcpy(Str, "Options");\r
+               if(CreateSubKey(hKey3, Str, &hKey4) == FFFTP_SUCCESS)\r
                {\r
                        WriteIntValueToReg(hKey4, "NoSave", SuppressSave);\r
 \r
@@ -683,6 +695,29 @@ void SaveRegistry(void)
                // 全設定暗号化対応\r
                EncryptSettings = NO;\r
                WriteBinaryToReg(hKey3, "EncryptAllChecksum", &EncryptSettingsChecksum, 20);\r
+               if(EncryptAllSettings == YES)\r
+               {\r
+                       if(RegType == REGTYPE_REG)\r
+                       {\r
+                               if(RegCreateKeyEx(hKey3, "Options", 0, "", REG_OPTION_NON_VOLATILE, KEY_WRITE, NULL, (HKEY*)&hKey4, NULL) == ERROR_SUCCESS)\r
+                               {\r
+                                       for(i = 0; ; i++)\r
+                                       {\r
+                                               sprintf(Str, "Host%d", i);\r
+                                               if(RegDeleteKey(hKey4, Str) != ERROR_SUCCESS)\r
+                                                       break;\r
+                                       }\r
+                                       for(i = 0; ; i++)\r
+                                       {\r
+                                               sprintf(Str, "History%d", i);\r
+                                               if(RegDeleteKey(hKey4, Str) != ERROR_SUCCESS)\r
+                                                       break;\r
+                                       }\r
+                                       RegCloseKey(hKey4);\r
+                               }\r
+                               RegDeleteKey(hKey3, "Options");\r
+                       }\r
+               }\r
                CloseReg(hKey3);\r
        }\r
        return;\r
@@ -773,7 +808,13 @@ int LoadRegistry(void)
                        }\r
                }\r
 \r
-               if(OpenSubKey(hKey3, "Options", &hKey4) == FFFTP_SUCCESS)\r
+               // 全設定暗号化対応\r
+//             if(OpenSubKey(hKey3, "Options", &hKey4) == FFFTP_SUCCESS)\r
+               if(EncryptAllSettings == YES)\r
+                       strcpy(Str, "EncryptedOptions");\r
+               else\r
+                       strcpy(Str, "Options");\r
+               if(OpenSubKey(hKey3, Str, &hKey4) == FFFTP_SUCCESS)\r
                {\r
                        ReadIntValueFromReg(hKey4, "WinPosX", &WinPosX);\r
                        ReadIntValueFromReg(hKey4, "WinPosY", &WinPosY);\r
@@ -1277,6 +1318,24 @@ void ClearRegistry(void)
                                RegCloseKey(hKey4);\r
                        }\r
                        RegDeleteKey(hKey3, "Options");\r
+                       // 全設定暗号化対応\r
+                       if(RegCreateKeyEx(hKey3, "EncryptedOptions", 0, "", REG_OPTION_NON_VOLATILE, KEY_WRITE, NULL, &hKey4, &Dispos) == ERROR_SUCCESS)\r
+                       {\r
+                               for(i = 0; ; i++)\r
+                               {\r
+                                       sprintf(Str, "Host%d", i);\r
+                                       if(RegDeleteKey(hKey4, Str) != ERROR_SUCCESS)\r
+                                               break;\r
+                               }\r
+                               for(i = 0; ; i++)\r
+                               {\r
+                                       sprintf(Str, "History%d", i);\r
+                                       if(RegDeleteKey(hKey4, Str) != ERROR_SUCCESS)\r
+                                               break;\r
+                               }\r
+                               RegCloseKey(hKey4);\r
+                       }\r
+                       RegDeleteKey(hKey3, "EncryptedOptions");\r
                        RegCloseKey(hKey3);\r
                }\r
                RegDeleteKey(hKey2, "FFFTP");\r
@@ -3186,6 +3245,7 @@ DWORD GetRandamDWRODValue(void)
 }\r
 \r
 // 全設定暗号化対応\r
+// 内部状態推定対策としてハッシュの160ビットのうち80ビットのみを鍵として使用\r
 void MaskSettingsData(const char* Salt, int SaltLength, void* Data, DWORD Size, int EscapeZero)\r
 {\r
        char Key[FMAX_PATH*2+1];\r
@@ -3193,23 +3253,23 @@ void MaskSettingsData(const char* Salt, int SaltLength, void* Data, DWORD Size,
        DWORD i;\r
        DWORD j;\r
        ulong Hash[5];\r
-       BYTE Mask[20];\r
+       BYTE Mask[10];\r
        memcpy(&Key[0], SecretKey, SecretKeyLength);\r
        memcpy(&Key[SecretKeyLength], Salt, SaltLength);\r
        p = (BYTE*)Data;\r
        for(i = 0; i < Size; i++)\r
        {\r
-               if(i % 20 == 0)\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, 20);\r
+                       memcpy(&Mask, &Hash, 10);\r
                }\r
-               if(EscapeZero == NO || (p[i] != 0 && p[i] != Mask[i % 20]))\r
-                       p[i] ^= Mask[i % 20];\r
+               if(EscapeZero == NO || (p[i] != 0 && p[i] != Mask[i % 10]))\r
+                       p[i] ^= Mask[i % 10];\r
        }\r
 }\r
 \r
@@ -3261,3 +3321,28 @@ int IsIniAvailable()
        return Sts;\r
 }\r
 \r
+// バージョン確認\r
+int ReadSettingsVersion()\r
+{\r
+       void *hKey3;\r
+       int i;\r
+       int Version;\r
+\r
+       SetRegType(REGTYPE_INI);\r
+       if((i = OpenReg("FFFTP", &hKey3)) != FFFTP_SUCCESS)\r
+       {\r
+               if(AskForceIni() == NO)\r
+               {\r
+                       SetRegType(REGTYPE_REG);\r
+                       i = OpenReg("FFFTP", &hKey3);\r
+               }\r
+       }\r
+       Version = INT_MAX;\r
+       if(i == FFFTP_SUCCESS)\r
+       {\r
+               ReadIntValueFromReg(hKey3, "Version", &Version);\r
+               CloseReg(hKey3);\r
+       }\r
+       return Version;\r
+}\r
+\r