SafeDataSetPage.cpp
上传用户:dengkfang
上传日期:2008-12-30
资源大小:5233k
文件大小:71k
源码类别:

CA认证

开发平台:

Visual C++

  1. // SafeDataSetPage.cpp : implementation file
  2. //
  3. #include "stdafx.h"
  4. #include "minica.h"
  5. #include "SafeDataSetPage.h"
  6. #include "MiniMainDlg.h"
  7. #include "Evp.h"
  8. #include "rc.h"
  9. #include ".GenericClassLanguage.h"
  10. #include "minict.h"
  11. const UINT BUFLEN = 4096;
  12. #ifdef _DEBUG
  13. #define new DEBUG_NEW
  14. #undef THIS_FILE
  15. static char THIS_FILE[] = __FILE__;
  16. #endif
  17. //加密后文件格式如下
  18. /*
  19. ------------------------------------信息头开始-------------------------------------------------
  20. 文件版本标记 - Evp20
  21. 信息颈长度 - DWORD
  22. 信息颈长度CRC码 - UINT
  23. ------------------------------------信息颈开始-------------------------------------------------
  24. 信息颈内容  处理方式 公钥加密
  25.              包括:
  26.       加密方式 ENUM
  27.   信息体个数n INT
  28.       n个信息体CDataSafe
  29. ---------------------------------对于数字信封:这里还要附加-------------------------------------
  30. ------------------------EVP信息头开始----------------------------------
  31. // 加密后EVP信息颈长度 DWORD
  32. // 加密后EVP信息颈长度 CRC校验码 UINT
  33. // 加密后EVP信息颈
  34. // -------------------------------EVP信息颈开始---------------------------
  35. // 公钥个数n
  36. // n个
  37. // 公钥加密的对称密钥长度
  38. // 公钥加密的对称密钥内容
  39. // 向量IV
  40. // -------------------------------EVP信息颈结束---------------------------
  41. ------------------------------------------------------------------------------------------------
  42. ------------------------------------n个加密文件内容开始------------------------------------------------
  43. ************************************************************************************************
  44. ************************************************************************************************
  45. ************************************************************************************************
  46. ************************************************************************************************
  47. ************************************************************************************************
  48. ------------------------------------n个加密文件内容结束------------------------------------------------
  49. */
  50. /////////////////////////////////////////////////////////////////////////////
  51. // CSafeDataSetPage property page
  52. const char m_sHeadMark[6] = "Evp20";
  53. CProgressCtrlST * CSafeDataSetPage::m_pProgOne = NULL;
  54. IMPLEMENT_DYNCREATE(CSafeDataSetPage, CPropertyPage)
  55. CSafeDataSetPage::CSafeDataSetPage() : CPropertyPage(CSafeDataSetPage::IDD)
  56. {
  57. //{{AFX_DATA_INIT(CSafeDataSetPage)
  58. // NOTE: the ClassWizard will add member initialization here
  59. //}}AFX_DATA_INIT
  60. m_uIndex = 0;
  61. m_EncType = NONE;
  62. m_bIsEnc = TRUE;
  63. m_pParent = NULL;
  64. m_pPageCdb = NULL;
  65. }
  66. CSafeDataSetPage::~CSafeDataSetPage()
  67. {
  68. m_Image.Detach();
  69. }
  70. void CSafeDataSetPage::DoDataExchange(CDataExchange* pDX)
  71. {
  72. CPropertyPage::DoDataExchange(pDX);
  73. //{{AFX_DATA_MAP(CSafeDataSetPage)
  74. // DDX_Control(pDX, IDC_EDIT_PWD, m_XpEditPwd);
  75. DDX_Control(pDX, IDC_B_ENC, m_BEnc);
  76. DDX_Control(pDX, IDC_PROGRESS_ALL, m_ProgAll);
  77. DDX_Control(pDX, IDC_PROGRESS_ONE, m_ProgOne);
  78. DDX_Control(pDX, IDC_LIST_DATASET, m_DataSetList);
  79. //}}AFX_DATA_MAP
  80. }
  81. BEGIN_MESSAGE_MAP(CSafeDataSetPage, CPropertyPage)
  82. //{{AFX_MSG_MAP(CSafeDataSetPage)
  83. ON_NOTIFY(NM_RCLICK, IDC_LIST_DATASET, OnRclickListDataset)
  84. ON_NOTIFY(NM_DBLCLK, IDC_LIST_DATASET, OnDblclkListDataset)
  85. ON_BN_CLICKED(IDC_B_ENC, OnBEnc)
  86. ON_BN_CLICKED(IDC_RADIO1, OnRadio1)
  87. ON_BN_CLICKED(IDC_RADIO2, OnRadio2)
  88. ON_BN_CLICKED(IDC_RADIO5, OnRadio5)
  89. ON_BN_CLICKED(IDC_RADIO6, OnRadio6)
  90. ON_NOTIFY(LVN_KEYDOWN, IDC_LIST_DATASET, OnKeydownListDataset)
  91. ON_BN_CLICKED(IDC_RADIO3, OnRadio3)
  92. ON_BN_CLICKED(IDC_RADIO4, OnRadio4)
  93. ON_NOTIFY(HDN_BEGINDRAG, IDC_LIST_DATASET, OnBegindragListDataset)
  94. ON_NOTIFY(LVN_BEGINDRAG, IDC_LIST_DATASET, OnBegindragListDataset)
  95. //}}AFX_MSG_MAP
  96. ON_MESSAGE(DROPM_DROPOK, OnDropOk)
  97. END_MESSAGE_MAP()
  98. /////////////////////////////////////////////////////////////////////////////
  99. // CSafeDataSetPage message handlers
  100. CWinThread * pThreadEvpSet = NULL;
  101. UINT _EvpSetThread(LPVOID lparam)
  102. {
  103. CSafeDataSetPage * p=(CSafeDataSetPage *)lparam;
  104. ((CMiniMainDlg *)p->GetParentWnd())->SetItemIcon(MiniCT_0002,16);
  105. //解决XP进度条不刷新问题
  106. //解决方法,刷新父窗口
  107. p->m_ProgOne.SetPos(0);
  108. //得到进度条控件区域
  109. CRect rectProg;
  110. p->m_ProgOne.GetWindowRect(&rectProg);
  111. p->ScreenToClient(rectProg);//
  112.   //指定父窗口刷新区域
  113. p->InvalidateRect(rectProg, TRUE);
  114. if(p->GetIsEnc())//加密
  115. {
  116. switch(p->m_EncType)
  117. {
  118. case CSafeDataSetPage::NONE:
  119. break;
  120. case CSafeDataSetPage::CRYPT:
  121. p->DoCrypt();
  122. break;
  123. case CSafeDataSetPage::DIGEST:
  124. break;
  125. case CSafeDataSetPage::SIGN:
  126. p->DoSign();
  127. break;
  128. case CSafeDataSetPage::SEAL:
  129. p->DoSeal();
  130. break;
  131. case CSafeDataSetPage::PubEnc:
  132. p->DoRSAPubEnc();
  133. break;
  134. case CSafeDataSetPage::PrivEnc:
  135. p->DoRSAPrivEnc();
  136. break;
  137. default:
  138. break;
  139. }
  140. }
  141. else //解密
  142. {
  143. switch(p->m_EncType)
  144. {
  145. case CSafeDataSetPage::NONE:
  146. break;
  147. case CSafeDataSetPage::CRYPT:
  148. p->DoDecCrypt();
  149. break;
  150. case CSafeDataSetPage::DIGEST:
  151. break;
  152. case CSafeDataSetPage::SIGN:
  153. break;
  154. case CSafeDataSetPage::SEAL:
  155. p->DoOpenSeal();
  156. break;
  157. case CSafeDataSetPage::PubEnc:
  158. p->DoRSAPriDec();
  159. break;
  160. case CSafeDataSetPage::PrivEnc:
  161. p->DoRSAPubDec();
  162. break;
  163. default:
  164. break;
  165. }
  166. }
  167. ((CMiniMainDlg *)p->GetParentWnd())->SetItemIcon(MiniCT_0002, 4);
  168. return 0;
  169. }
  170. BOOL CSafeDataSetPage::OnInitDialog() 
  171. {
  172. CPropertyPage::OnInitDialog();
  173. // TODO: Add extra initialization here
  174. CXPStyleButtonST::SetAllThemeHelper(this, ((CMiniCaApp *)AfxGetApp())->GetThemeHelperST());
  175. m_BEnc.SetIcon(IDI_ICON_DENC);
  176. m_BEnc.OffsetColor(CButtonST::BTNST_COLOR_BK_IN, 30);
  177. if(!((CMiniCaApp *)AfxGetApp())->IsXpStyle())
  178. {
  179. // m_Progress.SetBitmap(IDB_BITMAP_PROG);
  180. ClassXP(GetDlgItem(IDC_COMBO_CRYPT)->m_hWnd,TRUE);
  181. ClassXP(GetDlgItem(IDC_RADIO1)->m_hWnd,TRUE);
  182. ClassXP(GetDlgItem(IDC_RADIO2)->m_hWnd,TRUE);
  183. ClassXP(GetDlgItem(IDC_RADIO3)->m_hWnd,TRUE);
  184. ClassXP(GetDlgItem(IDC_RADIO4)->m_hWnd,TRUE);
  185. ClassXP(GetDlgItem(IDC_RADIO5)->m_hWnd,TRUE);
  186. ClassXP(GetDlgItem(IDC_RADIO6)->m_hWnd,TRUE);
  187. }
  188. //初始化图像列表
  189. SHFILEINFO shfi = {0};
  190. HIMAGELIST m_hImlIcons = (HIMAGELIST)SHGetFileInfo(NULL, 0, 
  191. &shfi, sizeof(SHFILEINFO), SHGFI_SYSICONINDEX | SHGFI_SMALLICON);
  192. //得到系统ImageList
  193. //以后通过得到文件的图标索引添加图标
  194. m_Image.Attach(m_hImlIcons);
  195. m_DataSetList.SetImageList(&m_Image, LVSIL_SMALL);
  196. m_DataSetList.SetExtendedStyle(LVS_EX_GRIDLINES);
  197. m_DataSetList.InsertColumn(0, MiniCT_1300, LVCFMT_LEFT, 150);
  198. m_DataSetList.InsertColumn(1, MiniCT_1301, LVCFMT_LEFT, 75);
  199. m_DataSetList.InsertColumn(2, MiniCT_1302, LVCFMT_LEFT, 70);
  200. m_DataSetList.InsertColumn(3, MiniCT_1303, LVCFMT_LEFT, 70);
  201. m_DataSetList.InsertColumn(4, MiniCT_1304, LVCFMT_LEFT, 100);
  202. // m_DataSetList.InsertColumn(3, "进度", LVCFMT_LEFT, 100);
  203. SetDlgItemText(IDC_COMBO_CRYPT,"idea-cbc");
  204. SetDlgItemText(IDC_EDIT_PWD,"MiniCA");
  205. ((CComboBox *)GetDlgItem(IDC_COMBO_CRYPT))->SetCurSel(16);
  206. ((CButton *)GetDlgItem(IDC_RADIO2))->SetCheck(1);
  207. m_pParent = AfxGetMainWnd();
  208. CSafeDataSetPage::m_pProgOne = &m_ProgOne;
  209. m_Target.Reg(this, "SafeData");
  210. CMiniMainDlg * pMain = (CMiniMainDlg *)AfxGetMainWnd();
  211. if(pMain)
  212. {
  213. CWinEvpSheet * pSheet = (CWinEvpSheet *)(pMain->GetPage("CWinEvpSheet"));
  214. if(pSheet)
  215. m_pPageCdb = (CSafeDataCdbPage*)pSheet->GetPage("CSafeDataCdbPage");
  216. }
  217. return TRUE;  // return TRUE unless you set the focus to a control
  218.               // EXCEPTION: OCX Property Pages should return FALSE
  219. }
  220. /*
  221. 函数功能:向列表中添加记录
  222. strDataSet - 记录名称
  223. strFileLen - 记录大小
  224. strDate - 修改时间
  225. uImage - 显示的图像索引
  226. pParent - 父节点句柄,NULL表示添加为根节点
  227. */
  228. CSuperGridCtrl::CTreeItem * CSafeDataSetPage::AddDataSet(const CDataSafe * pDataSafe,
  229.  const CString strDataSet, 
  230.  const UINT uImage,
  231.  const DWORD & dOldLen, 
  232.  const DWORD dNewLen, 
  233.  CString strType,
  234.  CString strTime,
  235.  CSuperGridCtrl::CTreeItem * pParent)
  236. {
  237. CString strOldLen(""), strNewLen("");
  238. strOldLen.Format("%d", dOldLen);
  239. if(dNewLen != 0 )
  240. strNewLen.Format("%d", dNewLen);
  241. CItemInfo* lpItemInfo = new CItemInfo();
  242. lpItemInfo->SetDataSafe(pDataSafe);
  243. lpItemInfo->SetImage(uImage);
  244. lpItemInfo->SetItemText(strDataSet);
  245. lpItemInfo->AddSubItemText(strOldLen); //原始大小
  246. lpItemInfo->AddSubItemText(strNewLen); //加密后大小
  247. lpItemInfo->AddSubItemText(strType); //类型说明
  248. lpItemInfo->AddSubItemText(strTime); //修改时间
  249. if(!pParent)
  250. {
  251. // lpRoot->m_uIndex = m_uIndex + 1;
  252. return m_DataSetList.InsertRootItem(lpItemInfo);//previous on N.Y.P.D we call it CreateTreeCtrl(lp)
  253. }
  254. else
  255. {
  256. // lpItemInfo->m_uIndex = m_uIndex + 1;
  257. return m_DataSetList.InsertItem(pParent, lpItemInfo, FALSE);
  258. }
  259. }
  260. //添加文件到结构MAP
  261. //枚举到文件时候的操作
  262. void CSafeDataSetPage::AddFileList(const WIN32_FIND_DATA & FileData, 
  263.    CSuperGridCtrl::CTreeItem * hPitem,
  264.    const UINT uTempParent,
  265.    CString sFile,
  266.    DWORD & dFileLen)
  267. {
  268. SHFILEINFO sfi = {0};
  269. SHGetFileInfo(FileData.cFileName, FILE_ATTRIBUTE_NORMAL, &sfi,
  270. sizeof(SHFILEINFO), SHGFI_USEFILEATTRIBUTES | SHGFI_SYSICONINDEX | SHGFI_TYPENAME);
  271. //ftLastWriteTime
  272. SYSTEMTIME stime;
  273. FILETIME ftime; 
  274. FileTimeToLocalFileTime(&FileData.ftLastWriteTime, &ftime); // 转换成本地时间 
  275. FileTimeToSystemTime(&ftime, &stime); // 转换成系统时间格式
  276. //文件大小
  277.   //  StrFormatByteSize(rFind.nFileSizeLow, szFileLen, 64 );
  278. dFileLen = (FileData.nFileSizeHigh * (MAXDWORD+1)) + FileData.nFileSizeLow;
  279. //时间
  280. CString strTime;
  281. strTime.Format("%d-%d-%d %d:%d", stime.wYear, stime.wMonth, stime.wDay, stime.wHour, stime.wMinute);
  282. CDataSafe DataSafe(FileData.cFileName, dFileLen, 
  283. FileData.ftLastWriteTime, TRUE, uTempParent, sFile.GetBuffer(0));
  284. AddDataSet(&DataSafe, FileData.cFileName, sfi.iIcon, dFileLen, 0, sfi.szTypeName, strTime, hPitem);
  285. // ++m_uIndex; 
  286. }
  287. BOOL CSafeDataSetPage::AddList(CString sLocalDir, UINT uPid, 
  288.    CSuperGridCtrl::CTreeItem * hPitem)
  289. {
  290.     POSITION pos = m_DirName.GetHeadPosition();
  291.     while ( NULL != pos )
  292.     {
  293. if(m_DirName.GetNext(pos).Compare(sLocalDir) == 0)//重复
  294. return TRUE;
  295.     }
  296. m_DirName.AddHead(sLocalDir);
  297. //判断是否为磁盘,如果为磁盘,则后面添加*.*
  298. if(sLocalDir.GetLength() == 3 && sLocalDir.Find(":") != -1)
  299. sLocalDir += "*.*";
  300. return EnumDir(sLocalDir, uPid, hPitem);
  301. }
  302. /*BOOL CSafeDataSetPage::GetDirTime(CString DirName, FILETIME &ftime, CString & strTime)
  303. {
  304. FILETIME lpCreationTime; // 文件夹的创建时间 
  305. FILETIME lpLastAccessTime; // 对文件夹的最近访问时间 
  306. FILETIME lpLastWriteTime; // 文件夹的最近修改时间 
  307. // 打开文件夹
  308. HANDLE hDir = CreateFile (DirName, GENERIC_READ, 
  309. FILE_SHARE_READ|FILE_SHARE_DELETE, 
  310. NULL, OPEN_EXISTING, 
  311. FILE_FLAG_BACKUP_SEMANTICS, NULL); 
  312. if(INVALID_HANDLE_VALUE == hDir)
  313. return FALSE;
  314. // 获取文件夹时间属性信息
  315. SYSTEMTIME stime;
  316. if (GetFileTime(hDir, &lpCreationTime, &lpLastAccessTime, &lpLastWriteTime))
  317. FileTimeToLocalFileTime(&lpLastWriteTime, &ftime); // 转换成本地时间 
  318. FileTimeToSystemTime(&ftime, &stime); // 转换成系统时间格式
  319. CloseHandle(hDir); // 关闭打开过的文件夹
  320. strTime.Format("%d-%d-%d %d:%d", stime.wYear, stime.wMonth, stime.wDay, stime.wHour, stime.wMinute);
  321. return TRUE;
  322. }*/
  323. //枚举目录,如果是文件,直接添加到列表中
  324. BOOL CSafeDataSetPage::EnumDir(CString strPath, UINT uPid, 
  325.    CSuperGridCtrl::CTreeItem * hPitem)
  326. {
  327. DWORD dDirLen = 0;
  328. WIN32_FIND_DATA wfd = {0};
  329. HANDLE hFind = FindFirstFile (strPath, &wfd);
  330. BOOL bResult = (hFind == INVALID_HANDLE_VALUE) ? FALSE : TRUE;
  331. CSuperGridCtrl::CTreeItem *  pItem = NULL;
  332. UINT uTempParent = 0;
  333. CString strTime;
  334. SYSTEMTIME stime;
  335. FILETIME ftime; 
  336. while (bResult)
  337. {
  338. if (wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY && wfd.cFileName[0] != '.' && wfd.cFileName[0] != '..') // folder
  339. {
  340. SHFILEINFO sfi = {0};
  341. SHGetFileInfo (NULL, FILE_ATTRIBUTE_DIRECTORY, &sfi, sizeof(SHFILEINFO),
  342. SHGFI_USEFILEATTRIBUTES | SHGFI_SYSICONINDEX | SHGFI_TYPENAME);
  343. FileTimeToLocalFileTime(&wfd.ftLastWriteTime, &ftime); // 转换成本地时间 
  344. FileTimeToSystemTime(&ftime, &stime); // 转换成系统时间格式
  345. strTime.Format("%d-%d-%d %d:%d", stime.wYear, stime.wMonth, stime.wDay, stime.wHour, stime.wMinute);
  346. CString strFileName = strPath;
  347. strFileName.Replace("*.*", wfd.cFileName);
  348. CDataSafe DataSafe(wfd.cFileName, 0, wfd.ftLastWriteTime, FALSE, uPid, strFileName);
  349. pItem = AddDataSet(&DataSafe, wfd.cFileName, sfi.iIcon, 0, 0, sfi.szTypeName, strTime, hPitem);
  350. uTempParent = ++m_uIndex;
  351. //进入目录
  352. CString strPathName = strPath; //枚举此文件夹下面的所有内容
  353. strPathName.Replace("*.*", wfd.cFileName);
  354. strPathName += "\*.*";
  355. EnumDir(strPathName, uTempParent, pItem);
  356. }
  357. bResult = FindNextFile (hFind, &wfd);
  358. }
  359. FindClose (hFind);
  360. // read files
  361. hFind = FindFirstFile (strPath, &wfd);
  362. bResult = (hFind == INVALID_HANDLE_VALUE) ? FALSE : TRUE;
  363. while (bResult)
  364. {
  365. if (!(wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) && wfd.cFileName[0] != '.' && wfd.cFileName[0] != '') // no folder or parent folder
  366. {
  367. CString strFileName = strPath;
  368. strFileName.Replace("*.*", wfd.cFileName);
  369. DWORD dFileLen = 0;
  370. AddFileList(wfd, hPitem, uPid, strFileName, dFileLen);
  371. dDirLen += dFileLen;
  372. //累加所有文件长度,然后显示在列表中,并修改父结构长度
  373. }
  374. bResult = FindNextFile (hFind, &wfd);
  375. }
  376. FindClose (hFind);
  377. CString str;
  378. str.Format("%d", dDirLen);
  379. if(hPitem)
  380. {
  381. int index = m_DataSetList.GetCurIndex(hPitem);
  382. if(index != -1)
  383. m_DataSetList.SetItemText(index, 1, str);
  384. }
  385. return bResult;
  386. }
  387. void CSafeDataSetPage::OnRclickListDataset(NMHDR* pNMHDR, LRESULT* pResult) 
  388. {
  389. // TODO: Add your control notification handler code here
  390. int i = m_DataSetList.GetSelectedItem();
  391. if(i == -1)
  392. return;
  393. CSuperGridCtrl::CTreeItem * pItem = m_DataSetList.GetTreeItem(i);
  394. CItemInfo * pInfo = m_DataSetList.GetData(pItem ); 
  395. const CDataSafe * pDataSafe = pInfo->GetDataSafe();
  396. CString str;
  397. str.Format("文件名%s 偏移%d 长度%d", pDataSafe->cName, pDataSafe->dBeginSeek, pDataSafe->dNewLen);
  398. AfxMessageBox(str);
  399. *pResult = 0;
  400. }
  401. //加载硬盘里面的.evp文件,读取文件信息,并写入MAP,然后显示在列表中
  402. BOOL CSafeDataSetPage::ParseEvp(CString strEvpFile, EncType & encType)
  403. {
  404. m_uIndex = 0; //添加目录时候不清0,因为可能多次添加
  405. CFile File;
  406. if(!File.Open(strEvpFile, CFile::modeRead | CFile::typeBinary))
  407. {
  408. AfxMessageBox(MiniCT_1320);
  409. return FALSE;
  410. }
  411. //读取文件前5个字母,判断是否为Evp20
  412. char sHeadMark[6] = {0};
  413. File.Read(sHeadMark, strlen(m_sHeadMark));
  414. if(strcmp(sHeadMark, m_sHeadMark)!=0)
  415. {
  416. //非EVP文件,返回
  417. File.Close();
  418. AfxMessageBox(MiniCT_1305);
  419. return FALSE;
  420. }
  421. DWORD dFileInfoLen = 0; 
  422. File.Read(&dFileInfoLen, sizeof(DWORD));
  423. //校验CRC,类型UINT
  424. UINT uCrcCheck = 0;
  425. File.Read(&uCrcCheck, sizeof(UINT));
  426. if(!CRC::CheckCrc((char *)&dFileInfoLen, sizeof(DWORD), uCrcCheck))
  427. {
  428. AfxMessageBox(MiniCT_1306);
  429. File.Close();
  430. return FALSE;
  431. }
  432. //开辟缓冲区,容纳加密后的信息体
  433. BYTE * pIn = new BYTE[dFileInfoLen + 1];
  434. File.Read(pIn, dFileInfoLen);
  435. HRSRC hRsrc = FindResource(NULL,MAKEINTRESOURCE(IDR_FILE_KEY),"CERT");
  436. DWORD lenKey = SizeofResource(NULL, hRsrc); 
  437. HGLOBAL hgKey = LoadResource(NULL,hRsrc);
  438. LPSTR lpKey = (LPSTR)LockResource(hgKey);
  439. DWORD dOutLen = dFileInfoLen;
  440. //开辟缓冲区,容纳解密后的信息体
  441. BYTE * pOut = new BYTE[dOutLen];
  442. CString outMsg;
  443. if(!CEvp::RSAPrivDec((BYTE *)lpKey, lenKey, "MiniCA", pIn, 
  444. dFileInfoLen, pOut, dOutLen, outMsg.GetBuffer(256)))
  445. {
  446. //解密失败
  447. AfxMessageBox(MiniCT_1307);
  448. File.Close();
  449. delete [] pIn;
  450. delete [] pOut;
  451. return FALSE;
  452. }
  453. CMemFile MemFile;
  454. MemFile.Attach(pOut, dOutLen);
  455. //首先是加密方式
  456. MemFile.Read(&encType, sizeof(EncType));
  457. m_EncType = encType;
  458. //然后是结构体个数
  459. UINT uIndex = 0;
  460. MemFile.Read(&uIndex, sizeof(uIndex));
  461. CSuperGridCtrl::CTreeItem * pItem[1024]; //只记录文件夹
  462. memset(pItem, 0, sizeof(CSuperGridCtrl::CTreeItem * ) * 1024);
  463. CMap<UINT, UINT, CSuperGridCtrl::CTreeItem *, CSuperGridCtrl::CTreeItem * > ItemMap;//记录目录ITEM的MAP
  464. ItemMap.SetAt(0, NULL);
  465. SHFILEINFO sfi = {0};
  466. //最后是n个结构体
  467. for(UINT index = 1, j = 1; index <= uIndex; index++, m_uIndex++) //读取文件信息到结构MAP
  468. {
  469. CDataSafe DataSafe;
  470. DataSafe.Read(MemFile);
  471. CSuperGridCtrl::CTreeItem * pParentItem = NULL;
  472. if(ItemMap.Lookup(DataSafe.uParentID, pParentItem))
  473. {
  474. SYSTEMTIME stime;
  475. FILETIME ftime; 
  476. FileTimeToLocalFileTime(&DataSafe.ftLastWriteTime, &ftime); // 转换成本地时间 
  477. FileTimeToSystemTime(&ftime, &stime); // 转换成系统时间格式
  478. //时间
  479. CString strTime;
  480. strTime.Format("%d-%d-%d %d:%d", stime.wYear, stime.wMonth, stime.wDay, stime.wHour, stime.wMinute);
  481. if(!DataSafe.bIsFile)//目录,记录下来
  482. {
  483. SHGetFileInfo (NULL, FILE_ATTRIBUTE_DIRECTORY, &sfi, sizeof(SHFILEINFO),
  484. SHGFI_USEFILEATTRIBUTES | SHGFI_SYSICONINDEX | SHGFI_TYPENAME);
  485. pItem[j] = AddDataSet(&DataSafe, DataSafe.cName, sfi.iIcon, 
  486. DataSafe.dOldLen, 0, sfi.szTypeName, strTime, pParentItem);
  487. ItemMap.SetAt(j, pItem[j]);
  488. j++;
  489. }
  490. else
  491. {
  492. SHGetFileInfo(DataSafe.cName, FILE_ATTRIBUTE_NORMAL, &sfi,
  493. sizeof(SHFILEINFO), SHGFI_USEFILEATTRIBUTES | SHGFI_SYSICONINDEX| SHGFI_TYPENAME );
  494. AddDataSet(&DataSafe, DataSafe.cName, sfi.iIcon, DataSafe.dOldLen, DataSafe.dNewLen,
  495. sfi.szTypeName, strTime, pParentItem);
  496. }
  497. }
  498. }
  499. delete [] pIn;
  500. delete [] pOut;
  501. MemFile.Close();
  502. File.Close();
  503. /* for(int index = 1, j = 0; index <= m_DataMap.GetCount(); index++, m_uIndex++)
  504. {
  505. }*/
  506. //如果分析成功,则转换为解密方式,需要完成,按钮等的变化
  507. // SetDlgItemText(IDC_B_ENC, "解密");
  508. m_BEnc.SetIcon(IDI_ICON_DDEC);
  509. ((CButton *)GetDlgItem(IDC_RADIO1))->SetCheck(0);
  510. ((CButton *)GetDlgItem(IDC_RADIO2))->SetCheck(0);
  511. ((CButton *)GetDlgItem(IDC_RADIO3))->SetCheck(0);
  512. ((CButton *)GetDlgItem(IDC_RADIO4))->SetCheck(0);
  513. ((CButton *)GetDlgItem(IDC_RADIO5))->SetCheck(0);
  514. ((CButton *)GetDlgItem(IDC_RADIO6))->SetCheck(0);
  515. GetDlgItem(IDC_RADIO1)->EnableWindow(0);
  516. GetDlgItem(IDC_RADIO2)->EnableWindow(0);
  517. GetDlgItem(IDC_RADIO3)->EnableWindow(0);
  518. GetDlgItem(IDC_RADIO4)->EnableWindow(0);
  519. GetDlgItem(IDC_RADIO5)->EnableWindow(0);
  520. GetDlgItem(IDC_RADIO6)->EnableWindow(0);
  521. switch(m_EncType)
  522. {
  523. case NONE:
  524. break;
  525. case CRYPT: //对称 1
  526. OnRadio1();
  527. GetDlgItem(IDC_RADIO1)->EnableWindow(1);
  528. ((CButton *)GetDlgItem(IDC_RADIO1))->SetCheck(1);
  529. break;
  530. case DIGEST: //摘要 3
  531. OnRadio3();
  532. GetDlgItem(IDC_RADIO3)->EnableWindow(1);
  533. ((CButton *)GetDlgItem(IDC_RADIO3))->SetCheck(1);
  534. break;
  535. case SIGN: //签名 4
  536. OnRadio3();
  537. GetDlgItem(IDC_RADIO4)->EnableWindow(1);
  538. ((CButton *)GetDlgItem(IDC_RADIO4))->SetCheck(1);
  539. break;
  540. case SEAL: //信封 2
  541. OnRadio4();
  542. GetDlgItem(IDC_RADIO2)->EnableWindow(1);
  543. ((CButton *)GetDlgItem(IDC_RADIO2))->SetCheck(1);
  544. break;
  545. case PubEnc:
  546. OnRadio5();
  547. GetDlgItem(IDC_RADIO5)->EnableWindow(1);
  548. ((CButton *)GetDlgItem(IDC_RADIO5))->SetCheck(1);
  549. break;
  550. case PrivEnc:
  551. OnRadio6();
  552. GetDlgItem(IDC_RADIO6)->EnableWindow(1);
  553. ((CButton *)GetDlgItem(IDC_RADIO6))->SetCheck(1);
  554. break;
  555. default:
  556. break;
  557. }
  558. m_bIsEnc = FALSE;
  559. m_strEvpPath = strEvpFile; //設置解密文件
  560. return TRUE;
  561. }
  562. CProgressCtrlST * CSafeDataSetPage::ShowProg(int nItem, int nCol)
  563. {
  564. // CString strFind = GetItemText(nItem, nCol);
  565. //basic code start
  566. CRect rect;
  567. int offset = 0;
  568. // Make sure that the item is visible
  569. if( !m_DataSetList.EnsureVisible(nItem, TRUE)) return NULL;
  570. m_DataSetList.GetSubItemRect(nItem, nCol, LVIR_BOUNDS, rect);
  571. // Now scroll if we need to expose the column
  572. CRect rcClient;
  573. m_DataSetList.GetClientRect(rcClient);
  574. if( offset + rect.left < 0 || offset + rect.left > rcClient.right )
  575. {
  576. CSize size;
  577. size.cx = offset + rect.left;
  578. size.cy = 0;
  579. m_DataSetList.Scroll(size);
  580. rect.left -= size.cx;
  581. }
  582. rect.left += offset;
  583. rect.right = rect.left + m_DataSetList.GetColumnWidth(nCol);
  584. if(rect.right > rcClient.right) 
  585.    rect.right = rcClient.right;
  586. //basic code end
  587. rect.bottom += rect.Height();//dropdown area
  588. DWORD dwStyle =  WS_CHILD | WS_VISIBLE;
  589. CProgressCtrlST *pProg = new CProgressCtrlST;
  590. pProg->Create(dwStyle, rect, this, 100050);
  591. pProg->SetBitmap(IDB_BITMAP_PROG);
  592. pProg->SetPos(40);
  593. // pList->ModifyStyleEx(0,WS_EX_CLIENTEDGE);//can we tell at all
  594. // pList->SetHorizontalExtent(CalcHorzExtent(pList, lstItems));
  595. // pList->ShowDropDown();
  596. // pList->SelectString(-1, strFind.GetBuffer(1));
  597. // The returned pointer should not be saved
  598. return pProg;
  599. }
  600. //功能:
  601. //写入 版本Evp20, 加密结构长度, 加密结构校验
  602. //移动文件到加密位置(掠过信息颈)
  603. //参数:
  604. //File - 用来加密文件的
  605. //nCount - 文件信息体个数
  606. //dFileInfoLen - 返回加密后长度
  607. //strMsg - 返回操作错误信息
  608. BOOL CSafeDataSetPage::MadeFileHead(CFile & File, const int nCount, DWORD & dFileInfoLen, CString & strMsg)
  609. {
  610. if(0 == nCount)
  611. {
  612. strMsg = MiniCT_1308;
  613. return FALSE;
  614. }
  615. HRSRC hRsrc = FindResource(NULL,MAKEINTRESOURCE(IDR_FILE_CERT),"CERT");
  616. DWORD lenCert = SizeofResource(NULL, hRsrc); 
  617. HGLOBAL hgCert = LoadResource(NULL,hRsrc);
  618. LPSTR lpCert = (LPSTR)LockResource(hgCert);
  619. //取得加密后文件信息体大小
  620. //文件信息体为: 加密方式sizeof(EncType) +  sizeof(int)(信息体个数 int 类型) + n个CDataSafe结构大小nCount * (sizeof(CDataSafe) - sizeof(char)*256
  621. //其中CDataSafe结构不写入文件全路径,所以 - sizeof(char)*256
  622. //
  623. dFileInfoLen = CEvp::GetEncLen(lpCert, lenCert, 
  624. sizeof(EncType) + sizeof(nCount) + nCount * (sizeof(CDataSafe) - sizeof(char)*256) );
  625. if(dFileInfoLen == -1)
  626. {
  627. strMsg = MiniCT_1309;
  628. return FALSE;
  629. }
  630. //写入版本标志Evp20
  631. File.Write(m_sHeadMark, strlen(m_sHeadMark));
  632. //写入加密后文件信息体大小,类型为DWORD
  633. File.Write(&dFileInfoLen, sizeof(DWORD));
  634. //写入CRC校验值,类型UINT
  635. UINT uCrcCheck = 0;
  636. if(CRC::GetCrc16((char *)&dFileInfoLen, sizeof(DWORD), uCrcCheck))
  637. {
  638. File.Write(&uCrcCheck, sizeof(UINT));
  639. }
  640. else
  641. {
  642. strMsg = MiniCT_1310; //"生成信息颈长度CRC校验失败";
  643. AddMsg(strMsg, M_ERROR);
  644. return FALSE;
  645. }
  646. //预留信息头 
  647. File.Seek(dFileInfoLen, CFile::current);
  648. return TRUE;
  649. }
  650. //功能: - 加密文件完毕后调用
  651. //写入 加密(加密方式+文件个数+文件信息体加密后长度)后内容
  652. //移动文件到加密位置
  653. //参数:
  654. //File - 用来加密文件的
  655. //encType - 加密方式
  656. //nCount - 文件信息体个数
  657. //dFileInfoLen - 加密后长度,用于分配内存
  658. //strMsg - 返回操作错误信息
  659. BOOL CSafeDataSetPage::MadeFileNeck(CList<CDataSafe *, CDataSafe *> * pDataList, CFile &File, 
  660. const EncType encType, const int nCount, 
  661. const DWORD dFileInfoLen, CString &strMsg)
  662. {
  663. //开始屏蔽进度显示 , 完毕后打开
  664. CSafeDataSetPage::m_pProgOne = NULL;
  665. //构造内存文件,写入 加密方式 + 信息体个数n + n个信息体
  666. CMemFile MemFile;
  667. MemFile.Write(&encType, sizeof(EncType));
  668. MemFile.Write(&nCount, sizeof(int));
  669. //枚举目录列表
  670. POSITION pos = pDataList->GetHeadPosition();
  671. while(pos != NULL)
  672. {
  673. CDataSafe* pDataSafe = pDataList->GetNext(pos);
  674. if(pDataSafe)
  675. pDataSafe->Write(MemFile);
  676. }
  677. //加密内存文件
  678. //构造加密结果 长度+1 内存
  679. DWORD dOutLen = -1;
  680. BYTE * pOut = new BYTE[dFileInfoLen + 1];
  681. dOutLen = dFileInfoLen;
  682. HRSRC hRsrc = FindResource(NULL,MAKEINTRESOURCE(IDR_FILE_CERT),"CERT");
  683. DWORD lenCert = SizeofResource(NULL, hRsrc); 
  684. HGLOBAL hgCert = LoadResource(NULL,hRsrc);
  685. LPSTR lpCert = (LPSTR)LockResource(hgCert);
  686. //构造加密输入
  687. DWORD dInLen = MemFile.GetLength();
  688. BYTE * pIn = MemFile.Detach(); //同时关闭MemFile.Close(); 此时不要重新开辟内存,而且Detach用malloc,所以释放用free
  689. if(!CEvp::RSAPubEnc((BYTE *)lpCert, lenCert, "", pIn, dInLen, 
  690. pOut, dOutLen, strMsg.GetBuffer(256)))
  691. {
  692. //加密失败
  693. strMsg.ReleaseBuffer();
  694. free(pIn);
  695. delete [] pOut;
  696. CSafeDataSetPage::m_pProgOne = &m_ProgOne;
  697. return FALSE;
  698. }
  699. else if(dOutLen != dFileInfoLen)
  700. {
  701. //加密失败
  702. strMsg.ReleaseBuffer();
  703. strMsg = MiniCT_1311;//"信息颈长度与预期不符";
  704. free(pIn);
  705. delete [] pOut;
  706. CSafeDataSetPage::m_pProgOne = &m_ProgOne;
  707. return FALSE;
  708. }
  709. CSafeDataSetPage::m_pProgOne = &m_ProgOne;
  710. //移动文件指针到开头 + "Evp20" + 加密后信息体大小DWORD + CRC校验UINT
  711. File.Seek(strlen(m_sHeadMark) + sizeof(DWORD) + sizeof(UINT), CFile::begin);
  712. File.Write(pOut, dFileInfoLen);
  713. free(pIn);
  714. delete [] pOut;
  715. return TRUE;
  716. }
  717. /////////////////////////////////////////////////////加密文件部分////////////////////////////////////////////////
  718. //功能:对称加密文件、目录
  719. //参数:
  720. // strCpName - 算法名称
  721. // strPwd- 对称密钥
  722. // strFileName - 加密后文件
  723. // outMsg - 返回操作信息
  724. BOOL CSafeDataSetPage::Crypt(CString strCpName, CString strPwd, CString strFileName, CString & outMsg)
  725. {
  726. //输入检查
  727. if(strCpName.IsEmpty() || strPwd.IsEmpty() || strFileName.IsEmpty())
  728. {
  729. outMsg = MiniCT_1312; //"算法名称或对称密钥或输出文件非法";
  730. return FALSE;
  731. }
  732. CFile File;//文件头加版本信息
  733. if(!File.Open(strFileName, CFile::modeCreate | CFile::modeWrite | CFile::typeBinary ))
  734. {
  735. outMsg.Format("%s : %s", MiniCT_1313,strFileName); //创建文件失败
  736. return FALSE;
  737. }
  738. int nCount = m_DataSetList.GetCount();
  739. DWORD dFileInfoLen = 0;
  740. //创建信息头
  741. if(!MadeFileHead(File, nCount, dFileInfoLen, outMsg))
  742. {
  743. File.Close();
  744. return FALSE;
  745. }
  746. DWORD dOutLen = -1;
  747. EVP_CIPHER_CTX Ctx, CtxTemp;
  748. if(!CEvp::InitCrypt2(strCpName, strPwd, 1, Ctx))
  749. {
  750. outMsg = MiniCT_1314; //"初始化加密结构失败";
  751. File.Close();
  752. return FALSE;
  753. }
  754. //枚举目录列表加密信息
  755. CList<CDataSafe *, CDataSafe *> DataList; //包含目录和文件得全部信息列表
  756. EnumList(&DataList);
  757. POSITION pos = DataList.GetHeadPosition();
  758. int iCount = DataList.GetCount();
  759. m_ProgAll.SetRange(0, iCount);
  760. int iFinish = 0;
  761. CString strInfo;
  762. while(pos != NULL)
  763. {
  764. CDataSafe* pDataSafe = DataList.GetNext(pos);
  765. if(pDataSafe)
  766. {
  767. if(pDataSafe->bIsFile) //文件则加密
  768. {
  769. strInfo.Format("%s %s ,%s %d %s", MiniCT_1315, pDataSafe->cName, MiniCT_1316, pDataSafe->dOldLen, MiniCT_1317);
  770. AddOnceMsg(strInfo);
  771. CtxTemp = Ctx;
  772. //结构中加密起始位置赋值
  773. pDataSafe->dBeginSeek = File.GetPosition();
  774. dOutLen = CEvp::Crypt2(&CtxTemp, pDataSafe->cPathName, File, 0, outMsg);
  775. if(dOutLen == -1)
  776. {
  777. CString str;
  778. str.Format("%s%s, %s%s", pDataSafe->cName, MiniCT_1318, MiniCT_1319, outMsg);//对称加密失败 失败原因:
  779. outMsg = str;
  780. File.Close();
  781. CleanList(&DataList);
  782. return FALSE;
  783. }
  784. else//结构赋值
  785. {
  786. pDataSafe->dNewLen = dOutLen;
  787. }
  788. }
  789. }
  790. m_ProgAll.SetPos(++iFinish);
  791. }
  792. //创建信息颈
  793. if(!MadeFileNeck(&DataList, File, CRYPT, nCount, dFileInfoLen, outMsg))
  794. {
  795. File.Close();
  796. CEvp::CleanCrypt2(Ctx);
  797. CleanList(&DataList);
  798. return FALSE;
  799. }
  800. CEvp::CleanCrypt2(Ctx);
  801. CleanList(&DataList);
  802. File.Close();
  803. return TRUE;
  804. }
  805. //对称解密
  806. BOOL CSafeDataSetPage::DecCrypt(CString strCpName, CString strPwd, CString strEvpFile, CString & outMsg)
  807. {
  808. //解密信息
  809. DWORD dOutLen = -1;
  810. BOOL bRet = TRUE;
  811. CFile File;
  812. if(!File.Open(strEvpFile, CFile::modeRead | CFile::typeBinary))
  813. {
  814. outMsg.Format("%s%s", MiniCT_1320, strEvpFile);//打开文件失败
  815. return FALSE;
  816. }
  817. EVP_CIPHER_CTX Ctx, CtxTemp;
  818. if(!CEvp::InitCrypt2(strCpName, strPwd, 0, Ctx))
  819. {
  820. outMsg = MiniCT_1314;//"初始化加密结构失败";
  821. File.Close();
  822. return FALSE;
  823. }
  824. CString strPathName;
  825. //枚举目录列表加密信息
  826. CList<CDataSafe *, CDataSafe *> DataList; //文件和目录信息列表
  827. CList<CDataSafe *, CDataSafe *> DirList; //目录信息列表
  828. EnumList(&DataList, &DirList);
  829. POSITION pos = DataList.GetHeadPosition();
  830. int iCount = DataList.GetCount();
  831. m_ProgAll.SetRange(0, iCount);
  832. int iFinish = 0;
  833. while(pos != NULL)
  834. {
  835. CDataSafe* pDataSafe = DataList.GetNext(pos);
  836. if(pDataSafe)
  837. {
  838. strPathName = GetPathName(pDataSafe, &DirList);
  839. if(pDataSafe->bIsFile) //文件
  840. {
  841. //结构中加密起始位置赋值
  842. CtxTemp = Ctx;
  843. File.Seek(pDataSafe->dBeginSeek, CFile::begin);
  844. dOutLen = CEvp::Crypt2(&CtxTemp, strPathName, 
  845. File, pDataSafe->dNewLen, outMsg);
  846. if(-1 == dOutLen)
  847. {
  848. bRet =  FALSE;
  849. break;
  850. }
  851. else if(dOutLen != pDataSafe->dOldLen)
  852. {
  853. outMsg.Format("%s%s", strPathName, MiniCT_1321); //文件大小校验失败
  854. bRet =  FALSE;
  855. break;
  856. }
  857. }
  858. else//目录 ->建立目录
  859. {
  860. if(!Mdir(strPathName, outMsg))
  861. {
  862. bRet =  FALSE;
  863. break;
  864. }
  865. }
  866. m_ProgAll.SetPos(++iFinish);
  867. }
  868. }
  869. File.Close();
  870. CleanList(&DataList);
  871. CEvp::CleanCrypt2(Ctx);
  872. return bRet;
  873. }
  874. //数集摘要
  875. //参数: strMdName - 摘要算法名称
  876. // strOutName - 保存结果的EVP文件名称
  877. // outMsg - 返回操作信息
  878. BOOL CSafeDataSetPage::Digest(CString strMdName, CString strOutName, CString & outMsg)
  879. {
  880. //输入检查
  881. if(strMdName.IsEmpty() || strOutName.IsEmpty())
  882. {
  883. outMsg = MiniCT_1322;//"算法名称或输出文件非法";
  884. return FALSE;
  885. }
  886. CFile File;//文件头加版本信息
  887. if(!File.Open(strOutName, CFile::modeCreate | CFile::modeWrite | CFile::typeBinary ))
  888. {
  889. outMsg = MiniCT_1313;//"创建文件失败";
  890. return FALSE;
  891. }
  892. int nCount = m_DataSetList.GetCount();
  893. DWORD dFileInfoLen = 0;
  894. //创建信息头
  895. if(!MadeFileHead(File, nCount, dFileInfoLen, outMsg))
  896. return FALSE;
  897. DWORD dOutLen = -1;
  898. EVP_MD_CTX mdCtx, mdCtxTemp;
  899. //初始化CTX
  900. CEvp::InitDigest2(strMdName, mdCtx);
  901. //枚举目录列表加密信息
  902. CList<CDataSafe *, CDataSafe *> DataList;
  903. EnumList(&DataList);
  904. POSITION pos = DataList.GetHeadPosition();
  905. int iCount = DataList.GetCount();
  906. m_ProgAll.SetRange(0, iCount);
  907. int iFinish = 0;
  908. while(pos != NULL)
  909. {
  910. CDataSafe* pDataSafe = DataList.GetNext(pos);
  911. if(pDataSafe)
  912. {
  913. if(pDataSafe->bIsFile) //文件则加密
  914. {
  915. mdCtxTemp = mdCtx;
  916. //结构中加密起始位置赋值
  917. pDataSafe->dBeginSeek = File.GetPosition();
  918. dOutLen = CEvp::Digest2(&mdCtxTemp, pDataSafe->cPathName, File, outMsg);
  919. if(dOutLen == -1)
  920. {
  921. CString str;
  922. str.Format("%s%s", MiniCT_1323, pDataSafe->cName); //摘要文件失败
  923. outMsg = str;
  924. File.Close();
  925. CleanList(&DataList);
  926. return FALSE;
  927. }
  928. else//结构赋值
  929. {
  930. pDataSafe->dNewLen = dOutLen;
  931. }
  932. }
  933. m_ProgAll.SetPos(++iFinish);
  934. }
  935. }
  936. //创建信息颈
  937. if(!MadeFileNeck(&DataList, File, DIGEST, nCount, dFileInfoLen, outMsg))
  938. {
  939. File.Close();
  940. CEvp::CleanDigest2(mdCtx);
  941. CleanList(&DataList);
  942. return FALSE;
  943. }
  944. File.Close();
  945. CEvp::CleanDigest2(mdCtx);
  946. CleanList(&DataList);
  947. return TRUE;
  948. }
  949. //摘要验证
  950. BOOL CSafeDataSetPage::VerifyDigest(CString strMdName, CString strEvpFile, CString & outStr)
  951. {
  952. EVP_MD_CTX mdCtx, mdCtxTemp;
  953. //解密信息
  954. BOOL bRet = TRUE;
  955. CFile File;
  956. if(!File.Open(strEvpFile, CFile::modeRead | CFile::typeBinary))
  957. {
  958. outStr.Format("%s%s", MiniCT_1320, strEvpFile); //打开文件失败
  959. return FALSE;
  960. }
  961. // 文件版本标记 - Evp20
  962. // 信息颈长度 - DWORD
  963. // 信息颈长度CRC码 - UINT
  964. File.Seek(strlen(m_sHeadMark), CFile::begin);
  965. DWORD dFileInfoLen = 0; 
  966. File.Read(&dFileInfoLen, sizeof(DWORD));
  967. File.Seek(sizeof(UINT), CFile::current);
  968. File.Seek(dFileInfoLen, CFile::current);
  969. //初始化CTX
  970. CEvp::InitDigest2(strMdName, mdCtx);
  971. {
  972. File.Close();
  973. return FALSE;
  974. }
  975. CString strPathName;
  976. //枚举目录列表加密信息
  977. CList<CDataSafe *, CDataSafe *> DataList; //文件和目录信息列表
  978. CList<CDataSafe *, CDataSafe *> DirList; //目录信息列表
  979. EnumList(&DataList, &DirList);
  980. POSITION pos = DataList.GetHeadPosition();
  981. int iCount = DataList.GetCount();
  982. m_ProgAll.SetRange(0, iCount);
  983. int iFinish = 0;
  984. while(pos != NULL)
  985. {
  986. CDataSafe* pDataSafe = DataList.GetNext(pos);
  987. if(pDataSafe)
  988. {
  989. strPathName = GetPathName(pDataSafe, &DirList);
  990. if(pDataSafe->bIsFile) //文件
  991. {
  992. //结构中加密起始位置赋值
  993. mdCtxTemp = mdCtx;
  994. File.Seek(pDataSafe->dBeginSeek, CFile::begin);
  995. bRet = CEvp::VerifyDigest2(&mdCtxTemp, strPathName, File, pDataSafe->dNewLen, outStr);
  996. }
  997. m_ProgAll.SetPos(++iFinish);
  998. }
  999. }
  1000. CleanList(&DataList);
  1001. File.Close();
  1002. CEvp::CleanDigest2(mdCtx);
  1003. return bRet;
  1004. }
  1005. //数字签名
  1006. BOOL CSafeDataSetPage::Sign(CString strMdName, const BYTE * pCertBuf, const UINT nCertLen, CString strPwd,
  1007.   CString strOutName, CString & outStr)
  1008. {
  1009. EVP_MD_CTX md_Ctx = {0};
  1010. EVP_PKEY * pkey = NULL;
  1011. X509 * px509 = NULL;
  1012. CEvp::InitSign2(strMdName, md_Ctx, (char *)pCertBuf, nCertLen, strPwd, px509, pkey);
  1013. CFile File;//文件头加版本信息
  1014. if(!File.Open(strOutName, CFile::modeCreate | CFile::modeWrite | CFile::typeBinary ))
  1015. {
  1016. outStr.Format("%s%s", MiniCT_1313, strOutName);//创建文件失败
  1017. return FALSE;
  1018. }
  1019. int nCount = m_DataSetList.GetCount();
  1020. DWORD dFileInfoLen = 0;
  1021. //创建信息头
  1022. if(!MadeFileHead(File, nCount, dFileInfoLen, outStr))
  1023. {
  1024. File.Close();
  1025. return FALSE;
  1026. }
  1027. DWORD dOutLen = -1;
  1028. //枚举目录列表加密信息
  1029. CList<CDataSafe *, CDataSafe *> DataList;
  1030. EnumList(&DataList);
  1031. POSITION pos = DataList.GetHeadPosition();
  1032. int iCount = DataList.GetCount();
  1033. m_ProgAll.SetRange(0, iCount);
  1034. int iFinish = 0;
  1035. CString strInfo;
  1036. while(pos != NULL)
  1037. {
  1038. CDataSafe* pDataSafe = DataList.GetNext(pos);
  1039. if(pDataSafe)
  1040. {
  1041. if(pDataSafe->bIsFile) //文件则加密
  1042. {
  1043. //结构中加密起始位置赋值
  1044. // strInfo.Format("文件 %s ,大小 %d 加密中...", pDataSafe->cName, pDataSafe->dOldLen);
  1045. strInfo.Format("%s %s ,%s %d %s", MiniCT_1315, pDataSafe->cName, MiniCT_1316, pDataSafe->dOldLen, MiniCT_1317);
  1046. AddOnceMsg(strInfo);
  1047. pDataSafe->dBeginSeek = File.GetPosition();
  1048. dOutLen = CEvp::Sign2(&md_Ctx, pkey, pDataSafe->cPathName, File, outStr);
  1049. if(dOutLen == -1)
  1050. {
  1051. CString str;
  1052. str.Format("%s%s, %s%s", MiniCT_1324, pDataSafe->cName, MiniCT_1319, outStr); //签名失败%s, 失败原因:%s
  1053. outStr = str;
  1054. File.Close();
  1055. CleanList(&DataList);
  1056. return FALSE;
  1057. }
  1058. else//结构赋值
  1059. {
  1060. pDataSafe->dNewLen = dOutLen;
  1061. }
  1062. }
  1063. m_ProgAll.SetPos(++iFinish);
  1064. }
  1065. }
  1066. //创建信息颈
  1067. if(!MadeFileNeck(&DataList, File, SIGN, nCount, dFileInfoLen, outStr))
  1068. {
  1069. File.Close();
  1070. CleanList(&DataList);
  1071. CEvp::CleanSign2(md_Ctx, px509, pkey);
  1072. return FALSE;
  1073. }
  1074. CEvp::CleanSign2(md_Ctx, px509, pkey);
  1075. File.Close();
  1076. CleanList(&DataList);
  1077. return TRUE;
  1078. }
  1079. //验证数字签名
  1080. BOOL CSafeDataSetPage::VerifySign(CString strMdName, const BYTE * pCertBuf, const UINT nCertLen,
  1081.   CString strEvpFile, CString & outStr)
  1082. {
  1083. EVP_MD_CTX mdCtx = {0},
  1084. mdCtxTemp = {0};
  1085. EVP_PKEY * pkey = NULL;
  1086. X509 * px509 = NULL;
  1087. BOOL bRet = TRUE;
  1088. CFile File;
  1089. if(!File.Open(strEvpFile, CFile::modeRead | CFile::typeBinary))
  1090. {
  1091. outStr.Format("%s%s", MiniCT_1320, strEvpFile);//"打开文件失败%s"
  1092. return FALSE;
  1093. }
  1094. CEvp::InitSign2(strMdName, mdCtx, (char *)pCertBuf, nCertLen, NULL, px509, pkey);
  1095. // 文件版本标记 - Evp20
  1096. // 信息颈长度 - DWORD
  1097. // 信息颈长度CRC码 - UINT
  1098. File.Seek(strlen(m_sHeadMark), CFile::begin);
  1099. DWORD dFileInfoLen = 0; 
  1100. File.Read(&dFileInfoLen, sizeof(DWORD));
  1101. File.Seek(sizeof(UINT), CFile::current);
  1102. File.Seek(dFileInfoLen, CFile::current);
  1103. CString strPathName;
  1104. //枚举目录列表加密信息
  1105. CList<CDataSafe *, CDataSafe *> DataList; //文件和目录信息列表
  1106. CList<CDataSafe *, CDataSafe *> DirList; //目录信息列表
  1107. EnumList(&DataList, &DirList);
  1108. POSITION pos = DataList.GetHeadPosition();
  1109. int iCount = DataList.GetCount();
  1110. m_ProgAll.SetRange(0, iCount);
  1111. int iFinish = 0;
  1112. while(pos != NULL)
  1113. {
  1114. CDataSafe* pDataSafe = DataList.GetNext(pos);
  1115. if(pDataSafe)
  1116. {
  1117. strPathName = GetPathName(pDataSafe, &DirList);
  1118. if(pDataSafe->bIsFile) //文件
  1119. {
  1120. //结构中加密起始位置赋值
  1121. mdCtxTemp = mdCtx;
  1122. File.Seek(pDataSafe->dBeginSeek, CFile::begin);
  1123. bRet = CEvp::VerifySign2(&mdCtxTemp, pkey, strPathName, File, pDataSafe->dNewLen, outStr);
  1124. }
  1125. m_ProgAll.SetPos(++iFinish);
  1126. }
  1127. }
  1128. CleanList(&DataList);
  1129. File.Close();
  1130. CEvp::CleanDigest2(mdCtx);
  1131. return TRUE;
  1132. }
  1133. //功能:多证书数字信封
  1134. //参数:
  1135. // pCERT -- [in]合法用户公钥链
  1136. // strCpName -- 算法名称
  1137. // outMsg -- [OUT]返回错误信息
  1138. BOOL CSafeDataSetPage::Seal(CEvp::stuCertLink * pCERT, CString strCpName,
  1139. CString strOutName, CString & outMsg)
  1140. {
  1141. CFile File;//文件头加版本信息
  1142. if(!File.Open(strOutName, CFile::modeCreate | CFile::modeWrite | CFile::typeBinary ))
  1143. {
  1144. outMsg.Format("%s%s", MiniCT_1313, strOutName);//"创建文件失败%s"
  1145. return FALSE;
  1146. }
  1147. int nCount = m_DataSetList.GetCount();
  1148. DWORD dFileInfoLen = 0;
  1149. //创建信息头
  1150. if(!MadeFileHead(File, nCount, dFileInfoLen, outMsg))
  1151. {
  1152. File.Close();
  1153. return FALSE;
  1154. }
  1155. DWORD dOutLen = -1;
  1156. EVP_CIPHER_CTX eCtx, eCtxTemp;
  1157. //初始化CTX
  1158. if(!CEvp::InitSeal2(pCERT, strCpName, File, eCtx, outMsg))
  1159. {
  1160. File.Close();
  1161. return FALSE;
  1162. }
  1163. //枚举目录列表加密信息
  1164. CList<CDataSafe *, CDataSafe *> DataList;
  1165. EnumList(&DataList);
  1166. POSITION pos = DataList.GetHeadPosition();
  1167. int iCount = DataList.GetCount();
  1168. m_ProgAll.SetRange(0, iCount);
  1169. int iFinish = 0;
  1170. CString strInfo;
  1171. // CDC* pDC = m_DataSetList.GetDC();
  1172. while(pos != NULL)
  1173. {
  1174. // m_DataSetList.DrawProgressBar(pDC, 0, 2);
  1175. CDataSafe* pDataSafe = DataList.GetNext(pos);
  1176. if(pDataSafe)
  1177. {
  1178. if(pDataSafe->bIsFile) //文件则加密
  1179. {
  1180. //初始化CTX
  1181. // strInfo.Format("文件 %s ,大小 %d 加密中...", pDataSafe->cName, pDataSafe->dOldLen);
  1182. strInfo.Format("%s %s ,%s %d %s", MiniCT_1315, pDataSafe->cName, MiniCT_1316, pDataSafe->dOldLen, MiniCT_1317);
  1183. AddOnceMsg(strInfo);
  1184. eCtxTemp = eCtx;
  1185. //结构中加密起始位置赋值
  1186. pDataSafe->dBeginSeek = File.GetPosition();
  1187. dOutLen = CEvp::Seal2(&eCtxTemp, pDataSafe->cPathName, File, outMsg);
  1188. if(dOutLen == -1)
  1189. {
  1190. CString str;
  1191. str.Format("%s%s, %s%s", MiniCT_1325, pDataSafe->cName, MiniCT_1319, outMsg);//"封装文件失败%s, 失败原因:%s"
  1192. outMsg = str;
  1193. File.Close();
  1194. CleanList(&DataList);
  1195. return FALSE;
  1196. }
  1197. else//结构赋值
  1198. {
  1199. pDataSafe->dNewLen = dOutLen;
  1200. }
  1201. }
  1202. m_ProgAll.SetPos(++iFinish);
  1203. }
  1204. }
  1205. // m_DataSetList.ReleaseDC(pDC);
  1206. //创建信息颈
  1207. if(!MadeFileNeck(&DataList, File, SEAL, nCount, dFileInfoLen, outMsg))
  1208. {
  1209. File.Close();
  1210. CEvp::CleanSeal2(eCtx);
  1211. CleanList(&DataList);
  1212. return FALSE;
  1213. }
  1214. File.Close();
  1215. CEvp::CleanSeal2(eCtx);
  1216. CleanList(&DataList);
  1217. return TRUE;
  1218. }
  1219. //拆封数字信封
  1220. BOOL CSafeDataSetPage::OpenSeal(char * pKey, UINT ukeyLen, char * pwd, CString strCpName,
  1221. CString strEvpFile, CString & outStr)
  1222. {
  1223. //解密信息
  1224. DWORD dOutLen = -1;
  1225. BOOL bRet = TRUE;
  1226. CFile File;
  1227. if(!File.Open(strEvpFile, CFile::modeRead | CFile::typeBinary))
  1228. {
  1229. outStr.Format("%s%s", MiniCT_1320, strEvpFile);//"打开文件%s失败"
  1230. return FALSE;
  1231. }
  1232. // 文件版本标记 - Evp20
  1233. // 信息颈长度 - DWORD
  1234. // 信息颈长度CRC码 - UINT
  1235. File.Seek(strlen(m_sHeadMark), CFile::begin);
  1236. DWORD dFileInfoLen = 0; 
  1237. File.Read(&dFileInfoLen, sizeof(DWORD));
  1238. File.Seek(sizeof(UINT), CFile::current);
  1239. File.Seek(dFileInfoLen, CFile::current);
  1240. EVP_CIPHER_CTX Ctx, CtxTemp;
  1241. if(!CEvp::InitOpenSeal2(pKey, ukeyLen, pwd, strCpName, File, Ctx, outStr))
  1242. {
  1243. File.Close();
  1244. outStr.Format(MiniCT_1314);//"初始化加密结构失败"
  1245. return FALSE;
  1246. }
  1247. CString strPathName;
  1248. //枚举目录列表加密信息
  1249. CList<CDataSafe *, CDataSafe *> DataList; //文件和目录信息列表
  1250. CList<CDataSafe *, CDataSafe *> DirList; //目录信息列表
  1251. EnumList(&DataList, &DirList);
  1252. POSITION pos = DataList.GetHeadPosition();
  1253. int iCount = DataList.GetCount();
  1254. m_ProgAll.SetRange(0, iCount);
  1255. int iFinish = 0;
  1256. while(pos != NULL)
  1257. {
  1258. CDataSafe* pDataSafe = DataList.GetNext(pos);
  1259. if(pDataSafe)
  1260. {
  1261. strPathName = GetPathName(pDataSafe, &DirList);
  1262. if(pDataSafe->bIsFile) //文件
  1263. {
  1264. //结构中加密起始位置赋值
  1265. CtxTemp = Ctx;
  1266. File.Seek(pDataSafe->dBeginSeek, CFile::begin);
  1267. dOutLen = CEvp::OpenSeal2(CtxTemp, File, pDataSafe->dNewLen, strPathName, outStr);
  1268. if(-1 == dOutLen)
  1269. {
  1270. bRet =  FALSE;
  1271. break;
  1272. }
  1273. else if(dOutLen != pDataSafe->dOldLen)
  1274. {
  1275. outStr.Format("%s%s", MiniCT_1321, strPathName);//文件%s大小校验失败
  1276. bRet =  FALSE;
  1277. break;
  1278. }
  1279. }
  1280. else//目录 ->建立目录
  1281. {
  1282. if(!Mdir(strPathName, outStr))
  1283. {
  1284. bRet =  FALSE;
  1285. break;
  1286. }
  1287. }
  1288. m_ProgAll.SetPos(++iFinish);
  1289. }
  1290. }
  1291. CleanList(&DataList);
  1292. File.Close();
  1293. CEvp::CleanOpenSeal2(Ctx);
  1294. return bRet;
  1295. }
  1296. //公钥加密
  1297. BOOL CSafeDataSetPage::RSAPubEnc(const BYTE * pCertBuf, const UINT nCertLen,
  1298.   CString strOutName, CString & outStr)
  1299. {
  1300. RSA * pRsa = NULL;
  1301. if(!CEvp::GetPubRsa(pCertBuf, nCertLen,pRsa))
  1302. {
  1303. outStr.Format("%s", MiniCT_1326); //取得公钥RSA结构失败
  1304. return FALSE;
  1305. }
  1306. CFile File;//文件头加版本信息
  1307. if(!File.Open(strOutName, CFile::modeCreate | CFile::modeWrite | CFile::typeBinary ))
  1308. {
  1309. outStr.Format("%s%s", MiniCT_1313, strOutName);//创建文件失败%s
  1310. return FALSE;
  1311. }
  1312. int nCount = m_DataSetList.GetCount();
  1313. DWORD dFileInfoLen = 0;
  1314. //创建信息头
  1315. if(!MadeFileHead(File, nCount, dFileInfoLen, outStr))
  1316. {
  1317. File.Close();
  1318. return FALSE;
  1319. }
  1320. DWORD dOutLen = -1;
  1321. //枚举目录列表加密信息
  1322. CList<CDataSafe *, CDataSafe *> DataList;
  1323. EnumList(&DataList);
  1324. POSITION pos = DataList.GetHeadPosition();
  1325. int iCount = DataList.GetCount();
  1326. m_ProgAll.SetRange(0, iCount);
  1327. int iFinish = 0;
  1328. CString strInfo;
  1329. while(pos != NULL)
  1330. {
  1331. CDataSafe* pDataSafe = DataList.GetNext(pos);
  1332. if(pDataSafe)
  1333. {
  1334. if(pDataSafe->bIsFile) //文件则加密
  1335. {
  1336. //结构中加密起始位置赋值
  1337. strInfo.Format("%s %s ,%s %d %s", MiniCT_1315, pDataSafe->cName, MiniCT_1316, pDataSafe->dOldLen, MiniCT_1317);
  1338. // strInfo.Format("文件 %s ,大小 %d 加密中...", pDataSafe->cName, pDataSafe->dOldLen);
  1339. AddOnceMsg(strInfo);
  1340. pDataSafe->dBeginSeek = File.GetPosition();
  1341. dOutLen = CEvp::RSAPubEnc2(pRsa, pDataSafe->cPathName, File, outStr);
  1342. if(dOutLen == -1)
  1343. {
  1344. CString str;
  1345. str.Format("%s%s%s%s", MiniCT_1327, pDataSafe->cName, MiniCT_1319, outStr); //公钥加密文件失败%s,失败原因:%s
  1346. outStr = str;
  1347. File.Close();
  1348. CleanList(&DataList);
  1349. return FALSE;
  1350. }
  1351. else//结构赋值
  1352. {
  1353. pDataSafe->dNewLen = dOutLen;
  1354. }
  1355. }
  1356. m_ProgAll.SetPos(++iFinish);
  1357. }
  1358. }
  1359. //创建信息颈
  1360. if(!MadeFileNeck(&DataList, File, PubEnc, nCount, dFileInfoLen, outStr))
  1361. {
  1362. CleanList(&DataList);
  1363. File.Close();
  1364. CEvp::FreeRsa(pRsa);
  1365. return FALSE;
  1366. }
  1367. CEvp::FreeRsa(pRsa);
  1368. CleanList(&DataList);
  1369. File.Close();
  1370. return TRUE;
  1371. }
  1372. //私钥解密
  1373. BOOL CSafeDataSetPage::RSAPriDec(const BYTE * pCertBuf, const UINT nCertLen, CString strPwd, CString strEvpFile,
  1374.   CString & outStr)
  1375. {
  1376. RSA * pRsa = NULL;
  1377. if(!CEvp::GetPrivRsa(pCertBuf, nCertLen, strPwd, pRsa))
  1378. {
  1379. outStr.Format("%s", MiniCT_1326);//"取得私钥RSA结构失败"
  1380. return FALSE;
  1381. }
  1382. DWORD dOutLen = -1;
  1383. BOOL bRet = TRUE;
  1384. CFile File;
  1385. if(!File.Open(strEvpFile, CFile::modeRead | CFile::typeBinary))
  1386. {
  1387. outStr.Format("%s%s", MiniCT_1320, strEvpFile);//打开文件失败%s
  1388. return FALSE;
  1389. }
  1390. CString strPathName;
  1391. //枚举目录列表加密信息
  1392. CList<CDataSafe *, CDataSafe *> DataList; //文件和目录信息列表
  1393. CList<CDataSafe *, CDataSafe *> DirList; //目录信息列表
  1394. EnumList(&DataList, &DirList);
  1395. POSITION pos = DataList.GetHeadPosition();
  1396. int iCount = DataList.GetCount();
  1397. m_ProgAll.SetRange(0, iCount);
  1398. int iFinish = 0;
  1399. while(pos != NULL)
  1400. {
  1401. CDataSafe* pDataSafe = DataList.GetNext(pos);
  1402. if(pDataSafe)
  1403. {
  1404. strPathName = GetPathName(pDataSafe, &DirList);
  1405. if(pDataSafe->bIsFile) //文件
  1406. {
  1407. File.Seek(pDataSafe->dBeginSeek, CFile::begin);
  1408. dOutLen = CEvp::RSAPrivDec2(pRsa, File, pDataSafe->dNewLen, strPathName, outStr);
  1409. if(-1 == dOutLen)
  1410. {
  1411. bRet =  FALSE;
  1412. break;
  1413. }
  1414. else if(dOutLen != pDataSafe->dOldLen)
  1415. {
  1416. outStr.Format("%s%s", MiniCT_1321, strPathName);
  1417. bRet =  FALSE;
  1418. break;
  1419. }
  1420. }
  1421. else//目录 ->建立目录
  1422. {
  1423. if(!Mdir(strPathName, outStr))
  1424. {
  1425. bRet =  FALSE;
  1426. break;
  1427. }
  1428. }
  1429. m_ProgAll.SetPos(++iFinish);
  1430. }
  1431. }
  1432. CleanList(&DataList);
  1433. CEvp::FreeRsa(pRsa);
  1434. File.Close();
  1435. return bRet;
  1436. }
  1437. //私钥加密
  1438. BOOL CSafeDataSetPage::RSAPrivEnc(const BYTE * pCertBuf, const UINT nCertLen, CString strPwd,
  1439.   CString strOutName, CString & outStr)//私钥加密
  1440. {
  1441. RSA * pRsa = NULL;
  1442. if(!CEvp::GetPrivRsa(pCertBuf, nCertLen, strPwd, pRsa))
  1443. {
  1444. outStr.Format("%s", MiniCT_1326);//"取得私钥RSA结构失败"
  1445. return FALSE;
  1446. }
  1447. CFile File;//文件头加版本信息
  1448. if(!File.Open(strOutName, CFile::modeCreate | CFile::modeWrite | CFile::typeBinary ))
  1449. {
  1450. outStr.Format("%s%s", MiniCT_1313, strOutName);
  1451. return FALSE;
  1452. }
  1453. int nCount = m_DataSetList.GetCount();
  1454. DWORD dFileInfoLen = 0;
  1455. //创建信息头
  1456. if(!MadeFileHead(File, nCount, dFileInfoLen, outStr))
  1457. {
  1458. File.Close();
  1459. return FALSE;
  1460. }
  1461. DWORD dOutLen = -1;
  1462. //枚举目录列表加密信息
  1463. CList<CDataSafe *, CDataSafe *> DataList;
  1464. EnumList(&DataList);
  1465. POSITION pos = DataList.GetHeadPosition();
  1466. int iCount = DataList.GetCount();
  1467. m_ProgAll.SetRange(0, iCount);
  1468. int iFinish = 0;
  1469. CString strInfo;
  1470. while(pos != NULL)
  1471. {
  1472. CDataSafe* pDataSafe = DataList.GetNext(pos);
  1473. if(pDataSafe)
  1474. {
  1475. if(pDataSafe->bIsFile) //文件则加密
  1476. {
  1477. //结构中加密起始位置赋值
  1478. strInfo.Format("%s %s ,%s %d %s", MiniCT_1315, pDataSafe->cName, MiniCT_1316, pDataSafe->dOldLen, MiniCT_1317);
  1479. // strInfo.Format("文件 %s ,大小 %d 加密中...", pDataSafe->cName, pDataSafe->dOldLen);
  1480. AddOnceMsg(strInfo);
  1481. pDataSafe->dBeginSeek = File.GetPosition();
  1482. dOutLen = CEvp::RSAPrivEnc2(pRsa, pDataSafe->cPathName, File, outStr);
  1483. if(dOutLen == -1)
  1484. {
  1485. CString str;
  1486. str.Format("%s%s%s%s", MiniCT_1328, pDataSafe->cName, MiniCT_1319, outStr);//私钥加密文件失败%s, 失败原因:%s
  1487. outStr = str;
  1488. File.Close();
  1489. CleanList(&DataList);
  1490. return FALSE;
  1491. }
  1492. else//结构赋值
  1493. {
  1494. pDataSafe->dNewLen = dOutLen;
  1495. }
  1496. }
  1497. m_ProgAll.SetPos(++iFinish);
  1498. }
  1499. }
  1500. //创建信息颈
  1501. if(!MadeFileNeck(&DataList, File, PrivEnc, nCount, dFileInfoLen, outStr))
  1502. {
  1503. File.Close();
  1504. CleanList(&DataList);
  1505. CEvp::FreeRsa(pRsa);
  1506. return FALSE;
  1507. }
  1508. CEvp::FreeRsa(pRsa);
  1509. File.Close();
  1510. CleanList(&DataList);
  1511. return TRUE;
  1512. }
  1513. //公钥解密
  1514. BOOL CSafeDataSetPage::RSAPubDec(const BYTE * pCertBuf, const UINT nCertLen, CString strEvpFile,
  1515.  CString & outStr)
  1516. {
  1517. RSA * pRsa = NULL;
  1518. if(!CEvp::GetPubRsa(pCertBuf, nCertLen, pRsa))
  1519. {
  1520. outStr.Format("%s", MiniCT_1326);
  1521. return FALSE;
  1522. }
  1523. DWORD dOutLen = -1;
  1524. BOOL bRet = TRUE;
  1525. CFile File;
  1526. if(!File.Open(strEvpFile, CFile::modeRead | CFile::typeBinary))
  1527. {
  1528. outStr.Format("%s%s", MiniCT_1320, strEvpFile);//打开文件失败%s
  1529. return FALSE;
  1530. }
  1531. CString strPathName;
  1532. //枚举目录列表加密信息
  1533. CList<CDataSafe *, CDataSafe *> DataList; //文件和目录信息列表
  1534. CList<CDataSafe *, CDataSafe *> DirList; //目录信息列表
  1535. EnumList(&DataList, &DirList);
  1536. POSITION pos = DataList.GetHeadPosition();
  1537. int iCount = DataList.GetCount();
  1538. m_ProgAll.SetRange(0, iCount);
  1539. int iFinish = 0;
  1540. while(pos != NULL)
  1541. {
  1542. CDataSafe* pDataSafe = DataList.GetNext(pos);
  1543. if(pDataSafe)
  1544. {
  1545. strPathName = GetPathName(pDataSafe, &DirList);
  1546. if(pDataSafe->bIsFile) //文件
  1547. {
  1548. File.Seek(pDataSafe->dBeginSeek, CFile::begin);
  1549. dOutLen = CEvp::RSAPubDec2(pRsa, File, pDataSafe->dNewLen, strPathName, outStr);
  1550. if(-1 == dOutLen)
  1551. {
  1552. CString str;
  1553. str.Format("%s%s%s%s", MiniCT_1329, pDataSafe->cPathName, MiniCT_1319, outStr);//公钥解密文件失败%s, 失败原因:%s
  1554. outStr = str;
  1555. bRet =  FALSE;
  1556. break;
  1557. }
  1558. else if(dOutLen != pDataSafe->dOldLen)
  1559. {
  1560. outStr.Format("%s%s", MiniCT_1321, strPathName);
  1561. bRet =  FALSE;
  1562. break;
  1563. }
  1564. }
  1565. else//目录 ->建立目录
  1566. {
  1567. if(!Mdir(strPathName, outStr))
  1568. {
  1569. bRet =  FALSE;
  1570. break;
  1571. }
  1572. }
  1573. m_ProgAll.SetPos(++iFinish);
  1574. }
  1575. }
  1576. CleanList(&DataList);
  1577. CEvp::FreeRsa(pRsa);
  1578. File.Close();
  1579. return bRet;
  1580. }
  1581. ////////////////////////////////////////////////加密部分结束///////////////////////////////////////////////////
  1582. void CSafeDataSetPage::OnDblclkListDataset(NMHDR* pNMHDR, LRESULT* pResult)
  1583. {
  1584. // TODO: Add your control notification handler code here
  1585. //双击,如果是未加密的,则打开LIST中目录,文件则打开文件
  1586. //如果是加密的,就解密到临时目录,并打开
  1587. int nIndex = m_DataSetList.GetSelectedItem();
  1588. if(nIndex == -1)
  1589. return;
  1590. CSuperGridCtrl::CTreeItem * pItem = m_DataSetList.GetTreeItem(nIndex);
  1591. if(!pItem)
  1592. return;
  1593. CItemInfo * pInfo = m_DataSetList.GetData(pItem ); 
  1594. const CDataSafe * pDataSafe = pInfo->GetDataSafe();
  1595. if(pDataSafe == NULL)
  1596. return;
  1597. if(pDataSafe->bIsFile) //执行
  1598. {
  1599. CString strOut;
  1600. CString strPathName;
  1601. BOOL bSucceed = TRUE;
  1602. if(m_bIsEnc) //未加密文件
  1603. {
  1604. strPathName.Format("%s", pDataSafe->cPathName);
  1605. }
  1606. else //解密到临时目录
  1607. {
  1608. //取得临时路径
  1609. TCHAR szTempPath[MAX_PATH];
  1610. DWORD dwResult=:: GetTempPath (MAX_PATH, szTempPath);
  1611. ASSERT (dwResult);
  1612. //创建临时文件
  1613. // TCHAR szTempFile[MAX_PATH];
  1614. // UINT nResult = GetTempFileName (szTempPath, _T ("~mc"), 0, szTempFile);
  1615. strPathName.Format("%s\%s",szTempPath, pDataSafe->cName);
  1616. bSucceed = DecOneFile(m_strEvpPath, strPathName, pDataSafe->dBeginSeek, 
  1617. pDataSafe->dNewLen, pDataSafe->dOldLen, strOut);
  1618. }
  1619. if(bSucceed)
  1620. ShellExecute(this->m_hWnd, "open", strPathName, "", "", SW_SHOWNORMAL);
  1621. else
  1622. AddMsg(strOut, M_ERROR);
  1623. }
  1624. else//展开
  1625. {
  1626. BOOL bRedraw=0;
  1627. if(m_DataSetList.ItemHasChildren(pItem))
  1628. {
  1629. m_DataSetList.SetRedraw(0);
  1630. int nScrollIndex=0;
  1631. if(m_DataSetList.IsCollapsed(pItem))
  1632. {
  1633. if(m_DataSetList.OnItemExpanding(pItem, nIndex))
  1634. {
  1635. nScrollIndex = m_DataSetList.Expand(pItem, nIndex);
  1636. m_DataSetList.OnItemExpanded(pItem, nIndex);
  1637. bRedraw=1;
  1638. }
  1639. }
  1640. else 
  1641. {
  1642. if(m_DataSetList.OnCollapsing(pItem))
  1643. {
  1644. m_DataSetList.Collapse(pItem);
  1645. m_DataSetList.OnItemCollapsed(pItem);
  1646. bRedraw=1;
  1647. }
  1648. }
  1649. m_DataSetList.SetRedraw(1);
  1650. if(bRedraw)
  1651. {
  1652. CRect rc;
  1653. m_DataSetList.GetItemRect(nIndex,rc,LVIR_BOUNDS);
  1654. m_DataSetList.InvalidateRect(rc);
  1655. m_DataSetList.UpdateWindow();
  1656. m_DataSetList.EnsureVisible(nScrollIndex,1);
  1657. }
  1658. }//ItemHasChildren
  1659. }
  1660. *pResult = 0;
  1661. }
  1662. //只是解密时候用,加密时候结构中保存了路径信息
  1663. //给定某个结构信息,附加父信息在其上面
  1664. //例如,结构为文件结构,文件名为minica.rar
  1665. //父结构肯定为目录结构,目录名为minica
  1666. //minica的父结构也存在,目录名为vc
  1667. //vc没有分目录
  1668. //最后的附加信息为:vc\minica\minica.rar
  1669. //参数: pDataSafe - 当前的结构信息
  1670. // uMinPid - 最小父结构ID
  1671. //解密时候可能不从根开始解密,这时候需要传递父lpParentItem
  1672. CString CSafeDataSetPage::GetPathName(CDataSafe* pDataSafe, 
  1673.   CList<CDataSafe *, CDataSafe *> * pDataList)
  1674. {
  1675. CString strAllPath, strPathName;//全部路径
  1676. if(!pDataSafe && !pDataList)
  1677. return strAllPath;
  1678. if(pDataSafe->uParentID == 0)//标示没有父
  1679. strPathName = pDataSafe->cName;
  1680. else
  1681. {
  1682. for(CDataSafe* pDataTemp = pDataSafe; ;)
  1683. {
  1684. strPathName = pDataTemp->cName + strPathName;
  1685. strPathName = "\" + strPathName;
  1686. if(pDataTemp->uParentID == 0)
  1687. break;
  1688. POSITION pos = pDataList->FindIndex( pDataTemp->uParentID - 1);
  1689. if(pos)
  1690. {
  1691. pDataTemp = pDataList->GetAt(pos);
  1692. }
  1693. else
  1694. break;
  1695. }
  1696. }
  1697. strAllPath.Format("%s\%s", m_strSavePath, strPathName); //解压到
  1698. if(strAllPath.GetAt(strAllPath.GetLength() - 1) == '\')
  1699. strAllPath = strAllPath.Left(strAllPath.GetLength() - 1);
  1700. return strAllPath;
  1701. }
  1702. BOOL CSafeDataSetPage::Mdir(CString strPathName, CString & strInfo)
  1703. {
  1704. strPathName += "\";
  1705. return CMiniCaApp::MakeSureDirectoryPathExists(strPathName);
  1706. /*if(_mkdir(strPathName) == -1)
  1707. {
  1708. if(errno==ENOENT)//目录没有发现
  1709. {
  1710. strInfo.Format("建立目录%s失败!",strPathName);
  1711. return FALSE;
  1712. }
  1713. }*/
  1714. }
  1715. void CSafeDataSetPage::OnRadio1() //对称加密按钮
  1716. {
  1717. // TODO: Add your control notification handler code here
  1718. GetDlgItem(IDC_STATIC_CHIPNAME)->EnableWindow(TRUE);
  1719. GetDlgItem(IDC_STATIC_PWD)->EnableWindow(TRUE);
  1720. GetDlgItem(IDC_COMBO_CRYPT)->EnableWindow(TRUE);
  1721. GetDlgItem(IDC_EDIT_PWD)->EnableWindow(TRUE);
  1722. }
  1723. void CSafeDataSetPage::OnRadio2() //信封加密按钮
  1724. {
  1725. // TODO: Add your control notification handler code here
  1726. GetDlgItem(IDC_STATIC_CHIPNAME)->EnableWindow(TRUE);
  1727. GetDlgItem(IDC_STATIC_PWD)->EnableWindow(FALSE);
  1728. GetDlgItem(IDC_COMBO_CRYPT)->EnableWindow(TRUE);
  1729. GetDlgItem(IDC_EDIT_PWD)->EnableWindow(FALSE);
  1730. }
  1731. void CSafeDataSetPage::OnRadio3() //摘要
  1732. {
  1733. // TODO: Add your control notification handler code here
  1734. }
  1735. void CSafeDataSetPage::OnRadio4() //签名
  1736. {
  1737. // TODO: Add your control notification handler code here
  1738. }
  1739. void CSafeDataSetPage::OnRadio5() //公钥加密按钮
  1740. {
  1741. // TODO: Add your control notification handler code here
  1742. GetDlgItem(IDC_STATIC_CHIPNAME)->EnableWindow(FALSE);
  1743. GetDlgItem(IDC_STATIC_PWD)->EnableWindow(FALSE);
  1744. GetDlgItem(IDC_COMBO_CRYPT)->EnableWindow(FALSE);
  1745. GetDlgItem(IDC_EDIT_PWD)->EnableWindow(FALSE);
  1746. }
  1747. void CSafeDataSetPage::OnRadio6() //私钥加密按钮
  1748. {
  1749. // TODO: Add your control notification handler code here
  1750. GetDlgItem(IDC_STATIC_CHIPNAME)->EnableWindow(FALSE);
  1751. GetDlgItem(IDC_STATIC_PWD)->EnableWindow(FALSE);
  1752. GetDlgItem(IDC_COMBO_CRYPT)->EnableWindow(FALSE);
  1753. GetDlgItem(IDC_EDIT_PWD)->EnableWindow(FALSE);
  1754. }
  1755. void CSafeDataSetPage::OnBEnc() 
  1756. {
  1757. // TODO: Add your control notification handler code here
  1758. if(pThreadEvpSet != NULL )
  1759. return;
  1760. //检测列表中是否有记录
  1761. // int nCount = ;
  1762. if(m_DataSetList.GetCount() == 0)
  1763. {
  1764. AddMsg(MiniCT_1308, M_ERROR);
  1765. return;
  1766. }
  1767. CEvp::SetProgRess(CSafeDataSetPage::m_pProgOne);
  1768. if(m_bIsEnc)//加密
  1769. {
  1770. if(((CButton *)GetDlgItem(IDC_RADIO1))->GetCheck())//对称加密
  1771. {
  1772. m_EncType = CRYPT;
  1773. }
  1774. else if(((CButton *)GetDlgItem(IDC_RADIO2))->GetCheck())//信封加密
  1775. {
  1776. m_EncType = SEAL;
  1777. }
  1778. else if(((CButton *)GetDlgItem(IDC_RADIO3))->GetCheck())//摘要
  1779. {
  1780. m_EncType = DIGEST;
  1781. }
  1782. else if(((CButton *)GetDlgItem(IDC_RADIO4))->GetCheck())//签名
  1783. {
  1784. m_EncType = SIGN;
  1785. }
  1786. else if(((CButton *)GetDlgItem(IDC_RADIO5))->GetCheck())//公钥加密
  1787. {
  1788. m_EncType = PubEnc;
  1789. }
  1790. else if(((CButton *)GetDlgItem(IDC_RADIO6))->GetCheck())//私钥加密
  1791. {
  1792. m_EncType = PrivEnc;
  1793. }
  1794. //出现令存对话框
  1795. CFileDialog dlgOpen(true,NULL,NULL,OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT /*| OFN_NOCHANGEDIR */,
  1796. MiniCT_1345, NULL);
  1797. dlgOpen.m_ofn.lStructSize = sizeof(OPENFILENAME);
  1798. CString str = MiniCT_1343;
  1799. dlgOpen.m_ofn.lpstrTitle = str;//标题条 LPCTSTR
  1800. if(dlgOpen.DoModal()!=IDOK) return;
  1801. m_strEvpPath = dlgOpen.GetPathName();
  1802. CString strExt = m_strEvpPath.Right(4);
  1803. if(strExt.CollateNoCase(".Evp") != 0)
  1804. m_strEvpPath += ".Evp";
  1805. }
  1806. else
  1807. {
  1808. //出现解密到对话框
  1809. if(!SelectPath())
  1810. return;
  1811. }
  1812. pThreadEvpSet = ::AfxBeginThread(_EvpSetThread,this,THREAD_PRIORITY_IDLE);
  1813. }
  1814. void CSafeDataSetPage::OnKeydownListDataset(NMHDR* pNMHDR, LRESULT* pResult) 
  1815. {
  1816. LV_KEYDOWN* pLVKeyDow = (LV_KEYDOWN*)pNMHDR;
  1817. // TODO: Add your control notification handler code here
  1818. if(!m_bIsEnc) //解密,不能删除
  1819. return;
  1820. switch(pLVKeyDow->wVKey)
  1821. {
  1822. case VK_DELETE: //只能删除父目录
  1823. {
  1824. int nItem = m_DataSetList.GetSelectedItem();
  1825. if(nItem!=-1)
  1826. {
  1827. CSuperGridCtrl::CTreeItem * pSelItem = m_DataSetList.GetTreeItem(nItem);
  1828. CItemInfo * pInfo = m_DataSetList.GetData(pSelItem ); 
  1829. if(pInfo->GetDataSafe()->uParentID != 0) //0为根的父
  1830. {
  1831. return;
  1832. }
  1833. //删除拖动链表
  1834. POSITION pos = m_DirName.GetHeadPosition();
  1835. while ( NULL != pos )
  1836. {
  1837. if(m_DirName.GetAt(pos).Compare(pInfo->GetDataSafe()->cPathName) == 0)//删除
  1838. {
  1839. m_DirName.RemoveAt(pos);
  1840. break;
  1841. }
  1842. m_DirName.GetNext(pos);
  1843. }
  1844. m_DataSetList.DeleteItemEx(pSelItem, nItem);
  1845. }
  1846. }
  1847. break;
  1848. }
  1849. *pResult = 0;
  1850. }
  1851. //记录结构信息的MAP,在加密解密之前先要枚举列表到MAP中
  1852. void CSafeDataSetPage::EnumList(CList<CDataSafe *, CDataSafe *> * pDataList, CList<CDataSafe *, CDataSafe *> * pDirList)
  1853. {
  1854. //枚举目录列表加密信息
  1855. POSITION pos = m_DataSetList.GetRootHeadPosition();
  1856. while(pos != NULL)
  1857. {
  1858. CSuperGridCtrl::CTreeItem *pParent = m_DataSetList.GetNextRoot(pos); 
  1859. CSuperGridCtrl::CTreeItem *pItem = pParent;
  1860. CItemInfo* lp = m_DataSetList.GetData(pParent);
  1861. CDataSafe * pDataSafe = new CDataSafe();
  1862. lp->CopyDataSafe(pDataSafe);
  1863. pDataList->AddTail(pDataSafe);
  1864. if(pDirList) //解密时候需要建立目录,此时需要添加目录列表
  1865. {
  1866. if(!pDataSafe->bIsFile)//目录
  1867. pDirList->AddTail(pDataSafe);
  1868. }
  1869. //GetNext ....loop through all children 
  1870. for(;;)
  1871. {
  1872. CSuperGridCtrl::CTreeItem *pCur = m_DataSetList.GetNext(pParent, pItem, TRUE, FALSE/*regardless of the item are hidden or not, set to TRUE if only visible items must be included in the search*/);   
  1873. if(!m_DataSetList.IsChildOf(pParent, pCur))
  1874. break;
  1875. else if(pCur==pItem)
  1876. break;
  1877. CItemInfo* lp = m_DataSetList.GetData(pCur);
  1878. pItem = pCur;//next;
  1879. CDataSafe * pDataSafe = new CDataSafe();
  1880. lp->CopyDataSafe(pDataSafe);
  1881. pDataList->AddTail(pDataSafe);
  1882. if(pDirList) //解密时候需要建立目录,此时需要添加目录列表
  1883. {
  1884. if(!pDataSafe->bIsFile)//目录
  1885. pDirList->AddTail(pDataSafe);
  1886. }
  1887. }
  1888. }
  1889. }
  1890. void CSafeDataSetPage::CleanList(CList<CDataSafe *, CDataSafe *> * pDataList)
  1891. {
  1892. POSITION pos = pDataList->GetHeadPosition();
  1893. while(pos != NULL)
  1894. {
  1895. CDataSafe* pDataSafe = pDataList->GetNext(pos);
  1896. if(pDataSafe)
  1897. delete pDataSafe;
  1898. }
  1899. }
  1900. void CSafeDataSetPage::DoCrypt()
  1901. {
  1902. CString strCpName, strPwd;
  1903. GetDlgItemText(IDC_COMBO_CRYPT,strCpName);
  1904. GetDlgItemText(IDC_EDIT_PWD,strPwd);
  1905. if(strCpName.IsEmpty() || strPwd.IsEmpty())
  1906. {
  1907. AddMsg(MiniCT_1330, M_ERROR);//请输入加密密钥和算法名称
  1908. pThreadEvpSet = NULL;
  1909. return;
  1910. }
  1911. CString outMsg;
  1912. if(!Crypt(strCpName, strPwd, m_strEvpPath, outMsg))
  1913. {
  1914. AddMsg(outMsg, M_ERROR);
  1915. }
  1916. else
  1917. AddMsg(MiniCT_1331);//对称加密成功
  1918. pThreadEvpSet = NULL;
  1919. }
  1920. void CSafeDataSetPage::DoSeal()
  1921. {
  1922. //创建合法用户公钥链
  1923. CEvp::stuCertLink * pCertLink = NULL;
  1924. int nCount = 0;
  1925. if(m_pPageCdb->GetCertPair(CSafeDataCdbPage::SEAL, TRUE, m_strKey, 
  1926. m_lenKey,m_p12Pwd,&((CMiniMainDlg *)m_pParent)->m_ListBox))//得到公钥
  1927. {
  1928. //可能为多证书,这时查找;,然后添加每一个
  1929. if(m_lenKey == 0) //外部证书
  1930. {
  1931. CString strSub,
  1932.     strPath;
  1933. while(AfxExtractSubString(strSub, m_strKey, nCount++, ';')) //未公开 分解字符串
  1934. {
  1935. if(nCount == 1) //第一个文件,取得路径
  1936. {
  1937. int nPos = strSub.ReverseFind('\');
  1938. strPath = strSub.Left(nPos + 1);//附带
  1939. strSub.TrimLeft();
  1940. pCertLink->AddCert(pCertLink, strSub, m_lenKey);
  1941. }
  1942. else
  1943. {
  1944. strSub.TrimLeft();
  1945. pCertLink->AddCert(pCertLink, strPath + strSub, m_lenKey);
  1946. }
  1947. }
  1948. }
  1949. else
  1950. pCertLink->AddCert(pCertLink, m_strKey, m_lenKey);
  1951. }
  1952. CString strCpName;
  1953. GetDlgItemText(IDC_COMBO_CRYPT,strCpName);
  1954. if(strCpName.IsEmpty())
  1955. {
  1956. AddMsg(MiniCT_1332, M_ERROR); //请输入加密算法名称
  1957. pThreadEvpSet = NULL;
  1958. return;
  1959. }
  1960. CString outMsg;
  1961. if(!Seal(pCertLink, strCpName, m_strEvpPath, outMsg))
  1962. {
  1963. AddMsg(outMsg, M_ERROR);
  1964. }
  1965. else
  1966. AddMsg(MiniCT_1333);//封装信封成功
  1967. pCertLink->RemoveAll(pCertLink);
  1968. pThreadEvpSet = NULL;
  1969. }
  1970. void CSafeDataSetPage::DoRSAPubEnc()
  1971. {
  1972. CString outStr;
  1973. if(m_pPageCdb->GetCertPair(CSafeDataCdbPage::PubEnc, TRUE, m_strKey,
  1974. m_lenKey,m_p12Pwd, &((CMiniMainDlg *)m_pParent)->m_ListBox))//得到公钥
  1975. {
  1976. if(!RSAPubEnc((UCHAR *)m_strKey, m_lenKey, m_strEvpPath, outStr))
  1977. {
  1978. AddMsg(outStr, M_ERROR);
  1979. }
  1980. else
  1981. AddMsg(MiniCT_1334);//公钥加密成功
  1982. }
  1983. pThreadEvpSet = NULL;
  1984. }
  1985. void CSafeDataSetPage::DoRSAPrivEnc()
  1986. {
  1987. CString outStr;
  1988. if(m_pPageCdb->GetCertPair(CSafeDataCdbPage::PubEnc, FALSE, m_strKey, 
  1989. m_lenKey, m_p12Pwd, &((CMiniMainDlg *)m_pParent)->m_ListBox))//得到私钥
  1990.   if(!RSAPrivEnc((UCHAR *)m_strKey, m_lenKey, m_p12Pwd, m_strEvpPath, outStr))
  1991. {
  1992. AddMsg(outStr, M_ERROR);
  1993. }
  1994. else
  1995. AddMsg(MiniCT_1335);//私钥加密成功
  1996. }
  1997. pThreadEvpSet = NULL;
  1998. }
  1999. void CSafeDataSetPage::DoDecCrypt()
  2000. {
  2001. CString strCpName, strPwd, outStr;
  2002. GetDlgItemText(IDC_COMBO_CRYPT, strCpName);
  2003. GetDlgItemText(IDC_EDIT_PWD, strPwd);
  2004. CString strEvpFile(m_strEvpPath);
  2005. if(strPwd.IsEmpty() || strCpName.IsEmpty())
  2006. {
  2007. AddMsg(MiniCT_1336, M_ERROR);  //请选择算法并输入加密密码
  2008. pThreadEvpSet = NULL;
  2009. return;
  2010. }
  2011. if(!DecCrypt(strCpName, strPwd, strEvpFile, outStr))
  2012. {
  2013. AddMsg(outStr, M_ERROR);
  2014. }
  2015. else
  2016. AddMsg(MiniCT_1337); //对称解密成功
  2017. pThreadEvpSet = NULL;
  2018. }
  2019. void CSafeDataSetPage::DoOpenSeal()
  2020. {
  2021. CString strCpName, outStr;
  2022. GetDlgItemText(IDC_COMBO_CRYPT, strCpName);
  2023. CString strEvpFile(m_strEvpPath);
  2024. if(strCpName.IsEmpty())
  2025. {
  2026. AddMsg(MiniCT_1338, M_ERROR);  //"请选择算法"
  2027. pThreadEvpSet = NULL;
  2028. return;
  2029. }
  2030. if(m_pPageCdb->GetCertPair(CSafeDataCdbPage::SEAL, FALSE, m_strKey, m_lenKey, m_p12Pwd,
  2031. &((CMiniMainDlg *)m_pParent)->m_ListBox))//得到私钥
  2032. {
  2033. if(!OpenSeal(m_strKey, m_lenKey, m_p12Pwd.GetBuffer(0), strCpName, strEvpFile, outStr))
  2034. {
  2035. AddMsg(outStr, M_ERROR);
  2036. }
  2037. else
  2038. AddMsg(MiniCT_1339); //拆封信封成功
  2039. m_p12Pwd.ReleaseBuffer();
  2040. }
  2041. pThreadEvpSet = NULL;
  2042. }
  2043. void CSafeDataSetPage::DoRSAPriDec()
  2044. {
  2045. CString outStr;
  2046. CString strEvpFile(m_strEvpPath);
  2047. if(m_pPageCdb->GetCertPair(CSafeDataCdbPage::PubEnc, FALSE, m_strKey, m_lenKey, m_p12Pwd,
  2048. &((CMiniMainDlg *)m_pParent)->m_ListBox))//得到私钥
  2049. {
  2050. if(!RSAPriDec((UCHAR *)m_strKey, m_lenKey, m_p12Pwd, strEvpFile, outStr))
  2051. {
  2052. AddMsg(outStr, M_ERROR);
  2053. }
  2054. else
  2055. AddMsg(MiniCT_1340); //私钥解密成功
  2056. }
  2057. pThreadEvpSet = NULL;
  2058. }
  2059. void CSafeDataSetPage::DoRSAPubDec()
  2060. {
  2061. CString outStr;
  2062. if(m_pPageCdb->GetCertPair(CSafeDataCdbPage::PrivEnc, TRUE, m_strKey, m_lenKey, m_p12Pwd,
  2063. &((CMiniMainDlg *)m_pParent)->m_ListBox))
  2064. {
  2065. if(!RSAPubDec((UCHAR *)m_strKey, m_lenKey, m_strEvpPath, outStr))
  2066. {
  2067. AddMsg(outStr, M_ERROR);
  2068. }
  2069. else
  2070. AddMsg(MiniCT_1341);
  2071. }
  2072. pThreadEvpSet = NULL;
  2073. }
  2074. void CSafeDataSetPage::AddMsg(CString info, DWORD type)
  2075. {
  2076. ((CMiniMainDlg *)m_pParent)->AddMsg(MiniCT_0002,info, type);
  2077. }
  2078. void CSafeDataSetPage::AddOnceMsg(CString info, DWORD type)
  2079. {
  2080. // ((CMiniMainDlg *)m_pParent)->AddMsg("WinEvp",info, type);
  2081. }
  2082. void CSafeDataSetPage::DoSign()
  2083. {
  2084. CString strCpName;
  2085. GetDlgItemText(IDC_COMBO_CRYPT,strCpName);
  2086. if(strCpName.IsEmpty())
  2087. {
  2088. AddMsg(MiniCT_1332, M_ERROR);
  2089. pThreadEvpSet = NULL;
  2090. return;
  2091. }
  2092. CString outStr;
  2093. if(m_pPageCdb->GetCertPair(CSafeDataCdbPage::SIGN, FALSE, m_strKey, m_lenKey, 
  2094. m_p12Pwd, &((CMiniMainDlg *)m_pParent)->m_ListBox))//得到私钥
  2095. {
  2096. if(!Sign("md5", (UCHAR *)m_strKey, m_lenKey, m_p12Pwd,
  2097. m_strEvpPath, outStr))
  2098. {
  2099. AddMsg(outStr, M_ERROR);
  2100. }
  2101. else
  2102. AddMsg(MiniCT_1342); //"数字签名成功"
  2103. }
  2104. pThreadEvpSet = NULL;
  2105. }
  2106. LRESULT CSafeDataSetPage::OnDropOk(WPARAM wParam, LPARAM lParam)
  2107. {
  2108. CStringArray * pStringArray = (CStringArray*) wParam;
  2109. for(int i = 0 ;i < pStringArray->GetSize(); i++)
  2110. {
  2111. AddList(pStringArray->GetAt(i)); //如果扩展名不为.evp
  2112. }
  2113. return 0;
  2114. }
  2115. //解密文件
  2116. //参数:
  2117. //EVP文件名
  2118. //输出文件名
  2119. //文件在EVP文件中的偏移
  2120. //加密后文件长度(也就是解密时候要读取的长度)
  2121. //原始文件长度,用于校验
  2122. //返回错误信息
  2123. BOOL CSafeDataSetPage::DecOneFile(CString strEvpFile, CString strOutFile, DWORD dSeek, 
  2124.   DWORD dFileLen, DWORD dOldLen, CString & outStr)
  2125. {
  2126. CFile FileEvp;
  2127. CString strCpName;
  2128. DWORD dOutLen = -1;
  2129. DWORD dFileInfoLen = 0; 
  2130. BOOL bSucceed = TRUE;
  2131. if(!FileEvp.Open(strEvpFile, CFile::modeRead | CFile::typeBinary))
  2132. {
  2133. outStr.Format("%s%s", MiniCT_1320, strEvpFile);//打开文件失败%s
  2134. return FALSE;
  2135. }
  2136. switch(m_EncType)
  2137. {
  2138. case NONE:
  2139. break;
  2140. case CRYPT: //对称 1
  2141. break;
  2142. case DIGEST://摘要 3
  2143. break;
  2144. case SIGN: //签名 4
  2145. break;
  2146. case SEAL: //信封 2
  2147. FileEvp.Seek(strlen(m_sHeadMark), CFile::begin);
  2148. FileEvp.Read(&dFileInfoLen, sizeof(DWORD));
  2149. FileEvp.Seek(sizeof(UINT), CFile::current);
  2150. FileEvp.Seek(dFileInfoLen, CFile::current);
  2151. GetDlgItemText(IDC_COMBO_CRYPT, strCpName);
  2152. if(strCpName.IsEmpty())
  2153. {
  2154. AddMsg(MiniCT_1338,M_ERROR);// "请选择算法"
  2155. break;
  2156. }
  2157. EVP_CIPHER_CTX Ctx;
  2158. if(m_pPageCdb->GetCertPair(CSafeDataCdbPage::SEAL, FALSE, m_strKey, m_lenKey, m_p12Pwd,
  2159. &((CMiniMainDlg *)m_pParent)->m_ListBox))//得到私钥
  2160. if(!CEvp::InitOpenSeal2(m_strKey, m_lenKey, m_p12Pwd.GetBuffer(0), strCpName, FileEvp, Ctx, outStr))
  2161. {
  2162. m_p12Pwd.ReleaseBuffer();
  2163. FileEvp.Close();
  2164. return FALSE;
  2165. }
  2166. m_p12Pwd.ReleaseBuffer();
  2167. FileEvp.Seek(dSeek, CFile::begin);
  2168. dOutLen = CEvp::OpenSeal2(Ctx, FileEvp, dFileLen, strOutFile, outStr);
  2169. if(dOutLen != dOldLen)
  2170. {
  2171. bSucceed = FALSE;
  2172. outStr = MiniCT_1321;
  2173. }
  2174. CEvp::CleanOpenSeal2(Ctx);
  2175. break;
  2176. case PubEnc:
  2177. break;
  2178. case PrivEnc:
  2179. break;
  2180. default:
  2181. break;
  2182. }
  2183. FileEvp.Close();
  2184. return bSucceed;
  2185. }
  2186. void CSafeDataSetPage::OnBegindragListDataset(NMHDR* pNMHDR, LRESULT* pResult) 
  2187. {
  2188. NMLISTVIEW*    pNMLV = (NMLISTVIEW*) pNMHDR;
  2189. COleDataSource datasrc;
  2190. HGLOBAL        hgDrop;
  2191. DROPFILES*     pDrop;
  2192. CStringList    lsDraggedFiles;
  2193. POSITION       pos;
  2194. int            nSelItem;
  2195. CString        sFile;
  2196. UINT           uBuffSize = 0;
  2197. TCHAR*         pszBuff;
  2198. FORMATETC      etc = { CF_HDROP, NULL, DVASPECT_CONTENT, -1, TYMED_HGLOBAL };
  2199. CString    outStr;
  2200.     *pResult = 0;   // return value ignored
  2201.     // For every selected item in the list, put the filename into lsDraggedFiles.
  2202. pos = m_DataSetList.GetFirstSelectedItemPosition();
  2203. while ( NULL != pos )
  2204. {
  2205. nSelItem = m_DataSetList.GetNextSelectedItem ( pos );
  2206. //如果是加密的,就解密到临时目录,并打开
  2207. CSuperGridCtrl::CTreeItem * pItem = m_DataSetList.GetTreeItem(nSelItem);
  2208. if(!pItem)
  2209. return;
  2210. CItemInfo * pInfo = m_DataSetList.GetData(pItem); 
  2211. const CDataSafe * pDataSafe = pInfo->GetDataSafe();
  2212. if(pDataSafe == NULL)
  2213. return;
  2214. //取得临时路径
  2215. TCHAR szTempPath[MAX_PATH];
  2216. DWORD dwResult=:: GetTempPath (MAX_PATH, szTempPath);
  2217. ASSERT (dwResult);
  2218. sFile.Format("%s\%s",szTempPath, pDataSafe->cName);
  2219. CString strOut;
  2220. if(pDataSafe->bIsFile) //文件
  2221. {
  2222. if(!DecOneFile(m_strEvpPath, sFile, pDataSafe->dBeginSeek, pDataSafe->dNewLen,
  2223. pDataSafe->dNewLen, strOut))
  2224. AddMsg(strOut, M_ERROR);
  2225. }
  2226. else//目录 ->建立目录
  2227. {
  2228. if(!Mdir(sFile, outStr))
  2229. {
  2230. return;
  2231. }
  2232. }
  2233. lsDraggedFiles.AddTail ( sFile );
  2234. // Calculate the # of chars required to hold this string.
  2235. uBuffSize += lstrlen ( sFile ) + 1;
  2236. }
  2237.     // Add 1 extra for the final null char, and the size of the DROPFILES struct.
  2238.     uBuffSize = sizeof(DROPFILES) + sizeof(TCHAR) * (uBuffSize + 1);
  2239.     // Allocate memory from the heap for the DROPFILES struct.
  2240.     hgDrop = GlobalAlloc ( GHND | GMEM_SHARE, uBuffSize );
  2241.     if ( NULL == hgDrop )
  2242.         return;
  2243.     pDrop = (DROPFILES*) GlobalLock ( hgDrop );
  2244.     if ( NULL == pDrop )
  2245. {
  2246.         GlobalFree ( hgDrop );
  2247.         return;
  2248. }
  2249.     // Fill in the DROPFILES struct.
  2250.     pDrop->pFiles = sizeof(DROPFILES);
  2251. #ifdef _UNICODE
  2252.     // If we're compiling for Unicode, set the Unicode flag in the struct to
  2253.     // indicate it contains Unicode strings.
  2254.     pDrop->fWide = TRUE;
  2255. #endif
  2256.     // Copy all the filenames into memory after the end of the DROPFILES struct.
  2257.     pos = lsDraggedFiles.GetHeadPosition();
  2258.     pszBuff = (TCHAR*) (LPBYTE(pDrop) + sizeof(DROPFILES));
  2259.     while ( NULL != pos )
  2260. {
  2261.         lstrcpy ( pszBuff, (LPCTSTR) lsDraggedFiles.GetNext ( pos ) );
  2262.         pszBuff = 1 + _tcschr ( pszBuff, '' );
  2263. }
  2264.     GlobalUnlock ( hgDrop );
  2265.     // Put the data in the data source.
  2266.     datasrc.CacheGlobalData ( CF_HDROP, hgDrop, &etc );
  2267.     // Add in our own custom data, so we know that the drag originated from our 
  2268.     // window.  CMyDropTarget::DragEnter() checks for this custom format, and
  2269.     // doesn't allow the drop if it's present.  This is how we prevent the user
  2270.     // from dragging and then dropping in our own window.
  2271.     // The data will just be a dummy bool.
  2272. HGLOBAL hgBool;
  2273.     hgBool = GlobalAlloc ( GHND | GMEM_SHARE, sizeof(bool) );
  2274.     if ( NULL == hgBool )
  2275. {
  2276.         GlobalFree ( hgDrop );
  2277.         return;
  2278. }
  2279.     // Put the data in the data source.
  2280.     etc.cfFormat = m_Target.GetClipbrdFormat();
  2281.     
  2282.     datasrc.CacheGlobalData (etc.cfFormat, hgBool, &etc );
  2283.     // Start the drag 'n' drop!
  2284. DROPEFFECT dwEffect = datasrc.DoDragDrop (DROPEFFECT_MOVE);
  2285.     // If the DnD completed OK, we remove all of the dragged items from our
  2286.     // list.
  2287.     GlobalFree(hgDrop);
  2288.     GlobalFree(hgBool);
  2289. }
  2290. void CSafeDataSetPage::TranslateCT()
  2291. {
  2292. CHeaderCtrl * pHeader = m_DataSetList.GetHeaderCtrl();
  2293. if (pHeader)
  2294. {
  2295. UINT uCount = pHeader->GetItemCount();
  2296. CString str = MiniCT_1300;
  2297. HDITEM hdi;
  2298. hdi.mask = HDI_TEXT;
  2299. hdi.pszText = (LPTSTR)((LPCTSTR)str);
  2300. pHeader->SetItem(0, &hdi);
  2301. str = MiniCT_1301;
  2302. hdi.pszText = (LPTSTR)((LPCTSTR)str);
  2303. pHeader->SetItem(1, &hdi);
  2304. str = MiniCT_1302;
  2305. hdi.pszText = (LPTSTR)((LPCTSTR)str);
  2306. pHeader->SetItem(2, &hdi);
  2307. str = MiniCT_1303;
  2308. hdi.pszText = (LPTSTR)((LPCTSTR)str);
  2309. pHeader->SetItem(3, &hdi);
  2310. str = MiniCT_1304;
  2311. hdi.pszText = (LPTSTR)((LPCTSTR)str);
  2312. pHeader->SetItem(4, &hdi);
  2313. }
  2314. SetDlgItemText(IDC_STATICINFO, MiniCT_11401);
  2315. SetDlgItemText(IDC_RADIO1, MiniCT_11402);
  2316. SetDlgItemText(IDC_RADIO2, MiniCT_11403);
  2317. SetDlgItemText(IDC_RADIO3, MiniCT_11404);
  2318. SetDlgItemText(IDC_RADIO4, MiniCT_11405);
  2319. SetDlgItemText(IDC_RADIO5, MiniCT_11406);
  2320. SetDlgItemText(IDC_RADIO6, MiniCT_11407);
  2321. SetDlgItemText(IDC_STATICFUN, MiniCT_11408);
  2322. SetDlgItemText(IDC_STATIC_PWD, MiniCT_11409);
  2323. SetDlgItemText(IDC_STATIC_CHIPNAME, MiniCT_11410);
  2324. }
  2325. BOOL CSafeDataSetPage::SelectPath() 
  2326. {
  2327. // TODO: Add your control notification handler code here
  2328. LPITEMIDLIST pidlRoot = NULL; 
  2329. LPMALLOC pMalloc;   
  2330. if(NOERROR == SHGetSpecialFolderLocation(m_pParent->m_hWnd, CSIDL_DRIVES, &pidlRoot)) //leak
  2331. {
  2332. BROWSEINFO bi;   //必须传入的参数,下面就是这个结构的参数的初始化 
  2333. CString strDisplayName;// = CMiniCaApp::NormalCode("选择文件夹");;   //用来得到,你选择的活页夹路径,相当于提供一个缓冲区 
  2334. bi.hwndOwner = GetSafeHwnd();   //得到父窗口Handle值 
  2335. bi.pidlRoot=0;   //这个变量就是我们在上面得到的. 
  2336. bi.pszDisplayName = strDisplayName.GetBuffer(MAX_PATH+1);   //得到缓冲区指针, 
  2337. CString strTitle = MiniCT_1344; //解密到
  2338. bi.lpszTitle = strTitle;  //设置标题 
  2339. bi.ulFlags = BIF_RETURNONLYFSDIRS  | BIF_DONTGOBELOWDOMAIN  ;   //设置标志 
  2340. bi.lpfn=NULL; 
  2341. bi.lParam=0; 
  2342. bi.iImage=0;   //上面这个是一些无关的参数的设置,最好设置起来, 
  2343. ITEMIDLIST * pidl;  
  2344. pidl = SHBrowseForFolder(&bi);   //打开对话框 
  2345. if(!pidl)
  2346. return FALSE;
  2347. SHGetPathFromIDList(pidl,bi.pszDisplayName);
  2348. strDisplayName.ReleaseBuffer();   //和上面的GetBuffer()相对应 
  2349. if(SUCCEEDED( SHGetMalloc ( &pMalloc ))) // leak
  2350. pMalloc->Free(pidlRoot); 
  2351. pMalloc->Release(); 
  2352. }
  2353. m_strSavePath = strDisplayName;
  2354. }
  2355. return TRUE;
  2356. }