⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ppmanager.cpp

📁 基于SD卡的软实现CSP程序
💻 CPP
字号:
/*
PPManager.CPP
Each of these functions provides the implementation for
CPGetProvParam() of a different type.

*/

#include "PPManager.h"
#include "CRDSPEC_Container.h"
#include "CRDSPEC_Card.h"
#include "Context.h"
#include <wincrypt.h>

static
BOOL
SetOutputParam(VOID *pvBuf ,PDWORD pdwBufLen,  const VOID *pvSrc, DWORD dwRequiredLen )
{
	DWORD dwBufLen = *pdwBufLen;

	*pdwBufLen = dwRequiredLen;
	if (pvBuf)
	{
		if (dwRequiredLen > dwBufLen)
		{
			SetLastError(ERROR_MORE_DATA);
			return FALSE;
		}
		else
			memcpy(pvBuf, pvSrc, dwRequiredLen);
	}
	return TRUE;
}
/*
CPPManager::Initialize
Purpose:
	Initializes the ProvderParam manager

Params:
	CContext* pContext: Context ptr

Returns:
	void
*/
void CPPManager::Initialize(CContext* pContext)
{
	m_pContext = pContext;
	m_rsa.Initialize(false);
}

/*
CPPManager::HandleContainer
Purpose:
	Imp of to CPGetProvParam with PP_CONTAINER.  See MSDN.

Params:
	BYTE* pbData: See MSDN
	DWORD* pdwDataLen: See MSDN
	DWORD dwFlags: See MSDN

Returns:
	See MSDN
*/
BOOL CPPManager::HandleContainer(BYTE* pbData, DWORD* pdwDataLen, DWORD dwFlags)
{
	//Get the container
	CContainer* pContainer = m_pContext->GetCurrentContainer();
	if(!pContainer ||
		(m_pContext->GetFlags() & CRYPT_VERIFYCONTEXT) == CRYPT_VERIFYCONTEXT)
	{
		SetLastError(NTE_BAD_UID);
		return FALSE;
	}

	//Check to see if the buffer is big enough
	DWORD dwBytesRequired = (wcslen(pContainer->GetName())+ 1) * sizeof(WCHAR);
	return SetOutputParam(pbData, pdwDataLen, pContainer->GetName(), dwBytesRequired);
}

/*
CPPManager::HandleEnumAlgs
Purpose:
	Imp of CPGetProvParam with PP_ENUM_ALGS.  See MSDN.

Params:
	BYTE* pbData: See MSDN
	DWORD* pdwDataLen: See MSDN
	DWORD dwFlags: See MSDN

Returns:
	See MSDN
*/
BOOL CPPManager::HandleEnumAlgs(BYTE* pbData, DWORD* pdwDataLen, DWORD dwFlags)
{
	return CryptGetProvParam(m_rsa, PP_ENUMALGS, pbData, pdwDataLen, dwFlags);
}

/*
CPPManager::HandleEnumAlgsEx
Purpose:
	Imp of CPGetProvParam with PP_ENUM_ALGS_EX.  See MSDN.

Params:
	BYTE* pbData: See MSDN
	DWORD* pdwDataLen: See MSDN
	DWORD dwFlags: See MSDN

Returns:
	See MSDN
*/
BOOL CPPManager::HandleEnumAlgsEx(BYTE* pbData, DWORD* pdwDataLen, DWORD dwFlags)
{
	return CryptGetProvParam(m_rsa, PP_ENUMALGS_EX, pbData, pdwDataLen, dwFlags);
}

/*
CPPManager::HandleEnumContainers
Purpose:
	Imp of to CPGetProvParam with PP_ENUM_CONTAINERS.  See MSDN.

Params:
	BYTE* pbData: See MSDN.
	DWORD* pdwDataLen: See MSDN.
	DWORD dwFlags: See MSDN.

Returns:
	See MSDN.
*/
BOOL CPPManager::HandleEnumContainers(CCard* pCrd, BYTE* pbData, DWORD* pdwDataLen, DWORD dwFlags)
{
	CHandleTable* pHT = pCrd->GetContainerList();
	BOOL fRet;
	if ((dwFlags & ~(CRYPT_FIRST | CRYPT_NEXT)) != 0)
	{
	    SetLastError((DWORD) NTE_BAD_FLAGS);
	    return FALSE;
	}
	if(CRYPT_FIRST & dwFlags)
		m_iCookie = 0;

	int iNextCookie = m_iCookie;
	CContainer* pContainer = (CContainer*)pHT->GetNext(iNextCookie);
	if(!pContainer)
	{
		SetLastError(ERROR_NO_MORE_ITEMS);
		return FALSE;
	}

	DWORD dwRequiredDataLen = sizeof(WCHAR)*(wcslen(pContainer->GetName()) + 1);

	fRet =  SetOutputParam(pbData,  pdwDataLen, pContainer->GetName(), dwRequiredDataLen );

	if (fRet && pbData) 
		// only advance the counter if we actually returned something
		m_iCookie = iNextCookie;

	return fRet;
}

/*
CPPManager::HandleImpType
Purpose:
	Imp of to CPGetProvParam with PP_IMP_TYPE.  See MSDN.

Params:
	BYTE* pbData: See MSDN
	DWORD* pdwDataLen: See MSDN
	DWORD dwFlags: See MSDN

Returns:
	See MSDN
*/
BOOL CPPManager::HandleImpType(BYTE* pbData, DWORD* pdwDataLen, DWORD dwFlags)
{
	DWORD dwImpType = WfSC_IMP_TYPE;
	return SetOutputParam( pbData, pdwDataLen, &dwImpType, sizeof(dwImpType) );
}

/*
CPPManager::HandleName
Purpose:
	Imp of to CPGetProvParam with PP_NAME.  See MSDN.

Params:
	BYTE* pbData: See MSDN
	DWORD* pdwDataLen: See MSDN
	DWORD dwFlags: See MSDN

Returns:
	See MSDN
*/
BOOL CPPManager::HandleName(BYTE* pbData, DWORD* pdwDataLen, DWORD dwFlags)
{
	DWORD dwBytesRequired = (wcslen(WfSC_PROVIDER_NAME)+1) * sizeof(WCHAR);
	return SetOutputParam( pbData, pdwDataLen, WfSC_PROVIDER_NAME, dwBytesRequired );
}

/*
CPPManager::HandleVersion
Purpose:
	Imp of to CPGetProvParam with PP_VERSION.  See MSDN.

Params:
	BYTE* pbData: See MSDN
	DWORD* pdwDataLen: See MSDN
	DWORD dwFlags: See MSDN

Returns:
	See MSDN
*/
BOOL CPPManager::HandleVersion(BYTE* pbData, DWORD* pdwDataLen, DWORD dwFlags)
{
	DWORD dwVersion = WfSC_PROVIDER_VERSION;
	return SetOutputParam( pbData, pdwDataLen, &dwVersion, sizeof(dwVersion) );
}

/*
CPPManager::HandleSigKeySizeInc
Purpose:
	Imp of to CPGetProvParam with PP_SIG_KEYSIZE_INC.  See MSDN.

Params:
	BYTE* pbData: See MSDN
	DWORD* pdwDataLen: See MSDN
	DWORD dwFlags: See MSDN

Returns:
	See MSDN
*/
BOOL CPPManager::HandleSigKeySizeInc(BYTE* pbData, DWORD* pdwDataLen, DWORD dwFlags)
{
	DWORD dwKeyInc = 0;
	m_rsa.GetKeyStepping(dwKeyInc);
	return SetOutputParam( pbData, pdwDataLen, &dwKeyInc, sizeof(dwKeyInc) );
}

/*
CPPManager::HandleKeyXKeySizeInc
Purpose:
	Imp of to CPGetProvParam with PP_KEYX_KEYSIZE_INC.  See MSDN.

Params:
	BYTE* pbData: See MSDN
	DWORD* pdwDataLen: See MSDN
	DWORD dwFlags: See MSDN

Returns:
	See MSDN
*/
BOOL CPPManager::HandleKeyXKeySizeInc(BYTE* pbData, DWORD* pdwDataLen, DWORD dwFlags)
{
	DWORD dwKeyInc = 0;
	m_rsa.GetKeyStepping(dwKeyInc);
	return SetOutputParam( pbData, pdwDataLen, &dwKeyInc, sizeof(dwKeyInc) );
}


/*
CPPManager::HandleUniqueContainer
Purpose:
	Imp of to CPGetProvParam with PP_UNIQUE_CONTAINER.  See MSDN.

Params:
	BYTE* pbData: See MSDN
	DWORD* pdwDataLen: See MSDN
	DWORD dwFlags: See MSDN

Returns:
	See MSDN
*/
BOOL CPPManager::HandleUniqueContainer(BYTE* pbData, DWORD* pdwDataLen, DWORD dwFlags)
{
	CContainer* pContainer = m_pContext->GetCurrentContainer();
	if(!pContainer ||
		(m_pContext->GetFlags() & CRYPT_VERIFYCONTEXT) == CRYPT_VERIFYCONTEXT)
	{
		SetLastError(NTE_BAD_UID);
		return FALSE;
	}

	//Check to see if the buffer is big enough -- the +4 at the end is for the three \ chars and the NULL terminator
	DWORD dwContainerLength = wcslen(pContainer->GetName());
	//DWORD dwReaderLength = wcslen(m_pContext->GetCard()->GetReaderName());
	//DWORD dwBytesRequired = (dwContainerLength + dwReaderLength + 4) * sizeof(WCHAR);
	DWORD dwBytesRequired = (dwContainerLength + 3) * sizeof(WCHAR);

	*pdwDataLen = dwBytesRequired;
	if (pbData)
	{
		if(dwBytesRequired > *pdwDataLen)
		{
			*pdwDataLen = dwBytesRequired;
			SetLastError(ERROR_MORE_DATA);
			return FALSE;
		}
	}
	else
		return TRUE;

	//Copy the data
	WCHAR* pszUniqueContainer = (WCHAR*)pbData;
	wcscpy(pszUniqueContainer, TEXT("\\\\"));
	/*wcscpy(&pszUniqueContainer[2], m_pContext->GetCard()->GetReaderName());
	wcscpy(&pszUniqueContainer[dwReaderLength + 2], TEXT("\\"));*/
	wcscpy(&pszUniqueContainer[2], pContainer->GetName());


	return TRUE;
}

/*
CPPManager::HandleProvType
Purpose:
	Gets the provider type.  See MSDN.

Params:
	BYTE* pbData: See MSDN.
	DWORD* pdwDataLen: See MSDN.
	DWORD dwFlags: See MSDN.

Returns:
	TRUE if it succeeds, FALSE otherwise.
*/
BOOL CPPManager::HandleProvType(BYTE* pbData, DWORD* pdwDataLen, DWORD dwFlags)
{
	DWORD dwProvType = PROV_RSA_FULL;
	return SetOutputParam( pbData, pdwDataLen, &dwProvType, sizeof(dwProvType) );
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -