\r
DWORD GetRandamDWRODValue(void);\r
\r
+// 全設定暗号化対応\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
+\r
/* 2010.01.30 genta 追加 */\r
static char SecretKey[FMAX_PATH+1];\r
static int SecretKeyLength;\r
// UTF-8対応\r
static int IniKanjiCode = KANJI_NOCNV;\r
\r
+// 全設定暗号化対応\r
+static int EncryptSettings = NO;\r
+static BYTE EncryptSettingsChecksum[20];\r
+static int EncryptSettingsError = NO;\r
+\r
/*===== 外部参照 =====*/\r
\r
/* 設定値 */\r
extern int FwallType;\r
extern int FwallDefault;\r
extern int FwallSecurity;\r
-extern int FwallResolv;\r
+extern int FwallResolve;\r
extern int FwallLower;\r
extern int FwallDelimiter;\r
extern int PasvDefault;\r
extern BYTE SSLRootCAFileHash[20];\r
// ファイルアイコン表示対応\r
extern int DispFileIcon;\r
+// タイムスタンプのバグ修正\r
+extern int DispTimeSeconds;\r
+// ファイルの属性を数字で表示\r
+extern int DispPermissionsNumber;\r
// ディレクトリ自動作成\r
extern int MakeAllDir;\r
+// UTF-8対応\r
+extern int LocalKanjiCode;\r
+// UPnP対応\r
+extern int UPnPEnabled;\r
+// 全設定暗号化対応\r
+extern int EncryptAllSettings;\r
+// ローカル側自動更新\r
+extern int AutoRefreshFileList;\r
+// 古い処理内容を消去\r
+extern int RemoveOldLog;\r
\r
/*----- マスタパスワードの設定 ----------------------------------------------\r
*\r
return;\r
}\r
\r
+ // 全設定暗号化対応\r
+ if(EncryptSettingsError == YES)\r
+ return;\r
+\r
SetRegType(RegType);\r
if(CreateReg("FFFTP", &hKey3) == FFFTP_SUCCESS)\r
{\r
CreatePasswordHash( SecretKey, SecretKeyLength, buf );\r
WriteStringToReg(hKey3, "CredentialCheck", buf);\r
\r
+ // 全設定暗号化対応\r
+ WriteIntValueToReg(hKey3, "EncryptAll", EncryptAllSettings);\r
+ sprintf(Buf, "%d", EncryptAllSettings);\r
+ EncodePassword(Buf, Str);\r
+ WriteStringToReg(hKey3, "EncryptAllDetector", Str);\r
+ EncryptSettings = EncryptAllSettings;\r
+ memset(&EncryptSettingsChecksum, 0, 20);\r
+\r
if(CreateSubKey(hKey3, "Options", &hKey4) == FFFTP_SUCCESS)\r
{\r
WriteIntValueToReg(hKey4, "NoSave", SuppressSave);\r
WriteIntValueToReg(hKey4, "FwallDef", FwallDefault);\r
WriteIntValueToReg(hKey4, "FwallSec", FwallSecurity);\r
WriteIntValueToReg(hKey4, "PasvDef", PasvDefault);\r
- WriteIntValueToReg(hKey4, "FwallRes", FwallResolv);\r
+ WriteIntValueToReg(hKey4, "FwallRes", FwallResolve);\r
WriteIntValueToReg(hKey4, "FwallLow", FwallLower);\r
WriteIntValueToReg(hKey4, "FwallDel", FwallDelimiter);\r
\r
// 再転送対応\r
SaveIntNum(hKey5, "ErrMode", Hist.TransferErrorMode, DefaultHist.TransferErrorMode);\r
SaveIntNum(hKey5, "ErrNotify", Hist.TransferErrorNotify, DefaultHist.TransferErrorNotify);\r
+ // セッションあたりの転送量制限対策\r
+ SaveIntNum(hKey5, "ErrReconnect", Hist.TransferErrorReconnect, DefaultHist.TransferErrorReconnect);\r
\r
CloseSubKey(hKey5);\r
n++;\r
// 再転送対応\r
SaveIntNum(hKey5, "ErrMode", Host.TransferErrorMode, DefaultHost.TransferErrorMode);\r
SaveIntNum(hKey5, "ErrNotify", Host.TransferErrorNotify, DefaultHost.TransferErrorNotify);\r
+ // セッションあたりの転送量制限対策\r
+ SaveIntNum(hKey5, "ErrReconnect", Host.TransferErrorReconnect, DefaultHost.TransferErrorReconnect);\r
}\r
CloseSubKey(hKey5);\r
}\r
WriteStringToReg(hKey4, "RootCertHash", Str);\r
// ファイルアイコン表示対応\r
WriteIntValueToReg(hKey4, "ListIcon", DispFileIcon);\r
+ // タイムスタンプのバグ修正\r
+ WriteIntValueToReg(hKey4, "ListSecond", DispTimeSeconds);\r
+ // ファイルの属性を数字で表示\r
+ WriteIntValueToReg(hKey4, "ListPermitNum", DispPermissionsNumber);\r
// ディレクトリ自動作成\r
WriteIntValueToReg(hKey4, "MakeDir", MakeAllDir);\r
+ // UTF-8対応\r
+ WriteIntValueToReg(hKey4, "Kanji", LocalKanjiCode);\r
+ // UPnP対応\r
+ WriteIntValueToReg(hKey4, "UPnP", UPnPEnabled);\r
+ // ローカル側自動更新\r
+ WriteIntValueToReg(hKey4, "ListRefresh", AutoRefreshFileList);\r
+ // 古い処理内容を消去\r
+ WriteIntValueToReg(hKey4, "OldLog", RemoveOldLog);\r
}\r
CloseSubKey(hKey4);\r
}\r
+ // 全設定暗号化対応\r
+ EncryptSettings = NO;\r
+ WriteBinaryToReg(hKey3, "EncryptAllChecksum", &EncryptSettingsChecksum, 20);\r
CloseReg(hKey3);\r
}\r
return;\r
// char Str[256]; /* ASCII_EXT_LENより大きい事 */\r
char Str[PRIVATE_KEY_LEN*4+1];\r
char Buf[FMAX_PATH+1];\r
+ // 全設定暗号化対応\r
+ char Buf2[FMAX_PATH+1];\r
char *Pos;\r
char *Pos2;\r
HOSTDATA Host;\r
HISTORYDATA Hist;\r
int Sts;\r
int Version;\r
+ // 全設定暗号化対応\r
+ BYTE Checksum[20];\r
\r
Sts = NO;\r
\r
if(Version < 1980)\r
IniKanjiCode = KANJI_SJIS;\r
\r
+ // 全設定暗号化対応\r
+ if(Version >= 1990)\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
+ {\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
+ }\r
+ }\r
+\r
if(OpenSubKey(hKey3, "Options", &hKey4) == FFFTP_SUCCESS)\r
{\r
ReadIntValueFromReg(hKey4, "WinPosX", &WinPosX);\r
ReadIntValueFromReg(hKey4, "FwallDef", &FwallDefault);\r
ReadIntValueFromReg(hKey4, "FwallSec", &FwallSecurity);\r
ReadIntValueFromReg(hKey4, "PasvDef", &PasvDefault);\r
- ReadIntValueFromReg(hKey4, "FwallRes", &FwallResolv);\r
+ ReadIntValueFromReg(hKey4, "FwallRes", &FwallResolve);\r
ReadIntValueFromReg(hKey4, "FwallLow", &FwallLower);\r
ReadIntValueFromReg(hKey4, "FwallDel", &FwallDelimiter);\r
\r
// 再転送対応\r
ReadIntValueFromReg(hKey5, "ErrMode", &Host.TransferErrorMode);\r
ReadIntValueFromReg(hKey5, "ErrNotify", &Host.TransferErrorNotify);\r
+ // セッションあたりの転送量制限対策\r
+ ReadIntValueFromReg(hKey5, "ErrReconnect", &Host.TransferErrorReconnect);\r
\r
CloseSubKey(hKey5);\r
\r
StrReadIn(Buf, sizeof(SSLRootCAFileHash), (char*)&SSLRootCAFileHash);\r
// ファイルアイコン表示対応\r
ReadIntValueFromReg(hKey4, "ListIcon", &DispFileIcon);\r
+ // タイムスタンプのバグ修正\r
+ ReadIntValueFromReg(hKey4, "ListSecond", &DispTimeSeconds);\r
+ // ファイルの属性を数字で表示\r
+ ReadIntValueFromReg(hKey4, "ListPermitNum", &DispPermissionsNumber);\r
// ディレクトリ自動作成\r
ReadIntValueFromReg(hKey4, "MakeDir", &MakeAllDir);\r
+ // UTF-8対応\r
+ ReadIntValueFromReg(hKey4, "Kanji", &LocalKanjiCode);\r
+ // UPnP対応\r
+ ReadIntValueFromReg(hKey4, "UPnP", &UPnPEnabled);\r
+ // ローカル側自動更新\r
+ ReadIntValueFromReg(hKey4, "ListRefresh", &AutoRefreshFileList);\r
+ // 古い処理内容を消去\r
+ ReadIntValueFromReg(hKey4, "OldLog", &RemoveOldLog);\r
\r
CloseSubKey(hKey4);\r
}\r
+ // 全設定暗号化対応\r
+ EncryptSettings = NO;\r
+ if(Version >= 1990)\r
+ {\r
+ memset(&Checksum, 0, 20);\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
+ {\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
+ }\r
+ }\r
CloseReg(hKey3);\r
}\r
else\r
\r
Sts = FFFTP_FAIL;\r
*Handle = NULL;\r
+ // バグ修正\r
+ New = NULL;\r
\r
if((Strm = fopen(AskIniFilePath(), "rt")) != NULL)\r
{\r
{\r
if((Tmp = strchr(Buf, ']')) != NULL)\r
*Tmp = NUL;\r
- strcpy(New->KeyName, Buf+1);\r
+ // バグ修正\r
+// strcpy(New->KeyName, Buf+1);\r
+ strncpy(New->KeyName, Buf+1, 80);\r
+ New->KeyName[80] = NUL;\r
New->ValLen = 0;\r
New->Next = NULL;\r
Data = New->ValTbl;\r
}\r
else if(strlen(Buf) > 0)\r
{\r
- strcpy(Data, Buf);\r
- Data += strlen(Buf) + 1;\r
- New->ValLen += strlen(Buf) + 1;\r
+ // バグ修正\r
+// strcpy(Data, Buf);\r
+// Data += strlen(Buf) + 1;\r
+// New->ValLen += strlen(Buf) + 1;\r
+ if(Data != NULL && New != NULL)\r
+ {\r
+ if(New->ValLen + strlen(Buf) + 1 <= REG_SECT_MAX)\r
+ {\r
+ strcpy(Data, Buf);\r
+ Data += strlen(Buf) + 1;\r
+ New->ValLen += strlen(Buf) + 1;\r
+ }\r
+ }\r
}\r
}\r
}\r
Sts = FFFTP_SUCCESS;\r
}\r
}\r
+ // 全設定暗号化対応\r
+ if(Sts == FFFTP_SUCCESS)\r
+ {\r
+ if(EncryptSettings == YES)\r
+ {\r
+ UnmaskSettingsData(Name, strlen(Name), Value, sizeof(int), NO);\r
+ CalculateSettingsDataChecksum(Value, sizeof(int));\r
+ }\r
+ }\r
return(Sts);\r
}\r
\r
char *Data;\r
char Tmp[20];\r
\r
+ // 全設定暗号化対応\r
+ if(EncryptSettings == YES)\r
+ MaskSettingsData(Name, strlen(Name), &Value, sizeof(int), NO);\r
if(TmpRegType == REGTYPE_REG)\r
RegSetValueEx(Handle, Name, 0, REG_DWORD, (CONST BYTE *)&Value, sizeof(int));\r
else\r
strcat(Data, Tmp);\r
Pos->ValLen += strlen(Data) + 1;\r
}\r
+ // 全設定暗号化対応\r
+ if(EncryptSettings == YES)\r
+ {\r
+ UnmaskSettingsData(Name, strlen(Name), &Value, sizeof(int), NO);\r
+ CalculateSettingsDataChecksum(&Value, sizeof(int));\r
+ }\r
return(FFFTP_SUCCESS);\r
}\r
\r
TempSize = StrReadIn(Pos, TempSize, Str);\r
*(Str + TempSize) = NUL;\r
Sts = FFFTP_SUCCESS;\r
- if(!CheckStringM(Str))\r
- break;\r
- // UTF-8ではない可能性がある\r
- // Shift_JISとみなす\r
+ break;\r
case KANJI_SJIS:\r
if(pa0 = AllocateStringA(Size * 4))\r
{\r
}\r
}\r
}\r
+ // 全設定暗号化対応\r
+ if(Sts == FFFTP_SUCCESS)\r
+ {\r
+ if(EncryptSettings == YES)\r
+ {\r
+ UnmaskSettingsData(Name, strlen(Name), Str, strlen(Str) + 1, YES);\r
+ CalculateSettingsDataChecksum(Str, strlen(Str) + 1);\r
+ }\r
+ }\r
return(Sts);\r
}\r
\r
REGDATATBL *Pos;\r
char *Data;\r
\r
+ // 全設定暗号化対応\r
+ if(EncryptSettings == YES)\r
+ MaskSettingsData(Name, strlen(Name), Str, strlen(Str) + 1, YES);\r
if(TmpRegType == REGTYPE_REG)\r
- RegSetValueEx(Handle, Name, 0, REG_SZ, (CONST BYTE *)Str, strlen(Str)+1);\r
+ // 全設定暗号化対応\r
+// RegSetValueEx(Handle, Name, 0, REG_SZ, (CONST BYTE *)Str, strlen(Str)+1);\r
+ RegSetValueEx(Handle, Name, 0, EncryptSettings == YES ? REG_BINARY : REG_SZ, (CONST BYTE *)Str, strlen(Str)+1);\r
else\r
{\r
Pos = (REGDATATBL *)Handle;\r
Data = Pos->ValTbl + Pos->ValLen;\r
Pos->ValLen += StrCatOut(Str, strlen(Str), Data) + 1;\r
}\r
+ // 全設定暗号化対応\r
+ if(EncryptSettings == YES)\r
+ {\r
+ UnmaskSettingsData(Name, strlen(Name), Str, strlen(Str) + 1, YES);\r
+ CalculateSettingsDataChecksum(Str, strlen(Str) + 1);\r
+ }\r
return(FFFTP_SUCCESS);\r
}\r
\r
*(Str + TempSize) = NUL;\r
*(Str + TempSize + 1) = NUL;\r
Sts = FFFTP_SUCCESS;\r
- if(!CheckMultiStringM(Str))\r
- break;\r
- // UTF-8ではない可能性がある\r
- // Shift_JISとみなす\r
+ break;\r
case KANJI_SJIS:\r
if(pa0 = AllocateStringA(Size * 4))\r
{\r
}\r
}\r
}\r
+ // 全設定暗号化対応\r
+ if(Sts == FFFTP_SUCCESS)\r
+ {\r
+ if(EncryptSettings == YES)\r
+ {\r
+ UnmaskSettingsData(Name, strlen(Name), Str, StrMultiLen(Str) + 1, YES);\r
+ CalculateSettingsDataChecksum(Str, StrMultiLen(Str) + 1);\r
+ }\r
+ }\r
return(Sts);\r
}\r
\r
REGDATATBL *Pos;\r
char *Data;\r
\r
+ // 全設定暗号化対応\r
+ if(EncryptSettings == YES)\r
+ MaskSettingsData(Name, strlen(Name), Str, StrMultiLen(Str) + 1, YES);\r
if(TmpRegType == REGTYPE_REG)\r
- RegSetValueEx(Handle, Name, 0, REG_MULTI_SZ, (CONST BYTE *)Str, StrMultiLen(Str)+1);\r
+ // 全設定暗号化対応\r
+// RegSetValueEx(Handle, Name, 0, REG_MULTI_SZ, (CONST BYTE *)Str, StrMultiLen(Str)+1);\r
+ RegSetValueEx(Handle, Name, 0, EncryptSettings == YES ? REG_BINARY : REG_MULTI_SZ, (CONST BYTE *)Str, StrMultiLen(Str)+1);\r
else\r
{\r
Pos = (REGDATATBL *)Handle;\r
Data = Pos->ValTbl + Pos->ValLen;\r
Pos->ValLen += StrCatOut(Str, StrMultiLen(Str), Data) + 1;\r
}\r
+ // 全設定暗号化対応\r
+ if(EncryptSettings == YES)\r
+ {\r
+ UnmaskSettingsData(Name, strlen(Name), Str, StrMultiLen(Str) + 1, YES);\r
+ CalculateSettingsDataChecksum(Str, StrMultiLen(Str) + 1);\r
+ }\r
return(FFFTP_SUCCESS);\r
}\r
\r
Sts = FFFTP_SUCCESS;\r
}\r
}\r
+ // 全設定暗号化対応\r
+ if(Sts == FFFTP_SUCCESS)\r
+ {\r
+ if(EncryptSettings == YES)\r
+ {\r
+ UnmaskSettingsData(Name, strlen(Name), Bin, Size, NO);\r
+ CalculateSettingsDataChecksum(Bin, Size);\r
+ }\r
+ }\r
return(Sts);\r
}\r
\r
REGDATATBL *Pos;\r
char *Data;\r
\r
+ // 全設定暗号化対応\r
+ if(EncryptSettings == YES)\r
+ MaskSettingsData(Name, strlen(Name), Bin, Len, NO);\r
if(TmpRegType == REGTYPE_REG)\r
RegSetValueEx(Handle, Name, 0, REG_BINARY, (CONST BYTE *)Bin, Len);\r
else\r
Data = Pos->ValTbl + Pos->ValLen;\r
Pos->ValLen += StrCatOut(Bin, Len, Data) + 1;\r
}\r
+ // 全設定暗号化対応\r
+ if(EncryptSettings == YES)\r
+ {\r
+ UnmaskSettingsData(Name, strlen(Name), Bin, Len, NO);\r
+ CalculateSettingsDataChecksum(Bin, Len);\r
+ }\r
return(FFFTP_SUCCESS);\r
}\r
\r
return rndValue;\r
}\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[20];\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
+ {\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
+ }\r
+ if(EscapeZero == NO || (p[i] != 0 && p[i] != Mask[i % 20]))\r
+ p[i] ^= Mask[i % 20];\r
+ }\r
+}\r
+\r
+void UnmaskSettingsData(const char* Salt, int SaltLength, void* Data, DWORD Size, int EscapeZero)\r
+{\r
+ MaskSettingsData(Salt, SaltLength, Data, Size, EscapeZero);\r
+}\r
+\r
+void CalculateSettingsDataChecksum(void* Data, DWORD Size)\r
+{\r
+ ulong Hash[5];\r
+ DWORD i;\r
+ BYTE Mask[20];\r
+ sha_memory((char*)Data, Size, Hash);\r
+ // sha.cはビッグエンディアンのため\r
+ for(i = 0; i < 5; i++)\r
+ Hash[i] = _byteswap_ulong(Hash[i]);\r
+ memcpy(&Mask, &Hash, 20);\r
+ for(i = 0; i < 20; i++)\r
+ EncryptSettingsChecksum[i] ^= Mask[i];\r
+}\r
+\r
// ポータブル版判定\r
int IsRegAvailable()\r
{\r