|
|
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1992 - 1998.
//
// File: HCContxt.c
//
// Contents: Functions that are used to pack and unpack different messages
//
// Classes:
//
// Functions:
//
// History: 12-23-97 v-sbhatt Created
// 07-22-98 fredch Added LicenseSetPublicKey() function
//----------------------------------------------------------------------------
#include "windows.h"
#include "stdlib.h"
#include <tchar.h>
#ifdef OS_WINCE
#include <wincelic.h>
#endif //OS_WINCE
#include "license.h"
#include "cryptkey.h"
#include "hccontxt.h"
#include "cliprot.h"
#ifndef OS_WINCE
#include "assert.h"
#endif // OS_WINCE
VOID FreeProprietaryCertificate( PHydra_Server_Cert * ppCertificate );
#ifdef __cplusplus
extern "C" { #endif
/******************************************************************
* Funtion : PLicense_Client_Context LicenseCreateContext(VOID) * Purpose : Creates a New License_Client_Context and initializes * it with 0 * Returns : Returns a pointer to created License_Client_Context *******************************************************************/
PLicense_Client_Context LicenseCreateContext( VOID) { PLicense_Client_Context pContext; //Allocate approptiate memory!
pContext = (PLicense_Client_Context)malloc(sizeof(License_Client_Context)); if(pContext == NULL) return NULL; memset(pContext, 0, sizeof(License_Client_Context));
//
// allocate memory for the crypto context
//
pContext->pCryptParam = ( PCryptSystem )malloc( sizeof( CryptSystem ) );
if( NULL == pContext->pCryptParam ) { free( pContext ); pContext = NULL; return( NULL ); }
return pContext; }
/**********************************************************************************
* Funtion : LICENSE_STATUS LicenseDeleteContext(PLicense_Client_Context pContext) * Purpose : Deletes an existing context and overwrites the memory with 0 * Returns : Returns LICENSE_STATUS *******************************************************************/
LICENSE_STATUS CALL_TYPE LicenseDeleteContext( HANDLE hContext )//PLicense_Client_Context pContext)
{ LICENSE_STATUS lsReturn = LICENSE_STATUS_OK; PLicense_Client_Context pContext = (PLicense_Client_Context)hContext; if(pContext == NULL) { lsReturn = LICENSE_STATUS_INVALID_CLIENT_CONTEXT; #if DBG
OutputDebugString(_T("The context handle passed is invalid")); #endif
return lsReturn; } //free pServerCert
if(pContext->pServerCert) { FreeProprietaryCertificate( &pContext->pServerCert ); }
//
// Free the public key
//
if( pContext->pbServerPubKey ) { memset( pContext->pbServerPubKey, 0x00, pContext->cbServerPubKey ); free( pContext->pbServerPubKey ); pContext->pbServerPubKey = NULL; } //Free pCryptSystem
if(pContext->pCryptParam) { memset(pContext->pCryptParam, 0x00, sizeof(CryptSystem)); free(pContext->pCryptParam); pContext->pCryptParam = NULL; }
//Free the last message
if(pContext->pbLastMessage) { memset(pContext->pbLastMessage, 0x00, pContext->cbLastMessage); free(pContext->pbLastMessage); pContext->pbLastMessage = NULL; } if(pContext) { //Zeroise the memory
memset(pContext, 0, sizeof(License_Client_Context)); //Now free the context;
free(pContext); pContext = NULL; } hContext = NULL; return lsReturn; }
/**********************************************************************************
* Funtion : LICENSE_STATUS * LicenseInitializeContext( * PLicense_Client_Context pContext, * DWORD dwFlags * ); * Purpose : Initializes an existing context * Returns : Returns LICENSE_STATUS *******************************************************************/
LICENSE_STATUS CALL_TYPE LicenseInitializeContext( HANDLE *phContext, DWORD dwFlags ) { LICENSE_STATUS lsReturn = LICENSE_STATUS_OK; PLicense_Client_Context pContext;
assert(phContext); pContext = LicenseCreateContext(); if(pContext == NULL) { #if DBG
OutputDebugString(_T("\nUnable to allocate memory for the context.\n")); #endif
*phContext = NULL; lsReturn = LICENSE_STATUS_OUT_OF_MEMORY; return lsReturn; } //Now initialize different members of the context structure
pContext->dwProtocolVersion = LICENSE_HIGHEST_PROTOCOL_VERSION; pContext->dwState = LICENSE_CLIENT_STATE_WAIT_SERVER_HELLO; pContext->pCryptParam->dwCryptState = CRYPT_SYSTEM_STATE_INITIALIZED; pContext->pCryptParam->dwSignatureAlg = SIGNATURE_ALG_RSA; pContext->pCryptParam->dwKeyExchAlg = KEY_EXCHANGE_ALG_RSA; pContext->pCryptParam->dwSessKeyAlg = BASIC_RC4_128; pContext->pCryptParam->dwMACAlg = MAC_MD5_SHA; memset(pContext->pCryptParam->rgbClientRandom, 0x00, LICENSE_RANDOM); memset(pContext->pCryptParam->rgbServerRandom, 0x00, LICENSE_RANDOM); memset(pContext->pCryptParam->rgbPreMasterSecret, 0x00, LICENSE_PRE_MASTER_SECRET); memset(pContext->pCryptParam->rgbMACSaltKey, 0x00, LICENSE_MAC_WRITE_KEY); memset(pContext->pCryptParam->rgbSessionKey, 0x00, LICENSE_SESSION_KEY); memset(pContext->rgbMACData, 0x00, LICENSE_MAC_DATA); pContext->cbLastMessage = 0; pContext->pbLastMessage = NULL; pContext->pServerCert = NULL; pContext->dwContextFlags = dwFlags;
*phContext = (HANDLE)pContext; return lsReturn; }
/******************************************************************
* Funtion : LICENSE_STATUS * LicenseAcceptContext( * HANDLE hContext, * UINT32 puiExtendedErrorInfo, * BYTE FAR * pbInput, * DWORD cbInput, * BYTE FAR * pbOutput, * DWORD FAR * pcbOutput ) * * Purpose : Process and construct licensing protocol data. * * Returns : Returns a LICENSE_STATUS return code. *******************************************************************/
LICENSE_STATUS CALL_TYPE LicenseAcceptContext( HANDLE hContext, UINT32 *puiExtendedErrorInfo, BYTE FAR *pbInput, DWORD cbInput, BYTE FAR *pbOutput, DWORD FAR*pcbOutput ) { PLicense_Client_Context pContext = (PLicense_Client_Context)hContext; return LicenseClientHandleServerMessage(pContext, puiExtendedErrorInfo, pbInput, cbInput, pbOutput, pcbOutput); }
/******************************************************************
* Funtion : LICENSE_STATUS * LicenseSetPublicKey( * HANDLE hContext, * DWORD cbPubKey, * BYTE FAR * pbPubKey ) * * Purpose : Sets the public key to use. * * Returns : Returns a LICENSE_STATUS return code. *******************************************************************/
LICENSE_STATUS CALL_TYPE LicenseSetPublicKey( HANDLE hContext, DWORD cbPubKey, BYTE FAR * pbPubKey ) { PLicense_Client_Context pContext = ( PLicense_Client_Context )hContext; PBYTE pbOldPubKey = NULL;
if( ( NULL == pbPubKey ) || ( 0 >= cbPubKey ) || ( NULL == pContext ) ) { return( LICENSE_STATUS_INVALID_INPUT ); }
//
// remember the old public key so that we can restore it if this
// function call doesn't complete successfully.
//
pbOldPubKey = pContext->pbServerPubKey; //
// allocate memory for the new public key
//
pContext->pbServerPubKey = malloc( cbPubKey );
if( NULL == pContext->pbServerPubKey ) { //
// no memory, restore the old public key and return an error
//
pContext->pbServerPubKey = pbOldPubKey; return( LICENSE_STATUS_OUT_OF_MEMORY ); }
//
// copy the new public key
//
memcpy( pContext->pbServerPubKey, pbPubKey, cbPubKey ); pContext->cbServerPubKey = cbPubKey;
if( pbOldPubKey ) { free( pbOldPubKey ); }
return( LICENSE_STATUS_OK ); }
/******************************************************************
* Funtion : LICENSE_STATUS * LicenseSetCertificate( * HANDLE hContext, * PHydra_Server_Cert pCertificate ) * * Purpose : Sets the certificate to use. * * Returns : Returns a LICENSE_STATUS return code. *******************************************************************/
LICENSE_STATUS CALL_TYPE LicenseSetCertificate( HANDLE hContext, PHydra_Server_Cert pCertificate ) { PLicense_Client_Context pContext = ( PLicense_Client_Context )hContext; PHydra_Server_Cert pNewCert = NULL; LICENSE_STATUS Status = LICENSE_STATUS_OK;
if( ( NULL == pCertificate ) || ( NULL == pContext ) || ( NULL == pCertificate->PublicKeyData.pBlob) || ( NULL == pCertificate->SignatureBlob.pBlob ) ) { return( LICENSE_STATUS_INVALID_INPUT ); }
//
// allocate memory for the new certificate
//
pNewCert = ( PHydra_Server_Cert )malloc( sizeof( Hydra_Server_Cert ) );
if( NULL == pNewCert ) { return( LICENSE_STATUS_OUT_OF_MEMORY ); }
memset( ( char * )pNewCert, 0, sizeof( Hydra_Server_Cert ) );
pNewCert->PublicKeyData.pBlob = ( LPBYTE )malloc( pCertificate->PublicKeyData.wBlobLen );
if( NULL == pNewCert->PublicKeyData.pBlob ) { Status = LICENSE_STATUS_OUT_OF_MEMORY; goto ErrorExit; }
pNewCert->SignatureBlob.pBlob = ( LPBYTE )malloc( pCertificate->SignatureBlob.wBlobLen );
if( NULL == pNewCert->SignatureBlob.pBlob ) { Status = LICENSE_STATUS_OUT_OF_MEMORY; goto ErrorExit; }
//
// copy the certificate info
//
pNewCert->dwVersion = pCertificate->dwVersion; pNewCert->dwSigAlgID = pCertificate->dwSigAlgID; pNewCert->dwKeyAlgID = pCertificate->dwKeyAlgID;
pNewCert->PublicKeyData.wBlobType = pCertificate->PublicKeyData.wBlobType; pNewCert->PublicKeyData.wBlobLen = pCertificate->PublicKeyData.wBlobLen; memcpy( pNewCert->PublicKeyData.pBlob, pCertificate->PublicKeyData.pBlob, pNewCert->PublicKeyData.wBlobLen );
pNewCert->SignatureBlob.wBlobType = pCertificate->SignatureBlob.wBlobType; pNewCert->SignatureBlob.wBlobLen = pCertificate->SignatureBlob.wBlobLen; memcpy( pNewCert->SignatureBlob.pBlob, pCertificate->SignatureBlob.pBlob, pNewCert->SignatureBlob.wBlobLen );
//
// free the old certificate and reset the pointer.
//
if( pContext->pServerCert ) { FreeProprietaryCertificate( &pContext->pServerCert ); } pContext->pServerCert = pNewCert;
return( Status );
ErrorExit:
if( pNewCert->PublicKeyData.pBlob ) { free( pNewCert->PublicKeyData.pBlob ); }
if( pNewCert->SignatureBlob.pBlob ) { free( pNewCert->SignatureBlob.pBlob ); }
free( pNewCert );
return( Status ); }
#ifdef __cpluscplus
} #endif
|