Leaked source code of windows server 2003
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

/******************************************************************************
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;
}