Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

1691 lines
50 KiB

  1. ///////////////////////////////////////////////////////////////////////////////////////////
  2. //
  3. // Copyright 2000 Gemplus Canada Inc.
  4. //
  5. // Project:
  6. // Kenny (GPK CSP)
  7. //
  8. // Authors:
  9. // Thierry Tremblay
  10. // Francois Paradis
  11. //
  12. // Compiler:
  13. // Microsoft Visual C++ 6.0 - SP3
  14. // Platform SDK - January 2000
  15. //
  16. ///////////////////////////////////////////////////////////////////////////////////////////
  17. #ifdef _UNICODE
  18. #define UNICODE
  19. #endif
  20. #include <stdio.h>
  21. #include "gpkcsp.h"
  22. ///////////////////////////////////////////////////////////////////////////////////////////
  23. //
  24. // Prototypes
  25. //
  26. ///////////////////////////////////////////////////////////////////////////////////////////
  27. BOOL Coherent(HCRYPTPROV hProv, bool *cardReinserted=NULL);
  28. HWND GetAppWindow();
  29. void GpkLocalLock();
  30. void GpkLocalUnlock();
  31. DWORD Select_MF(HCRYPTPROV hProv);
  32. extern Prov_Context* ProvCont;
  33. extern const DWORD MAX_GPK_OBJ;
  34. #ifdef _DEBUG
  35. static DWORD dw1, dw2;
  36. #endif
  37. ///////////////////////////////////////////////////////////////////////////////////////////
  38. //
  39. // CSP API Wrappers
  40. //
  41. ///////////////////////////////////////////////////////////////////////////////////////////
  42. BOOL WINAPI CPAcquireContext( OUT HCRYPTPROV* phProv,
  43. IN LPCSTR pszContainer,
  44. IN DWORD dwFlags,
  45. IN PVTableProvStruc pVTable )
  46. {
  47. BOOL bResult = CRYPT_SUCCEED;
  48. DWORD errcode = ERROR_SUCCESS;
  49. GpkLocalLock();
  50. DBG_PRINT(TEXT("->CPAcquireContext(phProv:0x%p(0x%08X), pszContainer:%s, dwFlags:0x%08X, pVTable:0x%p)"),
  51. phProv, *phProv,
  52. pszContainer,
  53. dwFlags,
  54. pVTable);
  55. DBG_TIME1;
  56. __try
  57. {
  58. __try
  59. {
  60. #ifdef MS_BUILD
  61. // TT-START : MS - Whistler Beta 1 - Certificate overwrite
  62. if (dwFlags & CRYPT_NEWKEYSET)
  63. {
  64. // Extract reader name if any is specified
  65. char szReaderName[MAX_PATH];
  66. char szNewContainerName[MAX_PATH];
  67. ZeroMemory( szReaderName, sizeof(szReaderName) );
  68. ZeroMemory( szNewContainerName, sizeof(szNewContainerName) );
  69. if (pszContainer != 0 && *pszContainer != 0)
  70. {
  71. if (strlen(pszContainer) >= 4 && memcmp( pszContainer, "\\\\.\\", 4 )==0)
  72. {
  73. // We have a reader name, keep it
  74. char* pEnd = strchr( pszContainer+4, '\\' );
  75. if (pEnd==0)
  76. {
  77. //only a reader name
  78. //strcpy( szReaderName, pszContainer );
  79. //strcat( szReaderName, "\\" );
  80. _snprintf(szReaderName, sizeof(szReaderName)-1, "%s%s", pszContainer, "\\");
  81. szReaderName[sizeof(szReaderName)-1]=0;
  82. }
  83. else
  84. {
  85. //there's also a container name
  86. if(pEnd-pszContainer+1 > sizeof(szReaderName)-1) // check before memcpy
  87. {
  88. bResult = CRYPT_FAILED;
  89. errcode = E_UNEXPECTED;
  90. __leave;
  91. }
  92. memcpy( szReaderName, pszContainer, pEnd - pszContainer + 1 );
  93. strncpy(szNewContainerName, pEnd + 1, sizeof(szNewContainerName)-1);
  94. szNewContainerName[sizeof(szNewContainerName)-1]=0;
  95. }
  96. }
  97. else
  98. {
  99. //no reader name, copy the container name
  100. strncpy(szNewContainerName, pszContainer, sizeof(szNewContainerName)-1);
  101. szNewContainerName[sizeof(szNewContainerName)-1]=0;
  102. }
  103. }
  104. // Request with default container, use default name
  105. if (strlen(szNewContainerName)==0)
  106. {
  107. strncpy(szNewContainerName, CSP_DEFAULTKEYSETNAME, sizeof(szNewContainerName)-1);
  108. szNewContainerName[sizeof(szNewContainerName)-1]=0;
  109. }
  110. HCRYPTPROV hProv;
  111. if (MyCPAcquireContext( &hProv, szReaderName, dwFlags & CRYPT_SILENT, pVTable ))
  112. {
  113. // SCR#41
  114. char szExistingContainerName[MAX_PATH];
  115. DWORD len = sizeof(szExistingContainerName);
  116. ZeroMemory( szExistingContainerName, sizeof(szExistingContainerName) );
  117. //get the existing container name
  118. bResult = MyCPGetProvParam( hProv, PP_CONTAINER, (BYTE*)szExistingContainerName, &len, 0 );
  119. errcode = GetLastError();
  120. if( bResult )
  121. {
  122. if( strcmp( szExistingContainerName, szNewContainerName ) == 0 )
  123. {
  124. //the requested container exist in the token,
  125. bResult = CRYPT_FAILED;
  126. errcode = NTE_EXISTS;
  127. }
  128. else
  129. {
  130. //there already are a container in the token which isn't the one
  131. //requested
  132. bResult = CRYPT_FAILED;
  133. errcode = NTE_TOKEN_KEYSET_STORAGE_FULL;
  134. }
  135. }
  136. MyCPReleaseContext( hProv, 0 );
  137. }
  138. else
  139. {
  140. if (GetLastError()!=NTE_KEYSET_NOT_DEF)
  141. {
  142. bResult = CRYPT_FAILED;
  143. errcode = GetLastError();
  144. }
  145. }
  146. }
  147. // TT-END: MS - Whistler Beta 1 - Certificate overwrite
  148. #endif // MS_BUILD
  149. if (bResult)
  150. {
  151. bResult = MyCPAcquireContext( phProv, pszContainer, dwFlags, pVTable );
  152. errcode = GetLastError();
  153. }
  154. }
  155. __except(EXCEPTION_EXECUTE_HANDLER)
  156. {
  157. bResult = CRYPT_FAILED;
  158. errcode = E_UNEXPECTED;
  159. }
  160. }
  161. __finally
  162. {
  163. DBG_TIME2;
  164. DBG_PRINT(TEXT("<-CPAcquireContext(phProv:0x%p(0x%08X), pszContainer:%s, dwFlags:0x%08X, pVTable:0x%p)\n returns %d in %d msec"),
  165. phProv, *phProv,
  166. pszContainer,
  167. dwFlags,
  168. pVTable,
  169. bResult,
  170. DBG_DELTA);
  171. GpkLocalUnlock();
  172. }
  173. RETURN( bResult, errcode );
  174. }
  175. ///////////////////////////////////////////////////////////////////////////////////////////
  176. ///////////////////////////////////////////////////////////////////////////////////////////
  177. BOOL WINAPI CPGetProvParam( IN HCRYPTPROV hProv,
  178. IN DWORD dwParam,
  179. IN BYTE* pbData,
  180. IN DWORD* pdwDataLen,
  181. IN DWORD dwFlags )
  182. {
  183. BOOL bResult = CRYPT_SUCCEED;
  184. DWORD errcode = ERROR_SUCCESS;
  185. GpkLocalLock();
  186. DBG_PRINT(TEXT("->CPGetProvParam(hProv:0x%08X, dwParam:0x%08X, pbData:0x%p, pdwDataLen:0x%p(%d), dwFlags:0x%08X)"),
  187. hProv,
  188. dwParam,
  189. pbData,
  190. pdwDataLen, *pdwDataLen,
  191. dwFlags);
  192. DBG_TIME1;
  193. __try
  194. {
  195. __try
  196. {
  197. // [FP] if we want to load a RSA private key into the GPK card,
  198. // we have to reconnect in exclusive mode
  199. if (dwParam == GPP_SESSION_RANDOM)
  200. {
  201. DWORD dwProto;
  202. errcode = SCardReconnect( ProvCont[hProv].hCard, SCARD_SHARE_EXCLUSIVE,
  203. SCARD_PROTOCOL_T0, SCARD_LEAVE_CARD, &dwProto );
  204. bResult = (errcode == SCARD_S_SUCCESS);
  205. }
  206. BOOL bDid = FALSE;
  207. if ((bResult) &&
  208. (((dwParam == PP_ENUMALGS) || (dwParam == PP_ENUMALGS_EX)) && (/*(Slot[ProvCont[hProv].Slot].GpkMaxSessionKey == 0) ||*/ (dwFlags == CRYPT_FIRST))) ||
  209. ((dwParam == PP_ENUMCONTAINERS) && (dwFlags == CRYPT_FIRST)) ||
  210. (dwParam == GPP_SERIAL_NUMBER) ||
  211. (dwParam == GPP_SESSION_RANDOM))
  212. {
  213. bResult = Coherent(hProv);
  214. errcode = GetLastError();
  215. bDid = TRUE;
  216. }
  217. if (bResult)
  218. {
  219. bResult = MyCPGetProvParam( hProv, dwParam, pbData, pdwDataLen, dwFlags );
  220. errcode = GetLastError();
  221. if (ProvCont[hProv].Flags & CRYPT_VERIFYCONTEXT &&
  222. ProvCont[hProv].isContNameNullBlank)
  223. {
  224. // No access to the card has been done in this case
  225. }
  226. else if ((!ProvCont[hProv].bCardTransactionOpened) && (bDid))
  227. {
  228. // [FP] to be able to load a RSA private key into the GPK card,
  229. // the transaction should not be closed (only for PP_SESSION_RANDOM)
  230. // Select_MF(hProv); [NK] PIN not presented
  231. SCardEndTransaction(ProvCont[hProv].hCard, SCARD_LEAVE_CARD);
  232. }
  233. }
  234. else
  235. {
  236. bResult = CRYPT_FAILED;
  237. errcode = GetLastError();
  238. }
  239. }
  240. __except(EXCEPTION_EXECUTE_HANDLER)
  241. {
  242. bResult = CRYPT_FAILED;
  243. errcode = E_UNEXPECTED;
  244. }
  245. }
  246. __finally
  247. {
  248. DBG_TIME2;
  249. DBG_PRINT(TEXT("<-CPGetProvParam(hProv:0x%08X, dwParam:0x%08X, pbData:0x%p, pdwDataLen:0x%p(%d), dwFlags:0x%08X)\n returns %d in %d msec"),
  250. hProv,
  251. dwParam,
  252. pbData,
  253. pdwDataLen, *pdwDataLen,
  254. dwFlags,
  255. bResult,
  256. DBG_DELTA);
  257. GpkLocalUnlock();
  258. }
  259. RETURN( bResult, errcode );
  260. }
  261. ///////////////////////////////////////////////////////////////////////////////////////////
  262. ///////////////////////////////////////////////////////////////////////////////////////////
  263. BOOL WINAPI CPReleaseContext( IN HCRYPTPROV hProv,
  264. IN DWORD dwFlags )
  265. {
  266. BOOL bResult = CRYPT_SUCCEED;
  267. DWORD errcode = ERROR_SUCCESS;
  268. GpkLocalLock();
  269. DBG_PRINT(TEXT("->CPReleaseContext(hProv:0x%08X, dwFlags:0x%08X)"),
  270. hProv,
  271. dwFlags);
  272. DBG_TIME1;
  273. __try
  274. {
  275. __try
  276. {
  277. //if (Coherent(hProv))
  278. //{
  279. bResult = MyCPReleaseContext( hProv, dwFlags );
  280. errcode = GetLastError();
  281. //}
  282. //else
  283. //{
  284. // bResult = CRYPT_FAILED;
  285. // errcode = GetLastError();
  286. //}
  287. }
  288. __except(EXCEPTION_EXECUTE_HANDLER)
  289. {
  290. bResult = CRYPT_FAILED;
  291. errcode = E_UNEXPECTED;
  292. }
  293. }
  294. __finally
  295. {
  296. DBG_TIME2;
  297. DBG_PRINT(TEXT("<-CPReleaseContext(hProv:0x%08X, dwFlags:0x%08X)\n returns %d in %d msec"),
  298. hProv,
  299. dwFlags,
  300. bResult,
  301. DBG_DELTA);
  302. GpkLocalUnlock();
  303. }
  304. RETURN( bResult, errcode );
  305. }
  306. ///////////////////////////////////////////////////////////////////////////////////////////
  307. ///////////////////////////////////////////////////////////////////////////////////////////
  308. BOOL WINAPI CPSetProvParam( IN HCRYPTPROV hProv,
  309. IN DWORD dwParam,
  310. IN CONST BYTE* pbData,
  311. IN DWORD dwFlags )
  312. {
  313. BOOL bResult = CRYPT_SUCCEED;
  314. DWORD errcode = ERROR_SUCCESS;
  315. GpkLocalLock();
  316. DBG_PRINT(TEXT("->CPSetProvParam(hProv:0x%08X, dwParam:0x%08X, pbData:0x%p, dwFlags:0x%08X)"),
  317. hProv,
  318. dwParam,
  319. pbData,
  320. dwFlags);
  321. DBG_TIME1;
  322. __try
  323. {
  324. __try
  325. {
  326. // [FP] if we want to change the PIN,
  327. // we have to check the coherence
  328. if (dwParam == GPP_CHANGE_PIN)
  329. {
  330. bResult = Coherent(hProv);
  331. errcode = GetLastError();
  332. }
  333. if (bResult)
  334. {
  335. bResult = MyCPSetProvParam (hProv, dwParam, pbData, dwFlags);
  336. errcode = GetLastError();
  337. if (ProvCont[hProv].Flags & CRYPT_VERIFYCONTEXT &&
  338. ProvCont[hProv].isContNameNullBlank)
  339. {
  340. // No access to the card has been done in this case
  341. }
  342. else
  343. {
  344. if (dwParam == GPP_CHANGE_PIN)
  345. {
  346. Select_MF(hProv);
  347. SCardEndTransaction(ProvCont[hProv].hCard, SCARD_LEAVE_CARD);
  348. }
  349. }
  350. }
  351. else
  352. {
  353. bResult = CRYPT_FAILED;
  354. errcode = GetLastError();
  355. }
  356. }
  357. __except(EXCEPTION_EXECUTE_HANDLER)
  358. {
  359. bResult = CRYPT_FAILED;
  360. errcode = E_UNEXPECTED;
  361. }
  362. }
  363. __finally
  364. {
  365. DBG_TIME2;
  366. DBG_PRINT(TEXT("<-CPSetProvParam(hProv:0x%08X, dwParam:0x%08X, pbData:0x%p, dwFlags:0x%08X)\n returns %d in %d msec"),
  367. hProv,
  368. dwParam,
  369. pbData,
  370. dwFlags,
  371. bResult,
  372. DBG_DELTA);
  373. GpkLocalUnlock();
  374. }
  375. RETURN( bResult, errcode );
  376. }
  377. ///////////////////////////////////////////////////////////////////////////////////////////
  378. ///////////////////////////////////////////////////////////////////////////////////////////
  379. BOOL WINAPI CPDeriveKey( IN HCRYPTPROV hProv,
  380. IN ALG_ID Algid,
  381. IN HCRYPTHASH hHash,
  382. IN DWORD dwFlags,
  383. OUT HCRYPTKEY* phKey )
  384. {
  385. BOOL bResult = CRYPT_SUCCEED;
  386. DWORD errcode = ERROR_SUCCESS;
  387. GpkLocalLock();
  388. DBG_PRINT(TEXT("->CPDeriveKey(hProv:0x%08X, Algid:0x%08X, hHash:0x%08X, phKey:0x%p(0x%08X))"),
  389. hProv,
  390. Algid,
  391. hHash,
  392. dwFlags,
  393. phKey, *phKey);
  394. DBG_TIME1;
  395. __try
  396. {
  397. __try
  398. {
  399. // We do not have to check the coherence in this case since the operation does not
  400. // use the card info
  401. bResult = MyCPDeriveKey( hProv, Algid, hHash, dwFlags, phKey );
  402. errcode = GetLastError();
  403. }
  404. __except(EXCEPTION_EXECUTE_HANDLER)
  405. {
  406. bResult = CRYPT_FAILED;
  407. errcode = E_UNEXPECTED;
  408. }
  409. }
  410. __finally
  411. {
  412. DBG_TIME2;
  413. DBG_PRINT(TEXT("<-CPDeriveKey(hProv:0x%08X, Algid:0x%08X, hHash:0x%08X, phKey:0x%p(0x%08X))\n returns %d in %d msec"),
  414. hProv,
  415. Algid,
  416. hHash,
  417. dwFlags,
  418. phKey, *phKey,
  419. bResult,
  420. DBG_DELTA);
  421. GpkLocalUnlock();
  422. }
  423. RETURN( bResult, errcode );
  424. }
  425. ///////////////////////////////////////////////////////////////////////////////////////////
  426. ///////////////////////////////////////////////////////////////////////////////////////////
  427. BOOL WINAPI CPDestroyKey( IN HCRYPTPROV hProv,
  428. IN HCRYPTKEY hKey )
  429. {
  430. BOOL bResult = CRYPT_SUCCEED;
  431. DWORD errcode = ERROR_SUCCESS;
  432. GpkLocalLock();
  433. DBG_PRINT(TEXT("->CPDestroyKey(hProv:0x%08X, hKey:0x%08X)"),
  434. hProv,
  435. hKey);
  436. DBG_TIME1;
  437. __try
  438. {
  439. __try
  440. {
  441. // We do not have to check the coherence in this case since the operation does not
  442. // use the card info
  443. bResult = MyCPDestroyKey( hProv, hKey );
  444. errcode = GetLastError();
  445. }
  446. __except(EXCEPTION_EXECUTE_HANDLER)
  447. {
  448. bResult = CRYPT_FAILED;
  449. errcode = E_UNEXPECTED;
  450. }
  451. }
  452. __finally
  453. {
  454. DBG_TIME2;
  455. DBG_PRINT(TEXT("<-CPDestroyKey(hProv:0x%08X, hKey:0x%08X)\n returns %d in %d msec"),
  456. hProv,
  457. hKey,
  458. bResult,
  459. DBG_DELTA);
  460. GpkLocalUnlock();
  461. }
  462. RETURN( bResult, errcode );
  463. }
  464. ///////////////////////////////////////////////////////////////////////////////////////////
  465. ///////////////////////////////////////////////////////////////////////////////////////////
  466. BOOL WINAPI CPExportKey( IN HCRYPTPROV hProv,
  467. IN HCRYPTKEY hKey,
  468. IN HCRYPTKEY hPubKey,
  469. IN DWORD dwBlobType,
  470. IN DWORD dwFlags,
  471. OUT BYTE* pbData,
  472. OUT DWORD* pdwDataLen )
  473. {
  474. BOOL bResult = CRYPT_SUCCEED;
  475. DWORD errcode = ERROR_SUCCESS;
  476. GpkLocalLock();
  477. DBG_PRINT(TEXT("->CPExportKey(hProv:0x%08X, hKey:0x%08X, hPubKey:0x%08X, dwBlobType:0x%08X, dwFlags:0x%08X, pbData:0x%p, pdwDataLen:0x%p(%d))"),
  478. hProv,
  479. hKey,
  480. hPubKey,
  481. dwBlobType,
  482. dwFlags,
  483. pbData,
  484. pdwDataLen, *pdwDataLen);
  485. DBG_TIME1;
  486. __try
  487. {
  488. __try
  489. {
  490. if (Coherent(hProv))
  491. {
  492. bResult = MyCPExportKey( hProv, hKey, hPubKey, dwBlobType, dwFlags, pbData, pdwDataLen );
  493. errcode = GetLastError();
  494. if (ProvCont[hProv].Flags & CRYPT_VERIFYCONTEXT &&
  495. ProvCont[hProv].isContNameNullBlank)
  496. {
  497. // No access to the card has been done in this case
  498. }
  499. else
  500. {
  501. // Select_MF(hProv); [NK] PIN not presented
  502. SCardEndTransaction(ProvCont[hProv].hCard, SCARD_LEAVE_CARD);
  503. }
  504. }
  505. else
  506. {
  507. bResult = CRYPT_FAILED;
  508. errcode = GetLastError();
  509. }
  510. }
  511. __except(EXCEPTION_EXECUTE_HANDLER)
  512. {
  513. bResult = CRYPT_FAILED;
  514. errcode = E_UNEXPECTED;
  515. }
  516. }
  517. __finally
  518. {
  519. DBG_TIME2;
  520. DBG_PRINT(TEXT("<-CPExportKey(hProv:0x%08X, hKey:0x%08X, hPubKey:0x%08X, dwBlobType:0x%08X, dwFlags:0x%08X, pbData:0x%p, pdwDataLen:0x%p(%d))\n returns %d in %d msec"),
  521. hProv,
  522. hKey,
  523. hPubKey,
  524. dwBlobType,
  525. dwFlags,
  526. pbData,
  527. pdwDataLen, *pdwDataLen,
  528. bResult,
  529. DBG_DELTA);
  530. GpkLocalUnlock();
  531. }
  532. RETURN( bResult, errcode );
  533. }
  534. ///////////////////////////////////////////////////////////////////////////////////////////
  535. ///////////////////////////////////////////////////////////////////////////////////////////
  536. BOOL WINAPI CPGenKey( IN HCRYPTPROV hProv,
  537. IN ALG_ID Algid,
  538. IN DWORD dwFlags,
  539. OUT HCRYPTKEY* phKey )
  540. {
  541. BOOL bResult = CRYPT_SUCCEED;
  542. DWORD errcode = ERROR_SUCCESS;
  543. GpkLocalLock();
  544. DBG_PRINT(TEXT("->CPGenKey(hProv:0x%08X, Algid:0x%08X, dwFlags:0x%08X, phKey:0x%p(0x%08X))"),
  545. hProv,
  546. Algid,
  547. dwFlags,
  548. dwFlags,
  549. phKey, *phKey);
  550. DBG_TIME1;
  551. __try
  552. {
  553. __try
  554. {
  555. if (Coherent(hProv))
  556. {
  557. bResult = MyCPGenKey( hProv, Algid, dwFlags, phKey );
  558. errcode = GetLastError();
  559. if (ProvCont[hProv].Flags & CRYPT_VERIFYCONTEXT &&
  560. ProvCont[hProv].isContNameNullBlank)
  561. {
  562. // No access to the card has been done in this case
  563. }
  564. else
  565. {
  566. if ((Algid == AT_KEYEXCHANGE) || (Algid == AT_SIGNATURE))
  567. Select_MF(hProv);
  568. SCardEndTransaction(ProvCont[hProv].hCard, SCARD_LEAVE_CARD);
  569. }
  570. }
  571. else
  572. {
  573. bResult = CRYPT_FAILED;
  574. errcode = GetLastError();
  575. }
  576. }
  577. __except(EXCEPTION_EXECUTE_HANDLER)
  578. {
  579. bResult = CRYPT_FAILED;
  580. errcode = E_UNEXPECTED;
  581. }
  582. }
  583. __finally
  584. {
  585. DBG_TIME2;
  586. DBG_PRINT(TEXT("<-CPGenKey(hProv:0x%p, Algid:0x%08X, dwFlags:0x%08X, phKey:0x%p(0x%p))\n returns %d in %d msec"),
  587. hProv,
  588. Algid,
  589. dwFlags,
  590. phKey, *phKey,
  591. bResult,
  592. DBG_DELTA);
  593. GpkLocalUnlock();
  594. }
  595. RETURN( bResult, errcode );
  596. }
  597. ///////////////////////////////////////////////////////////////////////////////////////////
  598. ///////////////////////////////////////////////////////////////////////////////////////////
  599. BOOL WINAPI CPGenRandom( IN HCRYPTPROV hProv,
  600. IN DWORD dwLen,
  601. IN OUT BYTE* pbBuffer )
  602. {
  603. BOOL bResult = CRYPT_SUCCEED;
  604. DWORD errcode = ERROR_SUCCESS;
  605. GpkLocalLock();
  606. DBG_PRINT(TEXT("->CPGenRandom(hProv:0x%08X, dwLen:%d, pbBuffer:0x%p)"),
  607. hProv,
  608. dwLen,
  609. pbBuffer);
  610. DBG_TIME1;
  611. __try
  612. {
  613. __try
  614. {
  615. if (Coherent(hProv))
  616. {
  617. bResult = MyCPGenRandom( hProv, dwLen, pbBuffer );
  618. errcode = GetLastError();
  619. if (ProvCont[hProv].Flags & CRYPT_VERIFYCONTEXT &&
  620. ProvCont[hProv].isContNameNullBlank)
  621. {
  622. // No access to the card has been done in this case
  623. }
  624. else
  625. {
  626. // Select_MF(hProv); [FP] PIN not presented
  627. SCardEndTransaction(ProvCont[hProv].hCard, SCARD_LEAVE_CARD);
  628. }
  629. }
  630. else
  631. {
  632. bResult = CRYPT_FAILED;
  633. errcode = GetLastError();
  634. }
  635. }
  636. __except(EXCEPTION_EXECUTE_HANDLER)
  637. {
  638. bResult = CRYPT_FAILED;
  639. errcode = E_UNEXPECTED;
  640. }
  641. }
  642. __finally
  643. {
  644. DBG_TIME2;
  645. DBG_PRINT(TEXT("<-CPGenRandom(hProv:0x%08X, dwLen:%d, pbBuffer:0x%p)\n returns %d in %d msec"),
  646. hProv,
  647. dwLen,
  648. pbBuffer,
  649. bResult,
  650. DBG_DELTA);
  651. GpkLocalUnlock();
  652. }
  653. RETURN( bResult, errcode );
  654. }
  655. ///////////////////////////////////////////////////////////////////////////////////////////
  656. ///////////////////////////////////////////////////////////////////////////////////////////
  657. BOOL WINAPI CPGetKeyParam( IN HCRYPTPROV hProv,
  658. IN HCRYPTKEY hKey,
  659. IN DWORD dwParam,
  660. IN BYTE* pbData,
  661. IN DWORD* pdwDataLen,
  662. IN DWORD dwFlags )
  663. {
  664. BOOL bResult = CRYPT_SUCCEED;
  665. DWORD errcode = ERROR_SUCCESS;
  666. GpkLocalLock();
  667. DBG_PRINT(TEXT("->CPGetKeyParam(hProv:0x%08X, hKey:0x%08X, dwParam:0x%08X, pbData:0x%p, pdwDataLen:0x%p(%d), dwFlags:0x%08X)"),
  668. hProv,
  669. hKey,
  670. dwParam,
  671. pbData,
  672. pdwDataLen, *pdwDataLen,
  673. dwFlags);
  674. DBG_TIME1;
  675. __try
  676. {
  677. __try
  678. {
  679. if (hKey <= MAX_GPK_OBJ)
  680. {
  681. bResult = Coherent(hProv);
  682. errcode = GetLastError();
  683. }
  684. if (bResult)
  685. {
  686. bResult = MyCPGetKeyParam (hProv, hKey, dwParam, pbData, pdwDataLen, dwFlags);
  687. errcode = GetLastError();
  688. if (ProvCont[hProv].Flags & CRYPT_VERIFYCONTEXT &&
  689. ProvCont[hProv].isContNameNullBlank)
  690. {
  691. // No access to the card has been done in this case
  692. }
  693. else
  694. {
  695. if (hKey <= MAX_GPK_OBJ)
  696. {
  697. // Select_MF(hProv); [NK] PIN not presented
  698. SCardEndTransaction(ProvCont[hProv].hCard, SCARD_LEAVE_CARD);
  699. }
  700. }
  701. }
  702. else
  703. {
  704. bResult = CRYPT_FAILED;
  705. errcode = GetLastError();
  706. }
  707. }
  708. __except(EXCEPTION_EXECUTE_HANDLER)
  709. {
  710. bResult = CRYPT_FAILED;
  711. errcode = E_UNEXPECTED;
  712. }
  713. }
  714. __finally
  715. {
  716. DBG_TIME2;
  717. DBG_PRINT(TEXT("<-CPGetKeyParam(hProv:0x%08X, hKey:0x%08X, dwParam:0x%08X, pbData:0x%p, pdwDataLen:0x%p(%d), dwFlags:0x%08X)\n returns %d in %d msec"),
  718. hProv,
  719. hKey,
  720. dwParam,
  721. pbData,
  722. pdwDataLen, *pdwDataLen,
  723. dwFlags,
  724. bResult,
  725. DBG_DELTA);
  726. GpkLocalUnlock();
  727. }
  728. RETURN( bResult, errcode );
  729. }
  730. ///////////////////////////////////////////////////////////////////////////////////////////
  731. ///////////////////////////////////////////////////////////////////////////////////////////
  732. BOOL WINAPI CPGetUserKey( IN HCRYPTPROV hProv,
  733. IN DWORD dwKeySpec,
  734. OUT HCRYPTKEY* phUserKey )
  735. {
  736. BOOL bResult = CRYPT_SUCCEED;
  737. DWORD errcode = ERROR_SUCCESS;
  738. GpkLocalLock();
  739. DBG_PRINT(TEXT("->CPGetUserKey(hProv:0x%08Xp, dwKeySpec:0x%08X, phUserKey:0x%p(0x%08X))"),
  740. hProv,
  741. dwKeySpec,
  742. phUserKey, *phUserKey);
  743. DBG_TIME1;
  744. __try
  745. {
  746. __try
  747. {
  748. if (Coherent(hProv))
  749. {
  750. bResult = MyCPGetUserKey( hProv, dwKeySpec, phUserKey );
  751. errcode = GetLastError();
  752. if (ProvCont[hProv].Flags & CRYPT_VERIFYCONTEXT &&
  753. ProvCont[hProv].isContNameNullBlank)
  754. {
  755. // No access to the card has been done in this case
  756. }
  757. else
  758. {
  759. // Select_MF(hProv); [NK] PIN not presented
  760. SCardEndTransaction(ProvCont[hProv].hCard, SCARD_LEAVE_CARD);
  761. }
  762. }
  763. else
  764. {
  765. bResult = CRYPT_FAILED;
  766. errcode = GetLastError();
  767. }
  768. }
  769. __except(EXCEPTION_EXECUTE_HANDLER)
  770. {
  771. bResult = CRYPT_FAILED;
  772. errcode = E_UNEXPECTED;
  773. }
  774. }
  775. __finally
  776. {
  777. DBG_TIME2;
  778. DBG_PRINT(TEXT("<-CPGetUserKey(hProv:0x%08X, dwKeySpec:0x%08X, phUserKey:0x%p(0x%08X))\n returns %d in %d msec"),
  779. hProv,
  780. dwKeySpec,
  781. phUserKey, *phUserKey,
  782. bResult,
  783. DBG_DELTA);
  784. GpkLocalUnlock();
  785. }
  786. RETURN( bResult, errcode );
  787. }
  788. ///////////////////////////////////////////////////////////////////////////////////////////
  789. ///////////////////////////////////////////////////////////////////////////////////////////
  790. BOOL WINAPI CPImportKey( IN HCRYPTPROV hProv,
  791. IN CONST BYTE* pbData,
  792. IN DWORD dwDataLen,
  793. IN HCRYPTKEY hPubKey,
  794. IN DWORD dwFlags,
  795. OUT HCRYPTKEY* phKey )
  796. {
  797. BOOL bResult = CRYPT_SUCCEED;
  798. DWORD errcode = ERROR_SUCCESS;
  799. GpkLocalLock();
  800. DBG_PRINT(TEXT("->CPImportKey(hProv:0x%08X, pbData:0x%p, dwDataLen:%d, hPubKey:0x%08X, dwFlags:0x%08X, phKey:0x%p(0x%08X))"),
  801. hProv,
  802. pbData,
  803. dwDataLen,
  804. hPubKey,
  805. dwFlags,
  806. phKey, *phKey);
  807. DBG_TIME1;
  808. __try
  809. {
  810. __try
  811. {
  812. BLOBHEADER BlobHeader;
  813. memcpy(&BlobHeader, pbData, sizeof(BLOBHEADER));
  814. // [FP] if we want to load a RSA private key into the GPK card,
  815. // the transaction is already opened - do not check the coherence -
  816. if ((!ProvCont[hProv].bCardTransactionOpened) && (BlobHeader.bType != PUBLICKEYBLOB))
  817. {
  818. bResult = Coherent( hProv );
  819. errcode = GetLastError();
  820. }
  821. if (bResult)
  822. {
  823. bResult = MyCPImportKey( hProv, pbData, dwDataLen, hPubKey, dwFlags, phKey );
  824. errcode = GetLastError();
  825. if (ProvCont[hProv].Flags & CRYPT_VERIFYCONTEXT &&
  826. ProvCont[hProv].isContNameNullBlank)
  827. {
  828. // No access to the card has been done in this case
  829. }
  830. else
  831. {
  832. if (BlobHeader.bType != PUBLICKEYBLOB)
  833. {
  834. Select_MF(hProv);
  835. SCardEndTransaction(ProvCont[hProv].hCard, SCARD_LEAVE_CARD);
  836. }
  837. }
  838. }
  839. else
  840. {
  841. bResult = CRYPT_FAILED;
  842. errcode = GetLastError();
  843. }
  844. // [FP] close the transaction and reconnect in shared mode
  845. if (ProvCont[hProv].bCardTransactionOpened)
  846. {
  847. DWORD dwProto;
  848. ProvCont[hProv].bCardTransactionOpened = FALSE;
  849. errcode = SCardReconnect(ProvCont[hProv].hCard, SCARD_SHARE_SHARED, SCARD_PROTOCOL_T0, SCARD_LEAVE_CARD, &dwProto);
  850. if (errcode != SCARD_S_SUCCESS)
  851. bResult = CRYPT_FAILED;
  852. }
  853. }
  854. __except(EXCEPTION_EXECUTE_HANDLER)
  855. {
  856. bResult = CRYPT_FAILED;
  857. errcode = E_UNEXPECTED;
  858. }
  859. }
  860. __finally
  861. {
  862. DBG_TIME2;
  863. DBG_PRINT(TEXT("<-CPImportKey(hProv:0x%08X, pbData:0x%p, dwDataLen:%d, hPubKey:0x%08X, dwFlags:0x%08X, phKey:0x%p(0x%08X))\n returns %d in %d msec"),
  864. hProv,
  865. pbData,
  866. dwDataLen,
  867. hPubKey,
  868. dwFlags,
  869. phKey, *phKey,
  870. bResult,
  871. DBG_DELTA);
  872. GpkLocalUnlock();
  873. }
  874. RETURN( bResult, errcode );
  875. }
  876. ///////////////////////////////////////////////////////////////////////////////////////////
  877. ///////////////////////////////////////////////////////////////////////////////////////////
  878. BOOL WINAPI CPSetKeyParam( IN HCRYPTPROV hProv,
  879. IN HCRYPTKEY hKey,
  880. IN DWORD dwParam,
  881. IN CONST BYTE* pbData,
  882. IN DWORD dwFlags )
  883. {
  884. BOOL bResult = CRYPT_SUCCEED;
  885. DWORD errcode = ERROR_SUCCESS;
  886. GpkLocalLock();
  887. DBG_PRINT(TEXT("->CPSetKeyParam(hProv:0x%08X, hKey:0x%08X, dwParam:0x%08X, pbData:0x%p, dwFlags:0x%08X)"),
  888. hProv,
  889. hKey,
  890. dwParam,
  891. pbData,
  892. dwFlags);
  893. DBG_TIME1;
  894. __try
  895. {
  896. __try
  897. {
  898. if (hKey <= MAX_GPK_OBJ)
  899. {
  900. bResult = Coherent(hProv);
  901. errcode = GetLastError();
  902. }
  903. if (bResult)
  904. {
  905. bResult = MyCPSetKeyParam( hProv, hKey, dwParam, pbData, dwFlags );
  906. errcode = GetLastError();
  907. if (ProvCont[hProv].Flags & CRYPT_VERIFYCONTEXT &&
  908. ProvCont[hProv].isContNameNullBlank)
  909. {
  910. // No access to the card has been done in this case
  911. }
  912. else
  913. {
  914. if (hKey <= MAX_GPK_OBJ)
  915. {
  916. Select_MF(hProv);
  917. SCardEndTransaction(ProvCont[hProv].hCard, SCARD_LEAVE_CARD);
  918. }
  919. }
  920. }
  921. else
  922. {
  923. bResult = CRYPT_FAILED;
  924. errcode = GetLastError();
  925. }
  926. }
  927. __except(EXCEPTION_EXECUTE_HANDLER)
  928. {
  929. bResult = CRYPT_FAILED;
  930. errcode = E_UNEXPECTED;
  931. }
  932. }
  933. __finally
  934. {
  935. DBG_TIME2;
  936. DBG_PRINT(TEXT("<-CPSetKeyParam(hProv:0x%08X, hKey:0x%08X, dwParam:0x%08X, pbData:0x%p, dwFlags:0x%08X)\n returns %d in %d msec"),
  937. hProv,
  938. hKey,
  939. dwParam,
  940. pbData,
  941. dwFlags,
  942. bResult,
  943. DBG_DELTA);
  944. GpkLocalUnlock();
  945. }
  946. RETURN( bResult, errcode );
  947. }
  948. ///////////////////////////////////////////////////////////////////////////////////////////
  949. ///////////////////////////////////////////////////////////////////////////////////////////
  950. BOOL WINAPI CPDecrypt( IN HCRYPTPROV hProv,
  951. IN HCRYPTKEY hKey,
  952. IN HCRYPTHASH hHash,
  953. IN BOOL Final,
  954. IN DWORD dwFlags,
  955. IN OUT BYTE* pbData,
  956. IN OUT DWORD* pdwDataLen )
  957. {
  958. BOOL bResult = CRYPT_SUCCEED;
  959. DWORD errcode = ERROR_SUCCESS;
  960. GpkLocalLock();
  961. DBG_PRINT(TEXT("->CPDecrypt(hProv:0x%08X, hKey:0x%08X, hHash:0x%08X, Final:%d, dwFlags:0x%08X, pbData:0x%p, pdwDataLen:0x%p(%d))"),
  962. hProv,
  963. hKey,
  964. hHash,
  965. Final,
  966. dwFlags,
  967. pbData,
  968. pdwDataLen, *pdwDataLen);
  969. DBG_TIME1;
  970. __try
  971. {
  972. __try
  973. {
  974. // We do not have to check the coherence in this case since the operation does not
  975. // use the card info
  976. bResult = MyCPDecrypt( hProv, hKey, hHash, Final, dwFlags, pbData, pdwDataLen );
  977. errcode = GetLastError();
  978. }
  979. __except(EXCEPTION_EXECUTE_HANDLER)
  980. {
  981. bResult = CRYPT_FAILED;
  982. errcode = E_UNEXPECTED;
  983. }
  984. }
  985. __finally
  986. {
  987. DBG_TIME2;
  988. DBG_PRINT(TEXT("<-CPDecrypt(hProv:0x%08X, hKey:0x%08X, hHash:0x%08X, Final:%d, dwFlags:0x%08X, pbData:0x%p, pdwDataLen:0x%p(%d))\n returns %d in %d msec"),
  989. hProv,
  990. hKey,
  991. hHash,
  992. Final,
  993. dwFlags,
  994. pbData,
  995. pdwDataLen, *pdwDataLen,
  996. bResult,
  997. DBG_DELTA);
  998. GpkLocalUnlock();
  999. }
  1000. RETURN( bResult, errcode );
  1001. }
  1002. ///////////////////////////////////////////////////////////////////////////////////////////
  1003. ///////////////////////////////////////////////////////////////////////////////////////////
  1004. BOOL WINAPI CPEncrypt( IN HCRYPTPROV hProv,
  1005. IN HCRYPTKEY hKey,
  1006. IN HCRYPTHASH hHash,
  1007. IN BOOL Final,
  1008. IN DWORD dwFlags,
  1009. IN OUT BYTE* pbData,
  1010. IN OUT DWORD* pdwDataLen,
  1011. IN DWORD dwBufLen )
  1012. {
  1013. BOOL bResult = CRYPT_SUCCEED;
  1014. DWORD errcode = ERROR_SUCCESS;
  1015. GpkLocalLock();
  1016. DBG_PRINT(TEXT("->CPEncrypt(hProv:0x%08X, hKey:0x%08X, hHash:0x%08X, Final:%d, dwFlags:0x%08X, pbData:0x%p, pdwDataLen:0x%p(%d), dwBufLen:%d)"),
  1017. hProv,
  1018. hKey,
  1019. hHash,
  1020. Final,
  1021. dwFlags,
  1022. pbData,
  1023. pdwDataLen, *pdwDataLen,
  1024. dwBufLen);
  1025. DBG_TIME1;
  1026. __try
  1027. {
  1028. __try
  1029. {
  1030. // We do not have to check the coherence in this case since the operation does not
  1031. // use the card info
  1032. bResult = MyCPEncrypt( hProv, hKey, hHash, Final, dwFlags, pbData, pdwDataLen, dwBufLen );
  1033. errcode = GetLastError();
  1034. }
  1035. __except(EXCEPTION_EXECUTE_HANDLER)
  1036. {
  1037. bResult = CRYPT_FAILED;
  1038. errcode = E_UNEXPECTED;
  1039. }
  1040. }
  1041. __finally
  1042. {
  1043. DBG_TIME2;
  1044. DBG_PRINT(TEXT("<-CPEncrypt(hProv:0x%08X, hKey:0x%08X, hHash:0x%08X, Final:%d, dwFlags:0x%08X, pbData:0x%p, pdwDataLen:0x%p(%d), dwBufLen:%d)\n returns %d in %d msec"),
  1045. hProv,
  1046. hKey,
  1047. hHash,
  1048. Final,
  1049. dwFlags,
  1050. pbData,
  1051. pdwDataLen, *pdwDataLen,
  1052. dwBufLen,
  1053. bResult,
  1054. DBG_DELTA);
  1055. GpkLocalUnlock();
  1056. }
  1057. RETURN( bResult, errcode );
  1058. }
  1059. ///////////////////////////////////////////////////////////////////////////////////////////
  1060. ///////////////////////////////////////////////////////////////////////////////////////////
  1061. BOOL WINAPI CPCreateHash( IN HCRYPTPROV hProv,
  1062. IN ALG_ID Algid,
  1063. IN HCRYPTKEY hKey,
  1064. IN DWORD dwFlags,
  1065. OUT HCRYPTHASH* phHash )
  1066. {
  1067. BOOL bResult = CRYPT_SUCCEED;
  1068. DWORD errcode = ERROR_SUCCESS;
  1069. GpkLocalLock();
  1070. DBG_PRINT(TEXT("->CPCreateHash(hProv:0x%08X, Algid:0x%08X, hKey:0x%08X, dwFlags:0x%08X, phHash:0x%p(0x%08X))"),
  1071. hProv,
  1072. Algid,
  1073. hKey,
  1074. dwFlags,
  1075. phHash, *phHash);
  1076. DBG_TIME1;
  1077. __try
  1078. {
  1079. __try
  1080. {
  1081. // We do not have to check the coherence in this case since the operation does not
  1082. // use the card info
  1083. bResult = MyCPCreateHash( hProv, Algid, hKey, dwFlags, phHash );
  1084. errcode = GetLastError();
  1085. }
  1086. __except(EXCEPTION_EXECUTE_HANDLER)
  1087. {
  1088. bResult = CRYPT_FAILED;
  1089. errcode = E_UNEXPECTED;
  1090. }
  1091. }
  1092. __finally
  1093. {
  1094. DBG_TIME2;
  1095. DBG_PRINT(TEXT("<-CPCreateHash(hProv:0x%08X, Algid:0x%08X, hKey:0x%08X, dwFlags:0x%08X, phHash:0x%p(0x%08X))\n returns %d in %d msec"),
  1096. hProv,
  1097. Algid,
  1098. hKey,
  1099. dwFlags,
  1100. phHash, *phHash,
  1101. bResult,
  1102. DBG_DELTA);
  1103. GpkLocalUnlock();
  1104. }
  1105. RETURN( bResult, errcode );
  1106. }
  1107. ///////////////////////////////////////////////////////////////////////////////////////////
  1108. ///////////////////////////////////////////////////////////////////////////////////////////
  1109. BOOL WINAPI CPDestroyHash( IN HCRYPTPROV hProv,
  1110. IN HCRYPTHASH hHash )
  1111. {
  1112. BOOL bResult = CRYPT_SUCCEED;
  1113. DWORD errcode = ERROR_SUCCESS;
  1114. GpkLocalLock();
  1115. DBG_PRINT(TEXT("->CPDestroyHash(hProv:0x%08X, hHash:0x%08X)"),
  1116. hProv,
  1117. hHash);
  1118. DBG_TIME1;
  1119. __try
  1120. {
  1121. __try
  1122. {
  1123. // We do not have to check the coherence in this case since the operation does not
  1124. // use the card info
  1125. bResult = MyCPDestroyHash( hProv, hHash );
  1126. errcode = GetLastError();
  1127. }
  1128. __except(EXCEPTION_EXECUTE_HANDLER)
  1129. {
  1130. bResult = CRYPT_FAILED;
  1131. errcode = E_UNEXPECTED;
  1132. }
  1133. }
  1134. __finally
  1135. {
  1136. DBG_TIME2;
  1137. DBG_PRINT(TEXT("<-CPDestroyHash(hProv:0x%08X, hHash:0x%08X)\n returns %d in %d msec"),
  1138. hProv,
  1139. hHash,
  1140. bResult,
  1141. DBG_DELTA);
  1142. GpkLocalUnlock();
  1143. }
  1144. RETURN( bResult, errcode );
  1145. }
  1146. ///////////////////////////////////////////////////////////////////////////////////////////
  1147. ///////////////////////////////////////////////////////////////////////////////////////////
  1148. BOOL WINAPI CPGetHashParam( IN HCRYPTPROV hProv,
  1149. IN HCRYPTHASH hHash,
  1150. IN DWORD dwParam,
  1151. IN BYTE* pbData,
  1152. IN DWORD* pdwDataLen,
  1153. IN DWORD dwFlags )
  1154. {
  1155. BOOL bResult = CRYPT_SUCCEED;
  1156. DWORD errcode = ERROR_SUCCESS;
  1157. GpkLocalLock();
  1158. DBG_PRINT(TEXT("->CPGetHashParam(hProv:0x%08X, hHash:0x%08X, dwParam:0x%08X, pbData:0x%p, pdwDataLen:0x%p(%d), dwFlags:0x%08X)"),
  1159. hProv,
  1160. hHash,
  1161. dwParam,
  1162. pbData,
  1163. pdwDataLen, *pdwDataLen,
  1164. dwFlags);
  1165. DBG_TIME1;
  1166. __try
  1167. {
  1168. __try
  1169. {
  1170. // We do not have to check the coherence in this case since the operation does not
  1171. // use the card info
  1172. bResult = MyCPGetHashParam( hProv, hHash, dwParam, pbData, pdwDataLen, dwFlags );
  1173. errcode = GetLastError();
  1174. }
  1175. __except(EXCEPTION_EXECUTE_HANDLER)
  1176. {
  1177. bResult = CRYPT_FAILED;
  1178. errcode = E_UNEXPECTED;
  1179. }
  1180. }
  1181. __finally
  1182. {
  1183. DBG_TIME2;
  1184. DBG_PRINT(TEXT("<-CPGetHashParam(hProv:0x%08X, hHash:0x%08X, dwParam:0x%08X, pbData:0x%p, pdwDataLen:0x%p(%d), dwFlags:0x%08X)\n returns %d in %d msec"),
  1185. hProv,
  1186. hHash,
  1187. dwParam,
  1188. pbData,
  1189. pdwDataLen, *pdwDataLen,
  1190. dwFlags,
  1191. bResult,
  1192. DBG_DELTA);
  1193. GpkLocalUnlock();
  1194. }
  1195. RETURN( bResult, errcode );
  1196. }
  1197. ///////////////////////////////////////////////////////////////////////////////////////////
  1198. ///////////////////////////////////////////////////////////////////////////////////////////
  1199. BOOL WINAPI CPHashData( IN HCRYPTPROV hProv,
  1200. IN HCRYPTHASH hHash,
  1201. IN CONST BYTE* pbData,
  1202. IN DWORD dwDataLen,
  1203. IN DWORD dwFlags )
  1204. {
  1205. BOOL bResult = CRYPT_SUCCEED;
  1206. DWORD errcode = ERROR_SUCCESS;
  1207. GpkLocalLock();
  1208. DBG_PRINT(TEXT("->CPHashData(hProv:0x%08X, hHash:0x%08X, pbData:0x%p, dwDataLen:%d, dwFlags:0x%08X)"),
  1209. hProv,
  1210. hHash,
  1211. pbData,
  1212. dwDataLen,
  1213. dwFlags);
  1214. DBG_TIME1;
  1215. __try
  1216. {
  1217. __try
  1218. {
  1219. // We do not have to check the coherence in this case since the operation does not
  1220. // use the card info
  1221. bResult = MyCPHashData( hProv, hHash, pbData, dwDataLen, dwFlags );
  1222. errcode = GetLastError();
  1223. }
  1224. __except(EXCEPTION_EXECUTE_HANDLER)
  1225. {
  1226. bResult = CRYPT_FAILED;
  1227. errcode = E_UNEXPECTED;
  1228. }
  1229. }
  1230. __finally
  1231. {
  1232. DBG_TIME2;
  1233. DBG_PRINT(TEXT("<-CPHashData(hProv:0x%08X, hHash:0x%08X, pbData:0x%p, dwDataLen:%d, dwFlags:0x%08X)\n returns %d in %d msec"),
  1234. hProv,
  1235. hHash,
  1236. pbData,
  1237. dwDataLen,
  1238. dwFlags,
  1239. bResult,
  1240. DBG_DELTA);
  1241. GpkLocalUnlock();
  1242. }
  1243. RETURN( bResult, errcode );
  1244. }
  1245. ///////////////////////////////////////////////////////////////////////////////////////////
  1246. ///////////////////////////////////////////////////////////////////////////////////////////
  1247. BOOL WINAPI CPHashSessionKey( IN HCRYPTPROV hProv,
  1248. IN HCRYPTHASH hHash,
  1249. IN HCRYPTKEY hKey,
  1250. IN DWORD dwFlags )
  1251. {
  1252. BOOL bResult = CRYPT_SUCCEED;
  1253. DWORD errcode = ERROR_SUCCESS;
  1254. GpkLocalLock();
  1255. DBG_PRINT(TEXT("->CPHashSessionKey(hProv:0x%08X, hHash:0x%08X, hKey:0x%08X, dwFlags:0x%08X)"),
  1256. hProv,
  1257. hHash,
  1258. hKey,
  1259. dwFlags);
  1260. DBG_TIME1;
  1261. __try
  1262. {
  1263. __try
  1264. {
  1265. // We do not have to check the coherence in this case since the operation does not
  1266. // use the card info
  1267. bResult = MyCPHashSessionKey( hProv, hHash, hKey, dwFlags );
  1268. errcode = GetLastError();
  1269. }
  1270. __except(EXCEPTION_EXECUTE_HANDLER)
  1271. {
  1272. bResult = CRYPT_FAILED;
  1273. errcode = E_UNEXPECTED;
  1274. }
  1275. }
  1276. __finally
  1277. {
  1278. DBG_TIME2;
  1279. DBG_PRINT(TEXT("<-CPHashSessionKey(hProv:0x%08X, hHash:0x%08X, hKey:0x%08X, dwFlags:0x%08X)\n returns %d in %d msec"),
  1280. hProv,
  1281. hHash,
  1282. hKey,
  1283. dwFlags,
  1284. bResult,
  1285. DBG_DELTA);
  1286. GpkLocalUnlock();
  1287. }
  1288. RETURN( bResult, errcode );
  1289. }
  1290. ///////////////////////////////////////////////////////////////////////////////////////////
  1291. ///////////////////////////////////////////////////////////////////////////////////////////
  1292. BOOL WINAPI CPSetHashParam( IN HCRYPTPROV hProv,
  1293. IN HCRYPTHASH hHash,
  1294. IN DWORD dwParam,
  1295. IN CONST BYTE* pbData,
  1296. IN DWORD dwFlags )
  1297. {
  1298. BOOL bResult = CRYPT_SUCCEED;
  1299. DWORD errcode = ERROR_SUCCESS;
  1300. GpkLocalLock();
  1301. DBG_PRINT(TEXT("->CPSetHashParam(hProv:0x%08X, hHash:0x%08X, dwParam:0x%08X, pbData:0x%p, dwFlags:0x%08X)"),
  1302. hProv,
  1303. hHash,
  1304. dwParam,
  1305. pbData,
  1306. dwFlags);
  1307. DBG_TIME1;
  1308. __try
  1309. {
  1310. __try
  1311. {
  1312. // We do not have to check the coherence in this case since the operation does not
  1313. // use the card info
  1314. bResult = MyCPSetHashParam( hProv, hHash, dwParam, pbData, dwFlags );
  1315. errcode = GetLastError();
  1316. }
  1317. __except(EXCEPTION_EXECUTE_HANDLER)
  1318. {
  1319. bResult = CRYPT_FAILED;
  1320. errcode = E_UNEXPECTED;
  1321. }
  1322. }
  1323. __finally
  1324. {
  1325. DBG_TIME2;
  1326. DBG_PRINT(TEXT("<-CPSetHashParam(hProv:0x%08X, hHash:0x%08X, dwParam:0x%08X, pbData:0x%p, dwFlags:0x%08X)\n returns %d in %d msec"),
  1327. hProv,
  1328. hHash,
  1329. dwParam,
  1330. pbData,
  1331. dwFlags,
  1332. bResult,
  1333. DBG_DELTA);
  1334. GpkLocalUnlock();
  1335. }
  1336. RETURN( bResult, errcode );
  1337. }
  1338. ///////////////////////////////////////////////////////////////////////////////////////////
  1339. ///////////////////////////////////////////////////////////////////////////////////////////
  1340. BOOL WINAPI CPSignHash(IN HCRYPTPROV hProv,
  1341. IN HCRYPTHASH hHash,
  1342. IN DWORD dwKeySpec,
  1343. IN LPCWSTR sDescription,
  1344. IN DWORD dwFlags,
  1345. OUT BYTE* pbSignature,
  1346. OUT DWORD* pdwSigLen )
  1347. {
  1348. BOOL bResult = CRYPT_SUCCEED;
  1349. DWORD errcode = ERROR_SUCCESS;
  1350. GpkLocalLock();
  1351. DBG_PRINT(TEXT("->CPSignHash(hProv:0x%08X, hHash:0x%08X, dwKeySpec:0x%08X, sDescription:0x%p('%s'), dwFlags:0x%08X, pbSignature:0x%p, pdwSigLen:0x%p(%d))"),
  1352. hProv,
  1353. hHash,
  1354. dwKeySpec,
  1355. sDescription, sDescription,
  1356. dwFlags,
  1357. pbSignature,
  1358. pdwSigLen, *pdwSigLen);
  1359. DBG_TIME1;
  1360. __try
  1361. {
  1362. __try
  1363. {
  1364. if (Coherent(hProv))
  1365. {
  1366. if (ProvCont[hProv].Flags & CRYPT_VERIFYCONTEXT &&
  1367. ProvCont[hProv].isContNameNullBlank)
  1368. {
  1369. bResult = CRYPT_FAILED;
  1370. errcode = NTE_PERM;
  1371. }
  1372. else
  1373. {
  1374. bResult = MyCPSignHash( hProv, hHash, dwKeySpec, sDescription, dwFlags, pbSignature, pdwSigLen );
  1375. errcode = GetLastError();
  1376. if (pbSignature != 0)
  1377. Select_MF(hProv);
  1378. SCardEndTransaction(ProvCont[hProv].hCard, SCARD_LEAVE_CARD);
  1379. }
  1380. }
  1381. else
  1382. {
  1383. bResult = CRYPT_FAILED;
  1384. errcode = GetLastError();
  1385. }
  1386. }
  1387. __except(EXCEPTION_EXECUTE_HANDLER)
  1388. {
  1389. bResult = CRYPT_FAILED;
  1390. errcode = E_UNEXPECTED;
  1391. }
  1392. }
  1393. __finally
  1394. {
  1395. DBG_TIME2;
  1396. DBG_PRINT(TEXT("<-CPSignHash(hProv:0x%08X, hHash:0x%08X, dwKeySpec:0x%08X, sDescription:0x%p('%s'), dwFlags:0x%08X, pbSignature:0x%p, pdwSigLen:0x%p(%d))\n returns %d in %d msec"),
  1397. hProv,
  1398. hHash,
  1399. dwKeySpec,
  1400. sDescription, sDescription,
  1401. dwFlags,
  1402. pbSignature,
  1403. pdwSigLen, *pdwSigLen,
  1404. bResult,
  1405. DBG_DELTA);
  1406. GpkLocalUnlock();
  1407. }
  1408. RETURN( bResult, errcode );
  1409. }
  1410. ///////////////////////////////////////////////////////////////////////////////////////////
  1411. ///////////////////////////////////////////////////////////////////////////////////////////
  1412. BOOL WINAPI CPVerifySignature( IN HCRYPTPROV hProv,
  1413. IN HCRYPTHASH hHash,
  1414. IN CONST BYTE* pbSignature,
  1415. IN DWORD dwSigLen,
  1416. IN HCRYPTKEY hPubKey,
  1417. IN LPCWSTR sDescription,
  1418. IN DWORD dwFlags )
  1419. {
  1420. BOOL bResult = CRYPT_SUCCEED;
  1421. DWORD errcode = ERROR_SUCCESS;
  1422. GpkLocalLock();
  1423. DBG_PRINT(TEXT("->CPVerifySignature(hProv:0x%08X, hHash:0x%08X, pbSignature:0x%p, dwSigLen:%d, hPubKey:0x%08X, sDescription:0x%p('%s'), dwFlags:0x%08X)"),
  1424. hProv,
  1425. hHash,
  1426. pbSignature,
  1427. dwSigLen,
  1428. hPubKey,
  1429. sDescription, sDescription,
  1430. dwFlags);
  1431. DBG_TIME1;
  1432. __try
  1433. {
  1434. __try
  1435. {
  1436. if (hPubKey <= MAX_GPK_OBJ)
  1437. {
  1438. bResult = Coherent(hProv);
  1439. errcode = GetLastError();
  1440. }
  1441. if (bResult)
  1442. {
  1443. bResult = MyCPVerifySignature( hProv, hHash, pbSignature, dwSigLen, hPubKey, sDescription, dwFlags );
  1444. errcode = GetLastError();
  1445. if (ProvCont[hProv].Flags & CRYPT_VERIFYCONTEXT &&
  1446. ProvCont[hProv].isContNameNullBlank)
  1447. {
  1448. // No access to the card has been done in this case
  1449. }
  1450. else
  1451. {
  1452. if (hPubKey <= MAX_GPK_OBJ)
  1453. {
  1454. // Select_MF(hProv); // NK PIN not presented
  1455. SCardEndTransaction(ProvCont[hProv].hCard, SCARD_LEAVE_CARD);
  1456. }
  1457. }
  1458. }
  1459. else
  1460. {
  1461. bResult = CRYPT_FAILED;
  1462. errcode = GetLastError();
  1463. }
  1464. }
  1465. __except(EXCEPTION_EXECUTE_HANDLER)
  1466. {
  1467. bResult = CRYPT_FAILED;
  1468. errcode = E_UNEXPECTED;
  1469. }
  1470. }
  1471. __finally
  1472. {
  1473. DBG_TIME2;
  1474. DBG_PRINT(TEXT("<-CPVerifySignature(hProv:0x%08X, hHash:0x%08X, pbSignature:0x%p, dwSigLen:%d, hPubKey:0x%08X, sDescription:0x%p('%s'), dwFlags:0x%08X)\n returns %d in %d msec"),
  1475. hProv,
  1476. hHash,
  1477. pbSignature,
  1478. dwSigLen,
  1479. hPubKey,
  1480. sDescription, sDescription,
  1481. dwFlags,
  1482. bResult,
  1483. DBG_DELTA);
  1484. GpkLocalUnlock();
  1485. }
  1486. RETURN( bResult, errcode );
  1487. }