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

CA认证

开发平台:

Visual C++

  1. #include <time.h>
  2. #define DER     1 //FORMAT_ASN1
  3. #define PEM     3 /*定义格式*/
  4. #define NET 4
  5. #define P12 5
  6. #define MAX_MD_SIZE (16+20) /* The SSLv3 md5+sha1 type */
  7. #pragma warning(disable:4786)
  8. #include <string>
  9. #include <list>
  10. typedef char * (* PNewCrlMem)(UINT len);
  11. /*struct stuSUBJECT//个体信息  由于文本框输入限制对中文不起作用,只能增加一倍缓冲长度
  12. {
  13. UCHAR C[16];//国家
  14. UCHAR ST[16];//省份
  15. UCHAR L[32];//城市
  16. UCHAR O[100];//组织
  17. UCHAR OU[100];//组织部门
  18. UCHAR CN[100];//个人信息
  19. UCHAR T[32];//头衔
  20. UCHAR G[32];//曾用名
  21. UCHAR S[32];//描述
  22. UCHAR MAIL[96];//电子邮件
  23. stuSUBJECT()
  24. {
  25. memset(this,0,sizeof(stuSUBJECT));
  26. }
  27. };*/
  28. struct stuCertPair //公私钥结构
  29. {
  30. const char * memCert;//公钥文件名或公钥内存
  31. UINT lenCert;//文件 - 0,内存 - 内存长度
  32. const char * memKey;//私钥文件名或私钥内存
  33. UINT lenKey;//文件 - 0,内存 - 内存长度
  34. const char * pwdKey;//私钥密码
  35. stuCertPair()
  36. {
  37. memset(this,0,sizeof(stuCertPair));
  38. }
  39. stuCertPair(const char * memcert,const UINT lencert,
  40.         const char * memkey,const UINT lenkey,
  41. const char * pwdkey)
  42. {
  43. memCert = memcert;
  44. lenCert = lencert;
  45. memKey = memkey;
  46. lenKey = lenkey;
  47. pwdKey = pwdkey;
  48. }
  49. };
  50. typedef struct stuCERTEXT//证书信息和扩展结构
  51. {
  52. char * cName;//内部标准名称
  53. char * cInfo;//内容
  54. stuCERTEXT * Link;
  55. stuCERTEXT()
  56. {
  57. memset(this,0,sizeof(stuCERTEXT));
  58. }
  59. stuCERTEXT(const stuCERTEXT & Link)
  60. {
  61. this->cName = Link.cName;
  62. this->cInfo = Link.cInfo;
  63. this->Link = Link.Link;
  64. }
  65. stuCERTEXT(const char *  cName,const char * cInfo)
  66. {
  67. this->cName =  new char[strlen(cName)+1];
  68. strcpy(this->cName,cName);
  69. this->cInfo = new char[strlen(cInfo)+1];
  70. strcpy(this->cInfo,cInfo);
  71. Link = NULL;
  72. }
  73. ~stuCERTEXT()
  74. {
  75. delete [] this->cName;
  76. delete [] this->cInfo;
  77. }
  78. void Add(stuCERTEXT *& Head,const char * cName,const char * cInfo)
  79. {
  80. stuCERTEXT * End = new stuCERTEXT(cName,cInfo);//钥增加的节点
  81. if(Head == NULL)
  82. {
  83. Head = End;
  84. }
  85. else 
  86. {
  87. stuCERTEXT * p = Head;
  88. while(p->Link != NULL)  
  89. p = p->Link;
  90. p->Link = End; 
  91. }
  92. }
  93. const char * GetCN()
  94. {
  95. //查找CN
  96. return "hpxs";
  97. }
  98. void RemoveAll(stuCERTEXT *& Head)
  99. {
  100. while(Head!=NULL)//遍历链表
  101. {
  102. stuCERTEXT * temp = NULL;
  103. temp = Head;
  104. Head = Head->Link;
  105. delete temp;
  106. }
  107. }
  108. }stuSUBJECT;
  109. struct stuREVOKE//证书作废结构链表
  110. {
  111. ULONG Index;//证书序号
  112. time_t time;//吊销时间
  113. stuREVOKE * Link;
  114. stuREVOKE()
  115. {
  116. memset(this,0,sizeof(stuREVOKE));
  117. }
  118. stuREVOKE(ULONG index,time_t t)
  119. {
  120. Index = index;
  121. time = t;
  122. Link = NULL;
  123. }
  124. void AddRevoke(stuREVOKE *& Head,const ULONG index,const time_t time)
  125. {
  126. stuREVOKE * End = new stuREVOKE(index,time);//钥增加的节点
  127. if(Head == NULL)
  128. {
  129. Head = End;
  130. }
  131. else 
  132. {
  133. stuREVOKE * p = Head;
  134. while(p->Link != NULL)  
  135. p = p->Link;
  136. p->Link = End; 
  137. }
  138. }
  139. void RemoveAll(stuREVOKE *& Head)
  140. {
  141. while(Head != NULL)//遍历链表
  142. {
  143. stuREVOKE * temp =NULL;
  144. temp = Head;
  145. Head = Head->Link;
  146. delete temp;
  147. }
  148. }
  149. };
  150. /*证书格式转换函数*/
  151. BOOL CertFormatConver(const char * buf/*文件内容或文件名称*/,
  152.   const int len/*内存长度为0则buf为文件名*/,
  153.   const char * pwd/*p12文件密码,或者解密私钥密码*/,
  154.   char * pem/*输出内存*/,
  155.   UINT * pOutLen,/*输入内存长度,输出实际输出的长度*/
  156.   char * keyPwd,/*加密私钥密码,只在私钥时候起作用*/
  157.   const int outformat,
  158.   char * outMsg/*操作结果*/);
  159. /*根证书生成函数,根据rootInfo信息,生成根证书公、私钥文件*/
  160. BOOL MakeRoot(const stuSUBJECT * RootInfo,/*[in]信息*/
  161.   const char * FriendlyName/*好记的名称,出现在P12包里面*/,
  162.   const int iKeyBits/*[in]位数*/, 
  163.   const long CertSerial/*[in]序列号*/, 
  164.   const int CertDays/*[in]有效期*/,
  165.   const char * KeyEncPwd/*[in]加密私钥密码*/,
  166.   const char * Kusage,/*密钥用法*/
  167.   const char * Ekusage,/*扩展密钥用法*/
  168.   const stuCERTEXT * pCertExt,/*证书扩展*/
  169.   char * CertMem/*[OUT]证书*/,
  170.   UINT * CertLen/*[OUT]*/,
  171.   char * KeyMem/*[OUT]私钥*/,
  172.   UINT * KeyLen/*[OUT]*/,
  173.   char * P12Mem/*[OUT]pkcs#12*/,
  174.   UINT * P12Len/*[OUT]*/,
  175.   char * outMsg,/*操作结果*/
  176.   const int type = DER/*[in]类型pem-der*/);
  177. /*证书请求生成函数,根据reqInfo信息,生成用户证书私钥文件、证书请求文件*/
  178. BOOL MakeReq(const stuSUBJECT * ReqInfo,/*请求信息IN*/
  179.  const int KeyBits/*位数IN*/,
  180.  const char * KeyEncPwd/*私钥密码,IN*/,
  181.  char * ReqMem/*证书请求文件OUT*/,
  182.  UINT * ReqLen/*证书请求文件长度OUT*/,
  183.  char * KeyMem/*私钥文件OUT*/,
  184.  UINT * KeyLen/*私钥文件文件长度OUT*/,
  185.  char * outMsg/*操作结果OUT*/,
  186.  const int iType = DER/*类型pem-der*/);
  187. /*证书生成函数,通过证书请求,生成用户证书公钥文件*/
  188. BOOL MakeCert(const stuCertPair & RootPair/*根证书对*/,
  189.   const long CertSerial/*序列号*/,
  190.   const char * CertEndDate/*作废日期*/,
  191.   const int CertDays/*有效期*/, 
  192.   const char * StreamReq/*请求文件或内存*/,
  193.   const int ReqLen/*请求的长度,0-标示文件*/,
  194.   const char * KUSAGE/*密钥用法*/,
  195.   const char * EKUSAGE/*增强密钥用法*/,
  196.   const stuCERTEXT * pCertExt,/*证书扩展*/
  197.   char * CertMem/*结果公钥文件*/,
  198.   UINT * CertLen/*结果长度*/,
  199.   char * outMsg/*操作结果*/,
  200.   const int type = DER/*结果类型DER,PEM*/);//通过证书请求,得到证书
  201. //直接生成公私钥
  202. BOOL DirectCert(const stuCertPair & RootPair/*根证书对*/,
  203. const int KeyBits/*[IN]*/,
  204. const long CertSerial/*[IN]序列号*/,
  205. const char * CertEndDate/*[IN]作废日期*/,
  206. const int CertDays/*[IN]有效期*/,
  207. const char * KeyEncPwd /*私钥加密密码,IN*/,
  208. const stuSUBJECT * sSUBJECT/*[IN]用户信息*/,
  209. const char * FriendlyName/*好记的名称*/,
  210. const char * KeyUsage/*密钥用法*/,
  211. const char * EkeyUsage/*扩展密钥用法*/,
  212. const stuCERTEXT * pCertExt,
  213. char * CertMem/*[OUT]输出证书公钥*/,
  214. UINT * CertLen/*[OUT]长度*/,
  215. char * KeyMem/*[OUT]输出证书私钥*/,
  216. UINT * KeyLen/*[OUT]长度*/,
  217. char * P12Mem/*[OUT]输出证书私钥*/,
  218. UINT * P12Len/*[OUT]长度*/,
  219. char * outMsg,
  220. const int type = DER/*结果类型DER,PEM*/);//直接生成公私钥
  221. /*黑名单生成函数*/
  222. BOOL MakeCrl(const stuCertPair & RootPair/*根证书对*/,
  223.  const stuREVOKE * Head/*作废链表*/,
  224.  const PNewCrlMem NewCrlMem/*回调函数*/,
  225.  char *& outCrl,
  226.  int * crll,
  227.  char * outfile/*crl文件*/,
  228.  char * outMsg/*操作结果*/);
  229. /*转换证书到REQ,如果根证书公私钥无法加载,则生成REQ否则生成证书*/
  230. //BOOL X5092Req(const char * Cert/*公钥*/,const int Certlen,const char * Key/*私钥,用于签名公钥*/,const int Keylen,
  231. //   const char * Keypwd/*密码*/,
  232. //   const char * outFile/*输出文件,req或者公钥证书*/,char * outMsg,/*操作结果*/
  233. //   char * Rootcert,/*根证书公钥*/int Rootlen,/*为0则certfile为磁盘文件,否则为内存区域*/
  234. //   char * Rootkey/*根证书私钥*/,int RKeylen,char * Pwd/*私钥密码*/);
  235. /*分解p12包*/
  236. BOOL ParsePfx(const char * StreamP12/*包文件或内存*/,
  237.   const UINT iP12Len/* 如果包为文件,则为0,否则为内存长度*/,
  238.   const char * P12DecPwd/*P12密码*/,
  239.   const char * PathCert/*公钥存放*/,
  240.   const char * PathKey/*私钥存放*/,
  241.   const char * KeyEncPwd/*私钥密码*/,
  242.   const int OutFormat/*输出格式*/,
  243.   char * outMsg/*返回结果*/);
  244. /*组合p12包*/
  245. BOOL CreatePfx(char * StreamP12/*OUT包文件路径或内存区域*/,
  246.    UINT & uP12Len,/*输入时候为用于保存结果的内存区域长度, 输出为实际P12内存的长度*/
  247.    const char * P12EncPwd/*IN 用于加密P12的密码*/,
  248.    const char * FriendName,/*IN 好记名称*/
  249.    const char * StreamCert/*IN公钥*/,
  250.    const UINT uCertLen,/*IN,公钥内存区域长度, 0 - 标示输入为磁盘文件*/
  251.    const char * Streamkey/*IN私钥*/,
  252.    const UINT uKeyLen,/*IN,私钥内存区域长度, 0 - 标示输入为磁盘文件*/
  253.    const char * KeyDecPwd/*解密私钥密码*/,
  254.    char * outMsg/*返回结果*/);
  255. BOOL ChangePfxPwd(const char * strP12/*in老包文件*/,
  256.    const char * strPwd/*IN原密码*/,
  257.    const char * strPwd2/*IN新密码*/,
  258.    const char * strOutP12/*in新包文件*/,
  259.    char * outMsg/*返回结果*/);
  260. //检验公钥、私钥是否配对
  261. BOOL CertPairCheck(const char * cert,
  262.    const char * key,
  263.    char * outMsg,
  264.    const char * priPwd = NULL/*私钥密码,IN*/);//检验公钥、私钥是否配对
  265. // 通过黑名单验证证书,验证通过返回真,否则返回假
  266. BOOL CheckCertWithCrl(const char *pubCert,const int pubCertLen,const char *crlData,const int crlLen,char * outMsg);
  267. // 通过根证书验证证书
  268. BOOL CheckCertWithRoot(const char *pubCert,const int pubCertLen,const char *rootCert,const int rootCertLen,char * outMsg);
  269. //检查证书有效期,在有效期内返回真,否则返回假
  270. BOOL CheckCertLife(const char *pubCert,const int pubCertLen,char * outMsg);
  271. //根证书预览
  272. //BOOL MakeRootPub(stuSUBJECT * rootInfo,/*信息*/ char * certMem/*证书文件*/,int * certLen,char * outMsg/*操作结果*/);
  273. /*组合P7包*/
  274. BOOL CreateP7b(std::list<std::string> * pCertList,
  275.    const char * lpszCrl,
  276.    const char * lpszP7b,
  277.    const int outformat,
  278.    char * outMsg/*返回结果*/);
  279. /*分解P7包*/
  280. BOOL ParseP7b(const char * lpszInP7b/*包文件或内存*/,
  281.   const UINT iP12Len/* 如果包为文件,则为0,否则为内存长度,预留将来用*/,
  282.   const int outformat/*输出格式*/,
  283.   const char * lpszCert/*公钥存放*/,
  284.   const char * lpszCrl/*CRL存放*/,
  285.   const char * lpszOutP7b/*用于转换P7格式的输出文件名*/,
  286.   char * outMsg/*返回结果*/);