windows-nt/Source/XPSP1/NT/termsrv/license/clrhouse/test/kpcode/kpcode.c

989 lines
25 KiB
C
Raw Normal View History

2020-09-26 03:20:57 -05:00
//+--------------------------------------------------------------------------
//
// Copyright (c) 1999 Microsoft Corporation
//
// File:
//
// Contents:
//
// History:
//
//---------------------------------------------------------------------------
#include <windows.h>
#include <wincrypt.h>
#include <stdio.h>
#include <stdlib.h>
#include <tchar.h>
#include "licekpak.h"
#define AllocateMemory(size) LocalAlloc(LPTR, size)
#define FreeMemory(ptr) LocalFree(ptr)
#define ENCRYPTCONTAINER _TEXT("Encrypt")
#define DECRYPTCONTAINER _TEXT("Decrypt")
///////////////////////////////////////////////////////////////////////////////
// The keypack serial number
//
LPTSTR pszPID = _TEXT("This is a test");
GUID g_KeypackSN = { 0xdedaa678, 0xb83c, 0x11d1, { 0x9c, 0xb3, 0x00, 0xc0, 0x4f, 0xb1, 0x6e, 0x75 } };
DWORD
InitializeKeyPackInfo(
PLicense_KeyPack pLicenseKeyPack );
void
FreeLicenseKeyPack(
PLicense_KeyPack pLicenseKeyPack );
void
PrintKeyPackInfo(
PLicense_KeyPack pLicenseKeyPack );
DWORD
EncodeKeyPack(
HCRYPTPROV hCrypt,
PLicense_KeyPack pLicenseKeyPack,
PBYTE pbLSCert,
DWORD cbLSCert,
PDWORD pcbEncodedBlob,
PBYTE * ppbEncodedBlob );
DWORD
DecodeKeyPack(
HCRYPTPROV hCryptProv,
PLicense_KeyPack pLicenseKeyPack,
DWORD cbEncodedBlob,
PBYTE pbEncodedBlob,
char * pszCHCertFile,
char * pszLSKeyContainer );
DWORD
GetCertificate(
char * szCertFile,
PBYTE * ppCert,
PDWORD pcbCert );
///////////////////////////////////////////////////////////////////////////////
DWORD
TLSSaveCertAsPKCS7(
HCRYPTPROV hCryptProv,
PBYTE pbCert,
DWORD cbCert,
PBYTE* ppbEncodedCert,
PDWORD pcbEncodedCert
)
/*
*/
{
DWORD dwStatus=ERROR_SUCCESS;
HCERTSTORE hStore=NULL;
PCCERT_CONTEXT pCertContext=NULL;
CRYPT_DATA_BLOB saveBlob;
do {
hStore=CertOpenStore(
CERT_STORE_PROV_MEMORY,
X509_ASN_ENCODING | PKCS_7_ASN_ENCODING,
hCryptProv,
CERT_STORE_NO_CRYPT_RELEASE_FLAG,
NULL
);
if(!hStore)
{
dwStatus = GetLastError();
break;
}
pCertContext = CertCreateCertificateContext(
X509_ASN_ENCODING,
pbCert,
cbCert
);
if(!pCertContext)
{
dwStatus = GetLastError();
break;
}
//
// always start from empty so CERT_STORE_ADD_ALWAYS
if(!CertAddCertificateContextToStore(
hStore,
pCertContext,
CERT_STORE_ADD_ALWAYS,
NULL
))
{
dwStatus = GetLastError();
break;
}
memset(&saveBlob, 0, sizeof(saveBlob));
// save certificate into memory
if(!CertSaveStore(hStore,
X509_ASN_ENCODING | PKCS_7_ASN_ENCODING,
CERT_STORE_SAVE_AS_PKCS7,
CERT_STORE_SAVE_TO_MEMORY,
&saveBlob,
0) && (dwStatus=GetLastError()) != ERROR_MORE_DATA)
{
dwStatus = GetLastError();
break;
}
if(!(saveBlob.pbData = (PBYTE)AllocateMemory(saveBlob.cbData)))
{
dwStatus=GetLastError();
break;
}
// save certificate into memory
if(!CertSaveStore(hStore,
X509_ASN_ENCODING | PKCS_7_ASN_ENCODING,
CERT_STORE_SAVE_AS_PKCS7,
CERT_STORE_SAVE_TO_MEMORY,
&saveBlob,
0))
{
dwStatus = GetLastError();
break;
}
*ppbEncodedCert = saveBlob.pbData;
*pcbEncodedCert = saveBlob.cbData;
} while(FALSE);
if(pCertContext)
{
CertFreeCertificateContext(pCertContext);
}
if(hStore)
{
CertCloseStore(hStore, CERT_CLOSE_STORE_FORCE_FLAG);
}
return dwStatus;
}
/////////////////////////////////////////////////////////////////////
HCRYPTPROV
CryptoInit(
LPTSTR szContainer
)
/*++
--*/
{
HCRYPTPROV hProv;
HCRYPTKEY hKey;
// Attempt to acquire a handle to the default key container.
if(!CryptAcquireContext(&hProv, szContainer, NULL, PROV_RSA_FULL, CRYPT_MACHINE_KEYSET))
{
// Create default key container.
if(!CryptAcquireContext(&hProv, szContainer, NULL, PROV_RSA_FULL, CRYPT_NEWKEYSET | CRYPT_MACHINE_KEYSET))
{
return NULL;
}
}
// Attempt to get handle to signature key.
if(!CryptGetUserKey(hProv, AT_SIGNATURE, &hKey))
{
if(GetLastError() == NTE_NO_KEY && !CryptGenKey(hProv,AT_SIGNATURE,0,&hKey))
return NULL;
}
CryptDestroyKey(hKey);
// Attempt to get handle to exchange key.
if(!CryptGetUserKey(hProv, AT_KEYEXCHANGE, &hKey))
{
if(GetLastError() == NTE_NO_KEY && !CryptGenKey(hProv, AT_KEYEXCHANGE, 0, &hKey))
return NULL;
}
CryptDestroyKey(hKey);
return hProv;
}
///////////////////////////////////////////////////////////////////////////////
const DWORD dwCertRdnValueType = CERT_RDN_PRINTABLE_STRING;
/////////////////////////////////////////////////////////////////////
DWORD
TLSExportPublicKey(
IN HCRYPTPROV hCryptProv,
IN DWORD dwKeyType,
IN OUT PDWORD pcbByte,
IN OUT PCERT_PUBLIC_KEY_INFO *ppbByte
)
/*
*/
{
BOOL bRetCode=TRUE;
*pcbByte=0;
*ppbByte=NULL;
bRetCode = CryptExportPublicKeyInfo(
hCryptProv,
dwKeyType,
X509_ASN_ENCODING,
NULL,
pcbByte);
if(bRetCode == FALSE)
goto cleanup;
if((*ppbByte=(PCERT_PUBLIC_KEY_INFO)AllocateMemory(*pcbByte)) == NULL)
goto cleanup;
bRetCode = CryptExportPublicKeyInfo(
hCryptProv,
dwKeyType,
X509_ASN_ENCODING,
*ppbByte,
pcbByte);
if(bRetCode == FALSE)
{
FreeMemory(*ppbByte);
*pcbByte = 0;
}
cleanup:
return (bRetCode) ? ERROR_SUCCESS : GetLastError();
}
/////////////////////////////////////////////////////////////////////
DWORD
TLSCryptEncodeObject(
IN DWORD dwEncodingType,
IN LPCSTR lpszStructType,
IN const void * pvStructInfo,
OUT PBYTE* ppbEncoded,
OUT DWORD* pcbEncoded
)
/*
Description:
Allocate memory and encode object, wrapper for CryptEncodeObject()
*/
{
DWORD dwStatus = ERROR_SUCCESS;
if(!CryptEncodeObject(dwEncodingType, lpszStructType, pvStructInfo, NULL, pcbEncoded) ||
(*ppbEncoded=(PBYTE)AllocateMemory(*pcbEncoded)) == NULL ||
!CryptEncodeObject(dwEncodingType, lpszStructType, pvStructInfo, *ppbEncoded, pcbEncoded))
{
dwStatus=GetLastError();
}
return dwStatus;
}
/////////////////////////////////////////////////////////////////////
DWORD
TLSCryptSignAndEncodeCertificate(
IN HCRYPTPROV hCryptProv,
IN DWORD dwKeySpec,
IN PCERT_INFO pCertInfo,
IN PCRYPT_ALGORITHM_IDENTIFIER pSignatureAlgorithm,
IN OUT PBYTE* ppbEncodedCert,
IN OUT PDWORD pcbEncodedCert
)
/*
*/
{
BOOL bRetCode;
bRetCode = CryptSignAndEncodeCertificate(
hCryptProv,
dwKeySpec,
X509_ASN_ENCODING,
X509_CERT_TO_BE_SIGNED,
pCertInfo,
pSignatureAlgorithm,
NULL,
NULL,
pcbEncodedCert);
if(bRetCode == FALSE && GetLastError() != ERROR_MORE_DATA)
goto cleanup;
*ppbEncodedCert=(PBYTE)AllocateMemory(*pcbEncodedCert);
if(*ppbEncodedCert == FALSE)
goto cleanup;
bRetCode = CryptSignAndEncodeCertificate(
hCryptProv,
AT_SIGNATURE,
X509_ASN_ENCODING,
X509_CERT_TO_BE_SIGNED,
pCertInfo,
pSignatureAlgorithm,
NULL,
*ppbEncodedCert,
pcbEncodedCert);
if(bRetCode == FALSE)
{
FreeMemory(*ppbEncodedCert);
*pcbEncodedCert = 0;
}
cleanup:
return (bRetCode) ? ERROR_SUCCESS : GetLastError();
}
/////////////////////////////////////////////////////////////////////
DWORD
CreateSelfSignCertificate(
HCRYPTPROV hCryptProv,
LPTSTR pszIssuer,
DWORD dwKeySpec,
PBYTE* ppbCert,
PDWORD pcbCert
)
/*++
--*/
{
DWORD dwStatus=ERROR_SUCCESS;
CRYPT_ALGORITHM_IDENTIFIER SignatureAlgorithm={ szOID_OIWSEC_sha1RSASign, 0, 0 };
CERT_INFO CertInfo;
PCERT_PUBLIC_KEY_INFO pbPublicKeyInfo=NULL;
DWORD cbPublicKeyInfo=0;
DWORD serialnumber;
CERT_RDN_ATTR rgNameAttr[] = {
{
szOID_COMMON_NAME,
dwCertRdnValueType,
_tcslen(pszIssuer) * sizeof(TCHAR),
(UCHAR *)pszIssuer
}
};
CERT_RDN rgRDN[] = { sizeof(rgNameAttr)/sizeof(rgNameAttr[0]), &rgNameAttr[0] };
CERT_NAME_INFO Name = {1, rgRDN};
memset(&CertInfo, 0, sizeof(CERT_INFO));
CertInfo.dwVersion = CERT_V3;
CertInfo.SerialNumber.cbData = sizeof(DWORD);
CertInfo.SerialNumber.pbData = (PBYTE)&serialnumber;
CertInfo.SignatureAlgorithm = SignatureAlgorithm;
TLSCryptEncodeObject(
CRYPT_ASN_ENCODING,
X509_NAME,
&Name,
&(CertInfo.Issuer.pbData),
&(CertInfo.Issuer.cbData)
);
GetSystemTimeAsFileTime(&CertInfo.NotBefore);
GetSystemTimeAsFileTime(&CertInfo.NotAfter);
CertInfo.Subject.pbData = CertInfo.Issuer.pbData;
CertInfo.Subject.cbData = CertInfo.Issuer.cbData;
dwStatus = TLSExportPublicKey(
hCryptProv,
dwKeySpec,
&cbPublicKeyInfo,
&pbPublicKeyInfo
);
if(dwStatus != ERROR_SUCCESS)
{
goto cleanup;
}
CertInfo.SubjectPublicKeyInfo = *pbPublicKeyInfo;
dwStatus = TLSCryptSignAndEncodeCertificate(
hCryptProv,
dwKeySpec,
&CertInfo,
&SignatureAlgorithm,
ppbCert,
pcbCert
);
cleanup:
return dwStatus;
}
///////////////////////////////////////////////////////////////////////////////
void _cdecl main(int argc, char *argv[])
{
License_KeyPack LicenseKeyPack;
License_KeyPack DecodedKeyPack;
PBYTE pbEncodedBlob;
DWORD cbEncodedBlob;
DWORD dwRetCode;
HCRYPTPROV hTest;
PBYTE pbEncryptCert;
DWORD cbEncryptCert;
PBYTE pbDecryptCert;
DWORD cbDecryptCert;
PBYTE pbEncryptCertPKCS7;
DWORD cbEncryptCertPKCS7;
PBYTE pbDecryptCertPKCS7;
DWORD cbDecryptCertPKCS7;
HCRYPTPROV hEncrypt;
HCRYPTPROV hDecrypt;
memset(&LicenseKeyPack, 0, sizeof(LicenseKeyPack));
memset(&DecodedKeyPack, 0, sizeof(DecodedKeyPack));
hTest = CryptoInit(_TEXT("Test"));
if(hTest == NULL)
{
exit(0);
}
//
// Initialize two crypto provider
//
hEncrypt = CryptoInit(ENCRYPTCONTAINER);
if(hEncrypt == NULL)
{
exit(0);
}
hDecrypt = CryptoInit(DECRYPTCONTAINER);
if(hDecrypt == NULL)
{
exit(0);
}
//
// Generate two test certificate
//
if(CreateSelfSignCertificate(
hEncrypt,
ENCRYPTCONTAINER,
AT_KEYEXCHANGE,
&pbEncryptCert,
&cbEncryptCert
) != ERROR_SUCCESS)
{
exit(0);
}
//
// Generate two test certificate
//
if(CreateSelfSignCertificate(
hDecrypt,
DECRYPTCONTAINER,
AT_KEYEXCHANGE,
&pbDecryptCert,
&cbDecryptCert
) != ERROR_SUCCESS)
{
exit(0);
}
TLSSaveCertAsPKCS7(
hEncrypt,
pbEncryptCert,
cbEncryptCert,
&pbEncryptCertPKCS7,
&cbEncryptCertPKCS7
);
TLSSaveCertAsPKCS7(
hDecrypt,
pbDecryptCert,
cbDecryptCert,
&pbDecryptCertPKCS7,
&cbDecryptCertPKCS7
);
//
// initialize the license key pack with the information we want to
// encode
//
memset( &LicenseKeyPack , 0, sizeof( License_KeyPack ) );
dwRetCode = InitializeKeyPackInfo( &LicenseKeyPack );
if( ERROR_SUCCESS != dwRetCode )
{
goto done;
}
//
// encode the license key pack.
//
dwRetCode = EncodeKeyPack(
hTest,
&LicenseKeyPack,
pbDecryptCertPKCS7,
cbDecryptCertPKCS7,
&cbEncodedBlob,
&pbEncodedBlob
);
if( ERROR_SUCCESS != dwRetCode )
{
printf( "cannot encode key pack: %d\n", dwRetCode );
goto done;
}
memset( &DecodedKeyPack, 0, sizeof( License_KeyPack ) );
if( ERROR_SUCCESS != dwRetCode )
{
goto done;
}
//
// decode the license key pack
//
dwRetCode = DecodeKeyPack(
hDecrypt,
&DecodedKeyPack,
cbEncodedBlob,
pbEncodedBlob,
pbDecryptCertPKCS7,
cbDecryptCertPKCS7
);
if( ERROR_SUCCESS != dwRetCode )
{
printf( "cannot encode key pack: %d\n", dwRetCode );
goto done;
}
//
// print the information in the decoded license key pack
//
PrintKeyPackInfo( &DecodedKeyPack );
done:
FreeLicenseKeyPack( &LicenseKeyPack );
FreeLicenseKeyPack( &DecodedKeyPack );
if( pbEncodedBlob )
{
LocalFree( pbEncodedBlob );
}
return;
Usage:
printf( "Usage: \n" );
printf( "LS_Certificate_File, LS_KeyContainer_Name, CH_Certificate_File, CH_KeyContainer_Name\n" );
return;
}
#define KEYPACK_DESCRIPTION_1 L"Joe's BlockBuster Software"
#define KEYPACK_DESCRIPTION_2 L"Claire's Garage Bestseller"
#define KEYPACK_PRODUCTNAME_1 L"Joe and Claire's Most Excellent Compiler"
#define KEYPACK_PRODUCTNAME_2 L"NetWise Surfer"
#define MANUFACTURER L"Joe and Claire"
#define MANUFACTURER_DATA L"2356 Elm Street, Seattle, WA"
#define PRODUCT_ID L"1234"
///////////////////////////////////////////////////////////////////////////////
DWORD
InitializeKeyPackInfo(
PLicense_KeyPack pLicenseKeyPack )
{
SYSTEMTIME SystemTime;
PKeyPack_Description pKpDesc;
pLicenseKeyPack->dwVersion = LICENSE_KEYPACK_VERSION_1_0;
pLicenseKeyPack->dwKeypackType = LICENSE_KEYPACK_TYPE_MOLP;
pLicenseKeyPack->dwDistChannel = LICENSE_DISTRIBUTION_CHANNEL_OEM;
memcpy( &pLicenseKeyPack->KeypackSerialNum, &g_KeypackSN, sizeof( GUID ) );
//
// setting all the time to the current time
//
GetSystemTime( &SystemTime );
SystemTimeToFileTime( &SystemTime, &pLicenseKeyPack->IssueDate );
pLicenseKeyPack->ActiveDate = pLicenseKeyPack->IssueDate;
pLicenseKeyPack->ExpireDate = pLicenseKeyPack->IssueDate;
pLicenseKeyPack->dwBeginSerialNum = 9999;
pLicenseKeyPack->dwQuantity = 799;
pLicenseKeyPack->cbProductId = ( wcslen( PRODUCT_ID ) + 1 ) * sizeof( WCHAR );
pLicenseKeyPack->pbProductId = LocalAlloc( GPTR, pLicenseKeyPack->cbProductId );
memcpy( pLicenseKeyPack->pbProductId, PRODUCT_ID, pLicenseKeyPack->cbProductId );
pLicenseKeyPack->dwProductVersion = 0x0000FFFF;
pLicenseKeyPack->dwPlatformId = 0x0000FFFF;
pLicenseKeyPack->dwLicenseType = 0xBEEFFACE;
pLicenseKeyPack->dwDescriptionCount = 2;
pLicenseKeyPack->pDescription = LocalAlloc( GPTR,
2 * sizeof( KeyPack_Description ) );
if( NULL == pLicenseKeyPack->pDescription )
{
return( GetLastError() );
}
//
// fill in the keypack descriptions
//
pKpDesc = pLicenseKeyPack->pDescription;
pKpDesc->Locale = GetSystemDefaultLCID();
pKpDesc->cbProductName = ( wcslen( KEYPACK_PRODUCTNAME_1 ) + 1 ) * sizeof( WCHAR );
pKpDesc->pbProductName = LocalAlloc( GPTR, pKpDesc->cbProductName );
if( NULL == pKpDesc->pbProductName )
{
return( GetLastError() );
}
memcpy( pKpDesc->pbProductName, KEYPACK_PRODUCTNAME_1, pKpDesc->cbProductName );
pKpDesc->cbDescription = ( wcslen( KEYPACK_DESCRIPTION_1 ) + 1 ) * sizeof( WCHAR );
pKpDesc->pDescription = LocalAlloc( GPTR, pKpDesc->cbDescription );
if( NULL == pKpDesc->pDescription )
{
return( GetLastError() );
}
memcpy( pKpDesc->pDescription, KEYPACK_DESCRIPTION_1, pKpDesc->cbDescription );
pKpDesc++;
pKpDesc->Locale = GetSystemDefaultLCID();
pKpDesc->cbProductName = ( wcslen( KEYPACK_PRODUCTNAME_2 ) + 1 ) * sizeof( WCHAR );
pKpDesc->pbProductName = LocalAlloc( GPTR, pKpDesc->cbProductName );
if( NULL == pKpDesc->pbProductName )
{
return( GetLastError() );
}
memcpy( pKpDesc->pbProductName, KEYPACK_PRODUCTNAME_2, pKpDesc->cbProductName );
pKpDesc->cbDescription = ( wcslen( KEYPACK_DESCRIPTION_2 ) + 1 ) * sizeof( WCHAR );
pKpDesc->pDescription = LocalAlloc( GPTR, pKpDesc->cbDescription );
if( NULL == pKpDesc->pDescription )
{
return( GetLastError() );
}
memcpy( pKpDesc->pDescription, KEYPACK_DESCRIPTION_2, pKpDesc->cbDescription );
pLicenseKeyPack->cbManufacturer = ( wcslen( MANUFACTURER ) + 1 ) * sizeof( WCHAR );
pLicenseKeyPack->pbManufacturer = LocalAlloc( GPTR, pLicenseKeyPack->cbManufacturer );
if( NULL == pLicenseKeyPack->pbManufacturer )
{
return( GetLastError() );
}
memcpy( pLicenseKeyPack->pbManufacturer, MANUFACTURER, pLicenseKeyPack->cbManufacturer );
pLicenseKeyPack->cbManufacturerData = ( wcslen( MANUFACTURER_DATA ) + 1 ) * sizeof( WCHAR );
pLicenseKeyPack->pbManufacturerData = LocalAlloc( GPTR, pLicenseKeyPack->cbManufacturerData );
if( NULL == pLicenseKeyPack->pbManufacturerData )
{
return( GetLastError() );
}
memcpy( pLicenseKeyPack->pbManufacturerData, MANUFACTURER_DATA, pLicenseKeyPack->cbManufacturerData );
return( ERROR_SUCCESS );
}
///////////////////////////////////////////////////////////////////////////////
void
FreeLicenseKeyPack(
PLicense_KeyPack pLicenseKeyPack )
{
DWORD i;
PKeyPack_Description pKpDesc;
if( pLicenseKeyPack->pDescription )
{
for( i = 0, pKpDesc = pLicenseKeyPack->pDescription;
i < pLicenseKeyPack->dwDescriptionCount;
i++, pKpDesc++ )
{
LocalFree( pKpDesc->pDescription );
}
}
LocalFree( pLicenseKeyPack->pDescription );
LocalFree( pLicenseKeyPack->pbManufacturer );
LocalFree( pLicenseKeyPack->pbManufacturerData );
return;
}
///////////////////////////////////////////////////////////////////////////////
void
PrintKeyPackInfo(
PLicense_KeyPack pLicenseKeyPack )
{
DWORD i;
PKeyPack_Description pKpDesc;
printf( "Keypack version: 0x%x\n", pLicenseKeyPack->dwVersion );
printf( "Keypack type: 0x%x\n", pLicenseKeyPack->dwKeypackType );
printf( "Keypack distribution channel: 0x%x\n", pLicenseKeyPack->dwDistChannel );
printf( "Keypack serial number: 0x%x-0x%x-0x%x-0x%x%x%x%x%x%x%x%x\n",
pLicenseKeyPack->KeypackSerialNum.Data1,
pLicenseKeyPack->KeypackSerialNum.Data2,
pLicenseKeyPack->KeypackSerialNum.Data3,
( DWORD )pLicenseKeyPack->KeypackSerialNum.Data4[0],
( DWORD )pLicenseKeyPack->KeypackSerialNum.Data4[1],
( DWORD )pLicenseKeyPack->KeypackSerialNum.Data4[2],
( DWORD )pLicenseKeyPack->KeypackSerialNum.Data4[3],
( DWORD )pLicenseKeyPack->KeypackSerialNum.Data4[4],
( DWORD )pLicenseKeyPack->KeypackSerialNum.Data4[5],
( DWORD )pLicenseKeyPack->KeypackSerialNum.Data4[6],
( DWORD )pLicenseKeyPack->KeypackSerialNum.Data4[7] );
printf( "Keypack Quantity: %d\n", pLicenseKeyPack->dwQuantity );
printf( "Keypack Product Id: %S\n", pLicenseKeyPack->pbProductId );
printf( "Keypack product version: 0x%x\n", pLicenseKeyPack->dwProductVersion );
printf( "Keypack platform Id: 0x%x\n", pLicenseKeyPack->dwPlatformId );
printf( "Keypack license type: 0x%x\n", pLicenseKeyPack->dwLicenseType );
if( pLicenseKeyPack->dwDescriptionCount )
{
for( i = 0, pKpDesc = pLicenseKeyPack->pDescription;
i < pLicenseKeyPack->dwDescriptionCount;
i++, pKpDesc++ )
{
printf( "Keypack Product Name: %S\n", pKpDesc->pbProductName );
printf( "Keypack Description: %S\n", pKpDesc->pDescription );
}
}
printf( "Keypack Manufacturer: %S\n", pLicenseKeyPack->pbManufacturer );
printf( "Keypack Manufacturer data: %S\n", pLicenseKeyPack->pbManufacturerData );
return;
}
///////////////////////////////////////////////////////////////////////////////
DWORD
EncodeKeyPack(
HCRYPTPROV hCrypt,
PLicense_KeyPack pLicenseKeyPack,
PBYTE pbLSCert,
DWORD cbLSCert,
PDWORD pcbEncodedBlob,
PBYTE * ppbEncodedBlob )
{
DWORD dwRetCode = ERROR_SUCCESS;
//
// encode the license keypack info
//
LicensePackEncodeParm parm;
memset(&parm, 0, sizeof(LicensePackEncodeParm));
parm.dwEncodeType = LICENSE_KEYPACK_ENCRYPT_ALWAYSFRENCH;
parm.hCryptProv = hCrypt;
parm.pbEncryptParm = pbLSCert;
parm.cbEncryptParm = cbLSCert;
dwRetCode = EncodeLicenseKeyPackEx(
pLicenseKeyPack,
&parm,
ppbEncodedBlob,
pcbEncodedBlob
);
done:
return( dwRetCode );
}
///////////////////////////////////////////////////////////////////////////////
DWORD
DecodeKeyPack(
HCRYPTPROV hCrypt,
PLicense_KeyPack pLicenseKeyPack,
DWORD cbEncodedBlob,
PBYTE pbEncodedBlob,
PBYTE pbCHCert,
DWORD cbCHCert )
{
DWORD dwRetCode = ERROR_SUCCESS;
LicensePackDecodeParm parm;
memset(&parm, 0, sizeof(parm));
parm.hCryptProv = hCrypt;
parm.pbDecryptParm = (PBYTE)pszPID;
parm.cbDecryptParm = (lstrlen(pszPID) + 1) * sizeof(TCHAR);
parm.cbClearingHouseCert = cbCHCert;
parm.pbClearingHouseCert = pbCHCert;
parm.pbRootCertificate = pbCHCert;
parm.cbRootCertificate = cbCHCert;
dwRetCode = DecodeLicenseKeyPackEx(
pLicenseKeyPack,
&parm,
cbEncodedBlob,
pbEncodedBlob
);
done:
return( dwRetCode );
}
///////////////////////////////////////////////////////////////////////////////
DWORD
GetCertificate(
char * szCertFile,
PBYTE * ppCert,
PDWORD pcbCert )
{
HANDLE hFile = INVALID_HANDLE_VALUE;
DWORD dwRetCode = ERROR_SUCCESS, cbRead = 0;
TCHAR tszCertFile[255];
mbstowcs( tszCertFile, szCertFile, strlen( szCertFile ) + 1 );
hFile = CreateFile( tszCertFile, GENERIC_READ, 0, NULL, OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL, NULL );
if( INVALID_HANDLE_VALUE == hFile )
{
dwRetCode = GetLastError();
goto done;
}
//
// find out the size of the file
//
*pcbCert = GetFileSize( hFile, NULL );
if( 0xFFFFFFFF == ( *pcbCert ) )
{
dwRetCode = GetLastError();
goto done;
}
//
// allocate memory for reading the file content
//
*ppCert = LocalAlloc( GPTR, *pcbCert );
if( NULL == ( *ppCert ) )
{
dwRetCode = GetLastError();
goto done;
}
//
// read the manufacturer info
//
if( !ReadFile( hFile, *ppCert, *pcbCert, &cbRead, NULL ) )
{
dwRetCode = GetLastError();
}
done:
if( INVALID_HANDLE_VALUE != hFile )
{
CloseHandle( hFile );
}
return( dwRetCode );
}