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

CA认证

开发平台:

Visual C++

  1. // Evp.h: interface for the CEvp class.
  2. //
  3. //////////////////////////////////////////////////////////////////////
  4. #if !defined(AFX_EVP_H__3857E3C8_085F_4691_ABCF_5D7F2E9536BA__INCLUDED_)
  5. #define AFX_EVP_H__3857E3C8_085F_4691_ABCF_5D7F2E9536BA__INCLUDED_
  6. #if _MSC_VER > 1000
  7. #pragma once
  8. #endif // _MSC_VER > 1000
  9. #include ".ControlProgressCtrlSTProgressCtrlST.h"
  10. class CEvp  
  11. {
  12. public:
  13. CEvp();
  14. virtual ~CEvp();
  15. public:
  16. void static SetProgRess(CProgressCtrlST * pProgress);
  17. struct stuCertLink
  18. {
  19. char * pCert;//合法用户公钥
  20. UINT CertLen;//公钥长度
  21. stuCertLink * Link;
  22. stuCertLink()
  23. {
  24. memset(this,0,sizeof(stuCertLink));
  25. }
  26. stuCertLink(const stuCertLink & Link)
  27. {
  28. this->pCert = Link.pCert;
  29. this->CertLen = Link.CertLen;
  30. this->Link = Link.Link;
  31. }
  32. stuCertLink(const char * pcert, const UINT certLen)
  33. {
  34. this->CertLen = certLen;
  35. this->pCert = new char[strlen(pcert)+1];
  36. strcpy(this->pCert,pcert);
  37. Link = NULL;
  38. }
  39. ~stuCertLink()
  40. {
  41. delete [] this->pCert;
  42. }
  43. void AddCert(stuCertLink *& Head, const char * pCert, const UINT uCertLen = 0)
  44. {
  45. stuCertLink * End = new stuCertLink(pCert, uCertLen);//钥增加的节点
  46. if(Head == NULL)
  47. {
  48. Head = End;
  49. }
  50. else 
  51. {
  52. stuCertLink * p = Head;
  53. while(p->Link != NULL)  
  54. p = p->Link;
  55. p->Link = End; 
  56. }
  57. }
  58. void RemoveAll(stuCertLink *& Head)
  59. {
  60. while(Head!=NULL)//遍历链表
  61. {
  62. stuCertLink * temp = NULL;
  63. temp = Head;
  64. Head = Head->Link;
  65. delete temp;
  66. }
  67. }
  68. };
  69. /*算法支持 内存 -> 内存  文件 -> 文件*/
  70. static BOOL Crypt(const char * cpName, const char * inStream, UINT inLen, 
  71.    char * outStream, UINT & outLen, char * pwd, const int type,
  72.    char * outMsg);
  73. /*消息摘要*/
  74. static BOOL Digest(const char * mdname/*摘要算法*/,
  75. const char * infoin/*输入,文件或内存*/,
  76. UINT inlen/*文件时候为0,内存为长度*/,
  77. unsigned char * md_value/*返回摘要*/,
  78. unsigned int * md_len/*摘要长度*/,
  79. char * outMsg);
  80. /*数字签名*/
  81. static BOOL Sign(const char * key/*私钥*/,
  82.   const int keylen/*0-内存私钥*/,
  83.   const char * pwd,
  84.   const char * mdname/*签名算法*/,
  85.   const char * infoin/*输入文件*/,
  86.   int inlen,/*输入长度,0->内存*/
  87.   char * infout/*输出*/,
  88.   UINT & outlen/*输出长度,输入文件时=0*/,
  89.   char * outMsg);
  90. /*数字签名验证*/
  91. static BOOL VerifySign(const char * cert/*公钥*/,
  92. const int certlen,
  93. const char * pwd,
  94. const char * mdname/*签名算法*/,
  95. const char * infoin,/*原始信息*/ 
  96. int inlen/*输入长度0->文件*/,
  97. char * sign/*签名结果*/,
  98. char * outMsg);
  99. /*数字信封 - 多证书 */
  100. static BOOL Seal(stuCertLink * pCERT/*[in]合法用户公钥链*/,
  101.   char * cpname/*算法名称*/,
  102.   char * filein/*输入文件*/, 
  103.   char * fileout/*输出文件*/,
  104.   char * outMsg);
  105. /*拆封数字信封 - 多证书*/
  106. static BOOL OpenSeal(char * key/*私钥*/, int keylen, char * pwd/*私钥密码*/, 
  107.    char * cpname/*算法名称*/, char * filein/*输入文件*/, 
  108.    char * fileout/*输出文件*/,char * outMsg);
  109. //公钥加密
  110. static BOOL RSAPubEnc(const BYTE * pCertBuf/*[in]公钥*/,
  111.    const UINT nCertLen/*[in]公钥长度*/,
  112.    const char * pPwd/*[in]公钥密码,只针对PFX包文件*/,
  113.    const BYTE * pInStream/*[in]输入文件或内存*/,
  114.    DWORD nInlen/*[in]数据长度,为0表示pInStream为文件名*/,
  115.    BYTE * pOutStream/*[out]加密后的数据*/,
  116.    DWORD & nOutlen/*[in,out]in为0时候表示pOutStream为文件名,out加密后数据长度*/,
  117.    char * OperMsg/*[out]返回操作错误信息*/);
  118. //私钥解密
  119. static BOOL RSAPrivDec(const BYTE * pKeyBuf/*[in]私钥*/,
  120. const UINT nKeyLen/*[in]私钥长度*/,
  121. const char * pPwd/*[in]私钥密码*/,
  122. const BYTE * pInStream/*[in]输入文件或内存*/,
  123. DWORD nInlen/*[in]数据长度,为0表示pInStream为文件名*/,
  124. BYTE * pOutStream/*[out]解密后的数据*/,
  125. DWORD & nOutlen/*[in,out]in为0时候表示pOutStream为文件名,out解密后数据长度*/,
  126. char * OperMsg/*[out]返回操作错误信息*/);
  127. //私钥加密(签名)
  128. static BOOL RSAPrivEnc(const BYTE * pKeyBuf/*[in]私钥*/,
  129. const UINT nKeyLen/*[in]私钥长度*/,
  130. const char * pPwd/*[in]私钥密码*/,
  131. const BYTE * pInStream/*[in]输入文件或内存*/,
  132. DWORD nInlen/*[in]数据长度,为0表示pInStream为文件名*/,
  133. BYTE * pOutStream/*[out]加密后的数据*/,
  134. DWORD & nOutlen/*[in,out]in为0时候表示pOutStream为文件名,out加密后数据长度*/,
  135. char * OperMsg/*[out]返回操作错误信息*/);
  136. //公钥解密
  137. static BOOL RSAPubDec(const BYTE * pCertBuf/*[in]公钥*/,
  138.    const UINT nCertLen/*[in]公钥长度*/,
  139.    const char * pPwd/*[in]公钥密码,只针对PFX包文件*/,
  140.    const BYTE * pInStream/*[in]输入文件或内存*/,
  141.    DWORD nInlen/*[in]数据长度,为0表示pInStream为文件名*/,
  142.    BYTE * pOutStream/*[out]加密后的数据*/,
  143.    DWORD & nOutlen/*[in,out]in为0时候表示pOutStream为文件名,out加密后数据长度*/,
  144.    char * OperMsg/*[out]返回操作错误信息*/);
  145. //得到公钥加密后的缓冲区长度 加密 117 -> 128, 解密 128 -> 117 ,所以解密后缓冲区一定小于源缓冲区
  146. static DWORD GetEncLen(const char * pCertBuf, const UINT nCertLen, const DWORD nInlen);
  147. //目录操作
  148. static BOOL InitCrypt2(const CString strCpName, CString strPwd, const int type, EVP_CIPHER_CTX & cipherCtx);
  149. static DWORD Crypt2(EVP_CIPHER_CTX * pcipherCtx, const CString & strFileName,
  150. CFile & File, DWORD dBolckLen, CString & outStr);
  151. static void CleanCrypt2(EVP_CIPHER_CTX & cipherCtx);
  152. static BOOL InitDigest2(CString strMdName, EVP_MD_CTX & mdCtx);
  153. static DWORD Digest2(EVP_MD_CTX * mdCtx, const CString strFileName,
  154. CFile & File, CString & outStr);
  155. static BOOL VerifyDigest2(EVP_MD_CTX * mdCtx, const CString strFileName,
  156. CFile & File, DWORD dBolckLen, CString & outStr);
  157. static void CleanDigest2(EVP_MD_CTX & mdCtx);
  158. static BOOL InitSign2(CString strMdName, EVP_MD_CTX & md_Ctx, const char * key,
  159.   const int keylen, const char * pwd, X509 *& x509, EVP_PKEY *& pkey);
  160. static DWORD Sign2(EVP_MD_CTX * pCtx, EVP_PKEY *& pkey, const CString strFileName,
  161.   CFile & File, CString & outStr);
  162. static BOOL VerifySign2(EVP_MD_CTX * pCtx, EVP_PKEY *& pkey, const CString strFileName,
  163.   CFile & File, DWORD dBolckLen, CString & outStr);
  164. static void CleanSign2(EVP_MD_CTX & md_Ctx, X509 *& px509, EVP_PKEY *& pkey);
  165. static BOOL InitSeal2(stuCertLink * pCERT, const CString strCpName,
  166.   CFile & File, EVP_CIPHER_CTX & eCtx, CString & outStr);
  167. static DWORD Seal2(EVP_CIPHER_CTX * pCtx,const CString strFileName, CFile & File, CString & outStr);
  168. static void CleanSeal2(EVP_CIPHER_CTX & sealCtx);
  169. static BOOL InitOpenSeal2(char * key, int keylen, char * pwd, const CString strCpName,
  170.   CFile & File, EVP_CIPHER_CTX & eCtx, CString & outStr);
  171. static DWORD OpenSeal2(EVP_CIPHER_CTX & eCtx, CFile & File, DWORD dBolckLen, 
  172. const CString strFileName, CString & outStr);
  173. static void CleanOpenSeal2(EVP_CIPHER_CTX & eCtx);
  174. static BOOL GetPubRsa(const BYTE * pCertBuf, const UINT nCertLen, RSA *& pRsa);
  175. static BOOL GetPrivRsa(const BYTE * pKeyBuf,const UINT nKeyLen, const char * pPwd, RSA *& pRsa);
  176. static void FreeRsa(RSA *& pRsa);
  177. static DWORD RSAPubEnc2(RSA * pRsa, const CString strFileName, CFile & File, CString & outStr);
  178. static DWORD RSAPrivDec2(RSA * pRsa, CFile & File, DWORD dBolckLen, const CString strFileName, CString & outStr);
  179. static DWORD RSAPrivEnc2(RSA * pRsa, const CString strFileName, CFile & File, CString & outStr);
  180. static DWORD RSAPubDec2(RSA * pRsa, CFile & File, DWORD dBolckLen, const CString strFileName, CString & outStr);
  181. private:
  182. static void DrawProg(float fPot);
  183. static CProgressCtrlST * m_pProgress;
  184. };
  185. #endif // !defined(AFX_EVP_H__3857E3C8_085F_4691_ABCF_5D7F2E9536BA__INCLUDED_)