472 lines
14 KiB
C
472 lines
14 KiB
C
/*++
|
||
|
||
Copyright (c) 1996 Microsoft Corporation
|
||
|
||
Module Name:
|
||
|
||
iiscrypt.c
|
||
|
||
Abstract:
|
||
|
||
IIS Crypto test app.
|
||
|
||
Author:
|
||
|
||
Keith Moore (keithmo) 02-Dec-1996
|
||
|
||
Revision History:
|
||
|
||
--*/
|
||
|
||
|
||
#include "precomp.h"
|
||
#pragma hdrstop
|
||
|
||
|
||
//
|
||
// Private constants.
|
||
//
|
||
|
||
#define TEST_HRESULT(api) \
|
||
if( FAILED(result) ) { \
|
||
\
|
||
printf( \
|
||
"%s:%lu failed, error %08lx\n", \
|
||
api, \
|
||
__LINE__, \
|
||
result \
|
||
); \
|
||
\
|
||
goto cleanup; \
|
||
\
|
||
} else
|
||
|
||
#define CLOSE_KEY(h) \
|
||
if( h != CRYPT_NULL ) { \
|
||
\
|
||
HRESULT _result; \
|
||
\
|
||
_result = IISCryptoCloseKey( h ); \
|
||
\
|
||
if( FAILED(_result) ) { \
|
||
\
|
||
printf( \
|
||
"IISCryptoCloseKey( %08lx ):%lu failed, error %08lx\n", \
|
||
h, \
|
||
__LINE__, \
|
||
_result \
|
||
); \
|
||
\
|
||
} \
|
||
\
|
||
}
|
||
|
||
#define DESTROY_HASH(h) \
|
||
if( h != CRYPT_NULL ) { \
|
||
\
|
||
HRESULT _result; \
|
||
\
|
||
_result = IISCryptoDestroyHash( h ); \
|
||
\
|
||
if( FAILED(_result) ) { \
|
||
\
|
||
printf( \
|
||
"IISCryptoDestroyHash( %08lx ):%lu failed, error %08lx\n", \
|
||
h, \
|
||
__LINE__, \
|
||
_result \
|
||
); \
|
||
\
|
||
} \
|
||
\
|
||
}
|
||
|
||
#define FREE_BLOB(b) \
|
||
if( b != NULL ) { \
|
||
\
|
||
HRESULT _result; \
|
||
\
|
||
_result = IISCryptoFreeBlob( b ); \
|
||
\
|
||
if( FAILED(_result) ) { \
|
||
\
|
||
printf( \
|
||
"IISCryptoFreeBlob( %08lx ):%lu failed, error %08lx\n", \
|
||
b, \
|
||
__LINE__, \
|
||
_result \
|
||
); \
|
||
\
|
||
} \
|
||
\
|
||
}
|
||
|
||
|
||
//
|
||
// Private types.
|
||
//
|
||
|
||
|
||
//
|
||
// Private globals.
|
||
//
|
||
|
||
DECLARE_DEBUG_PRINTS_OBJECT()
|
||
#include <initguid.h>
|
||
DEFINE_GUID(IisCryptSimpleGuid,
|
||
0x784d892C, 0xaa8c, 0x11d2, 0x92, 0x5e, 0x00, 0xc0, 0x4f, 0x72, 0xd9, 0x0e);
|
||
|
||
CHAR PlainText[] = "This is our sample plaintext that we'll encrypt.";
|
||
|
||
|
||
//
|
||
// Private prototypes.
|
||
//
|
||
|
||
|
||
//
|
||
// Public functions.
|
||
//
|
||
|
||
|
||
INT
|
||
__cdecl
|
||
main(
|
||
INT argc,
|
||
CHAR * argv[]
|
||
)
|
||
{
|
||
|
||
HRESULT result;
|
||
PVOID buffer;
|
||
DWORD bufferLength;
|
||
DWORD type;
|
||
HCRYPTPROV hProv;
|
||
HCRYPTKEY hKeyExchangeKey;
|
||
HCRYPTKEY hKeyExchangeKey2;
|
||
HCRYPTKEY hSignatureKey;
|
||
HCRYPTKEY hSignatureKey2;
|
||
HCRYPTKEY hSessionKey;
|
||
HCRYPTKEY hSessionKey2;
|
||
HCRYPTHASH hHash1;
|
||
HCRYPTHASH hHash2;
|
||
PIIS_CRYPTO_BLOB keyExchangePublicKeyBlob;
|
||
PIIS_CRYPTO_BLOB signaturePublicKeyBlob;
|
||
PIIS_CRYPTO_BLOB sessionKeyBlob;
|
||
PIIS_CRYPTO_BLOB dataBlob;
|
||
PIIS_CRYPTO_BLOB hashBlob1;
|
||
PIIS_CRYPTO_BLOB hashBlob2;
|
||
|
||
//
|
||
// Initialize debug stuff.
|
||
//
|
||
|
||
#ifndef _NO_TRACING_
|
||
CREATE_DEBUG_PRINT_OBJECT( "iiscrypt", IisCryptSimpleGuid );
|
||
CREATE_INITIALIZE_DEBUG();
|
||
#else
|
||
CREATE_DEBUG_PRINT_OBJECT( "iiscrypt" );
|
||
#endif
|
||
|
||
//
|
||
// Setup our locals so we know how to cleanup on exit.
|
||
//
|
||
|
||
hProv = CRYPT_NULL;
|
||
|
||
hKeyExchangeKey = CRYPT_NULL;
|
||
hKeyExchangeKey2 = CRYPT_NULL;
|
||
hSignatureKey = CRYPT_NULL;
|
||
hSignatureKey2 = CRYPT_NULL;
|
||
hSessionKey = CRYPT_NULL;
|
||
hSessionKey2 = CRYPT_NULL;
|
||
|
||
hHash1 = CRYPT_NULL;
|
||
hHash2 = CRYPT_NULL;
|
||
|
||
keyExchangePublicKeyBlob = NULL;
|
||
signaturePublicKeyBlob = NULL;
|
||
sessionKeyBlob = NULL;
|
||
dataBlob = NULL;
|
||
hashBlob1 = NULL;
|
||
hashBlob2 = NULL;
|
||
|
||
//
|
||
// Initialize the crypto package.
|
||
//
|
||
|
||
result = IISCryptoInitialize();
|
||
|
||
TEST_HRESULT( "IISCryptoInitialize()" );
|
||
|
||
//
|
||
// Open the container.
|
||
//
|
||
|
||
result = IISCryptoGetStandardContainer(
|
||
&hProv,
|
||
0
|
||
);
|
||
|
||
TEST_HRESULT( "IISCryptoGetStandardContainer()" );
|
||
printf( "hProv = %08lx\n", hProv );
|
||
|
||
//
|
||
// Get some keys.
|
||
//
|
||
|
||
result = IISCryptoGetKeyExchangeKey(
|
||
&hKeyExchangeKey,
|
||
hProv
|
||
);
|
||
|
||
TEST_HRESULT( "IISCryptoGetKeyExchangeKey()" );
|
||
printf( "hKeyExchangeKey = %08lx\n", hKeyExchangeKey );
|
||
|
||
result = IISCryptoGetSignatureKey(
|
||
&hSignatureKey,
|
||
hProv
|
||
);
|
||
|
||
TEST_HRESULT( "IISCryptoGetSignatureKey()" );
|
||
printf( "hSignatureKey = %08lx\n", hSignatureKey );
|
||
|
||
result = IISCryptoGenerateSessionKey(
|
||
&hSessionKey,
|
||
hProv
|
||
);
|
||
|
||
TEST_HRESULT( "IISCryptoGenerateSessionKey()" );
|
||
printf( "hSessionKey = %08lx\n", hSessionKey );
|
||
|
||
//
|
||
// Create a couple of public key blobs.
|
||
//
|
||
|
||
result = IISCryptoExportPublicKeyBlob(
|
||
&keyExchangePublicKeyBlob,
|
||
hProv,
|
||
hKeyExchangeKey
|
||
);
|
||
|
||
TEST_HRESULT( "IISCryptoExportPublicKeyBlob()" );
|
||
printf( "keyExchangePublicKeyBlob = %p\n", keyExchangePublicKeyBlob );
|
||
|
||
result = IISCryptoExportPublicKeyBlob(
|
||
&signaturePublicKeyBlob,
|
||
hProv,
|
||
hSignatureKey
|
||
);
|
||
|
||
TEST_HRESULT( "IISCryptoExportPublicKeyBlob()" );
|
||
printf( "signaturePublicKeyBlob = %p\n", signaturePublicKeyBlob );
|
||
|
||
//
|
||
// Now try to import them.
|
||
//
|
||
|
||
result = IISCryptoImportPublicKeyBlob(
|
||
&hKeyExchangeKey2,
|
||
keyExchangePublicKeyBlob,
|
||
hProv
|
||
);
|
||
|
||
TEST_HRESULT( "IISCryptoImportPublicKeyBlob()" );
|
||
printf( "hKeyExchangeKey2 = %08lx\n", hKeyExchangeKey2 );
|
||
|
||
result = IISCryptoImportPublicKeyBlob(
|
||
&hSignatureKey2,
|
||
signaturePublicKeyBlob,
|
||
hProv
|
||
);
|
||
|
||
TEST_HRESULT( "IISCryptoImportPublicKeyBlob()" );
|
||
printf( "hSignatureKey2 = %08lx\n", hSignatureKey2 );
|
||
|
||
//
|
||
// Create a session key blob.
|
||
//
|
||
|
||
result = IISCryptoExportSessionKeyBlob(
|
||
&sessionKeyBlob,
|
||
hProv,
|
||
hSessionKey,
|
||
hKeyExchangeKey
|
||
);
|
||
|
||
TEST_HRESULT( "IISCryptoExportSessionKeyBlob()" );
|
||
printf( "sessionKeyBlob = %p\n", sessionKeyBlob );
|
||
|
||
//
|
||
// Now try to import it back, using the imported signature key.
|
||
//
|
||
|
||
result = IISCryptoImportSessionKeyBlob(
|
||
&hSessionKey2,
|
||
sessionKeyBlob,
|
||
hProv,
|
||
hSignatureKey2
|
||
);
|
||
|
||
TEST_HRESULT( "IISCryptoImportKeyBlob()" );
|
||
printf( "hSessionKey2 = %08lx\n", hSessionKey2 );
|
||
|
||
//
|
||
// Create an encrypted data blob using the original session key.
|
||
//
|
||
|
||
printf( "PlainText[%lu:%lu] = %s\n", sizeof(PlainText), REG_SZ, PlainText );
|
||
|
||
result = IISCryptoEncryptDataBlob(
|
||
&dataBlob,
|
||
PlainText,
|
||
sizeof(PlainText),
|
||
REG_SZ,
|
||
hProv,
|
||
hSessionKey
|
||
);
|
||
|
||
TEST_HRESULT( "IISCryptoEncryptDataBlob()" );
|
||
printf( "dataBlob = %p\n", dataBlob );
|
||
|
||
//
|
||
// Decrypt the data blob using the imported session and signature keys.
|
||
//
|
||
|
||
result = IISCryptoDecryptDataBlob(
|
||
&buffer,
|
||
&bufferLength,
|
||
&type,
|
||
dataBlob,
|
||
hProv,
|
||
hSessionKey2,
|
||
hSignatureKey2
|
||
);
|
||
|
||
TEST_HRESULT( "IISCryptoDecryptDataBlob()" );
|
||
printf( "decrypted data[%lu:%lu] = %s\n", bufferLength, type, buffer );
|
||
|
||
//
|
||
// Create a hash object number 1 containing the plaintext data
|
||
// and the original session key, then export it as a hash blob.
|
||
//
|
||
|
||
result = IISCryptoCreateHash(
|
||
&hHash1,
|
||
hProv
|
||
);
|
||
|
||
TEST_HRESULT( "IISCryptoCreateHash()" );
|
||
printf( "hHash1 = %08lx\n", hHash1 );
|
||
|
||
result = IISCryptoHashData(
|
||
hHash1,
|
||
PlainText,
|
||
sizeof(PlainText)
|
||
);
|
||
|
||
TEST_HRESULT( "IISCryptoHashData()" );
|
||
|
||
result = IISCryptoHashSessionKey(
|
||
hHash1,
|
||
hSessionKey
|
||
);
|
||
|
||
TEST_HRESULT( "IISCryptoHashSessionKey()" );
|
||
|
||
result = IISCryptoExportHashBlob(
|
||
&hashBlob1,
|
||
hHash1
|
||
);
|
||
|
||
TEST_HRESULT( "IISCryptoExportHashBlob()" );
|
||
printf( "hashBlob1 = %p\n", hashBlob1 );
|
||
|
||
//
|
||
// Now do the same with the decrypted data and the imported key.
|
||
//
|
||
|
||
result = IISCryptoCreateHash(
|
||
&hHash2,
|
||
hProv
|
||
);
|
||
|
||
TEST_HRESULT( "IISCryptoCreateHash()" );
|
||
printf( "hHash2 = %08lx\n", hHash2 );
|
||
|
||
result = IISCryptoHashData(
|
||
hHash2,
|
||
buffer,
|
||
bufferLength
|
||
);
|
||
|
||
TEST_HRESULT( "IISCryptoHashData()" );
|
||
|
||
result = IISCryptoHashSessionKey(
|
||
hHash2,
|
||
hSessionKey2
|
||
);
|
||
|
||
TEST_HRESULT( "IISCryptoHashSessionKey()" );
|
||
|
||
result = IISCryptoExportHashBlob(
|
||
&hashBlob2,
|
||
hHash2
|
||
);
|
||
|
||
TEST_HRESULT( "IISCryptoExportHashBlob()" );
|
||
printf( "hashBlob2 = %p\n", hashBlob2 );
|
||
|
||
//
|
||
// Now compare the hash blobs. They had better match.
|
||
//
|
||
|
||
if( IISCryptoCompareBlobs( hashBlob1, hashBlob2 ) ) {
|
||
|
||
printf( "hashBlob1 == hashBlob2\n" );
|
||
|
||
} else {
|
||
|
||
printf( "HASH BLOBS DON'T MATCH!!\n" );
|
||
|
||
}
|
||
|
||
cleanup:
|
||
|
||
FREE_BLOB( hashBlob2);
|
||
FREE_BLOB( hashBlob1);
|
||
FREE_BLOB( dataBlob );
|
||
FREE_BLOB( sessionKeyBlob );
|
||
FREE_BLOB( signaturePublicKeyBlob );
|
||
FREE_BLOB( keyExchangePublicKeyBlob );
|
||
|
||
DESTROY_HASH( hHash2 );
|
||
DESTROY_HASH( hHash1 );
|
||
|
||
CLOSE_KEY( hSessionKey2 );
|
||
CLOSE_KEY( hSessionKey );
|
||
CLOSE_KEY( hSignatureKey2 );
|
||
CLOSE_KEY( hSignatureKey );
|
||
CLOSE_KEY( hKeyExchangeKey2 );
|
||
CLOSE_KEY( hKeyExchangeKey );
|
||
|
||
if( hProv != CRYPT_NULL ) {
|
||
|
||
(VOID)IISCryptoCloseContainer( hProv );
|
||
|
||
}
|
||
|
||
(VOID)IISCryptoTerminate();
|
||
|
||
DELETE_DEBUG_PRINT_OBJECT();
|
||
|
||
return 0;
|
||
|
||
} // main
|
||
|
||
|
||
//
|
||
// Private functions.
|
||
//
|
||
|