Source code of Windows XP (NT5)
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.
 
 
 
 
 
 

272 lines
5.6 KiB

//+--------------------------------------------------------------------------
//
// Copyright (c) 1997-1999 Microsoft Corporation
//
// File:
//
// Contents:
//
// History:
//
//---------------------------------------------------------------------------
#include <windows.h>
#include <stdio.h>
#include "license.h"
#include "cryptkey.h"
#include "lscsp.h"
#include "licecert.h"
#define SECRET_DATA "I love sushi"
BOOL
GetCspData(
LSCSPINFO CspInfo,
LPBYTE * ppbData,
LPDWORD pcbData );
//+----------------------------------------------------------------------------
int _cdecl main( int argc, char *argv[] )
{
LICENSE_STATUS
Status;
LPBYTE
pbProprietoryCert = NULL,
pbX509Cert = NULL,
pbPrivKey = NULL,
pbX509PrivKey = NULL,
pbX509PubKey = NULL,
pbEnvelopedData = NULL,
pbData = NULL;
DWORD
cbProprietoryCert = 0,
cbX509Cert = 0,
cbPrivKey = 0,
cbX509PrivKey = 0,
cbX509PubKey = 0,
cbEnvelopedData = 0,
cbData = 0;
BYTE
abData[512];
//
// Initialize the CSP library
//
Status = LsCsp_Initialize();
if( LICENSE_STATUS_OK != Status )
{
printf( "Error initializing LSCSP: %x\n", Status );
return 1;
}
//
// Retrieve the proprietory certificate
//
if( !GetCspData( LsCspInfo_Certificate, &pbProprietoryCert, &cbProprietoryCert ) )
{
printf( "Cannot get proprietory certificate\n" );
}
else
{
printf( "Got proprietory certificate\n" );
}
//
// Retrieve the X509 certificate
//
if( !GetCspData( LsCspInfo_X509Certificate, &pbX509Cert, &cbX509Cert ) )
{
printf( "Cannot get X509 certificate\n" );
}
else
{
printf( "Got X509 certificate\n" );
}
//
// retrieve private key for the proprietory certificate
//
if( !GetCspData( LsCspInfo_PrivateKey, &pbPrivKey, &cbPrivKey ) )
{
printf( "Cannot get private key for the proprietory certificate\n");
}
else
{
printf( "Got the private key for the proprietory certificate\n" );
}
//
// retrieve the private key for the X509 certificate
//
if( !GetCspData( LsCspInfo_X509CertPrivateKey, &pbX509PrivKey, &cbX509PrivKey ) )
{
printf( "Cannot get private key for the X509 certificate\n");
}
else
{
printf( "Got the private key for the X509 certificate\n" );
}
//
// validate the X509 certificate and get the public key from the certificate
//
Status = VerifyCertChain( pbX509Cert, cbX509Cert, NULL, &cbX509PubKey );
if( LICENSE_STATUS_INSUFFICIENT_BUFFER == Status )
{
pbX509PubKey = new BYTE[ cbX509PubKey ];
if( NULL != pbX509PubKey )
{
Status = VerifyCertChain( pbX509Cert, cbX509Cert, pbX509PubKey, &cbX509PubKey );
}
}
if( LICENSE_STATUS_OK != Status )
{
printf( "Cannot verify certificate chain\n" );
goto done;
}
//
// Use the public key to encrypt a blob of data
//
Status = LicenseEnvelopeData(
pbX509PubKey,
cbX509PubKey,
( LPBYTE )SECRET_DATA,
strlen( SECRET_DATA ) + 1,
NULL,
&cbEnvelopedData );
pbEnvelopedData = new BYTE[ cbEnvelopedData ];
if( NULL == pbEnvelopedData )
{
goto done;
}
Status = LicenseEnvelopeData(
pbX509PubKey,
cbX509PubKey,
( LPBYTE )SECRET_DATA,
strlen( SECRET_DATA ) + 1,
pbEnvelopedData,
&cbEnvelopedData );
//
// Decrypt the encrypted data
//
cbData = sizeof( abData );
Status = LsCsp_DecryptEnvelopedData(
CERT_TYPE_X509,
pbEnvelopedData,
cbEnvelopedData,
abData,
&cbData );
if( LICENSE_STATUS_OK == Status )
{
printf( "Secret data is: %s", pbData );
}
done:
if( pbProprietoryCert )
{
delete [] pbProprietoryCert;
}
if( pbX509Cert )
{
delete [] pbX509Cert;
}
if( pbPrivKey )
{
delete [] pbPrivKey;
}
if( pbX509PrivKey )
{
delete [] pbX509PrivKey;
}
if( pbX509PubKey )
{
delete [] pbX509PubKey;
}
if( pbEnvelopedData )
{
delete [] pbEnvelopedData;
}
LsCsp_Exit();
return 1;
}
///////////////////////////////////////////////////////////////////////////////
BOOL
GetCspData(
LSCSPINFO CspInfo,
LPBYTE * ppbData,
LPDWORD pcbData )
{
LICENSE_STATUS
Status;
BOOL
fResult = TRUE;
*ppbData = NULL;
*pcbData = 0;
Status = LsCsp_GetServerData( CspInfo, NULL, pcbData );
if( LICENSE_STATUS_OK == Status )
{
*ppbData = new BYTE[ *pcbData ];
if( NULL == *ppbData )
{
printf( "Out of memory\n" );
fResult = FALSE;
goto done;
}
Status = LsCsp_GetServerData( CspInfo, *ppbData, pcbData );
}
if( LICENSE_STATUS_OK != Status )
{
printf( "cannot get LSCSP data: %x\n", Status );
if( *ppbData )
{
delete [] *ppbData;
*pcbData = 0;
}
fResult = FALSE;
}
done:
return( fResult );
}