OSDN Git Service

Change the algorithm to encrypt all settings.
[ffftp/ffftp.git] / registry.c
index 31e8339..143f431 100644 (file)
@@ -96,6 +96,11 @@ void SetHashSalt( DWORD salt );
 \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
@@ -107,6 +112,11 @@ static ulong RndSource[9];
 // 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
@@ -155,7 +165,7 @@ extern int FwallPort;
 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
@@ -195,8 +205,22 @@ extern BYTE CertificateCacheHash[MAX_CERT_CACHE_HASH][20];
 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
@@ -322,6 +346,10 @@ void SaveRegistry(void)
                return;\r
        }\r
 \r
+       // 全設定暗号化対応\r
+       if(EncryptSettingsError == YES)\r
+               return;\r
+\r
        SetRegType(RegType);\r
        if(CreateReg("FFFTP", &hKey3) == FFFTP_SUCCESS)\r
        {\r
@@ -336,6 +364,14 @@ void SaveRegistry(void)
                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
@@ -419,7 +455,7 @@ void SaveRegistry(void)
                                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
@@ -509,6 +545,8 @@ void SaveRegistry(void)
                                                        // 再転送対応\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
@@ -596,6 +634,8 @@ void SaveRegistry(void)
                                                        // 再転送対応\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
@@ -623,11 +663,26 @@ void SaveRegistry(void)
                                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
@@ -656,12 +711,16 @@ int LoadRegistry(void)
 //     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
@@ -686,6 +745,34 @@ int LoadRegistry(void)
                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
@@ -819,7 +906,7 @@ int LoadRegistry(void)
                        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
@@ -1010,6 +1097,8 @@ int LoadRegistry(void)
                                        // 再転送対応\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
@@ -1027,11 +1116,47 @@ int LoadRegistry(void)
                        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
@@ -2113,6 +2238,8 @@ static int ReadInReg(char *Name, REGDATATBL **Handle)
 \r
        Sts = FFFTP_FAIL;\r
        *Handle = NULL;\r
+       // バグ修正\r
+       New = NULL;\r
 \r
        if((Strm = fopen(AskIniFilePath(), "rt")) != NULL)\r
        {\r
@@ -2131,7 +2258,10 @@ static int ReadInReg(char *Name, REGDATATBL **Handle)
                                                {\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
@@ -2148,9 +2278,19 @@ static int ReadInReg(char *Name, REGDATATBL **Handle)
                                        }\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
@@ -2367,6 +2507,15 @@ static int ReadIntValueFromReg(void *Handle, char *Name, int *Value)
                        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
@@ -2389,6 +2538,9 @@ static int WriteIntValueToReg(void *Handle, char *Name, int Value)
        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
@@ -2401,6 +2553,12 @@ static int WriteIntValueToReg(void *Handle, char *Name, int Value)
                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
@@ -2453,10 +2611,7 @@ static int ReadStringFromReg(void *Handle, char *Name, char *Str, DWORD Size)
                                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
@@ -2477,6 +2632,15 @@ static int ReadStringFromReg(void *Handle, char *Name, char *Str, DWORD Size)
                        }\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
@@ -2498,8 +2662,13 @@ static int WriteStringToReg(void *Handle, char *Name, char *Str)
        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
@@ -2510,6 +2679,12 @@ static int WriteStringToReg(void *Handle, char *Name, char *Str)
                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
@@ -2563,10 +2738,7 @@ static int ReadMultiStringFromReg(void *Handle, char *Name, char *Str, DWORD Siz
                                *(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
@@ -2589,6 +2761,15 @@ static int ReadMultiStringFromReg(void *Handle, char *Name, char *Str, DWORD Siz
                        }\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
@@ -2610,8 +2791,13 @@ static int WriteMultiStringToReg(void *Handle, char *Name, char *Str)
        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
@@ -2622,6 +2808,12 @@ static int WriteMultiStringToReg(void *Handle, char *Name, char *Str)
                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
@@ -2659,6 +2851,15 @@ static int ReadBinaryFromReg(void *Handle, char *Name, void *Bin, DWORD Size)
                        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
@@ -2681,6 +2882,9 @@ static int WriteBinaryToReg(void *Handle, char *Name, void *Bin, int Len)
        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
@@ -2693,6 +2897,12 @@ static int WriteBinaryToReg(void *Handle, char *Name, void *Bin, int Len)
                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
@@ -2975,6 +3185,53 @@ DWORD GetRandamDWRODValue(void)
        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