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

CA认证

开发平台:

Visual C++

  1. #include "CertKey.h"
  2. #include "rc.h"//CRC
  3. #include "CertInfoPage.h"
  4. struct stuCertDB
  5. {
  6. UINT _uID;//所属证书类别
  7. UINT _uLENGTH;//证书长度
  8. char _chINFO[2022];//证书内容
  9. char _chPWD[10];//证书密钥
  10. BOOL _bUSED;//是否使用
  11. UINT _uCRC;//校验码
  12. BOOL SetCRC()
  13. {
  14. return CRC::GetCrc16((char *)this,sizeof(stuCertDB) 
  15. - sizeof(UINT) ,_uCRC);
  16. }
  17. BOOL CheckCRC()
  18. {
  19. UINT CRC16;
  20. CRC::GetCrc16((char *)this,sizeof(stuCertDB) 
  21. - sizeof(UINT) ,CRC16);
  22. if(CRC16 == _uCRC)
  23. return TRUE;
  24. else
  25. return FALSE;
  26. }
  27. stuCertDB()
  28. {
  29. memset(this,0,sizeof(stuCertDB));
  30. }
  31. BOOL LoadFromDB(CString & str)
  32. {
  33. if(CheckCRC())
  34. {
  35. char msg[100] = {0};
  36. if(_uID%100 == 10)//私钥
  37. {
  38. EVP_PKEY * pKey = CCertKey::LoadKey(_chINFO,_uLENGTH,_chPWD,msg);
  39. if(!pKey)
  40. {
  41. str = "无效";
  42. EVP_PKEY_free(pKey);
  43. return FALSE;
  44. }
  45. else
  46. {
  47. str = "有效";
  48. EVP_PKEY_free(pKey);
  49. return TRUE;
  50. }
  51. }
  52. else
  53. {
  54. char subject[512]={0};
  55. char out[100]={0};
  56. CString strSubject;
  57. X509 *peer = CCertKey::LoadCert(_chINFO,_uLENGTH,_chPWD,out);
  58. if (peer != NULL)
  59. {
  60. // Server certificate
  61. UINT uKeyLen = CCertInfoPage::GetKeyLen(peer);
  62. if(!CCertInfoPage::GetSubjectInfo(peer,subject,out)) //929
  63. {
  64. strSubject = "NoSubject";
  65. }
  66. else
  67. {
  68. str.Format("%s",subject);
  69. int state=str.Find("CN=",0);
  70. int state1=str.Find("n",state);
  71. strSubject = str.Mid(state+3,state1-state-4);
  72. }
  73. str.Format("%s:%db", strSubject, uKeyLen);
  74. X509_free(peer);
  75. return TRUE;
  76. }
  77. else
  78. {
  79. str = "公钥无效";
  80. return FALSE;
  81. }
  82. }
  83. }
  84. else
  85. {
  86. str = "CRC错误";
  87. return FALSE;
  88. }
  89. return TRUE;
  90. }
  91. BOOL LoadFromCert(char * pCertFile,UINT uId,char * pPwd,BOOL bUsed,CString & strCause)//从证书文件加载到结构
  92. {
  93. strcpy(_chPWD,pPwd);
  94. _bUSED = bUsed;
  95. CFile file;
  96. if(file.Open(pCertFile,CFile::modeRead))
  97. {
  98. int len = file.GetLength();
  99. if(len < 2022)
  100. {
  101. _uID = uId;
  102. _uLENGTH = len;
  103. file.Read(_chINFO,_uLENGTH);
  104. file.Close();
  105. }
  106. else
  107. {
  108. file.Close();
  109. strCause = " 长度超过系统限制,恢复原有配置";
  110. return FALSE;
  111. }
  112. char msg[100] = {0};
  113. if(uId%100!=10)//非私钥
  114. {
  115. if(!CCertKey::LoadCert(pCertFile,0,pPwd,msg))
  116. {
  117. strCause = " 无法加载,恢复原有配置";
  118. return FALSE;
  119. }
  120. }
  121. else
  122. {
  123. if(!CCertKey::LoadKey(pCertFile,0,pPwd,msg))
  124. {
  125. strCause = " 无法加载,恢复原有配置";
  126. return FALSE;
  127. }
  128. }
  129. return SetCRC();
  130. }
  131. else
  132. {
  133. strCause = " 无法打开,恢复原有配置";
  134. return FALSE;
  135. }
  136. }
  137. };