亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? pkcs.cpp

?? PKCS#11的微軟CSP實現源碼
?? CPP
?? 第 1 頁 / 共 2 頁
字號:
	if(tokenInSlotList)
		free(tokenInSlotList);
	if(phCertList)
		free(phCertList);
	TRACE(__LINE__,"PKCS CreateContainerTable TRUE",NULL );
	return TRUE;





}


/*
%--------------------------------------------------------------------------
% ~Pkcs()
%
% ~Pkcs() est le destructor
%---------------------------------------------------------------------------
*/
Pkcs::~Pkcs()
{
	
}




/*
%--------------------------------------------------------------------------
% VerifyContainerExistance
%
% VerifyContainerExistance checks the existance container
%		 
%
% Parameters of entry :
%						IN container	The required container
%  
% return :	TRUE if the operation occurred well, FALSE if not
%---------------------------------------------------------------------------
*/
BOOL Pkcs::VerifyContainerExistance(PKCSContainer* container)
{
	TRACE(__LINE__,"VerifyContainerExistance",NULL );
	return table_Containers.VerifyEntry(container);
	
}

/*
%--------------------------------------------------------------------------
% GetContainer
%
% GetContainer is used to recover a container starting from its name 
%        in the table container_table
%		 
%
% Parameters of entry :
%						IN szContainerName	the name of the required container
%  
% return :	the container
%---------------------------------------------------------------------------
*/

PKCSContainer* Pkcs::GetContainer(const CHAR IN * szContainerName)
{
	TRACE(__LINE__,"Pkcs::GetContainer",NULL );
	if(!szContainerName)
		return NULL;

	int iCookie = START;
	table_Containers.Lock();
	PKCSContainer * pCnt;
	
	/*One seeks the Container with the good name*/
	do
	{
		pCnt = (PKCSContainer*)table_Containers.GetNext(iCookie);
	} while(pCnt && strcmp(pCnt->GetName(), szContainerName) != 0);
	table_Containers.Unlock();

	return pCnt;
	
}


/*
%--------------------------------------------------------------------------
% DoSign
%
% DoSign is used to sign data.  Two calls are carried out to DoSign 
% the first call, in order to recover the size with alouer for the signature
% the second call, in order to really carry out the signature
%		 
%
% Parameters of entry :
%						IN pContainer		the container to be used
%						IN pbyHashLen		length of the data to be signed
%						IN pbyHash			data to be signed
%						IN dwKeySpec		type of key to be used
%						OUT pbySignature	signed data
%						OUT pdwSigLen		length of the signed data
%						IN g_strPwd			pine code to use to reach the key private
%  
% return :	TRUE if the operation occurred well, FALSE if not
%---------------------------------------------------------------------------
*/

BOOL Pkcs::DoSign(PKCSContainer* pContainer, unsigned long pbyHashLen, LPBYTE pbyHash,DWORD dwKeySpec, LPBYTE pbySignature, LPDWORD pdwSigLen)
{

	CK_RV rv = CKR_OK;
	CK_OBJECT_HANDLE hPrivKey=NULL;
	CK_TOKEN_INFO tokenInfo;
	CK_BYTE_PTR signature=NULL;
	bool bret;
	bool correctPin=false;
	TRACE(__LINE__,"Pkcs::DoSign BEGIN",NULL );
	CK_SESSION_INFO info;

	/* one loggs */
	/* Are we already logged */
	rv=((pContainer->GetpFunctionList())->C_GetSessionInfo)(pContainer->GethSession(),&info);
	if(rv!=CKR_OK)
		return FALSE;
	if(info.state!= CKS_RW_USER_FUNCTIONS && info.state!= CKS_RO_USER_FUNCTIONS)
	{

		do
		{
			unsigned char * codepin=(unsigned char *)malloc(MAX_PIN_LEN);
			CK_ULONG codepinLen=MAX_PIN_LEN;
			rv=getCodePorteur(codepin,codepinLen);
			if(rv!=CKR_OK){
				free(codepin);
				TRACE(__LINE__,"Pkcs::DoSign Cancel of code pin",NULL );
				return FALSE;
			}
			rv = login(pContainer->GetpFunctionList(),  pContainer->GethSession(),codepin,strlen((const char *)codepin));
			if(rv==CKR_OK)
			{
				correctPin=true;
			}
			memset(codepin,0,codepinLen);
			if(rv==CKR_PIN_INCORRECT)
			{

				rv =((pContainer->GetpFunctionList())->C_GetTokenInfo)(pContainer->GetslotID(), &tokenInfo);
				if ((rv == CKR_OK)&&((tokenInfo.flags & CKF_USER_PIN_FINAL_TRY)))
				{
					rv=getCodePorteur(codepin,codepinLen);
					if(rv!=CKR_OK){
						free(codepin);
						TRACE(__LINE__,"DoSign::Decrypt Cancel of code pin",NULL );
						return FALSE;
					}
					rv = login(pContainer->GetpFunctionList(),  pContainer->GethSession(),codepin,strlen((const char *)codepin));
					if(rv!=CKR_OK) 
					{
						free(codepin);
						TRACE(__LINE__,"Pkcs::DoSign FALSE",NULL );
						return FALSE;
					}
					free(codepin);
					break;
				}
				else if(rv != CKR_OK)
				{
					free(codepin);
					TRACE(__LINE__,"Pkcs::DoSign FALSE",NULL );
					return FALSE;
				}
			}
			if((rv!=CKR_OK)&&(rv!=CKR_PIN_INCORRECT))
			{
				free(codepin);
				TRACE(__LINE__,"Pkcs::DoSign FALSE",NULL );
				return FALSE;
			}
				
				
				
		}while(!correctPin);
	}

	/* Recovery of the private key */
	rv = getPrivateKeyFromX509Cert(pContainer->GetpFunctionList(),pContainer->GethSession(), &hPrivKey, pContainer->Gethcert());
	if (rv!=CKR_OK) {
		TRACE(__LINE__,"Pkcs::DoSign FALSE",NULL );
		return FALSE;
	}

	/* If one invites CPSign the first time in order to recover the size to allow for the signature */
	if(!pbySignature)
	{
		/*CK_BYTE_PTR defaultSignature=(CK_BYTE_PTR)malloc(256*sizeof(CK_BYTE));
		CK_ULONG defaultSignatureLength=256;*/
		rv = sign(pContainer->GetpFunctionList(),pContainer->GethSession(),hPrivKey, (CK_BYTE_PTR)pbyHash,pbyHashLen,NULL_PTR/*defaultSignature*/,(CK_ULONG_PTR)pdwSigLen/*&defaultSignatureLength*/,1);
		if(rv!=CKR_OK){
			TRACE(__LINE__,"Pkcs::DoSign FALSE",NULL );
			free(signature);
			return FALSE;
		}
		//*pdwSigLen=defaultSignatureLength;
	}
	/* Recovery of the signature */
	else
	{
		/* real signature */
		signature=(CK_BYTE_PTR)malloc((*pdwSigLen)*sizeof(CK_BYTE));
		rv = sign(pContainer->GetpFunctionList(),pContainer->GethSession(),hPrivKey, (CK_BYTE_PTR)pbyHash,pbyHashLen,(CK_BYTE_PTR)signature,(CK_ULONG_PTR)pdwSigLen,1);
		if(rv!=CKR_OK){
			TRACE(__LINE__,"Pkcs::DoSign FALSE",NULL );
			free(signature);
			return FALSE;
		}
		
		/* Inversion of the block signature because CAPI awaits a turned over block*/
		int i,j;
		for (i=(*pdwSigLen)-1, j=0; i > j; --i, ++j)
		{
			CK_BYTE bTmp = signature[i];
			signature[i] = signature[j];
			signature[j] = bTmp;
		}
		memcpy(pbySignature,signature,*pdwSigLen);

	}
	
	if(signature)
		free(signature);
	bret=TRUE;
	TRACE(__LINE__,"Pkcs::DoSign TRUE",NULL );
	return bret;


}


/*
%--------------------------------------------------------------------------
% Decrypt
%
% Decrypt is used to decipher data
%		 
%
% Parameters of entry :
%						IN hPubKey			handle on the container to use to decipher
%						IN pbySource		data to be deciphered
%						IN wSourceLength	length of data to be deciphered
%						OUT pbyDestination	deciphered data
%						OUT pwDestinationLen length of deciphered data
%						IN pass				pine code to use to reach the key private
%  
% return :	TRUE if the operation occurred well, FALSE if not
%---------------------------------------------------------------------------
*/

BOOL Pkcs::Decrypt(HCRYPTKEY hPubKey, BYTE* pbySource, DWORD wSourceLength, BYTE* pbyDestination, DWORD* pwDestinationLen)
{

	CK_RV rv = CKR_OK;
	CK_TOKEN_INFO tokenInfo;
	bool correctPin=false;
	TRACE(__LINE__,"Pkcs::Decrypt BEGIN",NULL );
	if(!Pkcs::VerifyContainerExistance((PKCSContainer*) hPubKey)){
		TRACE(__LINE__,"Pkcs::Decrypt FALSE",NULL );
		return FALSE;
	}

	CK_SESSION_INFO info;

	/* one loggs */
	/* Are we already logged */
	rv=((((PKCSContainer*) hPubKey)->GetpFunctionList())->C_GetSessionInfo)(((PKCSContainer*) hPubKey)->GethSession(),&info);
	if(rv!=CKR_OK)
		return FALSE;
	if(info.state!= CKS_RW_USER_FUNCTIONS && info.state!= CKS_RO_USER_FUNCTIONS)
	{

		/* we logg  */
		do
		{
			unsigned char * codepin=(unsigned char *)malloc(MAX_PIN_LEN);
			CK_ULONG codepinLen=MAX_PIN_LEN;
			rv=getCodePorteur(codepin,codepinLen);
			if(rv!=CKR_OK){
				free(codepin);
				TRACE(__LINE__,"Pkcs::Decrypt Cancel of code pin",NULL );
				return FALSE;
			}
			rv = login(((PKCSContainer*) hPubKey)->GetpFunctionList(), ((PKCSContainer*) hPubKey)->GethSession(),codepin,strlen((const char *)codepin));
			if(rv==CKR_OK)
			{
				correctPin=true;
			}
			memset(codepin,0,codepinLen);
			if(rv==CKR_PIN_INCORRECT)
			{

				rv =((((PKCSContainer*) hPubKey)->GetpFunctionList())->C_GetTokenInfo)(((PKCSContainer*) hPubKey)->GetslotID(), &tokenInfo);
				if ((rv == CKR_OK)&&((tokenInfo.flags & CKF_USER_PIN_FINAL_TRY)))
				{
					rv=getCodePorteur(codepin,codepinLen);
					if(rv!=CKR_OK){
						free(codepin);
						TRACE(__LINE__,"Pkcs::Decrypt Cancel of code pin",NULL );
						return FALSE;
					}
					rv = login(((PKCSContainer*) hPubKey)->GetpFunctionList(), ((PKCSContainer*) hPubKey)->GethSession(),codepin,strlen((const char *)codepin));
					if(rv!=CKR_OK) 
					{
						free(codepin);
						TRACE(__LINE__,"Pkcs::Decrypt FALSE",NULL );
						return FALSE;
					}
					free(codepin);
					break;
				}
				else if(rv != CKR_OK)
				{
					free(codepin);
					TRACE(__LINE__,"Pkcs::Decrypt FALSE",NULL );
					return FALSE;
				}
			}
			if((rv!=CKR_OK)&&(rv!=CKR_PIN_INCORRECT))
			{
				free(codepin);
				TRACE(__LINE__,"Pkcs::Decrypt FALSE",NULL );
				return FALSE;
			}
				
				
				
		}while(!correctPin);
	}


	/* one recovers a handle on the private key */
	CK_OBJECT_HANDLE hPrivKey=NULL;
	rv = getPrivateKeyFromX509Cert(((PKCSContainer*)hPubKey)->GetpFunctionList(), ((PKCSContainer*)hPubKey)->GethSession(), &hPrivKey, ((PKCSContainer*)hPubKey)->Gethcert());
	if (rv!=CKR_OK) {
		TRACE(__LINE__,"Pkcs::Decrypt FALSE",NULL );
		return FALSE;
	}


	/* the data are deciphered */
	rv=decrypt(((PKCSContainer*)hPubKey)->GetpFunctionList(), ((PKCSContainer*)hPubKey)->GethSession(), hPrivKey, (CK_BYTE_PTR) pbySource, (CK_ULONG_PTR)&wSourceLength,(CK_BYTE_PTR)pbyDestination,(CK_ULONG_PTR)pwDestinationLen);
	if (rv!=CKR_OK) {
		TRACE(__LINE__,"Pkcs::Decrypt FALSE",NULL );
		return FALSE;
	}

	TRACE(__LINE__,"Pkcs::Decrypt TRUE",NULL );
	return TRUE;
}

CK_RV getCodePorteur(unsigned char * pCodePorteur, CK_ULONG codePorteurLen) {
	CK_RV rv=CKR_OK;

	if (pCodePorteur==NULL) {
		rv=CKR_ARGUMENTS_BAD;
		return rv;
	}
	// get the pin code
	DialogBox(g_hModule, MAKEINTRESOURCE(IDD_PWD), NULL, DialogProc);

	if (!strcmp((const char*)g_strPwd,"CANCEL")){
		memset(g_strPwd,0,sizeof(g_strPwd));
		rv=CKR_CANCEL;
		return rv;
	}
	memcpy(pCodePorteur, g_strPwd, codePorteurLen);
	memset(g_strPwd,0,sizeof(g_strPwd));
	return rv;
}

/*
%--------------------------------------------------------------------------
% DialogProc
%
% return :	TRUE if the operation occurred well, FALSE if not
%---------------------------------------------------------------------------
*/

BOOL CALLBACK DialogProc(
    HWND hwndDlg,         /* handle to dialog box*/
    UINT uMsg,      /* message*/
    WPARAM wParam,      /* first message parameter*/
    LPARAM lParam       /* second message parameter*/
   )
{
  switch( uMsg )
  {
	case WM_INITDIALOG:
		break;
	case WM_COMMAND:
		switch ( idCtrl(wParam, lParam) )
		{
			case IDOK:
				// memorisation du mot de passe
				GetDlgItemText(hwndDlg,IDC_PWD,(char *)g_strPwd,30);
				EndDialog(hwndDlg, idCtrl(wParam, lParam));
				return TRUE;
			case IDCANCEL:
				strncpy((char *)g_strPwd,"CANCEL",6);
				EndDialog(hwndDlg, idCtrl(wParam, lParam));
				return TRUE;

		}
		return TRUE;
		break;
  }
  return FALSE;
}


char getchar(char val){
	int valMod=val&0x0F;
	char temp;
	if(valMod<=9)
		temp='0'+valMod;
	else
		temp='A'+(valMod-0xA);

	return temp;


}



?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
免费在线一区观看| 欧美一区二区福利在线| 欧美一区二区三区日韩| 国产网红主播福利一区二区| 天天爽夜夜爽夜夜爽精品视频| 国产iv一区二区三区| 欧美一卡二卡在线| 亚洲黄色av一区| 国产黄色91视频| 精品嫩草影院久久| 天堂蜜桃一区二区三区 | 成人动漫中文字幕| 欧美一区二区三区视频| 亚洲综合色在线| 91最新地址在线播放| 国产亚洲1区2区3区| 免费看欧美女人艹b| 欧美日韩一区二区在线观看视频| 国产精品国产自产拍高清av| 国产自产视频一区二区三区| 日韩欧美电影一二三| 日本不卡高清视频| 制服丝袜国产精品| 亚洲成人午夜影院| 欧美日韩国产系列| 亚洲国产成人av好男人在线观看| 色妞www精品视频| 中文字幕中文乱码欧美一区二区| 国产91精品在线观看| 国产亚洲欧美激情| 国产成人高清视频| 国产精品久久777777| 成人午夜电影小说| 国产精品女同一区二区三区| 国产91精品欧美| 中文子幕无线码一区tr | 奇米影视在线99精品| 337p亚洲精品色噜噜狠狠| 亚洲成人av电影在线| 欧美军同video69gay| 亚洲成人三级小说| 欧美成人性福生活免费看| 精品一区二区三区在线视频| 欧美电影免费观看高清完整版 | 蜜臀av一区二区| 精品欧美乱码久久久久久1区2区| 九九九久久久精品| 久久精品视频在线免费观看 | 91精品婷婷国产综合久久竹菊| 午夜精品一区在线观看| 欧美一级日韩免费不卡| 国产尤物一区二区在线| 中文字幕欧美国产| 色av综合在线| 免费欧美高清视频| 欧美激情一区二区在线| 91精品1区2区| 久久精品久久综合| 国产精品久久久久精k8| 欧美色中文字幕| 国产伦精一区二区三区| 亚洲乱码国产乱码精品精小说| 欧美猛男男办公室激情| 国产成人免费在线观看不卡| 亚洲激情五月婷婷| 久久久综合视频| 欧美日韩中字一区| 韩国在线一区二区| 亚洲第一久久影院| 日本一区二区在线不卡| 欧美日韩国产精选| 成人午夜电影小说| 另类小说视频一区二区| 亚洲欧美一区二区久久| xnxx国产精品| 欧美视频在线不卡| 国产99久久精品| 日韩精品欧美精品| 中文字幕亚洲不卡| 久久网这里都是精品| 在线精品亚洲一区二区不卡| 极品少妇一区二区| 亚洲国产裸拍裸体视频在线观看乱了 | 欧美在线观看视频在线| 国产精品一二三区| 亚洲一区二区五区| 国产精品色在线观看| 日韩一区二区三区观看| 91理论电影在线观看| 国产一区二区三区久久悠悠色av| 亚洲精品伦理在线| 国产精品乱人伦中文| 欧美变态凌虐bdsm| 7777精品伊人久久久大香线蕉的 | 日韩欧美成人午夜| 777久久久精品| 在线观看欧美精品| 99久久国产综合色|国产精品| 狠狠色伊人亚洲综合成人| 亚洲va韩国va欧美va| 一区二区三区四区精品在线视频| 欧美国产精品一区| 久久久国产一区二区三区四区小说| 欧美一级电影网站| 欧美日韩免费视频| 91搞黄在线观看| 在线观看www91| 91久久奴性调教| 色先锋资源久久综合| 91在线视频在线| 94-欧美-setu| 色婷婷综合久色| 欧美亚洲国产一区在线观看网站 | 久久综合久久鬼色| 日韩视频免费观看高清完整版在线观看 | 亚洲.国产.中文慕字在线| 一区二区日韩av| 亚洲综合久久久久| 午夜久久久影院| 日韩国产精品久久久久久亚洲| 亚洲无人区一区| 日本女人一区二区三区| 美女视频黄 久久| 久久国产综合精品| 国产大片一区二区| 91在线观看一区二区| 91高清视频在线| 91精品国产手机| 精品999在线播放| 中文字幕免费不卡| 亚洲女性喷水在线观看一区| 亚洲18女电影在线观看| 九九视频精品免费| 波多野结衣的一区二区三区| 一本大道久久a久久精二百| 欧美色老头old∨ideo| 日韩视频国产视频| 国产午夜精品一区二区三区视频| 国产精品家庭影院| 首页国产欧美日韩丝袜| 国产一本一道久久香蕉| 91色乱码一区二区三区| 欧美日韩一区二区三区在线看| 91精品国产黑色紧身裤美女| 精品福利av导航| 亚洲欧美国产77777| 全国精品久久少妇| 国产·精品毛片| 欧美亚洲国产一区二区三区| 精品欧美乱码久久久久久| 中文字幕一区av| 蜜臀va亚洲va欧美va天堂| 波多野结衣中文字幕一区| 欧美日韩黄色一区二区| 久久久久久久综合狠狠综合| 亚洲精品亚洲人成人网| 久久se精品一区精品二区| 色呦呦网站一区| 国产色综合久久| 日韩国产精品久久久| 99国产精品一区| 亚洲精品一区二区三区香蕉| 亚洲高清免费在线| www.激情成人| 久久―日本道色综合久久| 亚洲一区在线看| 不卡视频一二三四| 精品国产亚洲一区二区三区在线观看| 综合激情成人伊人| 国产麻豆91精品| 91精品国产色综合久久不卡蜜臀 | 中文字幕欧美日韩一区| 日本在线播放一区二区三区| 99国产精品国产精品毛片| xf在线a精品一区二区视频网站| 一个色妞综合视频在线观看| 国产精品88av| 精品va天堂亚洲国产| 免费成人小视频| 911精品国产一区二区在线| 伊人性伊人情综合网| 99国产欧美久久久精品| 中文字幕av一区 二区| 国产美女主播视频一区| 日韩免费高清av| 日本午夜一本久久久综合| 欧美日韩精品久久久| 亚洲精品视频免费看| 成人av在线资源网站| 国产三级精品三级在线专区| 黄一区二区三区| 日韩精品中文字幕一区二区三区| 香蕉久久夜色精品国产使用方法| 色999日韩国产欧美一区二区| 国产精品免费免费| 成人精品视频.| 椎名由奈av一区二区三区| 成人亚洲精品久久久久软件| 国产精品视频线看| 色综合久久综合网欧美综合网 |