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.
 
 
 
 
 
 

269 lines
6.8 KiB

//+-------------------------------------------------------------------------
//
// Microsoft Windows
//
// Copyright (C) Microsoft Corporation, 1998 - 1999
//
// File: cspsigck.cpp
//
//--------------------------------------------------------------------------
// cspsigck.cpp : Defines the entry point for the console application.
//
// #ifndef WIN32_LEAN_AND_MEAN
// #define WIN32_LEAN_AND_MEAN
// #endif
// #include <windows.h> // All the Windows definitions.
#include "afx.h"
#include <iostream.h>
#ifndef WINVER
#define WINVER 0x0500
#endif
#include <wincrypt.h>
static LPCTSTR
ErrorString(
DWORD dwErrorCode);
static void
FreeErrorString(
LPCTSTR szErrorString);
DWORD __cdecl
main(
int argc,
char* argv[])
{
static TCHAR szDots[] =
TEXT("........................................................................");
DWORD dwReturn = 0;
HCRYPTPROV hProv = NULL;
DWORD dwIndex, dwLength, dwSts, dwProvType;
BOOL fSts;
CString szProvider;
cout << TEXT("==============================================================================\n")
<< TEXT(" Cryptographic Service Provider Signature validation\n")
<< TEXT("------------------------------------------------------------------------------\n")
<< flush;
dwIndex = 0;
for (;;)
{
dwLength = 0;
fSts = CryptEnumProviders(
dwIndex,
NULL,
0,
&dwProvType,
NULL,
&dwLength);
if (fSts)
{
fSts = CryptEnumProviders(
dwIndex,
NULL,
0,
&dwProvType,
szProvider.GetBuffer(dwLength / sizeof(TCHAR)),
&dwLength);
dwSts = GetLastError();
szProvider.ReleaseBuffer();
if (!fSts)
{
cerr << TEXT("\n ERROR Can't obtain provider name: ")
<< ErrorString(dwSts)
<< endl;
goto ErrorExit;
}
}
else
{
dwSts = GetLastError();
if (ERROR_NO_MORE_ITEMS == dwSts)
break;
cerr << TEXT("\n ERROR Can't obtain provider name length: ")
<< ErrorString(dwSts)
<< endl;
goto ErrorExit;
}
cout << szProvider << &szDots[szProvider.GetLength()] << flush;
fSts = CryptAcquireContext(
&hProv,
NULL,
szProvider,
dwProvType,
CRYPT_VERIFYCONTEXT);
if (fSts)
{
cout << TEXT("passed") << endl;
fSts = CryptReleaseContext(hProv, 0);
hProv = NULL;
if (!fSts)
{
dwSts = GetLastError();
cerr << TEXT("\n ERROR Can't release context: ")
<< ErrorString(dwSts)
<< endl;
goto ErrorExit;
}
}
else
{
dwSts = GetLastError();
dwReturn = dwSts;
cout << TEXT("FAILED\n")
<< TEXT(" ") << ErrorString(dwSts)
<< endl;
ASSERT(NULL == hProv);
}
dwIndex += 1;
}
cout << TEXT("------------------------------------------------------------------------------\n")
<< TEXT("Final Status") << &szDots[12]
<< (LPCTSTR)((ERROR_SUCCESS == dwReturn) ? TEXT("passed\n") : TEXT("FAILED\n"))
<< TEXT("==============================================================================\n")
<< flush;
dwReturn = 0;
ErrorExit:
if (hProv != NULL)
CryptReleaseContext(hProv, 0);
return dwReturn;
}
/*++
ErrorString:
This routine does it's very best to translate a given error code into a
text message. Any trailing non-printable characters are striped from the
end of the text message, such as carriage returns and line feeds.
Arguments:
dwErrorCode supplies the error code to be translated.
Return Value:
The address of a freshly allocated text string. Use FreeErrorString to
dispose of it.
Throws:
Errors are thrown as DWORD status codes.
Remarks:
Author:
Doug Barlow (dbarlow) 8/27/1998
--*/
static LPCTSTR
ErrorString(
DWORD dwErrorCode)
{
LPTSTR szErrorString = NULL;
try
{
DWORD dwLen;
LPTSTR szLast;
dwLen = FormatMessage(
FORMAT_MESSAGE_ALLOCATE_BUFFER
| FORMAT_MESSAGE_FROM_SYSTEM,
NULL,
dwErrorCode,
LANG_NEUTRAL,
(LPTSTR)&szErrorString,
0,
NULL);
if (0 == dwLen)
{
ASSERT(NULL == szErrorString);
dwLen = FormatMessage(
FORMAT_MESSAGE_ALLOCATE_BUFFER
| FORMAT_MESSAGE_FROM_HMODULE,
GetModuleHandle(NULL),
dwErrorCode,
LANG_NEUTRAL,
(LPTSTR)&szErrorString,
0,
NULL);
if (0 == dwLen)
{
ASSERT(NULL == szErrorString);
szErrorString = (LPTSTR)LocalAlloc(
LMEM_FIXED,
32 * sizeof(TCHAR));
if (NULL == szErrorString)
throw (DWORD)SCARD_E_NO_MEMORY;
_stprintf(szErrorString, TEXT("0x%08x"), dwErrorCode);
}
}
ASSERT(NULL != szErrorString);
for (szLast = szErrorString + lstrlen(szErrorString) - 1;
szLast > szErrorString;
szLast -= 1)
{
if (_istgraph(*szLast))
break;
*szLast = 0;
}
}
catch (...)
{
FreeErrorString(szErrorString);
throw;
}
return szErrorString;
}
/*++
FreeErrorString:
This routine frees the Error String allocated by the ErrorString service.
Arguments:
szErrorString supplies the error string to be deallocated.
Return Value:
None
Throws:
None
Remarks:
Author:
Doug Barlow (dbarlow) 8/27/1998
--*/
static void
FreeErrorString(
LPCTSTR szErrorString)
{
if (NULL != szErrorString)
LocalFree((LPVOID)szErrorString);
}