extern int AutoRefreshFileList;\r
// 古い処理内容を消去\r
extern int RemoveOldLog;\r
+// バージョン確認\r
+extern int ReadOnlySettings;\r
\r
/*----- マスタパスワードの設定 ----------------------------------------------\r
*\r
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
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
// 全設定暗号化対応\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
}\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
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
}\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
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
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