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

CA认证

开发平台:

Visual C++

  1. // Asn1ParsePage.cpp : implementation file
  2. //
  3. #include "stdafx.h"
  4. #include "MiniCA.h"
  5. #include "Asn1ParsePage.h"
  6. #include "MiniMainDlg.h"
  7. #include <locale.h>
  8. #include ".GenericClassLanguage.h"
  9. #include "minict.h"
  10. #ifdef _DEBUG
  11. #define new DEBUG_NEW
  12. #undef THIS_FILE
  13. static char THIS_FILE[] = __FILE__;
  14. #endif
  15. /////////////////////////////////////////////////////////////////////////////
  16. // CAsn1ParsePage property page
  17. IMPLEMENT_DYNCREATE(CAsn1ParsePage, CPropertyPage)
  18. CAsn1ParsePage::CAsn1ParsePage() : CPropertyPage(CAsn1ParsePage::IDD)
  19. {
  20. //{{AFX_DATA_INIT(CAsn1ParsePage)
  21. // NOTE: the ClassWizard will add member initialization here
  22. //}}AFX_DATA_INIT
  23. m_TreeItem=NULL;
  24. }
  25. CAsn1ParsePage::~CAsn1ParsePage()
  26. {
  27. }
  28. void CAsn1ParsePage::DoDataExchange(CDataExchange* pDX)
  29. {
  30. CPropertyPage::DoDataExchange(pDX);
  31. //{{AFX_DATA_MAP(CAsn1ParsePage)
  32. // DDX_Control(pDX, IDC_EDIT_PATH, m_XpEdit);
  33. DDX_Control(pDX, IDC_B_READ, m_Bread);
  34. DDX_Control(pDX, IDC_ASN1_TREE, m_Tree);
  35. //}}AFX_DATA_MAP
  36. }
  37. BEGIN_MESSAGE_MAP(CAsn1ParsePage, CPropertyPage)
  38. //{{AFX_MSG_MAP(CAsn1ParsePage)
  39. ON_BN_CLICKED(IDC_B_READ, OnBRead)
  40. ON_NOTIFY(TVN_SELCHANGED, IDC_ASN1_TREE, OnSelchangedAsn1Tree)
  41. ON_WM_DESTROY()
  42. ON_NOTIFY(NM_RCLICK, IDC_ASN1_TREE, OnRclickAsn1Tree)
  43. ON_COMMAND(ID_MENUITEM_EXPANE, OnMenuitemExpane)
  44. ON_WM_CREATE()
  45. //}}AFX_MSG_MAP
  46. END_MESSAGE_MAP()
  47. /////////////////////////////////////////////////////////////////////////////
  48. // CAsn1ParsePage message handlers
  49. BOOL CAsn1ParsePage::OnInitDialog() 
  50. {
  51. CPropertyPage::OnInitDialog();
  52. // TODO: Add extra initialization here
  53. m_Bread.SetThemeHelper(((CMiniCaApp *)AfxGetApp())->GetThemeHelperST());
  54. // m_Bread.DrawAsToolbar(TRUE);
  55. m_Bread.SetIcon(IDI_ICON_SELECTDIR);
  56. m_Bread.OffsetColor(CButtonST::BTNST_COLOR_BK_IN, 30);
  57. //m_Bread.SetFlat(FALSE);
  58. CImageList * pImgList = ((CMiniCaApp *)AfxGetApp())->GetImgList();
  59. m_Tree.SetImageList(pImgList,TVSIL_NORMAL);
  60. //XP风格菜单,表现为选中时候图标偏移
  61. BCMenu::SetMenuDrawMode( BCMENU_DRAWMODE_XP );
  62. m_toolTip.Create(this);
  63. m_toolTip.AddTool(GetDlgItem(IDC_B_READ), CMiniCaApp::NormalCode("选择被解码的文件r文件长度小于10K字节"));
  64. if(!((CMiniCaApp *)AfxGetApp())->IsXpStyle())
  65. {
  66. ClassXP(GetDlgItem(IDC_EDIT_PATH)->m_hWnd,TRUE);
  67. // ClassXP(GetDlgItem(IDC_ASN1_TREE)->m_hWnd,TRUE);
  68. }
  69. return TRUE;  // return TRUE unless you set the focus to a control
  70.               // EXCEPTION: OCX Property Pages should return FALSE
  71. }
  72. void CAsn1ParsePage::OnBRead() 
  73. {
  74. // TODO: Add your control notification handler code here
  75. CFileDialog dlgOpen(true,NULL,NULL,OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT /*| OFN_NOCHANGEDIR */,
  76. MiniCT_1600, NULL);
  77. dlgOpen.m_ofn.lStructSize = sizeof(OPENFILENAME);
  78. CString str = MiniCT_1601;
  79. dlgOpen.m_ofn.lpstrTitle = str;//标题条 LPCTSTR
  80. if(dlgOpen.DoModal()!=IDOK) return;
  81. CString fileName=dlgOpen.GetPathName();
  82. GetAsn1Info(fileName);
  83. }
  84. void CAsn1ParsePage::OnSelchangedAsn1Tree(NMHDR* pNMHDR, LRESULT* pResult) 
  85. {
  86. NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
  87. // TODO: Add your control notification handler code here
  88. HTREEITEM handle=m_Tree.GetSelectedItem();
  89. POSITION pos;
  90. stuNODE * tNode;
  91. CString str;
  92. for( pos = m_NodeList.GetHeadPosition(); pos != NULL; )
  93. {
  94. tNode=(stuNODE *)m_NodeList.GetNext(pos);
  95. if(tNode->NODE==handle)
  96. {
  97. str.Format("%s:%drn%s:%drn%s:%s", 
  98. MiniCT_1602, tNode->EXCURSION, MiniCT_1603,
  99. tNode->LENGTH, MiniCT_1604, tNode->INFO);
  100. SetDlgItemText(IDC_EDIT_INFO,str);
  101. break;
  102. }
  103. }
  104. *pResult = 0;
  105. }
  106. void CAsn1ParsePage::OnDestroy() 
  107. {
  108. CPropertyPage::OnDestroy();
  109. // TODO: Add your message handler code here
  110. stuNODE * LIST=NULL;
  111. for(;!m_NodeList.IsEmpty();)
  112. {
  113. LIST=(stuNODE *)m_NodeList.RemoveHead();
  114. delete LIST;
  115. }
  116. }
  117. void CAsn1ParsePage::OnRclickAsn1Tree(NMHDR* pNMHDR, LRESULT* pResult) 
  118. {
  119. // TODO: Add your control notification handler code here
  120. CPoint point;
  121. GetCursorPos(&point); // 当前鼠标坐标
  122. CPoint PointInTree = point;
  123. m_Tree.ScreenToClient( &PointInTree);
  124. UINT nFlag;
  125. m_TreeItem = m_Tree.HitTest( PointInTree, &nFlag );
  126. if(m_TreeItem == NULL)
  127. return;
  128. m_Tree.SelectItem(m_TreeItem);//设置选中
  129. HTREEITEM item = m_Tree.GetChildItem(m_TreeItem);//是否有子项
  130. if(item==NULL)
  131. return;
  132. int nState= m_Tree.GetItemState(m_TreeItem,TVIF_STATE)& TVIS_EXPANDED ;//是否已经展开
  133. BCMenu m_PopMenu;
  134. m_PopMenu.LoadMenu(IDR_MENU_ASN1VIEW);
  135. m_PopMenu.LoadToolbar(IDR_MINICAMENU);
  136. CMenu * pPopup = m_PopMenu.GetSubMenu(0);
  137. SetForegroundWindow(); //点击可以关闭
  138. ASSERT(pPopup);
  139. //ModifyODMenuA
  140. if(nState!=0)//已经展开
  141. m_PopMenu.ModifyODMenu(MiniCT_1605, ID_MENUITEM_EXPANE);
  142. else
  143. m_PopMenu.ModifyODMenu(MiniCT_1606, ID_MENUITEM_EXPANE);//展开
  144. UINT nSelection = pPopup->TrackPopupMenu(TPM_LEFTBUTTON|TPM_RIGHTBUTTON|TPM_LEFTALIGN, point.x, 
  145. point.y,this, NULL);
  146. m_PopMenu.DestroyMenu();
  147. *pResult = 0;
  148. }
  149. void CAsn1ParsePage::OnMenuitemExpane() //展开
  150. {
  151. // TODO: Add your command handler code here
  152. ExpandAll(m_TreeItem,TVE_TOGGLE);
  153. }
  154. void CAsn1ParsePage::ExpandAll(HTREEITEM item,UINT nCode )////展开,收缩
  155. {
  156. m_Tree.SetRedraw(FALSE);
  157. if( m_Tree.ItemHasChildren( item ))
  158. {
  159. m_Tree.Expand( item, nCode );
  160. item = m_Tree.GetChildItem( item );
  161. do
  162. {
  163. ExpandAll(item,nCode);
  164. }while( (item = m_Tree.GetNextSiblingItem( item )) != NULL );
  165. }
  166. m_Tree.EnsureVisible( m_Tree.GetSelectedItem());
  167. m_Tree.SetRedraw();
  168. }
  169. void CAsn1ParsePage::GetAsn1Info(CString strpath)
  170. {
  171. //由于PEM格式解码经常崩溃,所以在开始时候限制文件大小为2K
  172. CFile file;
  173. if(file.Open(strpath,CFile::modeRead))
  174. {
  175. if(file.GetLength() >= 10*1024)
  176. {
  177. file.Close();
  178. AddMsg(MiniCT_1607, M_WARING); //文件长度超过10K字节
  179. return;
  180. }
  181. file.Close();
  182. }
  183. else
  184. return;
  185. m_Tree.DeleteAllItems();
  186. SetDlgItemText(IDC_EDIT_INFO,"");
  187. SetDlgItemText(IDC_EDIT_PATH,strpath);
  188. stuNODE * LIST=NULL;
  189. for(;!m_NodeList.IsEmpty();)
  190. {
  191. LIST=(stuNODE *)m_NodeList.RemoveHead();
  192. delete [] LIST;
  193. }
  194. char buf[255]={0};
  195. stuTREE * TREEPEM = NULL, * TREEDER = NULL, * temp = NULL;
  196. if(Asn1Parse(strpath.GetBuffer(0),TREEDER,DER,buf))//==1 ok
  197. {
  198. HTREEITEM depth[20]={0};//深度
  199. depth[0]=TVI_ROOT;
  200. CString str;
  201. for(temp=TREEDER;temp!=NULL;temp=temp->Link)
  202. {
  203. stuNODE * pNode=new stuNODE;
  204. depth[temp->DEPTH+1]=m_Tree.InsertItem(temp->TYPE,10,10,depth[temp->DEPTH]);
  205. pNode->NODE=depth[temp->DEPTH+1];
  206. pNode->EXCURSION=temp->EXCURSION;
  207. pNode->LENGTH=temp->LENGTH;
  208. if(strlen(temp->INFO))
  209. {
  210. strncpy(pNode->INFO,temp->INFO,sizeof(pNode->INFO));
  211. }
  212. m_NodeList.AddHead(pNode);
  213. }
  214. FreeTree(TREEPEM);
  215. FreeTree(TREEDER);
  216. return;
  217. }
  218. strpath.ReleaseBuffer();
  219. if(Asn1Parse(strpath.GetBuffer(0),TREEPEM,PEM,buf))//==1 ok
  220. {
  221. HTREEITEM depth[20]={0};//深度
  222. depth[0]=TVI_ROOT;
  223. CString str;
  224. for(temp=TREEPEM;temp!=NULL;temp=temp->Link)
  225. {
  226. stuNODE * pNode=new stuNODE;
  227. depth[temp->DEPTH+1]=m_Tree.InsertItem(temp->TYPE,10,10,depth[temp->DEPTH]);
  228. pNode->NODE=depth[temp->DEPTH+1];
  229. pNode->EXCURSION=temp->EXCURSION;
  230. pNode->LENGTH=temp->LENGTH;
  231. if(strlen(temp->INFO))
  232. {
  233. strncpy(pNode->INFO,temp->INFO,sizeof(pNode->INFO));
  234. }
  235. m_NodeList.AddHead(pNode);
  236. }
  237. }
  238. else
  239. AddMsg(buf, M_ERROR);
  240. strpath.ReleaseBuffer();
  241. FreeTree(TREEPEM);
  242. FreeTree(TREEDER);
  243. }
  244. void CAsn1ParsePage::AddMsg(CString info, DWORD type)
  245. {
  246. ((CMiniMainDlg *)GetParent())->AddMsg(MiniCT_0005, info, type);
  247. }
  248. BOOL CAsn1ParsePage::PreTranslateMessage(MSG* pMsg)
  249. {
  250. // CG: The following block was added by the ToolTips component. m_toolTip.RelayEvent(pMsg);
  251. return CPropertyPage::PreTranslateMessage(pMsg); // CG: This was added by the ToolTips component.
  252. }
  253. /*添加链表节点*/
  254. int CAsn1ParsePage::AddTree(stuTREE *& Head,UINT Excursion,UINT Depth,UINT Length,char * Type)//返回当前序号
  255. {
  256. int index=0;
  257. stuTREE * End=new stuTREE(Excursion,Depth,Length,Type);//钥增加的节点
  258. if(Head==NULL)
  259. {
  260. Head=End;
  261. }
  262. else 
  263. {
  264. stuTREE * p=Head;
  265. index+=1;
  266. while(p->Link!=NULL)
  267. {
  268. index++;
  269. p=p->Link;
  270. }
  271. p->Link=End; 
  272. }
  273. return index;
  274. }
  275. void CAsn1ParsePage::FreeTree(stuTREE *& Head)
  276. {
  277. stuTREE * temp =NULL;
  278. while(Head!=NULL)//遍历链表
  279. {
  280.     temp=Head;
  281. Head=Head->Link;
  282. delete [] temp;
  283. }
  284. }
  285. int CAsn1ParsePage::asn1_print_info(int tag, int xclass, int constructed,
  286. int indent,char * str)
  287. {
  288. // if (constructed & V_ASN1_CONSTRUCTED)
  289. // p="cons: ";
  290. // else
  291. // p="prim: ";
  292. // if (BIO_write(bp,p,6) < 6) goto err;
  293. // BIO_indent(bp,indent,128);
  294. const char *p;
  295. if ((xclass & V_ASN1_PRIVATE) == V_ASN1_PRIVATE)
  296. sprintf(str,"Private[%d] ",tag);
  297. else if ((xclass & V_ASN1_CONTEXT_SPECIFIC) == V_ASN1_CONTEXT_SPECIFIC)
  298. sprintf(str,"Context[%d]",tag);
  299. else if ((xclass & V_ASN1_APPLICATION) == V_ASN1_APPLICATION)
  300. sprintf(str,"Application [%d]",tag);
  301. else 
  302. {
  303. p = ASN1_tag2str(tag);
  304. sprintf(str,p);
  305. }
  306. return(1);
  307. }
  308. void CAsn1ParsePage::Utf8ToAnsi(UCHAR * lpsrc, int srclen, LPSTR lpdst, int& dstlen)
  309. {
  310. WCHAR * Unicode;
  311.     int len = MultiByteToWideChar ( CP_UTF8 , 0 ,(char*) lpsrc ,-1 ,NULL,0);
  312.     Unicode = new WCHAR[len * sizeof(WCHAR)];
  313.     MultiByteToWideChar ( CP_UTF8 , 0 ,( char * ) lpsrc, -1, Unicode , len );
  314.     len = WideCharToMultiByte(CP_ACP,0,Unicode,-1,NULL,0,NULL,NULL);
  315.     dstlen = WideCharToMultiByte (CP_ACP,0,Unicode,-1,lpdst,len,NULL,NULL);
  316.     delete []Unicode;
  317. }
  318. BOOL CAsn1ParsePage::GetAsn1Str(ASN1_STRING * str,char * outName)
  319. {
  320. if(str==NULL)
  321. return FALSE;
  322. setlocale(LC_CTYPE, "");
  323. //判断str是否为UTF-8
  324. int len = 0;
  325. unsigned char * tmp = NULL; 
  326. if (str && ASN1_STRING_type(str) == V_ASN1_UTF8STRING)
  327. {
  328. len = ASN1_STRING_length(str);
  329. if (len >= 0)
  330. {
  331. tmp = (UCHAR *)OPENSSL_malloc(len+1);
  332. if (tmp)
  333. {
  334. memcpy(tmp, ASN1_STRING_data(str), len);
  335. tmp[len] = '';
  336. }
  337. }
  338. }
  339. else /* not a UTF8 name */ ///////////转UTF-8
  340. {
  341. len = ASN1_STRING_to_UTF8(&tmp, str);
  342. }
  343. int dstlen = 0;
  344. Utf8ToAnsi(tmp, len, outName, dstlen);
  345. OPENSSL_free(tmp);
  346. return TRUE;
  347. }
  348. int CAsn1ParsePage::asn1_parse2(stuTREE *& TREE, unsigned char **pp, long length, int offset,
  349. int depth, int indent, int dump,char * msg)
  350. {
  351. const unsigned char *p,*ep,*tot,*op,*opp;
  352. long len;
  353. int tag,xclass,ret=0;
  354. int nl,hl,j,r;
  355. ASN1_OBJECT *o=NULL;
  356. ASN1_OCTET_STRING *os=NULL;
  357. /* ASN1_BMPSTRING *bmp=NULL;*/
  358. int dump_indent = 6; /* Because we know BIO_dump_indent() */
  359. p= *pp;
  360. tot=p+length;
  361. op=p-1;
  362. char  strInfo[128]={0};
  363. BUF_MEM *bptr;
  364. int biolen;
  365. char * pbuf;
  366. int index=0,i=0;
  367. ASN1_STRING * AsnStr;
  368. char buf[255]={0};
  369. BIO *mem = BIO_new(BIO_s_mem());
  370. BIO_set_close(mem, BIO_CLOSE); /*  BIO_free() free BUF_MEM  */
  371. while ((p < tot) && (op < p))
  372. {
  373. i=0;
  374. op=p;
  375. j=ASN1_get_object(&p,&len,&tag,&xclass,length);//p指向变化
  376. if (j & 0x80)
  377. {
  378. strcpy(msg,"Error in encodingn");
  379. ret=0;
  380. goto end;
  381. }
  382. hl=(p-op);
  383. length-=hl;
  384. /* if j == 0x21 it is a constructed indefinite length object */
  385. if (!asn1_print_info(tag,xclass,j,(indent)?depth:0,strInfo))//得到strInfo(SEQUENCE)
  386. goto end;
  387. //增加链表
  388. index=AddTree(TREE,(long)offset+(long)(op- *pp),depth,len,strInfo);
  389. if (j & V_ASN1_CONSTRUCTED)
  390. {
  391. ep=p+len;
  392. if (len > length)
  393. {
  394. sprintf(msg,"length is greater than %ld",length);
  395. ret=0;
  396. goto end;
  397. }
  398. if ((j == 0x21) && (len == 0))
  399. {
  400. for (;;)
  401. {
  402. r=asn1_parse2(TREE,(UCHAR **)&p,(long)(tot-p),
  403. offset+(p - *pp),depth+1,
  404. indent,dump,msg);
  405. if (r == 0) { ret=0; goto end; }
  406. if ((r == 2) || (p >= tot)) break;
  407. }
  408. }
  409. else
  410. while (p < ep)
  411. {
  412. r=asn1_parse2(TREE,(UCHAR **)&p,(long)len,
  413. offset+(p - *pp),depth+1,
  414. indent,dump,msg);
  415. if (r == 0) { ret=0; goto end; }
  416. }
  417. }
  418. else if (xclass != 0)
  419. {
  420. p+=len;
  421. }
  422. else
  423. {
  424. nl=0;
  425. if ( (tag == V_ASN1_PRINTABLESTRING) ||
  426. (tag == V_ASN1_T61STRING) ||
  427. (tag == V_ASN1_IA5STRING) ||
  428. (tag == V_ASN1_VISIBLESTRING) ||
  429. (tag == V_ASN1_UTCTIME) ||
  430. (tag == V_ASN1_GENERALIZEDTIME))
  431. {
  432. if ((len > 0) &&
  433. BIO_write(mem,(char *)p,(int)len)
  434. != (int)len)
  435. goto end;
  436. }
  437. else if (tag == V_ASN1_OBJECT)
  438. {
  439. opp=op;
  440. if (d2i_ASN1_OBJECT(&o,&opp,len+hl) != NULL)
  441. {
  442. i2a_ASN1_OBJECT(mem,o);
  443. }
  444. else
  445. {
  446. if (BIO_write(mem,":BAD OBJECT",11) <= 0)
  447. goto end;
  448. }
  449. }
  450. else if (tag == V_ASN1_BOOLEAN)
  451. {
  452. int ii;
  453. opp=op;
  454. ii=d2i_ASN1_BOOLEAN(NULL,&opp,len+hl);
  455. if (ii < 0)
  456. {
  457. if (BIO_write(mem,"Bad booleann",12))
  458. goto end;
  459. }
  460. BIO_printf(mem,":%d",ii);
  461. }
  462. else if (tag == V_ASN1_BMPSTRING||tag ==V_ASN1_UTF8STRING)
  463. {
  464. AsnStr=ASN1_STRING_type_new(tag);
  465. ASN1_STRING_set(AsnStr,p,len);
  466. GetAsn1Str(AsnStr,buf);
  467. ASN1_STRING_free(AsnStr);
  468. if (BIO_write(mem,buf,strlen(buf)) < 0)
  469. goto end;
  470. }
  471. else if (tag == V_ASN1_OCTET_STRING)
  472. {
  473. int i,printable=1;
  474. opp=op;
  475. os=d2i_ASN1_OCTET_STRING(NULL,&opp,len+hl);
  476. if (os != NULL)
  477. {
  478. opp=os->data;
  479. for (i=0; i<os->length; i++)
  480. {
  481. if (( (opp[i] < ' ') &&
  482. (opp[i] != 'n') &&
  483. (opp[i] != 'r') &&
  484. (opp[i] != 't')) ||
  485. (opp[i] > '~'))
  486. {
  487. printable=0;
  488. break;
  489. }
  490. }
  491. if (printable && (os->length > 0))
  492. {
  493. if (BIO_write(mem,(char *)opp,
  494. os->length) <= 0)
  495. goto end;
  496. }
  497. if (!printable && (os->length > 0)
  498. && dump)
  499. {
  500. if (!nl) 
  501. {
  502. }
  503. if (BIO_dump_indent(mem,(char *)opp,
  504. ((dump == -1 || dump > os->length)?os->length:dump),
  505. dump_indent) <= 0)
  506. goto end;
  507. nl=1;
  508. }
  509. M_ASN1_OCTET_STRING_free(os);
  510. os=NULL;
  511. }
  512. }
  513. else if (tag == V_ASN1_INTEGER)
  514. {
  515. ASN1_INTEGER *bs;
  516. int i;
  517. opp=op;
  518. bs=d2i_ASN1_INTEGER(NULL,&opp,len+hl);
  519. if (bs != NULL)
  520. {
  521. for (i=0; i<bs->length; i++)
  522. {
  523. if (BIO_printf(mem,"%02X",bs->data[i]) <= 0)
  524. goto end;
  525. }
  526. if (bs->length == 0)
  527. {
  528. if (BIO_write(mem,"00",2) <= 0)
  529. goto end;
  530. }
  531. }
  532. else
  533. {
  534. if (BIO_write(mem,"BAD INTEGER",11) <= 0)
  535. goto end;
  536. }
  537. M_ASN1_INTEGER_free(bs);
  538. }
  539. else if (tag == V_ASN1_ENUMERATED)
  540. {
  541. ASN1_ENUMERATED *bs;
  542. int i;
  543. opp=op;
  544. bs=d2i_ASN1_ENUMERATED(NULL,&opp,len+hl);
  545. if (bs != NULL)
  546. {
  547. if (bs->type == V_ASN1_NEG_ENUMERATED)
  548. if (BIO_write(mem,"-",1) <= 0)
  549. for (i=0; i<bs->length; i++)
  550. {
  551. if (BIO_printf(mem,"%02X",bs->data[i]) <= 0)
  552. goto end;
  553. }
  554. if (bs->length == 0)
  555. {
  556. if (BIO_write(mem,"00",2) <= 0)
  557. goto end;
  558. }
  559. }
  560. else
  561. {
  562. if (BIO_write(mem,"BAD ENUMERATED",11) <= 0)
  563. goto end;
  564. }
  565. M_ASN1_ENUMERATED_free(bs);
  566. }
  567. else if (len > 0 && dump)
  568. {
  569. if (!nl) 
  570. {
  571. }
  572. if (BIO_dump_indent(mem,(char *)p,
  573. ((dump == -1 || dump > len)?len:dump),
  574. dump_indent) <= 0)
  575. goto end;
  576. nl=1;
  577. }
  578. p+=len;
  579. if ((tag == V_ASN1_EOC) && (xclass == 0))
  580. {
  581. ret=2; // End of sequence 
  582. goto end;
  583. }
  584. }
  585. length-=len;
  586. if((p < tot) && (op < p))
  587. {
  588. BIO_get_mem_ptr(mem, &bptr);
  589. // BIO_get_mem_ptr(mem, &bptr);
  590. biolen=bptr->length;
  591. pbuf=new char[biolen+1];
  592. memset(pbuf,0,biolen+1);
  593. memcpy(pbuf,bptr->data,biolen);
  594. for(stuTREE * temp=TREE;temp!=NULL;temp=temp->Link,i++)
  595. {
  596. if(i==index)
  597. {
  598. strncpy(temp->INFO,pbuf,biolen+1>sizeof(temp->INFO)?128:biolen+1);
  599. break;
  600. }
  601. }
  602. delete [] pbuf;
  603. BIO_reset(mem);//恢复bio
  604. }
  605. }
  606. ret=1;
  607. end:
  608. BIO_get_mem_ptr(mem, &bptr);
  609. // BIO_get_mem_ptr(mem, &bptr);
  610. biolen=bptr->length;
  611. pbuf=new char[biolen+1];
  612. memset(pbuf,0,biolen+1);
  613. memcpy(pbuf,bptr->data,biolen);
  614. for(stuTREE * temp=TREE;temp!=NULL;temp=temp->Link,i++)
  615. {
  616. if(i==index)
  617. {
  618. strncpy(temp->INFO,pbuf,biolen+1>sizeof(temp->INFO)?128:biolen+1);
  619. break;
  620. }
  621. }
  622. delete [] pbuf;
  623. if (mem != NULL) BIO_free(mem);
  624. if (o != NULL) ASN1_OBJECT_free(o);
  625. if (os != NULL) M_ASN1_OCTET_STRING_free(os);
  626. *pp=(UCHAR *)p;
  627. return(ret);
  628. }
  629. int CAsn1ParsePage::ASN1_parsedump(stuTREE *& TREE, unsigned char *pp, long len,char * msg)
  630. {
  631. int indent=0;//不用格式化根据输出的数据自动缩进(不使用-i参数)
  632. int dump= 0;//输出16进制数据(0不使用 -dump参数,-1使用)
  633. return(asn1_parse2(TREE,&pp,len,0,0,indent,dump,msg));
  634. }
  635. BOOL CAsn1ParsePage::Asn1Parse(const char * infile,stuTREE *& TREE,const int informat,char * msg)
  636. {
  637. int i,badops=0,ret=0;//offset=0,,j
  638. unsigned int length=0;
  639. long num;
  640. BIO *in=NULL,*b64=NULL;
  641. int indent=0;
  642. char *str=NULL;
  643. BUF_MEM *buf=NULL;
  644. OpenSSL_add_all_algorithms();
  645. in=BIO_new(BIO_s_file());
  646. if (in == NULL)
  647. {
  648. sprintf(msg,"opne %s error",infile);
  649. goto end;
  650. }
  651. if (BIO_read_filename(in,infile) <= 0)
  652. {
  653. strcpy(msg,"read file error");
  654. goto end;
  655. }
  656. if ((buf=BUF_MEM_new()) == NULL) goto end;
  657. if (!BUF_MEM_grow(buf,BUFSIZ*8)) goto end; /* Pre-allocate :-) changes the size */
  658. if (informat == PEM)//PEM格式的先解码为der
  659. {
  660. BIO *tmp;
  661. if ((b64=BIO_new(BIO_f_base64())) == NULL)
  662. goto end;
  663. BIO_push(b64,in);//该函数把in附加到b64上,并返回b64,形成b64-in链
  664. tmp=in;
  665. in=b64;
  666. b64=tmp;
  667. }
  668. num=0;
  669. for (;;)
  670. {
  671. if (!BUF_MEM_grow(buf,(int)num+BUFSIZ)) goto end;
  672. try
  673. {
  674. i = BIO_read(in,&(buf->data[num]),BUFSIZ);
  675. }
  676. catch(...)
  677. {
  678. return FALSE;
  679. }
  680. if (i <= 0) break;
  681. num+=i;
  682. }
  683. str=buf->data;
  684. /* If any structs to parse go through in sequence */
  685. if (length == 0) length = (unsigned int)num;
  686. if (length == 0) 
  687. goto end;
  688. if (!ASN1_parsedump(TREE,(unsigned char *)&(str)[0],length,msg))//str[offset]
  689. {
  690. strcpy(msg,"parse file error");
  691. goto end;
  692. }
  693. ret=1;
  694. end:
  695. if (in != NULL) BIO_free(in);
  696. if (b64 != NULL) BIO_free(b64);
  697. if (ret == 0)
  698. strncpy(msg, MiniCT_1608, 20); //解码错误
  699. if (buf != NULL) BUF_MEM_free(buf);
  700. OBJ_cleanup();
  701. EVP_cleanup();
  702. return ret;
  703. }
  704. void CAsn1ParsePage::TranslateCT() //繙譯諸如樹型控件,列錶控件等內容
  705. {
  706. SetDlgItemText(IDC_B_READ, MiniCT_10001); //
  707. }