📄 ppmanager.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 + -