pkcscontainer.cpp
上传用户:filter2008
上传日期:2013-02-01
资源大小:101k
文件大小:11k
源码类别:

CA认证

开发平台:

C/C++

  1. /****************************************************************************
  2. * library : pkcs_csp.dll
  3. * Purpose : It is a cryptographic service provider which is an independent 
  4. * software module that actually performs cryptography algorithms for 
  5. * authentication, encoding, and encryption.
  6. * This DLL can be interfaced on any PKCS#11 module.  
  7. *
  8. * Copyright (C) 2003 Ilex Syst鑝es Informatiques
  9. *
  10. * This library is free software; you can redistribute it and/or
  11. * modify it under the terms of the GNU Lesser General Public
  12. * License as published by the Free Software Foundation; either
  13. * version 2.1 of the License, or (at your option) any later version.
  14. *
  15. * This library is distributed in the hope that it will be useful,
  16. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  17. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  18. * Lesser General Public License for more details.
  19. *
  20. * You should have received a copy of the GNU Lesser General Public
  21. * License along with this library; if not, write to the Free Software
  22. * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
  23. *
  24. * Contact :
  25. * Ilex 
  26. * 51 boulevard Voltaire
  27. * 92600 Asni鑢es-sur-Seine
  28. * pkizy@ilex.fr
  29. *
  30. * Author: Delouvrier Antoine
  31. *
  32. *******************************************************************************/
  33. /*
  34. %----------------------------------------------------------------------------
  35. % PROJECT : CSP_PKCS
  36. %
  37. % MODULE : PKCSContainer
  38. %
  39. % VERSION : 1.00
  40. %
  41. % FICHIER : container.cpp
  42. %
  43. % Class container : it has the parameters of a container and methods making 
  44. % it possible to handle them
  45. %----------------------------------------------------------------------------
  46. % Version 1.00
  47. % CPX-31/03/2003-Cr閍tion
  48. %----------------------------------------------------------------------------
  49. */
  50. /*
  51. % Libraries ANSI or system
  52. %------------------------------
  53. */
  54. #include <windows.h>
  55. /*
  56. % HEADER Files include
  57. %-----------------------
  58. */
  59. #include "pkcscontainer.h"
  60. #include "cryptool.h"
  61. PKCSContainer::PKCSContainer() 
  62. {
  63. }
  64. /*
  65. %--------------------------------------------------------------------------
  66. % Initialize
  67. %
  68. % The Initialize method is used to initialize the container object
  69. %  
  70. %
  71. % Parameters of entry :
  72. % IN pFunctionList pointer on the list of functions Pkcs#11
  73. % IN hSession handle on a session Pkcs#11 
  74. % IN hcert handle on an object PKCS#11 certificate
  75. % IN cursubject character strings corresponding to the subject of the certificate
  76. % IN cursubjectLen length of the character strings above
  77. % IN keyId character strings corresponding to the keyID of the certificate
  78. % IN keyIdLen length of the character strings above
  79. % IN containerName the name of the container
  80. %  
  81. % return : TRUE if the operation occurred well, FALSE if not 
  82. %---------------------------------------------------------------------------
  83. */
  84. BOOL PKCSContainer::Initialize(CK_FUNCTION_LIST_PTR pFunctionList,CK_SLOT_ID slotID,CK_SESSION_HANDLE hSession,CK_OBJECT_HANDLE hcert,CK_BYTE_PTR cursubject,unsigned long cursubjectLen,CK_BYTE_PTR keyId,unsigned long keyIdLen,char * containerName )
  85. {
  86. TRACE(__LINE__,"PKCSContainer::Initialize BEGIN",NULL);
  87. this->pFunctionList=pFunctionList;
  88. this->slotID=slotID;
  89. this->hSession=hSession;
  90. this->hcert=hcert;
  91. this->cursubject=(CK_BYTE_PTR) malloc(cursubjectLen*sizeof(CK_BYTE));
  92. memcpy(this->cursubject,cursubject,cursubjectLen);
  93. this->keyId=(CK_BYTE_PTR) malloc(keyIdLen*sizeof(CK_BYTE));
  94. memcpy(this->keyId,keyId,keyIdLen);
  95. this->containerName=new char[strlen(containerName)];
  96. strcpy(this->containerName,containerName);
  97. TRACE(__LINE__,"PKCSContainer::Initialize TRUE",NULL);
  98. return TRUE;
  99. }
  100. /*
  101. %--------------------------------------------------------------------------
  102. % ~PKCSContainer()
  103. %
  104. % ~PKCSContainer() is the destructor of the container object
  105. %---------------------------------------------------------------------------
  106. */
  107. PKCSContainer::~PKCSContainer()
  108. {
  109. }
  110. /*
  111. %--------------------------------------------------------------------------
  112. % Delete()
  113. %
  114. % Delete() destroy parameters of the container object
  115. %  
  116. %  
  117. %  
  118. % return : TRUE if the operation occurred well, FALSE if not 
  119. %---------------------------------------------------------------------------
  120. */
  121. bool PKCSContainer::Delete()
  122. {
  123. TRACE(__LINE__,"PKCSContainer::Delete BEGIN",NULL);
  124. CK_RV rv=CKR_OK; 
  125. free(this->cursubject);
  126. free(this->keyId);
  127. rv=closeSession(pFunctionList,hSession);
  128. if(rv!=CKR_OK)
  129. {
  130. if(rv==CKR_SESSION_HANDLE_INVALID){
  131. TRACE(__LINE__,"PKCSContainer::Delete TRUE",NULL);
  132. return true;
  133. }
  134. TRACE(__LINE__,"PKCSContainer::Delete FALSE",NULL);
  135. return false;
  136. }
  137. TRACE(__LINE__,"PKCSContainer::Delete TRUE",NULL);
  138. return true;
  139. }
  140. /*
  141. %--------------------------------------------------------------------------
  142. % GetpFunctionList()
  143. %
  144. % GetpFunctionList() return the pointer of function of DLL PKCS used for this container
  145. %  
  146. %  
  147. %  
  148. % return : the pointer of function of DLL PKCS used for this container
  149. %---------------------------------------------------------------------------
  150. */
  151. CK_FUNCTION_LIST_PTR PKCSContainer::GetpFunctionList()
  152. {
  153. return pFunctionList;
  154. }
  155. /*
  156. %--------------------------------------------------------------------------
  157. % SetpFunctionList
  158. %
  159. % SetpFunctionList allows to set the pointer of function of DLL PKCS used for this container
  160. %
  161. % Parameters of entry :
  162. % IN pFunctionList pointer on the list of functions Pkcs#11 
  163. %---------------------------------------------------------------------------
  164. */
  165. void PKCSContainer::SetpFunctionList(CK_FUNCTION_LIST_PTR pFunctionList)
  166. {
  167. this->pFunctionList=pFunctionList;
  168. }
  169. /*
  170. %--------------------------------------------------------------------------
  171. % GetslotID()
  172. %
  173. % GetslotID() returns the slotID of this container
  174. %  
  175. %  
  176. % return  : the slotID of this container
  177. %---------------------------------------------------------------------------
  178. */
  179. CK_SLOT_ID PKCSContainer::GetslotID()
  180. {
  181. return slotID;
  182. }
  183. /*
  184. %--------------------------------------------------------------------------
  185. % SetslotID
  186. %
  187. % SetslotID allows to set the slotID of this container
  188. %  
  189. %
  190. % Parameters of entry :
  191. % IN slotID the slotID of container
  192. %---------------------------------------------------------------------------
  193. */
  194. void PKCSContainer::SetslotID(CK_SLOT_ID slotID)
  195. {
  196. this->slotID=slotID;
  197. }
  198. /*
  199. %--------------------------------------------------------------------------
  200. % GethSession
  201. %
  202. % GethSession return the session to be used for this container
  203. %  
  204. % return : the session to be used for this container
  205. %---------------------------------------------------------------------------
  206. */
  207. CK_SESSION_HANDLE PKCSContainer::GethSession()
  208. {
  209. return hSession;
  210. }
  211. /*
  212. %--------------------------------------------------------------------------
  213. % SethSession
  214. %
  215. % SethSession allows to set the session to be used for this container
  216. %  
  217. %
  218. % Parameters of entry :
  219. % IN hSession the PKCS#11 session
  220. %  
  221. %---------------------------------------------------------------------------
  222. */
  223. void PKCSContainer::SethSession(CK_SESSION_HANDLE hSession)
  224. {
  225. this->hSession=hSession;
  226. }
  227. /*
  228. %--------------------------------------------------------------------------
  229. % Gethcert
  230. %
  231. % Gethcert returns the handle of certificate of this container
  232. %  
  233. %  
  234. % return : the handle of certificate of this container
  235. %---------------------------------------------------------------------------
  236. */
  237. CK_OBJECT_HANDLE PKCSContainer::Gethcert()
  238. {
  239. return hcert;
  240. }
  241. /*
  242. %--------------------------------------------------------------------------
  243. % Sethcert
  244. %
  245. % Sethcert allows to set the handle of certificate of this container
  246. %  
  247. %
  248. % Parameters of entry :
  249. %  IN hcert the handle of certificate of this container
  250. %---------------------------------------------------------------------------
  251. */
  252. void PKCSContainer::Sethcert(CK_OBJECT_HANDLE hcert)
  253. {
  254. this->hcert=hcert;
  255. }
  256. /*
  257. %--------------------------------------------------------------------------
  258. % Getcursubject
  259. %
  260. % Getcursubject returns the subject of the certificate of this container
  261. %  
  262. %  
  263. % return : the subject of the certificate of this container
  264. %---------------------------------------------------------------------------
  265. */
  266. CK_BYTE_PTR PKCSContainer::Getcursubject()
  267. {
  268. return cursubject;
  269. }
  270. /*
  271. %--------------------------------------------------------------------------
  272. % GetkeyId
  273. %
  274. % GetkeyId returns the ID of the key of the certificate of this container
  275. %  
  276. %  
  277. % return : the ID of the key 
  278. %---------------------------------------------------------------------------
  279. */
  280. CK_BYTE_PTR PKCSContainer::GetkeyId()
  281. {
  282. return keyId;
  283. }
  284. /*
  285. %--------------------------------------------------------------------------
  286. % GetdwKeySpec
  287. %
  288. % GetdwKeySpec return the type of key for this container
  289. %  
  290. %
  291. % Parameters of entry :
  292. % IN dwKeySpec the type of key for this container
  293. %  
  294. %  
  295. % return : the type of key
  296. %---------------------------------------------------------------------------
  297. */
  298. BOOL PKCSContainer::GetdwKeySpec(DWORD dwKeySpec)
  299. {
  300. TRACE(__LINE__,"PKCSContainer::GetdwKeySpec BEGIN",NULL);
  301. CK_RV rv=CKR_OK;
  302. CK_BBOOL bbool;
  303. CK_OBJECT_HANDLE phKey=NULL; 
  304. rv=getPublicKeyFromX509Cert(this->pFunctionList,this->hSession,&phKey ,this->hcert);
  305. if (rv != CKR_OK){
  306. TRACE(__LINE__,"PKCSContainer::GetdwKeySpec FALSE",NULL);
  307. return false;
  308. }
  309. if(dwKeySpec==AT_SIGNATURE)
  310. {
  311. bbool=isPubKeySupportSign(this->pFunctionList,this->hSession,phKey);
  312. if(bbool==TRUE){
  313. TRACE(__LINE__,"PKCSContainer::GetdwKeySpec TRUE",NULL);
  314. return TRUE;
  315. }
  316. else{
  317. TRACE(__LINE__,"PKCSContainer::GetdwKeySpec FALSE",NULL);
  318. return FALSE;
  319. }
  320. }
  321. else if(dwKeySpec==AT_KEYEXCHANGE)
  322. {
  323. bbool=isPubKeySupportEncrypt(this->pFunctionList,this->hSession,phKey);
  324. if(bbool==TRUE){
  325. TRACE(__LINE__,"PKCSContainer::GetdwKeySpec TRUE",NULL);
  326. return TRUE;
  327. }
  328. else{
  329. TRACE(__LINE__,"PKCSContainer::GetdwKeySpec FALSE",NULL);
  330. return FALSE;
  331. }
  332. }
  333. else{
  334. TRACE(__LINE__,"PKCSContainer::GetdwKeySpec FALSE",NULL);
  335. return FALSE;
  336. }
  337. }
  338. /*
  339. %--------------------------------------------------------------------------
  340. % GetUserKey
  341. %
  342. % GetUserKey returns a handle on the container
  343. %  
  344. %
  345. % Parameters of entry  :
  346. % IN dwKeySpec the type of key for this container
  347. % OUT phUserKey handle on the container
  348. %  
  349. % Valeur retourn閑 : TRUE if the operation occurred well, FALSE if not
  350. %---------------------------------------------------------------------------
  351. */
  352. BOOL PKCSContainer::GetUserKey(DWORD dwKeySpec,HCRYPTKEY* phUserKey)
  353. {
  354. TRACE(__LINE__,"PKCSContainer::GetUserKey BEGIN",NULL);
  355. *phUserKey=(HCRYPTKEY)this; 
  356. TRACE(__LINE__,"PKCSContainer::GetUserKey TRUE",NULL);
  357. return TRUE;
  358. }