189 lines
5.6 KiB
C
189 lines
5.6 KiB
C
|
/******************************************************************************\
|
||
|
* Adapted by Bruce Fortune (Citrix Systems, Inc.) from MS Online Source
|
||
|
* This is a part of the Microsoft Source Code Samples.
|
||
|
* Copyright (C) 1996 Microsoft Corporation.
|
||
|
* All rights reserved.
|
||
|
* This source code is only intended as a supplement to
|
||
|
* Microsoft Development Tools and/or WinHelp documentation.
|
||
|
* See these sources for detailed information regarding the
|
||
|
* Microsoft samples programs.
|
||
|
\******************************************************************************/
|
||
|
|
||
|
#include <windows.h>
|
||
|
#include <stdio.h>
|
||
|
#include <stdlib.h>
|
||
|
#include <wincrypt.h>
|
||
|
|
||
|
#define SIGKEYSIZE 1024
|
||
|
|
||
|
#define PUBBLOBFILE "pubblob.h"
|
||
|
#define PRIVBLOBFILE "privblob.h"
|
||
|
|
||
|
//
|
||
|
// LINE_VALS - maximum number of byte values printed on each line of
|
||
|
// the "blob" files
|
||
|
//
|
||
|
#define LINE_VALS 8
|
||
|
|
||
|
char *pszProgname; // program name - from argv[0]
|
||
|
|
||
|
|
||
|
BOOL
|
||
|
OpenBlobFile(
|
||
|
FILE **file,
|
||
|
CHAR *fname
|
||
|
)
|
||
|
{
|
||
|
*file = fopen( fname, "wt" );
|
||
|
if ( !*file ) {
|
||
|
return(FALSE);
|
||
|
}
|
||
|
return(TRUE);
|
||
|
}
|
||
|
|
||
|
void
|
||
|
DumpKeyBlob(
|
||
|
FILE *file,
|
||
|
DWORD dwBlobType,
|
||
|
HCRYPTKEY hKey,
|
||
|
HCRYPTKEY hExportKey )
|
||
|
{
|
||
|
int dwBlobCount;
|
||
|
if (!CryptExportKey(
|
||
|
hKey,
|
||
|
hExportKey,
|
||
|
dwBlobType,
|
||
|
0,
|
||
|
NULL,
|
||
|
&dwBlobCount)) {
|
||
|
printf( "Error %x during CryptExportKey 1!\n", GetLastError());
|
||
|
exit(1);
|
||
|
} else {
|
||
|
PBYTE pBlob;
|
||
|
pBlob = (PBYTE) malloc( dwBlobCount );
|
||
|
if ( !pBlob || !CryptExportKey(
|
||
|
hKey,
|
||
|
hExportKey,
|
||
|
dwBlobType,
|
||
|
0,
|
||
|
pBlob,
|
||
|
&dwBlobCount)) {
|
||
|
printf("Error %x during malloc/CryptExportKey 2!\n",
|
||
|
GetLastError());
|
||
|
exit(1);
|
||
|
} else {
|
||
|
int cnt=0;
|
||
|
fprintf( file, "// This data is generated by %s.\n", pszProgname );
|
||
|
fprintf( file, "// Key Blob - %d bytes\n",
|
||
|
dwBlobCount );
|
||
|
while ( cnt < dwBlobCount ) {
|
||
|
int i;
|
||
|
for ( i=0; (i < LINE_VALS) && (cnt < dwBlobCount); cnt++,i++) {
|
||
|
fprintf( file, "0x%02x, ", *(pBlob+cnt) );
|
||
|
}
|
||
|
fprintf( file, "\n" );
|
||
|
}
|
||
|
free( pBlob );
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/*****************************************************************************/
|
||
|
void _cdecl main(int argc, char *argv[])
|
||
|
{
|
||
|
HCRYPTPROV hProv;
|
||
|
HCRYPTKEY hSigKey;
|
||
|
CHAR szUserName[100];
|
||
|
DWORD dwUserNameLen = 100;
|
||
|
FILE *blobfile;
|
||
|
|
||
|
pszProgname = argv[0];
|
||
|
|
||
|
// Attempt to acquire a handle to the default key container.
|
||
|
if(!CryptAcquireContext(&hProv, NULL, MS_DEF_PROV, PROV_RSA_FULL, 0)) {
|
||
|
// Some sort of error occured.
|
||
|
|
||
|
// Create default key container.
|
||
|
if(!CryptAcquireContext(&hProv, NULL, MS_DEF_PROV,
|
||
|
PROV_RSA_FULL, CRYPT_NEWKEYSET)) {
|
||
|
printf("Error creating key container!\n");
|
||
|
exit(1);
|
||
|
}
|
||
|
|
||
|
// Get name of default key container.
|
||
|
if(!CryptGetProvParam(hProv, PP_CONTAINER, szUserName,
|
||
|
&dwUserNameLen, 0)) {
|
||
|
// Error getting key container name.
|
||
|
szUserName[0] = 0;
|
||
|
}
|
||
|
|
||
|
printf("Create key container '%s'\n",szUserName);
|
||
|
}
|
||
|
|
||
|
// Attempt to get handle to signature key.
|
||
|
// Commented out the following 2 lines. We always gerenate a new signature key. TSE4.0
|
||
|
// uses the existing key which seems to generate the same key all the time.
|
||
|
// if( !CryptGetUserKey(hProv, AT_SIGNATURE, &hSigKey)) {
|
||
|
// if( GetLastError() == NTE_NO_KEY) {
|
||
|
//
|
||
|
// Create signature key pair.
|
||
|
//
|
||
|
printf("Creating signature key pair...");
|
||
|
|
||
|
if (!CryptGenKey( hProv,
|
||
|
AT_SIGNATURE,
|
||
|
(SIGKEYSIZE << 16 ) | CRYPT_EXPORTABLE,
|
||
|
&hSigKey)) {
|
||
|
printf("Error %x during CryptGenKey!\n", GetLastError());
|
||
|
exit(1);
|
||
|
} else {
|
||
|
// Get Public Key BLOB
|
||
|
if ( !OpenBlobFile( &blobfile, PUBBLOBFILE ) ) {
|
||
|
printf( "Error %x during OpenBlobFile!\n", GetLastError() );
|
||
|
exit(1);
|
||
|
}
|
||
|
fprintf( blobfile, "unsigned char PublicKeySigBlob[] = {\n" );
|
||
|
DumpKeyBlob( blobfile, PUBLICKEYBLOB, hSigKey, 0 );
|
||
|
fprintf( blobfile, "};\n" );
|
||
|
|
||
|
}
|
||
|
|
||
|
|
||
|
#if 0 // Commented out the following code. We always gerenate a new signature key. TSE4.0
|
||
|
// uses the existing key which seems to generate the same key all the time.
|
||
|
|
||
|
} else {
|
||
|
printf("Error %x during CryptGetUserKey!\n", GetLastError());
|
||
|
exit(1);
|
||
|
}
|
||
|
} else {
|
||
|
// Get Public Key BLOB
|
||
|
printf( "Using existing keys..." );
|
||
|
if ( !OpenBlobFile( &blobfile, PUBBLOBFILE ) ) {
|
||
|
printf( "Error %x during OpenBlobFile!\n", GetLastError() );
|
||
|
exit(1);
|
||
|
}
|
||
|
fprintf( blobfile, "unsigned char PublicKeySigBlob[] = {\n" );
|
||
|
DumpKeyBlob( blobfile, PUBLICKEYBLOB, hSigKey, 0 );
|
||
|
fprintf( blobfile, "};\n" );
|
||
|
}
|
||
|
#endif
|
||
|
|
||
|
// Get Private Key BLOB
|
||
|
if ( !OpenBlobFile( &blobfile, PRIVBLOBFILE ) ) {
|
||
|
printf( "Error %x during OpenBlobFile - %s!\n",
|
||
|
GetLastError(),
|
||
|
PRIVBLOBFILE );
|
||
|
exit(1);
|
||
|
}
|
||
|
fprintf( blobfile, "unsigned char PrivateKeySigBlob[] = {\n" );
|
||
|
DumpKeyBlob( blobfile, PRIVATEKEYBLOB, hSigKey, 0 );
|
||
|
fprintf( blobfile, "};\n" );
|
||
|
CryptDestroyKey(hSigKey);
|
||
|
|
||
|
CryptReleaseContext(hProv,0);
|
||
|
|
||
|
printf( " successful.\n" );
|
||
|
exit(0);
|
||
|
}
|