+ *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