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

CA认证

开发平台:

C/C++

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <memory.h>
  4. #include <errno.h>
  5. #include <string.h>
  6. #include<windows.h>
  7. #include <wincrypt.h>
  8. #include <time.h>
  9. #include "cryptool.h"
  10. #define CK_API      __stdcall
  11. typedef void *      SYS_HANDLE;
  12. typedef int ( CK_API *CK_PFUNCTION)();
  13. SYS_HANDLE dllPtr;
  14. int traceLevel=0;
  15. bool initializeDone=false;
  16. CK_RV init(CK_FUNCTION_LIST_PTR CK_PTR pFunctionList){
  17.    CK_RV rc;             // Return Code
  18.    CK_C_GetFunctionList    pFuncList;
  19.    /* Open the PKCS11 API shared library*/
  20.    int l = 50;
  21.    char buf[50 + 1];
  22.    int rl;
  23.    rl = GetPrivateProfileString( SECTION_PKCS_NAME, KEY_PKCS_NAME ,"",(char *) buf, 51,CSP_PKCS11_INI);
  24.    if(rl==0)
  25.    return CKR_CANCEL;
  26.    dllPtr = LoadLibrary(buf);
  27.    if (!dllPtr) {
  28.    return CKR_CANCEL;
  29.    }
  30.    
  31.    // Get the list of the PKCS11 functions this token supports 
  32.    pFuncList = (CK_C_GetFunctionList)GetProcAddress((HINSTANCE)dllPtr,(LPCSTR)"C_GetFunctionList");
  33.    if (!pFuncList) {
  34.       rc = errno;
  35.       return rc;
  36.    }
  37.    //pFuncList(&FunctionPtr);
  38.    (*pFuncList)(pFunctionList);
  39.    rc=initialize(*pFunctionList,NULL_PTR);
  40.    if (rc != CKR_OK) {
  41.       cleanup(*pFunctionList);
  42.   return CKR_CANCEL;
  43.    }
  44.    initializeDone=true;
  45.    
  46.    return CKR_OK;
  47. }
  48. /*
  49. %--------------------------------------------------------------------------
  50. % cleanup
  51. %
  52. % R鬺e : cleanup est utilis閑 pour lib閞er la dll PKCS
  53. %  
  54. %
  55. % Param鑤res d'entr閑 :
  56. % IN 
  57. %  
  58. % Valeur retourn閑 : TRUE si l'op閞ation s'est bien pass閑
  59. % FALSE sinon 
  60. %---------------------------------------------------------------------------
  61. */
  62. CK_RV cleanup(CK_FUNCTION_LIST_PTR pFunctionList){
  63.    CK_RV rc=CKR_OK;  // Return Code
  64.    /* To clean up we will free the slot list we create, call the Finalize
  65.     * routine for PKCS11 and close the dynamically linked library */
  66.    if(initializeDone){
  67.        initializeDone=false;
  68.        rc = pFunctionList->C_Finalize(NULL);
  69.        if(rc!=CKR_OK)
  70.      return rc;
  71.    }
  72.    return CKR_OK;
  73. }
  74. /*
  75. %--------------------------------------------------------------------------
  76. % initialize
  77. %
  78. % R鬺e : initialize est utilis閑 pour initialiser la dll PKCS
  79. %  
  80. %
  81. % Param鑤res d'entr閑 :
  82. % IN 
  83. %  
  84. % Valeur retourn閑 : TRUE si l'op閞ation s'est bien pass閑
  85. % FALSE sinon 
  86. %---------------------------------------------------------------------------
  87. */
  88. CK_RV initialize(CK_FUNCTION_LIST_PTR pFunctionList, char * pReserved) {
  89. CK_RV rv=CKR_OK;
  90. CK_C_INITIALIZE_ARGS initArgs;
  91. if (pReserved!=NULL_PTR) {
  92. initArgs.CreateMutex=NULL_PTR;
  93. initArgs.DestroyMutex=NULL_PTR;
  94. initArgs.LockMutex=NULL_PTR;
  95. initArgs.UnlockMutex=NULL_PTR;
  96. initArgs.flags=0;
  97. initArgs.pReserved=pReserved;
  98. }
  99. rv = (*pFunctionList->C_Initialize)(pReserved==NULL_PTR?NULL_PTR:&initArgs);
  100. return rv;
  101. }
  102. CK_BBOOL isPrivKeySupportSign(CK_FUNCTION_LIST_PTR pFunctionList, CK_SESSION_HANDLE hSession, CK_OBJECT_HANDLE hPrivKey)
  103. {
  104. CK_RV rv=CKR_OK;
  105. CK_BBOOL bbool;
  106.    
  107. CK_ATTRIBUTE templateAttr [] = 
  108. {
  109. {CKA_SIGN,&bbool,sizeof(CK_BBOOL)}
  110. };
  111. rv = (*pFunctionList->C_GetAttributeValue)(hSession,hPrivKey,templateAttr,1);
  112.   
  113. return bbool;
  114. }
  115. CK_RV getKeyFromX509Cert(CK_FUNCTION_LIST_PTR pFunctionList, CK_SESSION_HANDLE hSession, CK_OBJECT_HANDLE_PTR phKey, 
  116.   CK_OBJECT_HANDLE hCert,
  117.   CK_OBJECT_CLASS keyClass, int occurence)
  118. {
  119. CK_RV rv=CKR_OK;
  120. CK_ULONG keyIdLen=256; 
  121. CK_ULONG subjectLen=256;
  122. CK_ULONG keyListLen=10;
  123. CK_OBJECT_HANDLE_PTR phKeyList = (CK_OBJECT_HANDLE_PTR)malloc(keyListLen*sizeof(CK_OBJECT_HANDLE));
  124. CK_BYTE_PTR subject = NULL;
  125. CK_ULONG nbAttribut=0;
  126. CK_BYTE_PTR keyId = NULL;
  127.     CK_ATTRIBUTE KeyTemplate[] = {
  128. {CKA_CLASS,&keyClass,sizeof(keyClass)},
  129. {CKA_ID,keyId,keyIdLen},
  130. {CKA_SUBJECT,subject,subjectLen}
  131. };
  132.     if ( phKeyList == NULL)
  133.     {
  134.         return CKR_HOST_MEMORY;
  135.     }
  136. rv = getX509KeyId(pFunctionList, hSession, hCert, NULL_PTR, &keyIdLen);
  137. if (rv!=CKR_OK) {
  138. free(phKeyList);
  139. return rv;
  140. }
  141. keyId = (CK_BYTE_PTR) malloc(keyIdLen*sizeof(CK_BYTE));
  142.     if ( keyId == NULL)
  143.     {
  144. free(phKeyList);
  145.         return CKR_HOST_MEMORY;
  146.     }
  147. rv = getX509KeyId(pFunctionList, hSession, hCert, keyId, &keyIdLen);
  148. if (rv!=CKR_OK) {
  149. free(phKeyList);
  150.     free(keyId);
  151. return rv;
  152. }
  153.     
  154. nbAttribut=2;
  155. if (keyClass==CKO_PRIVATE_KEY) {
  156. rv = getX509Subject(pFunctionList, hSession, hCert, NULL_PTR, &subjectLen);
  157. if (rv!=CKR_OK) {
  158. }
  159. else
  160. {
  161. subject = (CK_BYTE_PTR) malloc(subjectLen*sizeof(CK_BYTE));
  162. if ( subject == NULL)
  163. {
  164. }
  165. else
  166. {
  167. rv = getX509Subject(pFunctionList, hSession, hCert, subject, &subjectLen);
  168. /* DREN le 10/12/2002: Au cas ou le subject n'existerait pas ou
  169. serait faux ( ne commencant pas par 0x30 ASN1) ce n'est pas une erreur!
  170. if (rv!=CKR_OK) */
  171. if (rv!=CKR_OK || subject [0] != 'x30')
  172. {
  173. /*
  174. free(phKeyList);
  175.     free(keyId);
  176. free(subject);
  177. return rv; */
  178. /* DREN le 10/12/2002: Fin */
  179. }
  180. else
  181. {
  182. nbAttribut=3;
  183. KeyTemplate[2].type = CKA_SUBJECT;
  184. KeyTemplate[2].pValue = subject;
  185. KeyTemplate[2].ulValueLen = subjectLen;
  186. }
  187. }
  188. }
  189. }
  190.     KeyTemplate[0].type = CKA_CLASS;
  191.     KeyTemplate[0].pValue = &keyClass;
  192.     KeyTemplate[0].ulValueLen = sizeof(keyClass);
  193.     KeyTemplate[1].type = CKA_ID;
  194.     KeyTemplate[1].pValue = keyId;
  195.     KeyTemplate[1].ulValueLen = keyIdLen;
  196.     rv = (*pFunctionList->C_FindObjectsInit)(hSession,KeyTemplate,nbAttribut);
  197. if (rv == CKR_OK)
  198. {
  199. CK_ULONG ulObjectCount=keyListLen;
  200. int index = 0;
  201. while (1) 
  202. {
  203.            
  204. rv = (*pFunctionList->C_FindObjects)(hSession,phKeyList,keyListLen, &ulObjectCount);
  205.             if ( (rv != CKR_OK) || (ulObjectCount == 0) ) break;
  206. if (index == occurence) {
  207. *phKey=phKeyList[index];
  208. /*CK_ULONG keySubjectLen=256;
  209. CK_BYTE_PTR keySubject = (CK_BYTE_PTR) malloc(keySubjectLen);
  210. memset(keySubject, 0, keySubjectLen);
  211. rv = getKeySubject(hSession, *phKey, keySubject, &keySubjectLen);
  212. free(keySubject);*/
  213. break;
  214. }
  215. index ++;
  216. }
  217. rv = (*pFunctionList->C_FindObjectsFinal)(hSession);
  218. if (ulObjectCount == 0)
  219. rv=-1;
  220. } else {
  221. }
  222. free(phKeyList);
  223.     if ( keyId != NULL)
  224.      free(keyId);
  225.     if ( subject != NULL)
  226.     free(subject);
  227. return rv;
  228. }
  229. CK_RV getX509KeyId(CK_FUNCTION_LIST_PTR pFunctionList, CK_SESSION_HANDLE hSession, CK_OBJECT_HANDLE hCert,
  230.  CK_BYTE_PTR keyId, CK_ULONG_PTR plenKeyId
  231.   )
  232. {
  233. CK_RV rv=CKR_OK;
  234.     
  235. CK_ATTRIBUTE templateAttr[] = 
  236. {
  237. {CKA_ID,keyId,*plenKeyId}
  238. };
  239. rv = (*pFunctionList->C_GetAttributeValue)(hSession,hCert,templateAttr,1);
  240. *plenKeyId=templateAttr[0].ulValueLen;
  241. return rv;
  242. }
  243. CK_RV getX509Subject(CK_FUNCTION_LIST_PTR pFunctionList, CK_SESSION_HANDLE hSession, CK_OBJECT_HANDLE hCert,
  244.    CK_BYTE_PTR subject, CK_ULONG_PTR pSubjectLen
  245.   )
  246. {
  247. CK_RV rv=CKR_OK;
  248.     
  249. CK_ATTRIBUTE templateAttr [] = 
  250. {
  251. {CKA_SUBJECT,subject,*pSubjectLen}
  252. };
  253. rv = (*pFunctionList->C_GetAttributeValue)(hSession,hCert,templateAttr,1);
  254. *pSubjectLen=templateAttr[0].ulValueLen;
  255. return rv;
  256. }
  257. CK_RV getX509Label(CK_FUNCTION_LIST_PTR pFunctionList, CK_SESSION_HANDLE hSession, CK_OBJECT_HANDLE hCert,
  258.    CK_BYTE_PTR label, CK_ULONG_PTR plabelLen
  259.   )
  260. {
  261. CK_RV rv=CKR_OK;
  262. CK_ATTRIBUTE templateAttr [] = 
  263. {
  264. {CKA_LABEL,label,*plabelLen}
  265. };
  266. rv = (*pFunctionList->C_GetAttributeValue)(hSession,hCert,templateAttr,1);
  267. *plabelLen=templateAttr[0].ulValueLen;
  268. return rv;
  269. }
  270. CK_RV getX509Issuer(CK_FUNCTION_LIST_PTR pFunctionList, CK_SESSION_HANDLE hSession, CK_OBJECT_HANDLE hCert,
  271.    CK_BYTE_PTR issuer, CK_ULONG_PTR pIssuerLen)
  272. {
  273. CK_RV rv=CKR_OK;
  274.     
  275. CK_ATTRIBUTE templateAttr [] = 
  276. {
  277. {CKA_ISSUER,issuer,*pIssuerLen}
  278. };
  279. rv = (*pFunctionList->C_GetAttributeValue)(hSession,hCert,templateAttr,1);
  280. *pIssuerLen=templateAttr[0].ulValueLen;
  281. return rv;
  282. }
  283. CK_RV login(CK_FUNCTION_LIST_PTR pFunctionList, CK_SESSION_HANDLE hSession, CK_CHAR_PTR pinCode, CK_ULONG len)
  284. {
  285. CK_RV rv=CKR_OK;
  286. //trying to log using pin number
  287. rv = (*pFunctionList->C_Login)(hSession,CKU_USER,pinCode,len);
  288.    
  289. if (rv == CKR_OK)
  290. {
  291.         
  292. return rv;
  293. }
  294. return rv;
  295. }
  296. CK_RV logout(CK_FUNCTION_LIST_PTR pFunctionList, CK_SESSION_HANDLE hSession)
  297. {
  298. CK_RV rv=CKR_OK;
  299.     
  300. rv = (*pFunctionList->C_Logout)(hSession);
  301. return rv;
  302. }
  303. CK_RV getAllX509CertificateList(CK_FUNCTION_LIST_PTR pFunctionList, CK_SESSION_HANDLE hSession, CK_OBJECT_HANDLE_PTR phCertList, CK_ULONG_PTR pCertListSize)
  304. /* DREN le 11/07/2002 : Fin */
  305. {
  306. CK_OBJECT_CLASS certClass = CKO_CERTIFICATE;
  307. CK_CERTIFICATE_TYPE certType = CKC_X_509;
  308. CK_ATTRIBUTE certTemplate[] = {
  309. {CKA_CLASS,&certClass,sizeof(certClass)},
  310. {CKA_CERTIFICATE_TYPE,&certType,sizeof(certType)}
  311. };
  312. return getCertListFromAttr(pFunctionList, hSession, certTemplate, sizeof(certTemplate)/sizeof(CK_ATTRIBUTE), phCertList, pCertListSize);
  313. }
  314. CK_RV getCertListFromAttr(CK_FUNCTION_LIST_PTR pFunctionList, CK_SESSION_HANDLE hSession, CK_ATTRIBUTE_PTR pCertTemplate, CK_ULONG certTemplateSize, CK_OBJECT_HANDLE_PTR phCertList, CK_ULONG_PTR pCertListSize)
  315. {
  316. CK_RV rv=CKR_OK;
  317. rv = (*pFunctionList->C_FindObjectsInit)(hSession,pCertTemplate,certTemplateSize);
  318. if (rv == CKR_OK)
  319. {
  320. rv = (*pFunctionList->C_FindObjects)(hSession,phCertList,*pCertListSize, pCertListSize);
  321.         
  322. if ( (rv != CKR_OK) || (*pCertListSize == 0) )
  323. if (*pCertListSize == 0)
  324. rv=-1;
  325. rv = (*pFunctionList->C_FindObjectsFinal)(hSession);
  326. }
  327. return rv;
  328. }
  329. CK_RV getPrivateKeyFromX509Cert(CK_FUNCTION_LIST_PTR pFunctionList, CK_SESSION_HANDLE hSession, CK_OBJECT_HANDLE_PTR phKey, CK_OBJECT_HANDLE hCert)
  330. {
  331. return getKeyFromX509Cert(pFunctionList, hSession,phKey, hCert, CKO_PRIVATE_KEY,0);
  332. }
  333. CK_RV getPublicKeyFromX509Cert(CK_FUNCTION_LIST_PTR pFunctionList, CK_SESSION_HANDLE hSession, CK_OBJECT_HANDLE_PTR phKey, CK_OBJECT_HANDLE hCert)
  334. {
  335. return getKeyFromX509Cert(pFunctionList, hSession,phKey, hCert, CKO_PUBLIC_KEY,0);
  336. }
  337. CK_RV getKeyType(CK_FUNCTION_LIST_PTR pFunctionList, CK_SESSION_HANDLE hSession, CK_OBJECT_HANDLE hKey,
  338.  CK_KEY_TYPE * keyType)
  339. {
  340. CK_RV rv=CKR_OK;
  341. CK_ATTRIBUTE templateAttr [] = 
  342. {
  343. {CKA_KEY_TYPE,keyType,sizeof(CK_KEY_TYPE)}
  344. };
  345. rv = (*pFunctionList->C_GetAttributeValue)(hSession,hKey,templateAttr,1);
  346. return rv;
  347. }
  348. CK_RV getSlotListWithToken(CK_FUNCTION_LIST_PTR pFunctionList, CK_SLOT_ID_PTR tokenInSlotList, CK_ULONG_PTR pTokenInSlotListSize)
  349. {
  350. CK_RV rv=CKR_OK;
  351. CK_ULONG ulCount;
  352. CK_SLOT_ID_PTR pSlotList;
  353. CK_SLOT_INFO slotInfo;
  354. int i = 0;
  355. rv = (*pFunctionList->C_GetSlotList)(FALSE,NULL_PTR,&ulCount);
  356. if ( (rv== CKR_OK) && (ulCount>0))
  357. {
  358. //Get slot list
  359. pSlotList = (CK_SLOT_ID_PTR) malloc(ulCount*sizeof(CK_SLOT_ID));
  360. rv = (*pFunctionList->C_GetSlotList)(FALSE,pSlotList,&ulCount);
  361. if (rv == CKR_OK)
  362. {
  363. for (unsigned int j=0; j<min(ulCount,*pTokenInSlotListSize); j++) {
  364. //Get slot information for slotId
  365. rv = (*pFunctionList->C_GetSlotInfo)(pSlotList[j], &slotInfo);
  366. if ((rv == CKR_OK)&&((slotInfo.flags & CKF_TOKEN_PRESENT) != 0)) {
  367. tokenInSlotList[i] = pSlotList[j];
  368. i++;
  369. }
  370. }
  371. }
  372. free(pSlotList);
  373. }
  374. *pTokenInSlotListSize=i;
  375. return rv;
  376. }
  377. CK_RV openSession(CK_FUNCTION_LIST_PTR pFunctionList, CK_SLOT_ID slotId, CK_SESSION_HANDLE_PTR phSession)
  378. {
  379. CK_RV rv=CKR_OK;
  380. //open session with token
  381. rv = (*pFunctionList->C_OpenSession)(slotId,CKF_SERIAL_SESSION,NULL_PTR,NULL_PTR,phSession);
  382. return rv;
  383. }
  384. CK_RV closeSession(CK_FUNCTION_LIST_PTR pFunctionList, CK_SESSION_HANDLE hSession)
  385. {
  386. CK_RV rv=CKR_OK;
  387.     
  388. rv = (*pFunctionList->C_CloseSession)(hSession);
  389. return rv;
  390. }
  391. CK_RV getX509Value(CK_FUNCTION_LIST_PTR pFunctionList, CK_SESSION_HANDLE hSession, CK_OBJECT_HANDLE hCert,
  392.  CK_BYTE_PTR value, CK_ULONG_PTR plenValue
  393.   )
  394. {
  395. CK_RV rv=CKR_OK;
  396.     if ( getTraceLevel() > 1)
  397.      TRACE_local(__LINE__,"getX509Value():");
  398. CK_ATTRIBUTE templateAttr [] = 
  399. {
  400. {CKA_VALUE,value,*plenValue}
  401. };
  402. rv = (*pFunctionList->C_GetAttributeValue)(hSession,hCert,templateAttr,1);
  403. *plenValue=templateAttr[0].ulValueLen;
  404.     if ( getTraceLevel() > 1)
  405.      TRACE_local(__LINE__,"C_GetAttributeValue()=0x%x",rv);
  406. return rv;
  407. }
  408. CK_RV getSlotList(CK_FUNCTION_LIST_PTR pFunctionList, CK_SLOT_ID_PTR pSlotList, CK_ULONG_PTR pSlotListSize)
  409. {
  410. CK_RV rv= (*pFunctionList->C_GetSlotList)(FALSE,pSlotList,pSlotListSize);
  411. return rv;
  412. }
  413. CK_RV waitForSlotEvent(CK_FUNCTION_LIST_PTR pFunctionList, CK_SLOT_ID_PTR pSlotId)
  414. {
  415. CK_RV rv=CKR_OK;
  416. CK_FLAGS flags = 0;
  417. rv = (*pFunctionList->C_WaitForSlotEvent)(flags, pSlotId, NULL_PTR);
  418. return rv;
  419. }
  420. bool propCertChain(CK_FUNCTION_LIST_PTR pFunctionList, CK_SESSION_HANDLE hSession, CK_OBJECT_HANDLE hCert,unsigned char * valuecert,unsigned long valuecertLen){
  421. HCERTSTORE hCertStore = NULL;
  422. PCCERT_CONTEXT pCertContext,pDesiredCert;
  423. HCRYPTPROV     hProv;
  424. bool root=FALSE;
  425. CK_BYTE_PTR pSubject;
  426. CK_ULONG subjectLen=0;
  427. CK_BYTE_PTR pIssuer;
  428. CK_ULONG issuerLen=0;
  429. CK_RV rv=CKR_OK;
  430. TRACE_local(__LINE__,"propCertChain : BEGIN",NULL);
  431. /* on r閏up鑢e le subject name*/
  432. rv =  getX509Subject(pFunctionList, hSession, hCert,NULL_PTR, &subjectLen);
  433. if (rv!=CKR_OK)
  434. return false;
  435. pSubject=(CK_BYTE_PTR) malloc(subjectLen*sizeof(CK_BYTE));
  436. rv =  getX509Subject( pFunctionList, hSession, hCert,pSubject, &subjectLen);
  437. if(rv!=CKR_OK)
  438. {
  439. free(pSubject);
  440. return false;
  441. }
  442. TRACE_local(__LINE__,"pSubject : %s",pSubject);
  443. /* on r閏up鑢e l'issuer name*/
  444. rv =  getX509Issuer(pFunctionList, hSession, hCert,NULL_PTR, &issuerLen);
  445. if (rv!=CKR_OK){
  446. free(pSubject);
  447. return false;
  448. }
  449. pIssuer=(CK_BYTE_PTR) malloc(issuerLen*sizeof(CK_BYTE));
  450. rv = getX509Issuer( pFunctionList, hSession, hCert,pIssuer, &issuerLen);
  451. if(rv!=CKR_OK)
  452. {
  453. free(pIssuer);
  454. free(pSubject);
  455. return false;
  456. }
  457. TRACE_local(__LINE__,"pIssuer : %s",pIssuer);
  458. if(memcmp(pIssuer,pSubject,issuerLen)==0)
  459. root=true;
  460. free(pSubject);
  461. free(pIssuer);
  462. if (RCRYPT_FAILED(CryptAcquireContext(&hProv,NULL,NULL,PROV_RSA_FULL,CRYPT_VERIFYCONTEXT )))
  463. {
  464. DWORD dw=GetLastError();
  465. TRACE_local(__LINE__,"CryptAcquireContext ERROR: %d",dw);
  466.     return false;
  467. }
  468.    // Open the user's specified store for writing.
  469.    //
  470. if(root)
  471. hCertStore = CertOpenStore(CERT_STORE_PROV_SYSTEM_W,
  472.                                  0,
  473.                                  hProv,
  474.                                  CERT_STORE_NO_CRYPT_RELEASE_FLAG |
  475.                                  CERT_SYSTEM_STORE_CURRENT_USER,
  476.                                  L"Root");
  477. else
  478. hCertStore = CertOpenStore(CERT_STORE_PROV_SYSTEM_W,
  479.                                  0,
  480.                                  hProv,
  481.                                  CERT_STORE_NO_CRYPT_RELEASE_FLAG |
  482.                                  CERT_SYSTEM_STORE_CURRENT_USER,
  483.                                  L"CA");
  484. if (NULL == hCertStore){
  485. TRACE_local(__LINE__,"CertOpenStore FAILED  ",NULL);
  486. return false;
  487. }
  488.  
  489.   //
  490.   // Build certificate context for this certificate.
  491.   //
  492.   pCertContext = CertCreateCertificateContext(X509_ASN_ENCODING,
  493.                                                   valuecert,
  494.                                                   valuecertLen);
  495.   if (pCertContext == NULL)
  496.   {
  497. TRACE_local(__LINE__,"CertCreateCertificateContext FAILED  ",NULL);
  498.       return false;
  499.   }
  500. if(pDesiredCert=CertFindCertificateInStore(
  501.       hCertStore,
  502. X509_ASN_ENCODING,
  503. 0,          
  504.       CERT_FIND_EXISTING,       
  505.       pCertContext,       
  506.       NULL))
  507. {
  508. TRACE_local(__LINE__,"propCertChain CERTIFICATE ALREADY INSTALLED TRUE",NULL);
  509. if (pCertContext != NULL)
  510. CertFreeCertificateContext(pCertContext);
  511. CryptReleaseContext(hProv,0);
  512. if (hCertStore != NULL)
  513. CertCloseStore(hCertStore, CERT_CLOSE_STORE_FORCE_FLAG);
  514. return true;
  515. }
  516.  //
  517.   // Put the cert in the store!
  518.   //
  519.   if (!CertAddCertificateContextToStore(hCertStore,
  520.                                         pCertContext,
  521.                                         CERT_STORE_ADD_REPLACE_EXISTING,
  522.                                         // or CERT_STORE_ADD_NEW
  523.                                         NULL))
  524.   {
  525. TRACE_local(__LINE__,"CertAddCertificateContextToStore FAILED  ",NULL);
  526.     return false;
  527.   }
  528.   if (pCertContext != NULL)
  529.   {
  530.      CertFreeCertificateContext(pCertContext);
  531.   }
  532. CryptReleaseContext(hProv,0);
  533.   if (hCertStore != NULL)
  534.   {
  535.      CertCloseStore(hCertStore, CERT_CLOSE_STORE_FORCE_FLAG);
  536.   }
  537. TRACE_local(__LINE__,"propCertChain : TRUE",NULL);
  538. return true;
  539. }
  540. /*
  541. %--------------------------------------------------------------------------
  542. % propCert
  543. %
  544. % R鬺e : La fonction propCert est utilis閑 pour ins閞er des certificats
  545. %  vers CAPI