You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
168 lines
3.6 KiB
168 lines
3.6 KiB
/******************************************************************************
|
|
|
|
Copyright (c) 2000 Microsoft Corporation
|
|
|
|
Module Name:
|
|
sign.cpp
|
|
|
|
Abstract:
|
|
|
|
Revision History:
|
|
Vijay Baliga (VBaliga) 08/10/2000
|
|
created
|
|
|
|
******************************************************************************/
|
|
|
|
#include <module.h>
|
|
#include <MPC_main.h>
|
|
#include <MPC_utils.h>
|
|
#include <MPC_streams.h>
|
|
#include <KeysLib.h>
|
|
#include <HCP_trace.h>
|
|
#include <TrustedScripts.h>
|
|
|
|
HRESULT WINAPI
|
|
GetSignature(
|
|
CComBSTR bstrPrivateKey,
|
|
CComBSTR bstrCode
|
|
)
|
|
{
|
|
__HCP_FUNC_ENTRY( "GetSignature" );
|
|
|
|
HRESULT hr;
|
|
CPCHCryptKeys key;
|
|
CComBSTR bstrSignature;
|
|
|
|
if (NULL != NULL)
|
|
{
|
|
__MPC_SET_ERROR_AND_EXIT(hr, E_INVALIDARG);
|
|
}
|
|
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, key.ImportPrivate(bstrPrivateKey));
|
|
|
|
__MPC_EXIT_IF_METHOD_FAILS
|
|
(
|
|
hr,
|
|
key.SignData
|
|
(
|
|
bstrSignature,
|
|
(BYTE*) (BSTR(bstrCode)),
|
|
SysStringByteLen(bstrCode)
|
|
)
|
|
);
|
|
|
|
hr = S_OK;
|
|
|
|
wprintf(L"%s", bstrSignature);
|
|
|
|
__HCP_FUNC_CLEANUP;
|
|
|
|
__HCP_FUNC_EXIT(hr);
|
|
}
|
|
|
|
static HRESULT LoadFile( /*[in ]*/ LPCWSTR szFile ,
|
|
/*[out]*/ HGLOBAL& hg )
|
|
{
|
|
__HCP_FUNC_ENTRY( "LoadFile" );
|
|
|
|
HRESULT hr;
|
|
CComPtr<IStream> streamMem;
|
|
CComPtr<MPC::FileStream> streamFile;
|
|
|
|
|
|
//
|
|
// Create a stream for a file.
|
|
//
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, MPC::CreateInstance( &streamFile ));
|
|
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, streamFile->InitForRead( szFile ));
|
|
|
|
|
|
//
|
|
// Create a memory stream.
|
|
//
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, ::CreateStreamOnHGlobal( NULL, FALSE, &streamMem ));
|
|
|
|
//
|
|
// Load the contents in memory.
|
|
//
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, MPC::BaseStream::TransferData( streamFile, streamMem ));
|
|
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, ::GetHGlobalFromStream( streamMem, &hg ));
|
|
hr = S_OK;
|
|
|
|
|
|
__HCP_FUNC_CLEANUP;
|
|
|
|
__HCP_FUNC_EXIT(hr);
|
|
}
|
|
|
|
static HRESULT LoadFileAsString( /*[in ]*/ LPCWSTR szFile ,
|
|
/*[out]*/ CComBSTR& bstrData )
|
|
{
|
|
__HCP_FUNC_ENTRY( "LoadFileAsString" );
|
|
|
|
HRESULT hr;
|
|
HGLOBAL hg = NULL;
|
|
DWORD dwLen;
|
|
LPWSTR str;
|
|
|
|
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, LoadFile( szFile, hg ));
|
|
|
|
dwLen = ::GlobalSize( hg );
|
|
|
|
bstrData.Attach( ::SysAllocStringLen( NULL, dwLen ) );
|
|
|
|
::MultiByteToWideChar( CP_ACP, 0, (LPCSTR)::GlobalLock( hg ), dwLen, bstrData, (dwLen+1)*sizeof(WCHAR) ); bstrData[dwLen] = 0;
|
|
|
|
hr = S_OK;
|
|
|
|
|
|
__HCP_FUNC_CLEANUP;
|
|
|
|
if(hg) ::GlobalFree( hg );
|
|
|
|
__HCP_FUNC_EXIT(hr);
|
|
}
|
|
|
|
int __cdecl wmain(
|
|
int argc,
|
|
LPCWSTR argv[]
|
|
)
|
|
{
|
|
HRESULT hr;
|
|
MPC::wstring szFileKey;
|
|
MPC::wstring szFileCode;
|
|
CComBSTR bstrPrivateKey;
|
|
CComBSTR bstrCode;
|
|
|
|
if (argc != 3)
|
|
{
|
|
wprintf(L"Usage: %s <private key file> <code file>\n", argv[0]);
|
|
exit(1);
|
|
}
|
|
|
|
|
|
if (FAILED(hr = ::CoInitializeEx(NULL, COINIT_MULTITHREADED)))
|
|
{
|
|
wprintf(L"No COM!!\n");
|
|
exit(2);
|
|
}
|
|
|
|
MPC::SubstituteEnvVariables(szFileKey = argv[1]);
|
|
MPC::SubstituteEnvVariables(szFileCode = argv[2]);
|
|
|
|
LoadFileAsString(szFileKey.c_str(), bstrPrivateKey);
|
|
LoadFileAsString(szFileCode.c_str(), bstrCode);
|
|
|
|
if(FAILED(hr = GetSignature(bstrPrivateKey, bstrCode)))
|
|
{
|
|
wprintf(L"Failed to process %s: %08x\n", argv[1], hr);
|
|
exit(3);
|
|
}
|
|
|
|
::CoUninitialize();
|
|
|
|
return 0;
|
|
}
|