The following input of the "Time Stamp URL" seems to work:
Code: Select all
http://timestamp.comodoca.com/authenticode" /fd SHA256"Can a comodo SHA-256 time stamping server be used with InstallAware X2?
Code: Select all
http://timestamp.comodoca.com/authenticode" /fd SHA256"Code: Select all
http://timestamp.comodoca.com/rfc3161Code: Select all
#include <windows.h>
#include <tchar.h>
#define MAX 32767
int _tmain(int argc, _TCHAR* argv[])
{
int i, k;
_TCHAR cmd[MAX+1], *p;
cmd[MAX] = _T('\0');
if (_sntprintf(cmd, MAX, _T("\"%s"), argv[0]) < 0) return 1;
p = _tcsrchr(cmd, _T('.'));
if (p == NULL) return 1;
if (_sntprintf(p, MAX-(p-cmd), _T("2.exe\"")) < 0) return 1;
p += _tcslen(p);
for (i = k = 1; i < argc; i++) {
if (_tcscmp(argv[i], _T("/t")) == 0) {
if (_sntprintf(p, MAX-(p-cmd), _T(" /tr")) < 0) return 1;
k = -2;
}
else {
if (_sntprintf(p, MAX-(p-cmd), _T(" \"%s\""), argv[i]) < 0) return 1;
}
p += _tcslen(p);
if (++k == 0) {
if (_sntprintf(p, MAX-(p-cmd), _T(" /fd SHA256 /td SHA256")) < 0) return 1;
p += _tcslen(p);
}
}
DWORD exitCode;
STARTUPINFO si; ZeroMemory(&si, sizeof(STARTUPINFO)); si.cb = sizeof(STARTUPINFO);
PROCESS_INFORMATION pi; ZeroMemory(&pi, sizeof(PROCESS_INFORMATION));
if (!CreateProcess(NULL, cmd, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi)) return 1;
WaitForSingleObject(pi.hProcess, INFINITE);
if (!GetExitCodeProcess(pi.hProcess, &exitCode)) return 1;
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
return exitCode;
}
That means my installer's signature would expire when the certificate expires from January 1, 2017 onwards. I've also found out that it is not trivial to make a valid SHA-256 signature with a SHA-1 time stamp signature for Windows XP and Windows Vista (both require a special system update to recognize these signatures correctly). For me, the solution are SHA-256 signatures with SHA-256 time stamp signatures, and to additionally pack these exe/msi files inside a ZIP file for Windows XP and Windows Vista (because the corresponding exe/msi files are denied by the Internet Explorer due to an invalid signature on Windows XP or Windows Vista).This restriction will not apply to the time-stamp certificate used to time-stamp the code-signing certificate or the certificate’s signature hash (thumbprint) until January 1, 2017. After this time, Windows will treat any code with a SHA-1 time-stamp or SHA-1 signature hash (thumbprint) as if the code did not have a time-stamp signature.
Code: Select all
#include <windows.h>
#include <tchar.h>
#define MAX 32767
const TCHAR sha1Url[] = _T("http://timestamp.comodoca.com/authenticode");
DWORD shell(LPTSTR cmd)
{
DWORD exitCode;
STARTUPINFO si; ZeroMemory(&si, sizeof(STARTUPINFO)); si.cb = sizeof(STARTUPINFO);
PROCESS_INFORMATION pi; ZeroMemory(&pi, sizeof(PROCESS_INFORMATION));
if (!CreateProcess(NULL, cmd, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi)) return 1;
WaitForSingleObject(pi.hProcess, INFINITE);
if (!GetExitCodeProcess(pi.hProcess, &exitCode)) return 1;
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
return exitCode;
}
BOOL repext(_TCHAR *dest, size_t n, const _TCHAR *src, const _TCHAR *ext)
{
if (_tcslen(src) >= n) return FALSE;
_tcscpy(dest, src);
_TCHAR *p = _tcsrchr(dest, _T('.'));
if (p == NULL) return TRUE;
if (_tcslen(dest) + _tcslen(ext) - _tcslen(p) >= n) return FALSE;
_tcscpy(p, ext);
return TRUE;
}
int _tmain(int argc, _TCHAR* argv[])
{
int i, k;
_TCHAR cmd[MAX+1], *p, *p2, *pBaseExe;
bool isMsi = false;
DWORD exitCode;
cmd[MAX] = _T('\0');
if (_sntprintf(cmd, MAX, _T("\"%s"), argv[0]) < 0) return 1;
p = _tcsrchr(cmd, _T('.'));
if (p == NULL) return 1;
if (_sntprintf(p, MAX-(p-cmd), _T("2.exe\"")) < 0) return 1;
p += _tcslen(p);
pBaseExe = p;
p2 = _tcsrchr(argv[argc - 1], _T('.'));
if (p2) {
if (_tcsicmp(p2, _T(".msi")) == 0) {
isMsi = true;
}
}
if (isMsi) {
for (i = k = 1; i < argc; i++) {
if (_tcscmp(argv[i - 1], _T("/f")) == 0) {
_TCHAR file[MAX_PATH];
if (!repext(file, _countof(file), argv[i], _T("-sha256.p12"))) return 1;
if (_sntprintf(p, MAX - (p - cmd), _T(" \"%s\""), file) < 0) return 1;
}
else if (_tcscmp(argv[i], _T("/t")) == 0) {
if (_sntprintf(p, MAX - (p - cmd), _T(" /tr")) < 0) return 1;
k = -2;
}
else {
if (_sntprintf(p, MAX - (p - cmd), _T(" \"%s\""), argv[i]) < 0) return 1;
}
p += _tcslen(p);
if (++k == 0) {
if (_sntprintf(p, MAX - (p - cmd), _T(" /fd SHA256 /td SHA256")) < 0) return 1;
p += _tcslen(p);
}
}
}
else {
for (i = k = 1; i < argc; i++) {
if (_tcscmp(argv[i - 1], _T("/t")) == 0) {
if (_sntprintf(p, MAX - (p - cmd), _T(" \"%s\""), sha1Url) < 0) return 1;
}
else if (_tcscmp(argv[i - 1], _T("/f")) == 0) {
_TCHAR file[MAX_PATH];
if (!repext(file, _countof(file), argv[i], _T("-sha1.p12"))) return 1;
if (_sntprintf(p, MAX - (p - cmd), _T(" \"%s\""), file) < 0) return 1;
}
else {
if (_sntprintf(p, MAX - (p - cmd), _T(" \"%s\""), argv[i]) < 0) return 1;
}
p += _tcslen(p);
}
exitCode = shell(cmd);
if (exitCode) return exitCode;
p = pBaseExe;
for (i = k = 1; i < argc; i++) {
if (_tcscmp(argv[i - 1], _T("/f")) == 0) {
_TCHAR file[MAX_PATH];
if (!repext(file, _countof(file), argv[i], _T("-sha256.p12"))) return 1;
if (_sntprintf(p, MAX - (p - cmd), _T(" \"%s\""), file) < 0) return 1;
}
else if (_tcscmp(argv[i], _T("/t")) == 0) {
if (_sntprintf(p, MAX - (p - cmd), _T(" /tr")) < 0) return 1;
k = -2;
}
else {
if (_sntprintf(p, MAX - (p - cmd), _T(" \"%s\""), argv[i]) < 0) return 1;
}
p += _tcslen(p);
if (++k == 0) {
if (_sntprintf(p, MAX - (p - cmd), _T(" /fd SHA256 /td SHA256 /as")) < 0) return 1;
p += _tcslen(p);
}
}
}
return shell(cmd);
}