CertInstallDlg.cpp
上传用户:filter2008
上传日期:2013-02-01
资源大小:101k
文件大小:13k
源码类别:

CA认证

开发平台:

C/C++

  1. // CertInstallDlg.cpp : implementation file
  2. //
  3. #include "stdafx.h"
  4. #include "Certificat.h"
  5. #include "CertInstall.h"
  6. #include "CertInstallDlg.h"
  7. #include "cryptool.h"
  8. #ifdef _DEBUG
  9. #define new DEBUG_NEW
  10. #undef THIS_FILE
  11. static char THIS_FILE[] = __FILE__;
  12. #endif
  13. #define WM_USER_INIT_PKCS       WM_USER + 1
  14. CList<CCertificat, CCertificat&> m_certList;
  15. /////////////////////////////////////////////////////////////////////////////
  16. // CAboutDlg dialog used for App About
  17. class CAboutDlg : public CDialog
  18. {
  19. public:
  20. CAboutDlg();
  21. // Dialog Data
  22. //{{AFX_DATA(CAboutDlg)
  23. enum { IDD = IDD_ABOUTBOX };
  24. //}}AFX_DATA
  25. // ClassWizard generated virtual function overrides
  26. //{{AFX_VIRTUAL(CAboutDlg)
  27. protected:
  28. virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
  29. //}}AFX_VIRTUAL
  30. // Implementation
  31. protected:
  32. //{{AFX_MSG(CAboutDlg)
  33. //}}AFX_MSG
  34. DECLARE_MESSAGE_MAP()
  35. };
  36. CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
  37. {
  38. //{{AFX_DATA_INIT(CAboutDlg)
  39. //}}AFX_DATA_INIT
  40. }
  41. void CAboutDlg::DoDataExchange(CDataExchange* pDX)
  42. {
  43. CDialog::DoDataExchange(pDX);
  44. //{{AFX_DATA_MAP(CAboutDlg)
  45. //}}AFX_DATA_MAP
  46. }
  47. BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
  48. //{{AFX_MSG_MAP(CAboutDlg)
  49. // No message handlers
  50. //}}AFX_MSG_MAP
  51. END_MESSAGE_MAP()
  52. /////////////////////////////////////////////////////////////////////////////
  53. // CCertInstallDlg dialog
  54. CCertInstallDlg::CCertInstallDlg(CWnd* pParent /*=NULL*/)
  55. : CDialog(CCertInstallDlg::IDD, pParent)
  56. {
  57. //{{AFX_DATA_INIT(CCertInstallDlg)
  58. // NOTE: the ClassWizard will add member initialization here
  59. //}}AFX_DATA_INIT
  60. // Note that LoadIcon does not require a subsequent DestroyIcon in Win32
  61. m_hIcon = AfxGetApp()->LoadIcon(IDI_ICON1);
  62. }
  63. void CCertInstallDlg::DoDataExchange(CDataExchange* pDX)
  64. {
  65. CDialog::DoDataExchange(pDX);
  66. //{{AFX_DATA_MAP(CCertInstallDlg)
  67. DDX_Control(pDX, IDOK, m_ctrInstall);
  68. DDX_Control(pDX, IDC_CERT_LIST, m_ctrCertList);
  69. //}}AFX_DATA_MAP
  70. }
  71. BEGIN_MESSAGE_MAP(CCertInstallDlg, CDialog)
  72. //{{AFX_MSG_MAP(CCertInstallDlg)
  73. ON_WM_SYSCOMMAND()
  74. ON_WM_PAINT()
  75. ON_WM_QUERYDRAGICON()
  76.   ON_MESSAGE(WM_USER_INIT_PKCS, OnInitializePkcs)
  77. ON_BN_CLICKED(IDOK, OnInstall)
  78. //}}AFX_MSG_MAP
  79. END_MESSAGE_MAP()
  80. /////////////////////////////////////////////////////////////////////////////
  81. // CCertInstallDlg message handlers
  82. BOOL CCertInstallDlg::OnInitDialog()
  83. {
  84. CDialog::OnInitDialog();
  85. // Add "About..." menu item to system menu.
  86. // IDM_ABOUTBOX must be in the system command range.
  87. ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
  88. ASSERT(IDM_ABOUTBOX < 0xF000);
  89. CMenu* pSysMenu = GetSystemMenu(FALSE);
  90. if (pSysMenu != NULL)
  91. {
  92. CString strAboutMenu;
  93. strAboutMenu.LoadString(IDS_ABOUTBOX);
  94. if (!strAboutMenu.IsEmpty())
  95. {
  96. pSysMenu->AppendMenu(MF_SEPARATOR);
  97. pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
  98. }
  99. }
  100. // Set the icon for this dialog.  The framework does this automatically
  101. //  when the application's main window is not a dialog
  102. SetIcon(m_hIcon, TRUE); // Set big icon
  103. SetIcon(m_hIcon, FALSE); // Set small icon
  104.   CImageList    *ImageFileList;
  105.   ImageFileList = new CImageList();
  106.  
  107.   /* add list icons */
  108.   ImageFileList->Create(16,16,ILC_COLOR24|ILC_MASK,0,0);
  109.   ImageFileList->Add(AfxGetApp()->LoadIcon(IDR_MAINFRAME));
  110.   ImageFileList->Add(AfxGetApp()->LoadIcon(IDI_CERT));
  111.   m_ctrCertList.SetImageList(ImageFileList, LVSIL_SMALL);
  112.   PostMessage(WM_USER_INIT_PKCS);
  113. return TRUE;  // return TRUE  unless you set the focus to a control
  114. }
  115. void CCertInstallDlg::OnSysCommand(UINT nID, LPARAM lParam)
  116. {
  117. if ((nID & 0xFFF0) == IDM_ABOUTBOX)
  118. {
  119. CAboutDlg dlgAbout;
  120. dlgAbout.DoModal();
  121. }
  122. else
  123. {
  124. CDialog::OnSysCommand(nID, lParam);
  125. }
  126. }
  127. // If you add a minimize button to your dialog, you will need the code below
  128. //  to draw the icon.  For MFC applications using the document/view model,
  129. //  this is automatically done for you by the framework.
  130. void CCertInstallDlg::OnPaint() 
  131. {
  132. if (IsIconic())
  133. {
  134. CPaintDC dc(this); // device context for painting
  135. SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
  136. // Center icon in client rectangle
  137. int cxIcon = GetSystemMetrics(SM_CXICON);
  138. int cyIcon = GetSystemMetrics(SM_CYICON);
  139. CRect rect;
  140. GetClientRect(&rect);
  141. int x = (rect.Width() - cxIcon + 1) / 2;
  142. int y = (rect.Height() - cyIcon + 1) / 2;
  143. // Draw the icon
  144. dc.DrawIcon(x, y, m_hIcon);
  145. }
  146. else
  147. {
  148. CDialog::OnPaint();
  149. }
  150. }
  151. // The system calls this to obtain the cursor to display while the user drags
  152. //  the minimized window.
  153. HCURSOR CCertInstallDlg::OnQueryDragIcon()
  154. {
  155. return (HCURSOR) m_hIcon;
  156. }
  157. char CCertInstallDlg::GetChar(char val)
  158. {
  159. int valMod=val&0x0F;
  160. char temp;
  161.   if(valMod<=9)
  162. temp='0'+valMod;
  163. else
  164. temp='A'+(valMod-0xA);
  165. return temp;
  166. };
  167. void CCertInstallDlg::OnInitializePkcs(WPARAM wParam,LPARAM lParam)
  168. {
  169. CK_RV rv=0;
  170. CK_ULONG slotIndex=0;
  171. CK_FUNCTION_LIST_PTR pFunctionList=NULL;
  172. CK_SLOT_ID_PTR slotList;
  173. CK_ULONG slotListSize=0;
  174.   m_certList.RemoveAll();
  175. /* initialisation de la dll PKCS#11*/
  176. setTraceLevel();
  177.   // Load the PKCS11 library 
  178.   rv= init(&pFunctionList);
  179. if (rv!=CKR_OK){
  180.     AfxMessageBox("Impossible d'initialiser le module pkcs11",MB_OK);
  181.     return;
  182. }
  183. /* On r閏up鑢e tous les slots diponibles */
  184. rv = getSlotList(pFunctionList, NULL_PTR, &slotListSize);
  185. if (rv!=CKR_OK){
  186.     AfxMessageBox("Erreur lors de la r閏up閞ation des slots(1) du module pkcs11",MB_OK);
  187.     return;
  188. }
  189. slotList = (CK_SLOT_ID_PTR)malloc(slotListSize*sizeof(CK_SLOT_ID));
  190. rv = getSlotList(pFunctionList, slotList, &slotListSize);
  191. if (rv!=CKR_OK){
  192.     AfxMessageBox("Erreur lors de la r閏up閞ation des slots(2) du module pkcs11",MB_OK);
  193.     return;
  194. }
  195. CK_SLOT_INFO slotInfo;
  196. CK_SESSION_HANDLE hSession;
  197. CK_ULONG certListSize = 256;
  198. CK_OBJECT_HANDLE_PTR phCertList;
  199. CK_BBOOL flag=FALSE;
  200. CK_BYTE_PTR  curSubject=NULL;
  201. CK_ULONG    curSubjectLen=512;
  202. CK_ULONG keyIdLen=256; 
  203. CK_BYTE_PTR keyId = NULL;
  204. for(unsigned int i=0;i<slotListSize;i++)
  205. {
  206. flag=FALSE;
  207. rv =(pFunctionList->C_GetSlotInfo)(slotList[i], &slotInfo);
  208. if ((rv == CKR_OK)&&((slotInfo.flags & CKF_TOKEN_PRESENT) != 0))
  209. {
  210. // On ouvre une session pour ce token 
  211. rv=openSession(pFunctionList,slotList[i] ,&hSession);
  212. if (rv==CKR_OK)
  213. {
  214. certListSize=256;
  215. // on r閏up鑢e tous les certificats 
  216. phCertList = (CK_OBJECT_HANDLE_PTR) malloc(certListSize*sizeof(CK_OBJECT_HANDLE));
  217. rv = getAllX509CertificateList(pFunctionList, hSession, phCertList, &certListSize);
  218. if(rv!=CKR_OK)
  219. {
  220. free(phCertList);
  221. continue;
  222. }
  223. //on les parcours pour les ajouter