📄 pkcsdemodlg.cpp
字号:
// PKCSDemoDlg.cpp : implementation file
//
#include "stdafx.h"
#include "PKCSDemo.h"
#include "PKCSDemoDlg.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
#include "DlgUserPIN.h"
#define NEWLINE "\r\n"
#define countof(a) (sizeof(a)/ sizeof(CK_ATTRIBUTE))
CK_BBOOL bTrue = TRUE;
CK_ULONG ulModulusBits = MODULUS_BIT_LENGTH;
CK_BYTE subject[] = "Sample RSA Key Pair";
CK_ULONG keyType = CKK_RSA;
CK_OBJECT_CLASS pubClass = CKO_PUBLIC_KEY;
CK_ATTRIBUTE pubTemplate[] = {
{CKA_CLASS, &pubClass, sizeof(pubClass)},
{CKA_KEY_TYPE, &keyType, sizeof(keyType)},
{CKA_SUBJECT, subject, sizeof(subject)},
{CKA_MODULUS_BITS, &ulModulusBits, sizeof(ulModulusBits)},
{CKA_ENCRYPT, &bTrue, sizeof(bTrue)},
{CKA_TOKEN, &bTrue, sizeof(bTrue)},
{CKA_WRAP, &bTrue, sizeof(bTrue)},
}; // Without specifying CKA_PRIVATE attribute in this case,
// a public key will be created by default.
CK_OBJECT_CLASS priClass = CKO_PRIVATE_KEY;
CK_ATTRIBUTE priTemplate[] = {
{CKA_CLASS, &priClass, sizeof(priClass)},
{CKA_KEY_TYPE, &keyType, sizeof(keyType)},
{CKA_SUBJECT, subject, sizeof(subject)},
{CKA_DECRYPT, &bTrue, sizeof(bTrue)},
{CKA_PRIVATE, &bTrue, sizeof(bTrue)},
{CKA_SENSITIVE, &bTrue, sizeof(bTrue)},
{CKA_TOKEN, &bTrue, sizeof(bTrue)},
{CKA_EXTRACTABLE, &bTrue, sizeof(bTrue)},
{CKA_UNWRAP, &bTrue, sizeof(bTrue)},
};
CK_MECHANISM keyGenMechanism = {
CKM_RSA_PKCS_KEY_PAIR_GEN,
NULL_PTR,
0
};
CK_MECHANISM ckMechanism = {CKM_RSA_PKCS, NULL_PTR, 0};
CK_BYTE pbMsg[] = "USB token bring you more security.";
CK_ULONG ulMsgLen = strlen((const char *)pbMsg);
/////////////////////////////////////////////////////////////////////////////
// CAboutDlg dialog used for App About
//////////////////////////////////////////////////////////////////////////
// byte to string according with special format
static CString nByteToStr(DWORD dwSize, void* pData, DWORD dwByte, DWORD dwSplit);
CString nByteToStr(DWORD dwSize, void* pData, DWORD dwByte, DWORD dwSplit)
{
BYTE* pBuf = (BYTE*)pData; // local pointer to a BYTE in the BYTE array.
CString strRet("");
DWORD nLine = 0;
DWORD dwLines = 0;
DWORD dwRest = 0;
bool bNeedSplit = true;
char szTemp[20] = {0, };
DWORD dwBlock = 0;
if(0 == dwSplit)
{
dwSplit = dwSize;
bNeedSplit = false;
}
dwRest = dwSize % dwSplit;
dwLines = dwSize / dwSplit;
DWORD i, j, k, m;
for(i = 0; i < dwLines; i++)
{
DWORD dwRestTemp = dwSplit % dwByte;
DWORD dwByteBlock = dwSplit / dwByte;
for(j = 0; j < dwByteBlock; j++)
{
for(k = 0; k < dwByte; k++)
{
wsprintf(szTemp, "%02X", pBuf[i * dwSplit + j * dwByte + k]);
strRet += szTemp;
}
strRet += " ";
}
if(dwRestTemp)
{
for(m = 0; m < dwRestTemp; m++)
{
wsprintf(
szTemp, "%02X",
pBuf[i * dwSplit + j * dwByte + k - 3 + dwRestTemp]);
strRet += szTemp;
}
}
if(bNeedSplit)
strRet += NEWLINE;
}
if(dwRest)
{
DWORD dwRestTemp = dwRest % dwByte;
DWORD dwByteBlock = dwRest / dwByte;
for(j = 0; j < dwByteBlock; j++)
{
for(k = 0; k < dwByte; k++)
{
wsprintf(szTemp, "%02X", pBuf[dwSize - dwRest + k]);
strRet += szTemp;
}
strRet += " ";
}
if(dwRestTemp)
{
for(m = 0; m < dwRestTemp; m++)
{
wsprintf(
szTemp, "%02X",
pBuf[dwSize - dwRest + k - 1 + dwRestTemp]);
strRet += szTemp;
}
}
if(bNeedSplit)
strRet += NEWLINE;
}
return strRet;
} // End of ByteToStr
/////////////////////////////////////////////////////////////////////////////
// CPKCSDemoDlg dialog
CPKCSDemoDlg::CPKCSDemoDlg(CWnd* pParent /*=NULL*/)
: CDialog(CPKCSDemoDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CPKCSDemoDlg)
m_strInfo = _T("");
//}}AFX_DATA_INIT
// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
m_pSlotList = NULL_PTR;
m_pApplication = new char[255];
ZeroMemory(m_pApplication, 255);
lstrcpy((char*)m_pApplication, "PKCS Demo App");
m_hSession = NULL_PTR;
m_hPubKey = NULL_PTR;
m_hPriKey = NULL_PTR;
m_bKeyGen = FALSE;
ZeroMemory(m_pSignature, MODULUS_BIT_LENGTH);
m_ulSignatureLen = sizeof(m_pSignature);
m_pbCipherBuffer = NULL_PTR;
m_ulCipherLen = 0;
}
CPKCSDemoDlg::~CPKCSDemoDlg()
{
if(m_hSession)
{
C_CloseSession(m_hSession);
m_hSession = NULL_PTR;
}
delete[] m_pApplication;
if(m_pSlotList)
{
delete[] m_pSlotList;
m_pSlotList = NULL_PTR;
}
if(m_pbCipherBuffer)
{
delete[] m_pbCipherBuffer;
m_pbCipherBuffer = NULL_PTR;
m_ulCipherLen = 0;
}
}
void CPKCSDemoDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CPKCSDemoDlg)
DDX_Control(pDX, IDC_BTN_VERIFY, m_btnVerify);
DDX_Control(pDX, IDC_BTN_SIGN, m_btnSign);
DDX_Control(pDX, IDC_BTN_ENCRYPT, m_btnEncrypt);
DDX_Control(pDX, IDC_BTN_DECRYPT, m_btnDecrypt);
DDX_Control(pDX, IDC_BTN_KEYPAIRGEN, m_btnKeyPairGen);
DDX_Control(pDX, IDC_BTN_CONNECT, m_btnConnect);
DDX_Control(pDX, IDC_INFO, m_edtInfo);
DDX_Text(pDX, IDC_INFO, m_strInfo);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CPKCSDemoDlg, CDialog)
//{{AFX_MSG_MAP(CPKCSDemoDlg)
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(IDC_BTN_CONNECT, OnBtnConnect)
ON_BN_CLICKED(IDC_BTN_KEYPAIRGEN, OnBtnKeypairgen)
ON_BN_CLICKED(IDC_BTN_SIGN, OnBtnSign)
ON_BN_CLICKED(IDC_BTN_VERIFY, OnBtnVerify)
ON_BN_CLICKED(IDC_BTN_CLEARINFO, OnBtnClearinfo)
ON_BN_CLICKED(IDC_BTN_ENCRYPT, OnBtnEncrypt)
ON_BN_CLICKED(IDC_BTN_DECRYPT, OnBtnDecrypt)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CPKCSDemoDlg message handlers
BOOL CPKCSDemoDlg::OnInitDialog()
{
CDialog::OnInitDialog();
// Set the icon for this dialog. The framework does this automatically
// when the application's main window is not a dialog
SetIcon(m_hIcon, TRUE); // Set big icon
SetIcon(m_hIcon, FALSE); // Set small icon
// TODO: Add extra initialization here
ShowMsg("Before any operation, you should connect to token!"NEWLINE);
m_btnKeyPairGen.EnableWindow(FALSE);
m_btnSign.EnableWindow(FALSE);
m_btnVerify.EnableWindow(FALSE);
m_btnEncrypt.EnableWindow(FALSE);
m_btnDecrypt.EnableWindow(FALSE);
return TRUE; // return TRUE unless you set the focus to a control
}
// If you add a minimize button to your dialog, you will need the code below
// to draw the icon. For MFC applications using the document/view model,
// this is automatically done for you by the framework.
void CPKCSDemoDlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // device context for painting
SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
// Center icon in client rectangle
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;
// Draw the icon
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CDialog::OnPaint();
}
}
// The system calls this to obtain the cursor to display while the user drags
// the minimized window.
HCURSOR CPKCSDemoDlg::OnQueryDragIcon()
{
return (HCURSOR) m_hIcon;
}
void CPKCSDemoDlg::ShowMsg(CString strInfo)
{
m_strInfo += strInfo;
UpdateData(FALSE);
int nLastLine = m_edtInfo.GetLineCount();// GetFirstVisibleLine();
if (nLastLine > 0)
{
m_edtInfo.LineScroll(nLastLine, 0);
}
}
void CPKCSDemoDlg::StartOP(void)
{
ShowMsg(NEWLINE"================================================");
}
void CPKCSDemoDlg::ShowErr(CString strInfo, CK_RV rv)
{
CString strTemp("");
strTemp.Format(strInfo.GetBuffer(strInfo.GetLength()), rv);
ShowMsg(strTemp);
}
void CPKCSDemoDlg::ClearMsg(void)
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -