+BOOL __stdcall SSLConfirmCallback(BOOL* pbAborted, BOOL bVerified, LPCSTR Certificate, LPCSTR CommonName)\r
+{\r
+ BOOL bResult;\r
+ uint32 Hash[5];\r
+ int i;\r
+ char* pm0;\r
+ bResult = FALSE;\r
+ sha_memory((char*)Certificate, (uint32)(strlen(Certificate) * sizeof(char)), (uint32*)&Hash);\r
+ // sha.cはビッグエンディアンのため\r
+ for(i = 0; i < 5; i++)\r
+ Hash[i] = _byteswap_ulong(Hash[i]);\r
+ i = 0;\r
+ while(i < MAX_CERT_CACHE_HASH)\r
+ {\r
+ if(memcmp(&CertificateCacheHash[i], &Hash, 20) == 0)\r
+ {\r
+ bResult = TRUE;\r
+ break;\r
+ }\r
+ i++;\r
+ }\r
+ if(!bResult)\r
+ {\r
+ if(pm0 = AllocateStringM(strlen(Certificate) + 1024))\r
+ {\r
+ sprintf(pm0, MSGJPN326, IsHostNameMatched(AskHostAdrs(), CommonName) ? MSGJPN327 : MSGJPN328, bVerified ? MSGJPN327 : MSGJPN328, Certificate);\r
+ if(MessageBox(GetMainHwnd(), pm0, "FFFTP", MB_YESNO) == IDYES)\r
+ {\r
+ for(i = MAX_CERT_CACHE_HASH - 1; i >= 1; i--)\r
+ memcpy(&CertificateCacheHash[i], &CertificateCacheHash[i - 1], 20);\r
+ memcpy(&CertificateCacheHash[0], &Hash, 20);\r
+ bResult = TRUE;\r
+ }\r
+ FreeDuplicatedString(pm0);\r
+ }\r
+ }\r
+ if(!bResult)\r
+ *pbAborted = YES;\r
+ return bResult;\r
+}\r
+\r
+BOOL LoadSSLRootCAFile()\r
+{\r
+ BOOL bResult;\r
+ HANDLE hFile;\r
+ DWORD Size;\r
+ BYTE* pBuffer;\r
+ uint32 Hash[5];\r
+ int i;\r
+ bResult = FALSE;\r
+ if((hFile = CreateFile(SSLRootCAFilePath, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL)) != INVALID_HANDLE_VALUE)\r
+ {\r
+ Size = GetFileSize(hFile, NULL);\r
+ if(pBuffer = (BYTE*)malloc(Size))\r
+ {\r
+ if(ReadFile(hFile, pBuffer, Size, &Size, NULL))\r
+ {\r
+ sha_memory((char*)pBuffer, (uint32)Size, (uint32*)&Hash);\r
+ // sha.cはビッグエンディアンのため\r
+ for(i = 0; i < 5; i++)\r
+ Hash[i] = _byteswap_ulong(Hash[i]);\r
+ // 同梱する"ssl.pem"に合わせてSHA1ハッシュ値を変更すること\r
+ if(memcmp(&Hash, &SSLRootCAFileHash, 20) == 0 || memcmp(&Hash, "\xF0\x1B\x48\x26\x67\x44\x3A\xFF\x0A\x16\xD3\xBB\x8A\x33\xEB\x70\x6D\x75\xA6\x0D", 20) == 0\r
+ || DialogBox(GetFtpInst(), MAKEINTRESOURCE(updatesslroot_dlg), GetMainHwnd(), ExeEscDialogProc) == YES)\r
+ {\r
+ memcpy(&SSLRootCAFileHash, &Hash, 20);\r
+ if(SetSSLRootCertificate(pBuffer, Size))\r
+ bResult = TRUE;\r
+ }\r
+ }\r
+ free(pBuffer);\r
+ }\r
+ CloseHandle(hFile);\r
+ }\r
+ return bResult;\r
+}\r
+\r
+// マルチコアCPUの特定環境下でファイル通信中にクラッシュするバグ対策\r
+BOOL IsMainThread()\r
+{\r
+ if(GetCurrentThreadId() != MainThreadId)\r
+ return FALSE;\r
+ return TRUE;\r
+}\r
+\r
+// ファイルアイコン表示対応\r
+int AskDispFileIcon(void)\r
+{\r
+ return(DispFileIcon);\r
+}\r
+\r