OSDN Git Service

Enhance all settings encryption.
authors_kawamoto <s_kawamoto@users.sourceforge.jp>
Sun, 29 Jun 2014 08:04:21 +0000 (17:04 +0900)
committers_kawamoto <s_kawamoto@users.sourceforge.jp>
Sun, 29 Jun 2014 08:04:21 +0000 (17:04 +0900)
Fix spelling mistakes.
Modify documents.
Fix bugs that some settings are not loaded correctly.

FFFTP_Eng_Release/FFFTP.exe
Release/FFFTP.exe
doc/eng/FFFTP.txt
doc/eng/history.txt
doc/jpn/FFFTP.txt
doc/jpn/history.txt
hostman.c
registry.c

index 8114b7b..db3c223 100644 (file)
Binary files a/FFFTP_Eng_Release/FFFTP.exe and b/FFFTP_Eng_Release/FFFTP.exe differ
index 1b76941..c2c45b6 100644 (file)
Binary files a/Release/FFFTP.exe and b/Release/FFFTP.exe differ
index cfca98f..aceaa11 100644 (file)
@@ -2,7 +2,7 @@
 [Software Name]  FFFTP Ver.1.99 (FTP Client software)\r
 [Copyright]      Copyright(C) 1997-2010 Sota & cooperators\r
                  Copyright (C) 2011-2014 FFFTP Project (Hiromichi Matsushima, Suguru Kawamoto, IWAMOTO Kouichi, vitamin0x, unarist, Asami, fortran90, tomo1192, Yuji Tanaka, Moriguchi Hirokazu, Fu-sen).\r
-[Environment]    Windows 8, 7, Vista, XP, 2000\r
+[Environment]    Windows 8.1, 8, 7, Vista, XP, 2000\r
 ============================================================\r
 \r
 About INI File\r
@@ -31,10 +31,17 @@ File ->
 Changes in Ver.1.99\r
 --------------------\r
 \r
+-- Tested on Windows 8.1 (32bit/64bit).\r
+\r
 -- Added the feature of automatic software update.\r
    It will connect to the dedicated server to check whether there are updates\r
    every 7 days by default, and then confirm whether to apply them.\r
 \r
+-- Added a feature to encrypt the all settings with the master password.\r
+   This prevents malwares and third parties from skimming personal information.\r
+   Please note that 1.98g or former versions cannot read encrypted settings.\r
+   This feature is disabled by default.\r
+\r
 -- Fixed bugs that the apprication did not start when the INI file was modified\r
    and BOM was inserted in it.\r
 \r
@@ -68,6 +75,13 @@ Changes in Ver.1.99
 -- Supported high DPI displays.\r
    The interface such as the menu will look smooth on high DPI displays.\r
 \r
+-- Added a feature to export settings as FileZilla XML format.\r
+\r
+-- Added an option not to use weak encryption methods for each host.\r
+   This refuses SSL 2.0 and encryption algorithms whose keys are shorter than\r
+   128 bits.\r
+   This feature is enabled by default.\r
+\r
 \r
 Outline\r
 -------\r
index 1c3f1e6..5926d2c 100644 (file)
@@ -3,10 +3,17 @@ FFFTP version history.
 Changes in Ver.1.99\r
 --------------------\r
 \r
+-- Tested on Windows 8.1 (32bit/64bit).\r
+\r
 -- Added the feature of automatic software update.\r
    It will connect to the dedicated server to check whether there are updates\r
    every 7 days by default, and then confirm whether to apply them.\r
 \r
+-- Added a feature to encrypt the all settings with the master password.\r
+   This prevents malwares and third parties from skimming personal information.\r
+   Please note that 1.98g or former versions cannot read encrypted settings.\r
+   This feature is disabled by default.\r
+\r
 -- Fixed bugs that the apprication did not start when the INI file was modified\r
    and BOM was inserted in it.\r
 \r
@@ -40,6 +47,29 @@ Changes in Ver.1.99
 -- Supported high DPI displays.\r
    The interface such as the menu will look smooth on high DPI displays.\r
 \r
+-- Added a feature to export settings as FileZilla XML format.\r
+\r
+-- Added an option not to use weak encryption methods for each host.\r
+   This refuses SSL 2.0 and encryption algorithms whose keys are shorter than\r
+   128 bits.\r
+   This feature is enabled by default.\r
+\r
+Changes in Ver.1.98g2\r
+--------------------\r
+\r
+-- Fixed the issue that the installer was contaminated by a file for the ZIP\r
+   version.\r
+\r
+-- Fixed bugs that the message indicating that SSL/TLS root CAs had been\r
+   modified was displayed.\r
+\r
+Changes in Ver.1.98g1\r
+--------------------\r
+\r
+-- Updated OpenSSL.\r
+\r
+-- Updated SSL/TLS root CAs.\r
+\r
 Changes in Ver.1.98g\r
 --------------------\r
 \r
index c99f0ad..365c945 100644 (file)
@@ -1,6 +1,6 @@
 ============================================================\r
 \81y\83\\83t\83g\96¼\81z\81@FTP\83N\83\89\83C\83A\83\93\83g FFFTP\81isf.jp\94Å\81j Ver 1.99\r
-\81y\93®\8dì\8am\94F\8aÂ\8b«\81z\81@Windows 8\81A7\81AVista\81AXP\81A2000\r
+\81y\93®\8dì\8am\94F\8aÂ\8b«\81z\81@Windows 8.1\81A8\81A7\81AVista\81AXP\81A2000\r
 \81y\83T\83|\81[\83g\81z\81@http://sourceforge.jp/projects/ffftp/\r
 ============================================================\r
 \r
@@ -30,10 +30,17 @@ FFFTP Ver.1.96d+009
 Ver 1.99\82Å\82Ì\95Ï\8dX\93_\r
 -------------------\r
 \r
+\81EWindows 8.1 (32bit/64bit)\82Å\93®\8dì\82ð\8am\94F\82µ\82Ü\82µ\82½\81B\r
+\r
 \81E\83\\83t\83g\83E\83F\83A\82Ì\8e©\93®\8dX\90V\8b@\94\\82ð\92Ç\89Á\82µ\82Ü\82µ\82½\81B\r
 \81@\8aù\92è\82Å\82Í7\93ú\82²\82Æ\82É\90ê\97p\82Ì\83T\81[\83o\81[\82É\90Ú\91±\82µ\82Ä\8dX\90V\82ª\82 \82é\82©\82Ç\82¤\82©\8am\94F\82µ\81A\r
 \81@\8dX\90V\82ª\82 \82ê\82Î\8dX\90V\82ð\93K\97p\82·\82é\82©\82Ç\82¤\82©\83\86\81[\83U\81[\82É\8am\94F\82µ\82Ü\82·\81B\r
 \r
+\81E\83}\83X\83^\81[\83p\83X\83\8f\81[\83h\82ð\97p\82¢\82Ä\91S\82Ä\82Ì\90Ý\92è\82ð\88Ã\8d\86\89»\82·\82é\8b@\94\\82ð\92Ç\89Á\82µ\82Ü\82µ\82½\81B\r
+\81@\83}\83\8b\83E\83F\83A\82â\91æ\8eO\8eÒ\82É\82æ\82è\90Ý\92è\82©\82ç\8cÂ\90l\8fî\95ñ\82ð\93Ç\82Ý\8eæ\82ç\82ê\82È\82­\82È\82è\82Ü\82·\82ª\81A\r
+\81@1.98g\88È\91O\82Å\82Í\90Ý\92è\82ð\93Ç\82Ý\8d\9e\82ß\82È\82è\82Ü\82·\82Ì\82Å\92\8d\88Ó\82µ\82Ä\82­\82¾\82³\82¢\81B\r
+\81@\82±\82Ì\8b@\94\\82Í\8aù\92è\82Å\82Í\96³\8cø\82É\82È\82Á\82Ä\82¢\82Ü\82·\81B\r
+\r
 \81EINI\83t\83@\83C\83\8b\82ª\89ü\95Ï\82³\82êBOM\82ª\95t\89Á\82³\82ê\82Ä\82¢\82é\8fê\8d\87\82É\83N\83\89\83b\83V\83\85\82·\82é\83o\83O\82ð\r
 \81@\8fC\90³\82µ\82Ü\82µ\82½\81B\r
 \r
@@ -73,6 +80,12 @@ Ver 1.99
 \81E\8d\82DPI\83f\83B\83X\83v\83\8c\83C\82É\91Î\89\9e\82µ\82Ü\82µ\82½\81B\r
 \81@\8d\82DPI\83f\83B\83X\83v\83\8c\83C\82É\95\\8e¦\82·\82é\8dÛ\82É\83\81\83j\83\85\81[\82È\82Ç\82Ì\95\\8e¦\82ª\8a\8a\82ç\82©\82É\82È\82è\82Ü\82·\81B\r
 \r
+\81E\90Ý\92è\82ðFileZilla XML\8c`\8e®\82É\83G\83N\83X\83|\81[\83g\82·\82é\8b@\94\\82ð\92Ç\89Á\82µ\82Ü\82µ\82½\81B\r
+\r
+\81E\83z\83X\83g\82Ì\90Ý\92è\82É\8eã\82¢\88Ã\8d\86\89»\95û\8e®\82ð\8eg\97p\82µ\82È\82¢\90Ý\92è\82ð\92Ç\89Á\82µ\82Ü\82µ\82½\81B\r
+\81@SSL 2.0\82â\8c®\82Ì\8b­\93x\82ª128\83r\83b\83g\96¢\96\9e\82Ì\88Ã\8d\86\82ð\8b\91\94Û\82·\82é\82æ\82¤\82É\82È\82è\82Ü\82·\81B\r
+\81@\82±\82Ì\8b@\94\\82Í\8aù\92è\82Å\82Í\97L\8cø\82É\82È\82è\82Ü\82·\81B\r
+\r
 \r
 Ver 1.96d\88È\91O\82Ö\96ß\82·\8fê\8d\87\r
 -----------------------\r
index ed76a5a..e156ee1 100644 (file)
@@ -2,10 +2,17 @@ FFFTP
 \r
 \81¡Ver 1.99\r
 \r
+\81EWindows 8.1 (32bit/64bit)\82Å\93®\8dì\82ð\8am\94F\82µ\82Ü\82µ\82½\81B\r
+\r
 \81E\83\\83t\83g\83E\83F\83A\82Ì\8e©\93®\8dX\90V\8b@\94\\82ð\92Ç\89Á\82µ\82Ü\82µ\82½\81B\r
 \81@\8aù\92è\82Å\82Í7\93ú\82²\82Æ\82É\90ê\97p\82Ì\83T\81[\83o\81[\82É\90Ú\91±\82µ\82Ä\8dX\90V\82ª\82 \82é\82©\82Ç\82¤\82©\8am\94F\82µ\81A\r
 \81@\8dX\90V\82ª\82 \82ê\82Î\8dX\90V\82ð\93K\97p\82·\82é\82©\82Ç\82¤\82©\83\86\81[\83U\81[\82É\8am\94F\82µ\82Ü\82·\81B\r
 \r
+\81E\83}\83X\83^\81[\83p\83X\83\8f\81[\83h\82ð\97p\82¢\82Ä\91S\82Ä\82Ì\90Ý\92è\82ð\88Ã\8d\86\89»\82·\82é\8b@\94\\82ð\92Ç\89Á\82µ\82Ü\82µ\82½\81B\r
+\81@\83}\83\8b\83E\83F\83A\82â\91æ\8eO\8eÒ\82É\82æ\82è\90Ý\92è\82©\82ç\8cÂ\90l\8fî\95ñ\82ð\93Ç\82Ý\8eæ\82ç\82ê\82È\82­\82È\82è\82Ü\82·\82ª\81A\r
+\81@1.98g\88È\91O\82Å\82Í\90Ý\92è\82ð\93Ç\82Ý\8d\9e\82ß\82È\82è\82Ü\82·\82Ì\82Å\92\8d\88Ó\82µ\82Ä\82­\82¾\82³\82¢\81B\r
+\81@\82±\82Ì\8b@\94\\82Í\8aù\92è\82Å\82Í\96³\8cø\82É\82È\82Á\82Ä\82¢\82Ü\82·\81B\r
+\r
 \81EINI\83t\83@\83C\83\8b\82ª\89ü\95Ï\82³\82êBOM\82ª\95t\89Á\82³\82ê\82Ä\82¢\82é\8fê\8d\87\82É\83N\83\89\83b\83V\83\85\82·\82é\83o\83O\82ð\r
 \81@\8fC\90³\82µ\82Ü\82µ\82½\81B\r
 \r
@@ -45,6 +52,25 @@ FFFTP
 \81E\8d\82DPI\83f\83B\83X\83v\83\8c\83C\82É\91Î\89\9e\82µ\82Ü\82µ\82½\81B\r
 \81@\8d\82DPI\83f\83B\83X\83v\83\8c\83C\82É\95\\8e¦\82·\82é\8dÛ\82É\83\81\83j\83\85\81[\82È\82Ç\82Ì\95\\8e¦\82ª\8a\8a\82ç\82©\82É\82È\82è\82Ü\82·\81B\r
 \r
+\81E\90Ý\92è\82ðFileZilla XML\8c`\8e®\82É\83G\83N\83X\83|\81[\83g\82·\82é\8b@\94\\82ð\92Ç\89Á\82µ\82Ü\82µ\82½\81B\r
+\r
+\81E\83z\83X\83g\82Ì\90Ý\92è\82É\8eã\82¢\88Ã\8d\86\89»\95û\8e®\82ð\8eg\97p\82µ\82È\82¢\90Ý\92è\82ð\92Ç\89Á\82µ\82Ü\82µ\82½\81B\r
+\81@SSL 2.0\82â\8c®\82Ì\8b­\93x\82ª128\83r\83b\83g\96¢\96\9e\82Ì\88Ã\8d\86\82ð\8b\91\94Û\82·\82é\82æ\82¤\82É\82È\82è\82Ü\82·\81B\r
+\81@\82±\82Ì\8b@\94\\82Í\8aù\92è\82Å\82Í\97L\8cø\82É\82È\82è\82Ü\82·\81B\r
+\r
+\81¡Ver 1.98g2\r
+\r
+\81E\83C\83\93\83X\83g\81[\83\89\94Å\82ÉZIP\94Å\82Ì\83t\83@\83C\83\8b\82ª\8d¬\93ü\82µ\82Ä\82¢\82½\96â\91è\82ð\8fC\90³\82µ\82Ü\82µ\82½\81B\r
+\r
+\81E\83\8b\81[\83g\8fØ\96¾\8f\91\82Ì\95Ï\8dX\82ª\8c\9f\8fo\82³\82ê\82½\8e|\82Ì\83\81\83b\83Z\81[\83W\82ª\95\\8e¦\82³\82ê\82é\83o\83O\82ð\8fC\90³\r
+\81@\82µ\82Ü\82µ\82½\81B\r
+\r
+\81¡Ver 1.98g1\r
+\r
+\81EOpenSSL\82ð\8dX\90V\82µ\82Ü\82µ\82½\81B\r
+\r
+\81ESSL/TLS\82Ì\83\8b\81[\83g\8fØ\96¾\8f\91\82ð\8dX\90V\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
index 0059a3b..e9d12c2 100644 (file)
--- a/hostman.c
+++ b/hostman.c
@@ -1051,6 +1051,8 @@ int CopyHostFromListInConnect(int Num, HOSTDATA *Set)
                Set->UseFTPES = Pos->Set.UseFTPES;\r
                Set->UseFTPIS = Pos->Set.UseFTPIS;\r
                Set->UseSFTP = Pos->Set.UseSFTP;\r
+               strcpy(Set->PrivateKey, Pos->Set.PrivateKey);\r
+               Set->NoWeakEncryption = Pos->Set.NoWeakEncryption;\r
                // 同時接続対応\r
                Set->MaxThreadCount = Pos->Set.MaxThreadCount;\r
                Set->ReuseCmdSkt = Pos->Set.ReuseCmdSkt;\r
@@ -1347,7 +1349,7 @@ void CopyDefaultHost(HOSTDATA *Set)
        Set->UseFTPIS = YES;\r
        Set->UseSFTP = YES;\r
        strcpy(Set->PrivateKey, "");\r
-       Set->NoWeakEncryption = NO;\r
+       Set->NoWeakEncryption = YES;\r
        // 同時接続対応\r
        Set->MaxThreadCount = 1;\r
        Set->ReuseCmdSkt = YES;\r
index b80c17c..a3809c2 100644 (file)
@@ -99,8 +99,10 @@ static int StrReadIn(char *Src, int Max, char *Dst);
 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
@@ -308,22 +310,60 @@ int ValidateMasterPassword(void)
                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( ReadStringFromReg(hKey3, "CredentialCheck", checkbuf, sizeof( checkbuf )) == FFFTP_SUCCESS ){\r
-                       // 全設定暗号化対応\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
-                       case 0: /* not match */\r
+                       switch(CheckPasswordValidity(SecretKey, SecretKeyLength, checkbuf, stretch))\r
+                       {\r
+                       case 0:\r
                                IsMasterPasswordError = PASSWORD_UNMATCH;\r
                                break;\r
-                       case 1: /* match */\r
+                       case 1:\r
+                               IsMasterPasswordError = PASSWORD_OK;\r
+                               break;\r
+                       default:\r
+                               IsMasterPasswordError = BAD_PASSWORD_HASH;\r
+                               break;\r
+                       }\r
+               }\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:\r
                                IsMasterPasswordError = PASSWORD_OK;\r
                                break;\r
-                       case 2: /* invalid hash */\r
                        default:\r
                                IsMasterPasswordError = BAD_PASSWORD_HASH;\r
                                break;\r
@@ -378,25 +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
                // 全設定暗号化対応\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
+                       CreatePasswordHash(SecretKey, SecretKeyLength, buf, 65535);\r
+                       WriteStringToReg(hKey3, "CredentialCheck1", buf);\r
                }\r
                else\r
                {\r
-                       WriteIntValueToReg(hKey3, "CredentialStretch", 0);\r
-                       CreatePasswordHash( SecretKey, SecretKeyLength, buf, 0 );\r
+                       SetHashSalt( salt );\r
+                       WriteIntValueToReg(hKey3, "CredentialSalt", salt);\r
+                       CreatePasswordHash(SecretKey, SecretKeyLength, buf, 0);\r
+                       WriteStringToReg(hKey3, "CredentialCheck", buf);\r
                }\r
-               WriteStringToReg(hKey3, "CredentialCheck", buf);\r
 \r
                // 全設定暗号化対応\r
                WriteIntValueToReg(hKey3, "EncryptAll", EncryptAllSettings);\r
@@ -573,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
@@ -748,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
@@ -812,36 +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(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
-                                               Restart();\r
-                                               Terminate();\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
@@ -1062,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
@@ -1074,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
@@ -1832,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
@@ -1846,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
@@ -3392,15 +3471,34 @@ void CreatePasswordHash( char* Password, int length, char* HashStr, int StretchC
 \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
@@ -3408,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