--- /dev/null
+// updater.c\r
+// Copyright (C) 2014 Suguru Kawamoto\r
+// ソフトウェア自動更新\r
+\r
+#include <ws2tcpip.h>\r
+#include <windows.h>\r
+#include <mmsystem.h>\r
+typedef SOCKADDR_STORAGE_XP SOCKADDR_STORAGE;\r
+typedef SOCKADDR_STORAGE *PSOCKADDR_STORAGE, FAR *LPSOCKADDR_STORAGE;\r
+#include <winhttp.h>\r
+\r
+#include "updater.h"\r
+#include "socketwrapper.h"\r
+#include "protectprocess.h"\r
+\r
+BOOL DownloadFileViaHTTP(void* pOut, DWORD Length, DWORD* pLength, LPCWSTR UserAgent, LPCWSTR ServerName, LPCWSTR ObjectName)\r
+{\r
+ BOOL bResult;\r
+ HINTERNET hSession;\r
+ HINTERNET hConnect;\r
+ HINTERNET hRequest;\r
+ bResult = FALSE;\r
+ if(hSession = WinHttpOpen(UserAgent, WINHTTP_ACCESS_TYPE_NO_PROXY, WINHTTP_NO_PROXY_NAME, WINHTTP_NO_PROXY_BYPASS, 0))\r
+ {\r
+ if(hConnect = WinHttpConnect(hSession, ServerName, INTERNET_DEFAULT_HTTP_PORT, 0))\r
+ {\r
+ if(hRequest = WinHttpOpenRequest(hConnect, L"GET", ObjectName, NULL, WINHTTP_NO_REFERER, WINHTTP_DEFAULT_ACCEPT_TYPES, 0))\r
+ {\r
+ if(WinHttpSendRequest(hRequest, WINHTTP_NO_ADDITIONAL_HEADERS, 0, WINHTTP_NO_REQUEST_DATA, 0, 0, 0))\r
+ {\r
+ if(WinHttpReceiveResponse(hRequest, NULL))\r
+ {\r
+ if(WinHttpQueryDataAvailable(hRequest, pLength))\r
+ {\r
+ if(*pLength <= Length)\r
+ {\r
+ if(WinHttpReadData(hRequest, pOut, Length, pLength))\r
+ bResult = TRUE;\r
+ }\r
+ }\r
+ }\r
+ }\r
+ WinHttpCloseHandle(hRequest);\r
+ }\r
+ WinHttpCloseHandle(hConnect);\r
+ }\r
+ WinHttpCloseHandle(hSession);\r
+ }\r
+ return bResult;\r
+}\r
+\r
+// FFFTPの更新情報を確認\r
+BOOL CheckForUpdates()\r
+{\r
+ BOOL bResult;\r
+ BYTE Buf1[4096];\r
+ BYTE Buf2[1024];\r
+ BYTE Hash[20];\r
+ DWORD Length;\r
+ bResult = FALSE;\r
+ if(DownloadFileViaHTTP(&Buf1, sizeof(Buf1), &Length, HTTP_USER_AGENT, UPDATE_SERVER, UPDATE_HASH_PATH))\r
+ {\r
+ if(DecryptSignature(UPDATE_RSA_PUBLIC_KEY, &Buf1, Length, &Buf2, sizeof(Buf2), &Length))\r
+ {\r
+ if(Length >= 20)\r
+ {\r
+ if(memcmp(&Buf2[0], UPDATE_SIGNATURE, 20) == 0)\r
+ {\r
+ if(DownloadFileViaHTTP(&Buf1, sizeof(Buf1), &Length, HTTP_USER_AGENT, UPDATE_SERVER, UPDATE_LIST_PATH))\r
+ {\r
+ if(GetSHA1HashOfMemory(&Buf1, Length, &Hash))\r
+ {\r
+ if(memcmp(&Hash, &Buf2[20], 20) == 0)\r
+ {\r
+ // TODO: 更新情報を解析\r
+ }\r
+ }\r
+ }\r
+ }\r
+ }\r
+ }\r
+ }\r
+ return bResult;\r
+}\r
+\r
+// 別のプロセスでFFFTPを更新\r
+BOOL StartUpdateProcess()\r
+{\r
+ BOOL bResult;\r
+ bResult = FALSE;\r
+ // TODO: CreateProcess()\r
+ return bResult;\r
+}\r
+\r
--- /dev/null
+// updater.h\r
+// Copyright (C) 2014 Suguru Kawamoto\r
+// ソフトウェア自動更新\r
+\r
+#ifndef __UPDATER_H__\r
+#define __UPDATER_H__\r
+\r
+#include <windows.h>\r
+\r
+#define HTTP_USER_AGENT L"Mozilla/4.0"\r
+#define UPDATE_SERVER L"ffftp.sourceforge.jp"\r
+#define UPDATE_HASH_PATH L"/update/hash"\r
+#define UPDATE_LIST_PATH L"/update/list"\r
+#define UPDATE_RSA_PUBLIC_KEY \\r
+ "-----BEGIN PUBLIC KEY-----\n" \\r
+ "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAmJvR902LFeKcP9ldQfVQ\n" \\r
+ "F11f3Ph+KDZRIaMM30lBV77atXKuhJunbrjoiocakoSI7UZ1e7Em/Vx7DKi09Hu5\n" \\r
+ "P0Qr5VU4OZ1CoO0bLsot7kKm2LbvLvVD/D92Ff4nhTMD5jhtsdp/XIbRjcdRj+TI\n" \\r
+ "BmEdGOL62vXZ5XjZbrO3CRis7g0Ft/ojSgH1Qd3QSck5IJ3+L7844uIF9SB73xME\n" \\r
+ "RuL+tG2n+VGajM6Hi6xJ1ssbpr7iLB69QmQ5swIaJSiY8oE950mL+EBNFmI3Md0N\n" \\r
+ "vr4tDG8+fq/VhQB64k5hfgWaBImKYaEfftvg51L7yRX+CttgV6GM85ls41H/NDPM\n" \\r
+ "CwIDAQAB\n" \\r
+ "-----END PUBLIC KEY-----\n"\r
+#define UPDATE_SIGNATURE "\x15\x48\x1D\x36\x13\x9D\xA3\x84\x2F\x06\x73\x40\x74\xAC\xED\xFC\x2D\xED\x75\x86"\r
+\r
+BOOL CheckForUpdates();\r
+BOOL StartUpdateProcess();\r
+\r
+#endif\r
+\r