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

📄 keyexport.cpp

📁 对PKCS11接口的封装
💻 CPP
字号:
/*===========================================================================


===========================================================================

		说明:

			通用函数 支持平台:WIN98/2K/XP...

		文件名:	

			Epass3000Export.cpp
---------------------------------------------------------------------------
		描述:		

			封装接口

---------------------------------------------------------------------------
		修改:

*===========================================================================*/


#include "StdAfx.h"
#include "KeyCommon.h"
#include "DeviceList.h"
#include "KeyExport.h"

static char	g_szErrInfo[512] = {0};
DWORD		g_dwErrCode = 0;

int WINAPI CK_GetDeviceNumber()
{
	DWORD dCount = 0;
	
	ULONG ulErrorCode = GetDeviceListHandle().GetSlotCount(dCount);
	
	if ( ulErrorCode != CKR_OK )
	{
		sprintf(g_szErrInfo,"取设备列表出错,ErrorCode:0x%x",ulErrorCode);
		g_dwErrCode = ulErrorCode;
	}

	return (ulErrorCode == CKR_OK) ? dCount : -1;
}

int	WINAPI CK_GetDeviceSerialNumber(CK_SLOT_ID ckSlotID,char *szSN)
{
	int idex, iLen;
	ULONG ulErrorCode = CKR_OK;
	BYTE cbserialNumber[17] = {0};	
	CK_TOKEN_INFO ckTokenInfo = {0};
	
	ulErrorCode = GetDeviceListHandle().GetTokenInfo(ckSlotID, &ckTokenInfo);
	if(CKR_OK != ulErrorCode)
	{
		DebugOutPosition(__FILE__, __LINE__);
		goto end;
	}
	
	CopyMemory(cbserialNumber, ckTokenInfo.serialNumber, 16);
	for(idex = ARRAYSIZEOF(cbserialNumber) - 1; idex > 0; idex--)
	{
		if(cbserialNumber[idex] == 0x20)
		{
			cbserialNumber[idex] = '\0';
			continue;
		}
		else
			break;
	}
	
	iLen = idex + 1;
	CopyMemory(szSN, cbserialNumber, iLen);
end:
	if ( ulErrorCode != CKR_OK )
	{
		sprintf(g_szErrInfo,"取设备序列号出错,ErrorCode:0x%x",ulErrorCode);
		g_dwErrCode = ulErrorCode;
	}
	return (ulErrorCode == CKR_OK) ? USBKEY_OK : USBKEY_FAILED;
}

int	WINAPI CK_CreateFile(CK_SLOT_ID ckSlotID,char *szUserPwd,DWORD dwFileID,DWORD dwFileSize)
{
	BOOL bLoged;
	CK_USER_TYPE ulType;
	ULONG ulErrorCode = CKR_OK;
	
	char strFileName[128] = {0};
	ULONG ulFileNameLen = 0;
	
	ulErrorCode = GetDeviceListHandle().OpenAppletSession(ckSlotID);
	if(CKR_OK != ulErrorCode)
	{
		DebugOutPosition(__FILE__, __LINE__);
		goto end;
	}
	
	ulErrorCode = GetDeviceListHandle().GetAppletSessionInfo(ulType, bLoged);
	if(CKR_OK != ulErrorCode)
	{
		DebugOutPosition(__FILE__, __LINE__);
		goto end;
	}
	
	if(ulType != CKU_USER)
	{
		GetDeviceListHandle().AppletSessionLogOut();

		ulErrorCode = GetDeviceListHandle().AppletSessionLogIn(CKU_USER, (PBYTE)szUserPwd, strlen(szUserPwd));
		if(CKR_OK != ulErrorCode)
		{
			DebugOutPosition(__FILE__, __LINE__);
			goto end;
		}
	}
	
	sprintf(strFileName, "%d", dwFileID);
	ulFileNameLen = strlen(strFileName);
	
	ulErrorCode = GetDeviceListHandle().CreateTokenFile(FALSE, (PBYTE)strFileName, ulFileNameLen, dwFileSize);
	
end:
	if ( ulErrorCode != CKR_OK )
	{
		sprintf(g_szErrInfo,"创建文件出错,ErrorCode:0x%x",ulErrorCode);
		g_dwErrCode = ulErrorCode;
	}
	GetDeviceListHandle().CloseAppletSession();
	return (ulErrorCode == CKR_OK) ? USBKEY_OK : USBKEY_FAILED;
}

int WINAPI CK_DeleteFile(CK_SLOT_ID ckSlotID,char *szUserPwd,DWORD dwFileID)
{
	BOOL bLoged;
	CK_USER_TYPE ulType;
	ULONG ulErrorCode = CKR_OK;
	
	char strFileName[128] = {0};
	ULONG ulFileNameLen = 0;
	
	ulErrorCode = GetDeviceListHandle().OpenAppletSession(ckSlotID);
	if(CKR_OK != ulErrorCode)
	{
		DebugOutPosition(__FILE__, __LINE__);
		goto end;
	}
	
	ulErrorCode = GetDeviceListHandle().GetAppletSessionInfo(ulType, bLoged);
	if(CKR_OK != ulErrorCode)
	{
		DebugOutPosition(__FILE__, __LINE__);
		goto end;
	}
	
	if(ulType != CKU_USER)
	{
		GetDeviceListHandle().AppletSessionLogOut();

		ulErrorCode = GetDeviceListHandle().AppletSessionLogIn(CKU_USER, (PBYTE)szUserPwd, strlen(szUserPwd));
		if(CKR_OK != ulErrorCode)
		{
			DebugOutPosition(__FILE__, __LINE__);
			goto end;
		}
	}
	
	sprintf(strFileName, "%d", dwFileID);
	ulFileNameLen = strlen(strFileName);
	
	ulErrorCode = GetDeviceListHandle().DeleteTokenFile((PBYTE)strFileName, ulFileNameLen);
	
end:
	if ( ulErrorCode != CKR_OK )
	{
		sprintf(g_szErrInfo,"删除设备文件出错,ErrorCode:0x%x",ulErrorCode);
		g_dwErrCode = ulErrorCode;
	}
	GetDeviceListHandle().CloseAppletSession();
	return (ulErrorCode == CKR_OK) ? USBKEY_OK : USBKEY_FAILED;
}

int	WINAPI CK_WriteData(CK_SLOT_ID ckSlotID,char *szUserPwd,DWORD dwFileID,
						int iOffset,BYTE *bpWriteData,DWORD dwDataLen){
   	BOOL bLoged;
	CK_USER_TYPE ulType;
	ULONG ulErrorCode = CKR_OK;
	
	PBYTE pcbData = NULL;
	ULONG ulcbDataLen = 0;

	PBYTE pcbWriteData = NULL;
	ULONG ulcbWriteDataLen = 0;


	char strFileName[128] = {0};
	ULONG ulFileNameLen = 0;
	
	ulErrorCode = GetDeviceListHandle().OpenAppletSession(ckSlotID);
	if(CKR_OK != ulErrorCode)
	{
		DebugOutPosition(__FILE__, __LINE__);
		goto end;
	}
	
	ulErrorCode = GetDeviceListHandle().GetAppletSessionInfo(ulType, bLoged);
	if(CKR_OK != ulErrorCode)
	{
		DebugOutPosition(__FILE__, __LINE__);
		goto end;
	}
	
	if(ulType != CKU_USER)
	{
		GetDeviceListHandle().AppletSessionLogOut();

		ulErrorCode = GetDeviceListHandle().AppletSessionLogIn(CKU_USER, (PBYTE)szUserPwd, strlen(szUserPwd));
		if(CKR_OK != ulErrorCode)
		{
			DebugOutPosition(__FILE__, __LINE__);
			goto end;
		}
	}
	
	sprintf(strFileName, "%d", dwFileID);
	ulFileNameLen = strlen(strFileName);


	ulErrorCode = GetDeviceListHandle().ReadFileData((PBYTE)strFileName, ulFileNameLen, NULL, ulcbDataLen);
	if(CKR_OK != ulErrorCode)
	{
		DebugOutPosition(__FILE__, __LINE__);
		goto end;
	}

	pcbData = new BYTE[ulcbDataLen];
	ZeroMemory(pcbData, ulcbDataLen);

	ulErrorCode = GetDeviceListHandle().ReadFileData((PBYTE)strFileName, ulFileNameLen, pcbData, ulcbDataLen);
	if(CKR_OK != ulErrorCode)
	{
		DebugOutPosition(__FILE__, __LINE__);
		goto end;
	}

	ulcbWriteDataLen = ulcbDataLen + iOffset + dwDataLen;

	pcbWriteData = new BYTE[ulcbWriteDataLen];
	ZeroMemory(pcbWriteData, ulcbWriteDataLen);
	CopyMemory(pcbWriteData, pcbData, ulcbDataLen);
	CopyMemory(pcbWriteData + iOffset, bpWriteData, dwDataLen);
	
	if(ulcbDataLen < iOffset + dwDataLen)
	{
		ulcbWriteDataLen = dwDataLen + iOffset;
	}
	else
	{
		ulcbWriteDataLen = ulcbDataLen;
	}

	ulErrorCode = GetDeviceListHandle().WriteFileData((PBYTE)strFileName, ulFileNameLen, pcbWriteData, ulcbWriteDataLen);

	delete [] pcbData;
	pcbData = NULL;

	delete [] pcbWriteData;
	pcbWriteData = NULL;
	
end:
	if ( ulErrorCode != CKR_OK )
	{
		sprintf(g_szErrInfo,"写设备文件出错,ErrorCode:0x%x",ulErrorCode);
		g_dwErrCode = ulErrorCode;
	}
	GetDeviceListHandle().CloseAppletSession();
	
	return (ulErrorCode == CKR_OK) ? USBKEY_OK : USBKEY_FAILED;
}

int WINAPI CK_ReadData(CK_SLOT_ID ckSlotID,char *szUserPwd,DWORD dwFileID,int iOffset,
					   BYTE *bpReadDataBuffer,DWORD dwReadLen)
{   
	BOOL bLoged;
	CK_USER_TYPE ulType;
	ULONG ulErrorCode = CKR_OK;
	
	PBYTE pcbData = NULL;
	ULONG ulcbDataLen = 0;
	
	char strFileName[128] = {0};
	ULONG ulFileNameLen = 0;
	
	ulErrorCode = GetDeviceListHandle().OpenAppletSession(ckSlotID);
	if(CKR_OK != ulErrorCode)
	{
		DebugOutPosition(__FILE__, __LINE__);
		goto end;
	}
	
	ulErrorCode = GetDeviceListHandle().GetAppletSessionInfo(ulType, bLoged);
	if(CKR_OK != ulErrorCode)
	{
		DebugOutPosition(__FILE__, __LINE__);
		goto end;
	}
	
	if(ulType != CKU_USER)
	{
		GetDeviceListHandle().AppletSessionLogOut();

		ulErrorCode = GetDeviceListHandle().AppletSessionLogIn(CKU_USER, (PBYTE)szUserPwd, strlen(szUserPwd));
		if(CKR_OK != ulErrorCode)
		{
			DebugOutPosition(__FILE__, __LINE__);
			goto end;
		}
	}
	
	sprintf(strFileName, "%d", dwFileID);
	ulFileNameLen = strlen(strFileName);

	ulErrorCode = GetDeviceListHandle().ReadFileData((PBYTE)strFileName, ulFileNameLen, NULL, ulcbDataLen);
	if(CKR_OK != ulErrorCode)
	{
		DebugOutPosition(__FILE__, __LINE__);
		goto end;
	}
	
	if(ulcbDataLen <= 0)
	{
		ulErrorCode = USBKEY_BUFFER_TOO_SMALL;
		DebugOutPosition(__FILE__, __LINE__);
		goto end;		
	}

	pcbData = new BYTE[ulcbDataLen];
	ZeroMemory(pcbData, ulcbDataLen);

	ulErrorCode = GetDeviceListHandle().ReadFileData((PBYTE)strFileName, ulFileNameLen, pcbData, ulcbDataLen);
	if(CKR_OK != ulErrorCode)
	{
		DebugOutPosition(__FILE__, __LINE__);
		delete [] pcbData;
		pcbData = NULL;
		goto end;
	}

	CopyMemory(bpReadDataBuffer, pcbData + iOffset, dwReadLen);

	delete [] pcbData;
	pcbData = NULL;
	
end:
	if ( ulErrorCode != CKR_OK )
	{
		sprintf(g_szErrInfo,"读设备文件出错,ErrorCode:0x%x",ulErrorCode);
		g_dwErrCode = ulErrorCode;
	}
	GetDeviceListHandle().CloseAppletSession();	
	return (ulErrorCode == CKR_OK) ? USBKEY_OK : USBKEY_FAILED;
}

int WINAPI CK_SetPIN(CK_SLOT_ID ckSlotID,char *szUserPwd, char *szSOPwd)
{
	ULONG ulErrorCode = CKR_OK;
	
	ulErrorCode = GetDeviceListHandle().OpenAppletSession(ckSlotID);
	if(CKR_OK != ulErrorCode)
	{
		DebugOutPosition(__FILE__, __LINE__);
		goto end;
	}
	
	ulErrorCode = GetDeviceListHandle().ChangePinEx((PBYTE)szSOPwd, strlen(szSOPwd), (PBYTE)szUserPwd, strlen(szUserPwd));
	
end:
	if ( ulErrorCode != CKR_OK )
	{
		sprintf(g_szErrInfo,"设置密码出错,ErrorCode:0x%x",ulErrorCode);
		g_dwErrCode = ulErrorCode;
	}
	GetDeviceListHandle().CloseAppletSession();
	
	return (ulErrorCode == CKR_OK) ? USBKEY_OK : USBKEY_FAILED;
}

int WINAPI CK_VerifyPIN(CK_SLOT_ID ckSlotID,bool bUserPin, char *szPIN)
{
	BOOL bLoged;
	CK_USER_TYPE ulType;
	ULONG ulErrorCode = CKR_OK;	
	
	AUX_PIN_INFO ckTokenAuxInfo = {0};
	
	GetDeviceListHandle().Reset();
	ulErrorCode = GetDeviceListHandle().OpenAppletSession(ckSlotID);
	if(CKR_OK != ulErrorCode)
	{
		DebugOutPosition(__FILE__, __LINE__);
		goto ERR;
	}
	
	ulErrorCode = GetDeviceListHandle().GetAppletSessionInfo(ulType, bLoged);
	if(CKR_OK != ulErrorCode)
	{
		DebugOutPosition(__FILE__, __LINE__);
		GetDeviceListHandle().CloseAppletSession();
		goto ERR;
	}
	
	if(bLoged == TRUE) 
	{
		GetDeviceListHandle().AppletSessionLogOut();
	}
	
	ulErrorCode = GetDeviceListHandle().AppletSessionLogIn((bUserPin == TRUE) ? CKU_USER : CKU_SO, (PBYTE)szPIN, strlen(szPIN));
	if(CKR_OK != ulErrorCode)
	{
		DebugOutPosition(__FILE__, __LINE__);		
	
		ulErrorCode = GetDeviceListHandle().GetTokenAuxInfo(ckSlotID, &ckTokenAuxInfo);
		if(CKR_OK != ulErrorCode)
		{
			DebugOutPosition(__FILE__, __LINE__);
			GetDeviceListHandle().CloseAppletSession();
			goto ERR;
		}
		else
		{
			if(bUserPin)
				ulErrorCode = (ckTokenAuxInfo.bUserPinCurCounter == 0) ? -1 : ckTokenAuxInfo.bUserPinCurCounter;
			else
				ulErrorCode = (ckTokenAuxInfo.bSOPinCurCounter == 0) ? -1 : ckTokenAuxInfo.bSOPinCurCounter;
		}
	}
	
	GetDeviceListHandle().CloseAppletSession();
	
	return (ulErrorCode);

ERR:
	g_dwErrCode = ulErrorCode;
	sprintf(g_szErrInfo,"检验密码出错,ErrorCode:0x%x",g_dwErrCode);	
	return -2;
}

int WINAPI CK_ChangePIN(CK_SLOT_ID ckSlotID,bool bUserPin, char *szOldPIN,char *szNewPIN)
{
	ULONG ulErrorCode = CKR_OK;
	CK_USER_TYPE ulType;
	AUX_PIN_INFO ckTokenAuxInfo = {0};
	
	ulErrorCode = GetDeviceListHandle().OpenAppletSession(ckSlotID);
	if(CKR_OK != ulErrorCode)
	{
		DebugOutPosition(__FILE__, __LINE__);
		goto ERR;
	}

	ulType = (bUserPin == TRUE) ? CKU_USER : CKU_SO;
	
	ulErrorCode = GetDeviceListHandle().ChangePin(ulType, 
		(PBYTE)szOldPIN, strlen(szOldPIN), (PBYTE)szNewPIN, strlen(szNewPIN));
	if(CKR_OK != ulErrorCode)
	{
		DebugOutPosition(__FILE__, __LINE__);
		
		ulErrorCode = GetDeviceListHandle().GetTokenAuxInfo(ckSlotID, &ckTokenAuxInfo);
		if(CKR_OK != ulErrorCode)
		{
			DebugOutPosition(__FILE__, __LINE__);
			goto ERR;
		}
		else
		{
			if(bUserPin)
				ulErrorCode = (ckTokenAuxInfo.bUserPinCurCounter == 0) ? -1 : ckTokenAuxInfo.bUserPinCurCounter;
			else
				ulErrorCode = (ckTokenAuxInfo.bSOPinCurCounter == 0) ? -1 : ckTokenAuxInfo.bSOPinCurCounter;
		}
	}

	GetDeviceListHandle().CloseAppletSession();
	return (ulErrorCode);
ERR:
	g_dwErrCode = ulErrorCode;
	sprintf(g_szErrInfo,"修改密码出错,ErrorCode:0x%x",g_dwErrCode);
	return -2;
}

int WINAPI CK_GetFileSize(CK_SLOT_ID ckSlotID,char *szUserPwd,DWORD dwFileID)
{
	BOOL bLoged;
	CK_USER_TYPE ulType;
	ULONG ulErrorCode = CKR_OK;
	
	char strFileName[128] = {0};
	ULONG ulFileNameLen = 0;
	ULONG ulFileSize = 0;
	
	ulErrorCode = GetDeviceListHandle().OpenAppletSession(ckSlotID);
	if(CKR_OK != ulErrorCode)
	{
		DebugOutPosition(__FILE__, __LINE__);
		goto end;
	}
	
	ulErrorCode = GetDeviceListHandle().GetAppletSessionInfo(ulType, bLoged);
	if(CKR_OK != ulErrorCode)
	{
		DebugOutPosition(__FILE__, __LINE__);
		goto end;
	}	
	
	GetDeviceListHandle().AppletSessionLogOut();

	ulErrorCode = GetDeviceListHandle().AppletSessionLogIn(CKU_USER, (PBYTE)szUserPwd, strlen(szUserPwd));
	if(CKR_OK != ulErrorCode)
	{
		DebugOutPosition(__FILE__, __LINE__);
		goto end;
	}
	
	sprintf(strFileName, "%d", dwFileID);
	ulFileNameLen = strlen(strFileName);
	
	ulErrorCode = GetDeviceListHandle().GetFileSize((PBYTE)strFileName, ulFileNameLen, ulFileSize);
	
end:
	if ( ulErrorCode != CKR_OK )
	{
		sprintf(g_szErrInfo,"获取文件大小出错,ErrorCode:0x%x",ulErrorCode);
		g_dwErrCode = ulErrorCode;
	}
	GetDeviceListHandle().CloseAppletSession();
	return (ulErrorCode == CKR_OK) ? ulFileSize : 0;
}

const char * WINAPI CK_GetLastErrorInfor()
{
	return g_szErrInfo;
}

⌨️ 快捷键说明

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