📄 enumobjdlg.cpp
字号:
if(numObj==0)
{
StartOP();
ShowMsg(NEWLINE"No certificate object."NEWLINE);
}
else
{
StartOP();
CHAR strNumObj[4];
wsprintf(strNumObj,"%d",numObj);
ShowMsg(NEWLINE);
ShowMsg(strNumObj);
ShowMsg(" certificate object(s) was found."NEWLINE);
}
}
void CEnumObjDlg::OnBtnLogin()
{
// TODO: Add your control notification handler code here
StartOP();
CK_RV rv;
CK_TOKEN_INFO tokenInfo = {0};
rv = C_GetTokenInfo(m_pSlotList[0], &tokenInfo);
if (CKR_OK != rv)
{
ShowMsg(NEWLINE"Can not get token info!"NEWLINE);
return;
}
DlgUserPIN dlg;
dlg.DoModal();
if("" == g_strUserPIN)
{
ShowMsg(NEWLINE"To enum all objects, you must input User PIN!"NEWLINE);
return;
}
CK_ULONG ulPIN = g_strUserPIN.GetLength();
CK_BYTE_PTR pPIN = (CK_BYTE_PTR)g_strUserPIN.GetBuffer(ulPIN);
::SetCursor(::LoadCursor(NULL, IDC_WAIT));
rv = C_Login(m_hSession, CKU_USER, pPIN, ulPIN);
if(CKR_OK != rv)
{
ShowErr(NEWLINE"Can't login to token, ErrorCode: 0x%08X."NEWLINE, rv);
if(rv==CKR_USER_ALREADY_LOGGED_IN)
ShowErr(NEWLINE"You have already logged in!",NULL);
return;
}
else
ShowMsg(NEWLINE"Login to Token Successfully!"NEWLINE);
m_btnEnum.EnableWindow(TRUE);
m_btnData.EnableWindow(TRUE);
m_btnPublic.EnableWindow(TRUE);
m_btnPrivate.EnableWindow(TRUE);
m_btnSecret.EnableWindow(TRUE);
}
void CEnumObjDlg::OnBtnData()
{
// TODO: Add your control notification handler code here
CK_OBJECT_CLASS dataClass = CKO_DATA;
BOOL IsToken=true;
CK_ATTRIBUTE pTempl[] =
{
{CKA_CLASS, &dataClass, sizeof(CKO_DATA)},
{CKA_TOKEN, &IsToken, sizeof(true)}
};
C_FindObjectsInit(m_hSession, pTempl, 2);
CK_OBJECT_HANDLE hCKObj;
CK_ULONG ulRetCount = 0;
CK_RV ckrv = 0;
int numObj=0;
do
{
ckrv = C_FindObjects(m_hSession, &hCKObj, 1, &ulRetCount);
if(CKR_OK != ckrv)
{
break;
}
if(1 != ulRetCount)
break;
CK_ATTRIBUTE pAttrTemp[] =
{
{CKA_CLASS, NULL, 0},
{CKA_LABEL, NULL, 0},
{CKA_APPLICATION, NULL, 0},
{CKA_VALUE, NULL,0},
};
ckrv = C_GetAttributeValue(m_hSession, hCKObj, pAttrTemp, 4);
if(ckrv != CKR_OK)
{
break;
}
pAttrTemp[0].pValue = new char[pAttrTemp[0].ulValueLen];
pAttrTemp[1].pValue = new char[pAttrTemp[1].ulValueLen + 1];
pAttrTemp[2].pValue = new char[pAttrTemp[2].ulValueLen + 1];
pAttrTemp[3].pValue = new char[pAttrTemp[3].ulValueLen];
ZeroMemory(pAttrTemp[0].pValue, pAttrTemp[0].ulValueLen);
ZeroMemory(pAttrTemp[1].pValue, pAttrTemp[1].ulValueLen + 1);
ZeroMemory(pAttrTemp[2].pValue, pAttrTemp[2].ulValueLen + 1);
ZeroMemory(pAttrTemp[3].pValue, pAttrTemp[3].ulValueLen );
ckrv = C_GetAttributeValue(m_hSession, hCKObj, pAttrTemp, 4);
if(ckrv != CKR_OK)
{
delete[] pAttrTemp[0].pValue;
delete[] pAttrTemp[1].pValue;
delete[] pAttrTemp[2].pValue;
delete[] pAttrTemp[3].pValue;
break;
}
numObj++;
int nClassTemp = *((int*)pAttrTemp[0].pValue);
CString strvale = (char*)pAttrTemp[1].pValue;
CString strApp= (char*)pAttrTemp[2].pValue;
ShowMsg(NEWLINE);
StartOP();
CString strShow;
parse_object(pAttrTemp, 10, strShow);
ShowMsg(strShow);
delete[] pAttrTemp[0].pValue;
delete[] pAttrTemp[1].pValue;
delete[] pAttrTemp[2].pValue;
delete[] pAttrTemp[3].pValue;
}while(true);
if(numObj==0)
{
StartOP();
ShowMsg(NEWLINE"No data object."NEWLINE);
}
else
{
StartOP();
CHAR strNumObj[4];
wsprintf(strNumObj,"%d",numObj);
ShowMsg(NEWLINE);
ShowMsg(strNumObj);
ShowMsg(" data object(s) was found."NEWLINE);
}
}
void CEnumObjDlg::OnBtnPublic()
{
CK_OBJECT_CLASS dataClass = CKO_PUBLIC_KEY;
BOOL IsToken=true;
CK_ATTRIBUTE pTempl[] =
{
{CKA_CLASS, &dataClass, sizeof(CKO_PUBLIC_KEY)},
{CKA_TOKEN, &IsToken, sizeof(true)}
};
C_FindObjectsInit(m_hSession, pTempl, 2);
CK_OBJECT_HANDLE hCKObj;
CK_ULONG ulRetCount = 0;
CK_RV ckrv = 0;
int numObj=0;
CK_MECHANISM smech;
smech.mechanism = CKM_RSA_PKCS;
smech.pParameter = NULL_PTR;
smech.ulParameterLen = 0;
//CK_ULONG slen = 1024;
char *_message = "Simple message for signing & verifying.";
CK_ULONG messagelen = strlen(_message);
CK_RV rv = CKR_OK;
do
{
ckrv = C_FindObjects(m_hSession, &hCKObj, 1, &ulRetCount);
if(CKR_OK != ckrv)
{
break;
}
if(1 != ulRetCount)
break;
if (hCKObj!=0)
{
C_FindObjectsFinal(m_hSession);
rv = C_VerifyInit(m_hSession, &smech, hCKObj);
if (rv != CKR_OK) {
fprintf(stderr, "C_VerifyInit: rv = 0x%.8X\n", rv);
ShowMsg("C_VerifyInit error!\n ");
break;
}
rv = C_Verify(m_hSession, (CK_BYTE_PTR)_message, messagelen,
(CK_BYTE_PTR)sign, slen);
if (rv != CKR_OK) {
fprintf(stderr, "C_Verify: rv = 0x%.8X\n", rv);
ShowMsg("C_Verify error!\n ");
break;
}
fprintf(stdout, "Message was successfully verified with public key!\n");
ShowMsg("Message was successfully verified with public key!\n ");
break;
}
}while(true);
}
void CEnumObjDlg::OnBtnPrivate()
{
// TODO: Add your control notification handler code here
CK_OBJECT_CLASS dataClass = CKO_PRIVATE_KEY;
BOOL IsToken=true;
CK_ATTRIBUTE pTempl[] =
{
{CKA_CLASS, &dataClass, sizeof(CKO_PRIVATE_KEY)},
{CKA_TOKEN, &IsToken, sizeof(true)}
};
C_FindObjectsInit(m_hSession, pTempl, 2);
//私钥
CK_OBJECT_HANDLE hCKObj;
CK_ULONG ulRetCount = 0;
CK_RV ckrv = 0;
int numObj=0;
/****************************数字签名*******************************/
//设置签名
FILE *file;
FILE *sigfile;
pbBuffer= new BYTE[1002];
memset(pbBuffer,0,1002);
file=fopen("c:\\testin.txt","rb");
if ( file == NULL ){
return;
}
frlens=fread(pbBuffer,sizeof(BYTE),1000,file);
fclose(file);
CK_MECHANISM smech;
smech.mechanism = CKM_RSA_PKCS;
smech.pParameter = NULL_PTR;
smech.ulParameterLen = 0;
do
{
ckrv = C_FindObjects(m_hSession, &hCKObj, 1, &ulRetCount);
if(CKR_OK != ckrv)
{
break;
}
if(1 != ulRetCount)
break;
if (hCKObj != 0)
{
CK_RV rv = CKR_OK;
C_FindObjectsFinal(m_hSession);
rv = C_SignInit(m_hSession, &smech, hCKObj);
if (rv != CKR_OK) {
fprintf(stderr, "C_SignInit: rv = 0x%.8X\n", rv);
ShowMsg("C_SignInit error!\n");
return;
}
rv = C_Sign(m_hSession, (CK_BYTE_PTR)pbBuffer, frlens,
(CK_BYTE_PTR)sign, &slen);
if (rv != CKR_OK)
{
fprintf(stderr, "C_Sign: ckrv = 0x%.8X\n", ckrv);
ShowMsg("C_Sign error!\n");
return;
}
// 签名信息写入文件
sigfile=fopen("c:\\sigfile.txt","wb");
if ( sigfile == NULL ){
return;
}
fwrite(&slen, sizeof(DWORD), 1, sigfile);
fwrite(sign, 1, slen, sigfile);
fclose(sigfile);
fprintf(stdout, "Message was successfully signed with private key!\n");
ShowMsg("Message was successfully signed with private key! \n");
break;
}
}while(true);
/****************************数字签名*******************************/
}
void CEnumObjDlg::OnBtnSecret()
{
// TODO: Add your control notification handler code here
CK_OBJECT_CLASS dataClass = CKO_SECRET_KEY;
BOOL IsToken=true;
CK_ATTRIBUTE pTempl[] =
{
{CKA_CLASS, &dataClass, sizeof(CKO_PUBLIC_KEY)},
{CKA_TOKEN, &IsToken, sizeof(true)}
};
C_FindObjectsInit(m_hSession, pTempl, 2);
CK_OBJECT_HANDLE hCKObj;
CK_ULONG ulRetCount = 0;
CK_RV ckrv = 0;
int numObj=0;
do
{
ckrv = C_FindObjects(m_hSession, &hCKObj, 1, &ulRetCount);
if(CKR_OK != ckrv)
{
break;
}
if(1 != ulRetCount)
break;
CK_ATTRIBUTE pAttrTemp[] =
{
{CKA_CLASS, NULL, 0},
{CKA_KEY_TYPE,NULL,0},
{CKA_LABEL, NULL, 0},
{CKA_DERIVE,NULL,0},
{CKA_VALUE,NULL,0},
};
ckrv = C_GetAttributeValue(m_hSession, hCKObj, pAttrTemp, 5);
if(ckrv != CKR_OK)
{
break;
}
pAttrTemp[0].pValue = new char[pAttrTemp[0].ulValueLen];
pAttrTemp[1].pValue = new char[pAttrTemp[1].ulValueLen];
pAttrTemp[2].pValue = new char[pAttrTemp[2].ulValueLen+1];
pAttrTemp[3].pValue = new char[pAttrTemp[3].ulValueLen];
pAttrTemp[4].pValue = new char[pAttrTemp[4].ulValueLen];
ZeroMemory(pAttrTemp[0].pValue, pAttrTemp[0].ulValueLen);
ZeroMemory(pAttrTemp[1].pValue, pAttrTemp[1].ulValueLen);
ZeroMemory(pAttrTemp[2].pValue, pAttrTemp[2].ulValueLen+1);
ZeroMemory(pAttrTemp[3].pValue, pAttrTemp[3].ulValueLen);
ZeroMemory(pAttrTemp[4].pValue, pAttrTemp[4].ulValueLen);
ckrv = C_GetAttributeValue(m_hSession, hCKObj, pAttrTemp, 5);
if(ckrv != CKR_OK)
{
delete[] pAttrTemp[0].pValue;
delete[] pAttrTemp[1].pValue;
delete[] pAttrTemp[2].pValue;
delete[] pAttrTemp[3].pValue;
delete[] pAttrTemp[4].pValue;
break;
}
numObj++;
ShowMsg(NEWLINE);
StartOP();
CString strShow;
parse_object(pAttrTemp, 5, strShow);
ShowMsg(strShow);
delete[] pAttrTemp[0].pValue;
delete[] pAttrTemp[1].pValue;
delete[] pAttrTemp[2].pValue;
delete[] pAttrTemp[3].pValue;
delete[] pAttrTemp[4].pValue;
}while(true);
if(numObj==0)
{
StartOP();
ShowMsg(NEWLINE"No secret key."NEWLINE);
}
else
{
StartOP();
CHAR strNumObj[4];
wsprintf(strNumObj,"%d",numObj);
ShowMsg(NEWLINE);
ShowMsg(strNumObj);
ShowMsg(" secret key object(s) was found."NEWLINE);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -