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.

11999 lines
365 KiB

  1. ///////////////////////////////////////////////////////////////////////////////////////////
  2. //
  3. // Copyright 2000 Gemplus Canada Inc.
  4. //
  5. // Project:
  6. // Kenny (GPK CSP)
  7. //
  8. // Authors: Laurent CASSIER
  9. // Jean-Marc ROBERT
  10. //
  11. // Modifications: Thierry Tremblay
  12. // Francois Paradis
  13. // GPK8000 support, key importation, enhancement for Whistler & debug
  14. //
  15. // Compiler:
  16. // Microsoft Visual C++ 6.0 - SP3
  17. // Platform SDK - January 2000
  18. //
  19. ///////////////////////////////////////////////////////////////////////////////////////////
  20. #ifdef _UNICODE
  21. #define UNICODE
  22. #endif
  23. #include "gpkcsp.h"
  24. #include <tchar.h>
  25. #include <process.h>
  26. #include <cassert>
  27. #include <cstdio>
  28. #include "resource.h"
  29. #include "gmem.h"
  30. #include "compcert.h"
  31. #include "pincache.h"
  32. //////////////////////////////////////////////////////////////////////////
  33. //
  34. // Configuration
  35. //
  36. //////////////////////////////////////////////////////////////////////////
  37. const int MAX_SLOT = 16;
  38. //////////////////////////////////////////////////////////////////////////
  39. //
  40. // Prototypes
  41. //
  42. //////////////////////////////////////////////////////////////////////////
  43. static void zap_gpk_objects( DWORD SlotNb, BOOL IsPrivate );
  44. BOOL SCARDPROBLEM( LONG result, WORD sc_status, BYTE offset );
  45. #ifdef _DEBUG
  46. static DWORD dw1, dw2;
  47. #endif
  48. //////////////////////////////////////////////////////////////////////////
  49. //
  50. // Macros & Templates
  51. //
  52. //////////////////////////////////////////////////////////////////////////
  53. template<class T>
  54. bool IsNull( const T* p )
  55. {
  56. return p == 0;
  57. }
  58. template<class T>
  59. bool IsNotNull( const T* p )
  60. {
  61. return p != 0;
  62. }
  63. template<class T>
  64. bool IsNullStr( const T* p )
  65. {
  66. return p == 0 || *p == 0;
  67. }
  68. template<class T>
  69. bool IsNotNullStr( const T* p )
  70. {
  71. return p != 0 && *p != 0;
  72. }
  73. //////////////////////////////////////////////////////////////////////////
  74. //
  75. // Definitions
  76. //
  77. //////////////////////////////////////////////////////////////////////////
  78. const char* SYSTEM_DF = "SYSTEM";
  79. const char* GPK_DF = "GTOK1";
  80. const WORD MAX_SES_KEY_EF = 0x01FF;
  81. const WORD GPK_MF = 0x3F00;
  82. const WORD GPK_OBJ_PRIV_EF = 0x0002;
  83. const WORD GPK_OBJ_PUB_EF = 0x0004;
  84. const WORD GPK_IADF_EF = 0x0005;
  85. const WORD GPK_PIN_EF = 0x0006;
  86. const BYTE GPK_FIRST_KEY = 0x07;
  87. const BYTE FILE_CHUNK_SIZE = 200;
  88. const int REALLOC_SIZE = 50;
  89. const int MAX_FIELD = 16;
  90. extern const DWORD MAX_GPK_OBJ = 100;
  91. // Values for a GPK8000 INTL
  92. const int MAX_GPK_PUBLIC = 4000;
  93. const int MAX_GPK_PRIVATE = 1600;
  94. const int RC2_40_SIZE = 0x05;
  95. const int RC2_128_SIZE = 0x10;
  96. const int DES_SIZE = 0x08;
  97. const int DES3_112_SIZE = 0x10;
  98. const int DES3_SIZE = 0x18;
  99. const int DES_BLOCK_SIZE = 0x08;
  100. const int RC2_BLOCK_SIZE = 0x08;
  101. const BYTE TAG_RSA_PUBLIC = 0x01;
  102. const BYTE TAG_DSA_PUBLIC = 0x02;
  103. const BYTE TAG_RSA_PRIVATE = 0x03;
  104. const BYTE TAG_DSA_PRIVATE = 0x04;
  105. const BYTE TAG_CERTIFICATE = 0x05;
  106. const BYTE TAG_DATA = 0x06;
  107. const BYTE TAG_KEYSET = 0x20;
  108. const WORD FLAG_APPLICATION = 0x0001;
  109. const WORD FLAG_END_DATE = 0x0002;
  110. const WORD FLAG_ID = 0x0004;
  111. const WORD FLAG_ISSUER = 0x0008;
  112. const WORD FLAG_LABEL = 0x0010;
  113. const WORD FLAG_SERIAL_NUMBER = 0x0020;
  114. const WORD FLAG_START_DATE = 0x0040;
  115. const WORD FLAG_SUBJECT = 0x0080;
  116. const WORD FLAG_VALUE = 0x0100;
  117. const WORD FLAG_RESERVED = 0x0200; // Not used by CSP
  118. const WORD FLAG_KEY_TYPE = 0x0400;
  119. const WORD FLAG_KEYSET = 0x0800;
  120. const WORD FLAG_SIGN = 0x1000;
  121. const WORD FLAG_EXCHANGE = 0x2000;
  122. const WORD FLAG_EXPORT = 0x4000;
  123. const WORD FLAG_MODIFIABLE = 0x8000;
  124. enum
  125. {
  126. POS_APPLICATION = 0,
  127. POS_END_DATE,
  128. POS_ID,
  129. POS_ISSUER,
  130. POS_LABEL,
  131. POS_SERIAL_NUMBER,
  132. POS_START_DATE,
  133. POS_SUBJECT,
  134. POS_VALUE,
  135. POS_RESERVED, // Not used by CSP
  136. POS_KEY_TYPE,
  137. POS_KEYSET
  138. };
  139. const int PIN_LEN = PIN_MAX;
  140. const int TIME_GEN_512 = 30;
  141. const int TIME_GEN_1024 = 35;
  142. // Used for GPK4000 perso (filter)
  143. const WORD EF_PUBLIC_SIZE = 1483;
  144. const WORD EF_PRIVATE_SIZE = 620;
  145. const WORD DIFF_US_EXPORT = 240;
  146. // depend on the GemSAFE mapping
  147. const BYTE USER_PIN = 0;
  148. const BYTE TAG_MODULUS = 0x01;
  149. const BYTE TAG_PUB_EXP = 0x07;
  150. const BYTE TAG_LEN = 1;
  151. const BYTE PUB_EXP_LEN = 3;
  152. //////////////////////////////////////////////////////////////////////////
  153. //
  154. // Structures
  155. //
  156. //////////////////////////////////////////////////////////////////////////
  157. typedef struct OBJ_FIELD
  158. {
  159. BYTE *pValue;
  160. WORD Len;
  161. WORD Reserved1;
  162. BOOL bReal;
  163. WORD Reserved2;
  164. } OBJ_FIELD;
  165. typedef struct GPK_EXP_KEY
  166. {
  167. BYTE KeySize;
  168. BYTE ExpSize;
  169. WORD Reserved;
  170. BYTE Exposant[256];
  171. BYTE Modulus[256];
  172. } GPK_EXP_KEY;
  173. typedef struct GPK_OBJ
  174. {
  175. BYTE Tag;
  176. BYTE LastField;
  177. BYTE ObjId;
  178. BYTE FileId;
  179. WORD Flags;
  180. WORD Reserved1;
  181. GPK_EXP_KEY PubKey;
  182. OBJ_FIELD Field[MAX_FIELD];
  183. HCRYPTKEY hKeyBase;
  184. BOOL IsPrivate;
  185. WORD Reserved2;
  186. BOOL IsCreated;
  187. WORD Reserved3;
  188. } GPK_OBJ;
  189. typedef struct TMP_OBJ
  190. {
  191. HCRYPTPROV hProv;
  192. HCRYPTKEY hKeyBase;
  193. } TMP_OBJ;
  194. typedef struct TMP_HASH
  195. {
  196. HCRYPTPROV hProv;
  197. HCRYPTHASH hHashBase;
  198. } TMP_HASH;
  199. typedef struct Slot_Description
  200. {
  201. // NK 06.02.2001 - PinCache
  202. PINCACHE_HANDLE hPinCacheHandle;
  203. // End NK
  204. BOOL Read_Priv;
  205. BOOL Read_Public;
  206. BOOL InitFlag;
  207. BOOL UseFile [MAX_REAL_KEY];
  208. BYTE NbGpkObject;
  209. BYTE bGpkSerNb[8];
  210. GPK_EXP_KEY GpkPubKeys[MAX_REAL_KEY];
  211. GPK_OBJ GpkObject[MAX_GPK_OBJ + 1]; // 0 is not used, valid 1-MAX_GPK_OBJ
  212. DWORD NbKeyFile; // number of key file version 2.00.002
  213. DWORD GpkMaxSessionKey; // Card unwrap capability
  214. DWORD ContextCount;
  215. HANDLE CheckThread;
  216. SCARD_READERSTATE ReaderState;
  217. BOOL CheckThreadStateEmpty; // TRUE if card has been removed and detected by checkThread
  218. TCHAR szReaderName[128];
  219. // TT - 17/10/2000 - Timestamps on card
  220. BYTE m_TSPublic;
  221. BYTE m_TSPrivate;
  222. BYTE m_TSPIN;
  223. BOOL ValidateTimestamps( HCRYPTPROV prov );
  224. } Slot_Description;
  225. //////////////////////////////////////////////////////////////////////////
  226. //
  227. // Statics (locals)
  228. //
  229. //////////////////////////////////////////////////////////////////////////
  230. static HINSTANCE hFirstInstMod = 0;
  231. static BOOL bFirstGUILoad = TRUE;
  232. static HCRYPTPROV hProvBase = 0;
  233. static SCARDCONTEXT hCardContext = 0; // mv
  234. static unsigned l_globalLockCount;
  235. static BYTE bSendBuffer[512];
  236. static BYTE bRecvBuffer[512];
  237. static BYTE* g_pbGpkObj = 0;
  238. static DWORD cbSendLength;
  239. static DWORD cbRecvLength;
  240. static DWORD dwSW1SW2;
  241. static DWORD countCardContextRef= 0;
  242. static DWORD NbInst;
  243. static TCHAR mszCardList[MAX_PATH];
  244. // For dynamic reallocation of TmpObject, hHashGpk and ProvCont
  245. static DWORD MAX_CONTEXT = 50;
  246. static DWORD MAX_TMP_KEY = 200;
  247. static DWORD MAX_TMP_HASH = 200;
  248. // Temporary objects in each context
  249. static TMP_OBJ* TmpObject; // dynamic allocated/reallocated
  250. static TMP_HASH* hHashGpk; // dynamic allocated/reallocated
  251. // Many contexts management
  252. Prov_Context* ProvCont; // dynamic allocated/reallocated
  253. // Per slot information
  254. static SCARDCONTEXT hCardContextCheck[MAX_SLOT];
  255. static volatile BOOL g_fStopMonitor[MAX_SLOT];
  256. static Slot_Description Slot[MAX_SLOT];
  257. static BOOL InitSlot[MAX_SLOT];
  258. static DWORD g_FuncSlotNb = 0;
  259. static long g_threadAttach = 0;
  260. // Gen key time for GPK8000
  261. static int g_GPK8000KeyGenTime512 = 0;
  262. static int g_GPK8000KeyGenTime1024 = 0;
  263. // End of the Dialogue Management
  264. static HCRYPTKEY hRsaIdentityKey = 0;
  265. static DWORD AuxMaxSessionKeyLength = 0;
  266. static DWORD dwRsaIdentityLen = 64;
  267. static BYTE RC2_Key_Size = 0;
  268. static BYTE RSA_KEK_Size = 0;
  269. static BYTE PrivateBlob[] =
  270. {
  271. // Blob header
  272. 0x07, // PRIVATEKEYBLOB
  273. 0x02, // CUR_BLOB_VERSION
  274. 0x00,0x00, // RESERVED
  275. 0x00,0xa4,0x00,0x00, // CALG_RSA_KEYX
  276. // RSA Public Key
  277. 0x52,0x53,0x41,0x32, // "RSA2"
  278. 0x00,0x02,0x00,0x00, // 512 bits
  279. 0x01,0x00,0x00,0x00, // Public Exponent
  280. // Modulus
  281. 0x6b,0xdf,0x51,0xef,0xdb,0x6f,0x10,0x5c,
  282. 0x32,0xbf,0x87,0x1c,0xd1,0x4c,0x24,0x7e,
  283. 0xe7,0x2a,0x14,0x10,0x6d,0xeb,0x2c,0xd5,
  284. 0x8c,0x0b,0x95,0x7b,0xc7,0x5d,0xc6,0x87,
  285. 0x12,0xea,0xa9,0xcd,0x57,0x7d,0x3e,0xcb,
  286. 0xe9,0x6a,0x46,0xd0,0xe1,0xae,0x2f,0x86,
  287. 0xd9,0x50,0xf9,0x98,0x71,0xdd,0x39,0xfc,
  288. 0x0e,0x60,0xa9,0xd3,0xf2,0x38,0xbb,0x8d,
  289. // Prime 1
  290. 0x5d,0x2c,0xbc,0x1e,0xc3,0x38,0xfe,0x00,
  291. 0x5e,0xca,0xcf,0xcd,0xb4,0x13,0x89,0x16,
  292. 0xd2,0x07,0xbc,0x9b,0xe1,0x20,0x31,0x0b,
  293. 0x81,0x28,0x17,0x0c,0xc7,0x73,0x94,0xee,
  294. // Prime 2
  295. 0x67,0xbe,0x7b,0x78,0x4e,0xc7,0x91,0x73,
  296. 0xa8,0x34,0x5a,0x24,0x9d,0x92,0x0d,0xe8,
  297. 0x91,0x61,0x24,0xdc,0xb5,0xeb,0xdf,0x71,
  298. 0x66,0xdc,0xe1,0x77,0xd4,0x78,0x14,0x98,
  299. // Exponent 1
  300. 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  301. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  302. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  303. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  304. // Exponent 2
  305. 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  306. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  307. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  308. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  309. // Coefficient
  310. 0xa0,0x51,0xe9,0x83,0xca,0xee,0x4b,0xf0,
  311. 0x59,0xeb,0xa4,0x81,0xd6,0x1f,0x49,0x42,
  312. 0x2b,0x75,0x89,0xa7,0x9f,0x84,0x7f,0x1f,
  313. 0xc3,0x8f,0x70,0xb6,0x7e,0x06,0x5e,0x8b,
  314. // Private Exponent
  315. 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  316. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  317. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  318. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  319. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  320. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  321. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  322. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
  323. };
  324. static BYTE InitValue[2][2*16+2] =
  325. {
  326. {
  327. // 1 key case
  328. 0x01, 0xF0, 0x00, GPK_FIRST_KEY,
  329. 0x01, 0xD0, 0x00, GPK_FIRST_KEY,
  330. 0x03, 0xB0, 0x00, GPK_FIRST_KEY,
  331. 0x03, 0x90, 0x00, GPK_FIRST_KEY,
  332. 0x00,
  333. 0xFF
  334. },
  335. {
  336. // 2 keys case
  337. 0x01, 0xF0,0x00, GPK_FIRST_KEY,
  338. 0x01, 0xD0,0x00, GPK_FIRST_KEY,
  339. 0x03, 0xB0,0x00, GPK_FIRST_KEY,
  340. 0x03, 0x90,0x00, GPK_FIRST_KEY,
  341. 0x01, 0xF0,0x00, GPK_FIRST_KEY+1,
  342. 0x01, 0xD0,0x00, GPK_FIRST_KEY+1,
  343. 0x03, 0xB0,0x00, GPK_FIRST_KEY+1,
  344. 0x03, 0x90,0x00, GPK_FIRST_KEY+1,
  345. 0x00,
  346. 0xFF
  347. }
  348. };
  349. // NK 09.02.2001 PinCache functions
  350. //////////////////////////////////////////////////////////////////////////
  351. //
  352. // PopulatePins()
  353. // Initializes the Pins structure and storea data
  354. //
  355. //////////////////////////////////////////////////////////////////////////
  356. void PopulatePins( PPINCACHE_PINS pPins,
  357. BYTE *szCurPin,
  358. DWORD bCurPin,
  359. BYTE *szNewPin,
  360. DWORD bNewPin )
  361. {
  362. if ( NULL == szCurPin )
  363. pPins->pbCurrentPin = NULL;
  364. else
  365. pPins->pbCurrentPin = szCurPin;
  366. pPins->cbCurrentPin = bCurPin;
  367. if ( NULL == szNewPin )
  368. pPins->pbNewPin = NULL;
  369. else
  370. pPins->pbNewPin = szNewPin;
  371. pPins->cbNewPin = bNewPin;
  372. }
  373. /*------------------------------------------------------------------------------
  374. ------------------------------------------------------------------------------*/
  375. DWORD Select_MF(HCRYPTPROV hProv);
  376. BOOL Coherent(HCRYPTPROV hProv, bool *cardReinserted=NULL);
  377. static DWORD OpenCard(CHAR* szContainerAsked, DWORD dwFlags, SCARDHANDLE* hCard, PTCHAR szReaderName, DWORD dwReaderNameLen);
  378. void ReleaseProvider(HCRYPTPROV hProv);
  379. static int get_pin_free(HCRYPTPROV hProv);
  380. static BOOL verify_pin(HCRYPTPROV hProv, const char* pPin, DWORD dwPinLen);
  381. static BOOL change_pin(HCRYPTPROV hProv, BYTE secretCode, const char* a_pOldPin, DWORD dwOldPinLen, const char* a_pNewPin, DWORD dwNewPinLen);
  382. static BOOL Context_exist(HCRYPTPROV hProv);
  383. /*------------------------------------------------------------------------------
  384. ------------------------------------------------------------------------------*/
  385. struct CallbackData
  386. {
  387. HCRYPTPROV hProv;
  388. BOOL IsCoherent;
  389. };
  390. //////////////////////////////////////////////////////////////////////////
  391. //
  392. // Callbacks for PinCache
  393. //
  394. //////////////////////////////////////////////////////////////////////////
  395. DWORD Callback_VerifyPinLength( PPINCACHE_PINS pPins, PVOID pvCallBackCtx )
  396. {
  397. if ((pPins->cbCurrentPin < PIN_MIN) || (pPins->cbCurrentPin > PIN_MAX))
  398. return SCARD_E_INVALID_CHV;
  399. if (( pPins->cbNewPin != 0 ) &&
  400. ((pPins->cbNewPin < PIN_MIN) || (pPins->cbNewPin > PIN_MAX)))
  401. return SCARD_E_INVALID_CHV;
  402. return ERROR_SUCCESS;
  403. }
  404. DWORD Callback_VerifyChangePin( PPINCACHE_PINS pPins, PVOID pvCallBackCtx )
  405. {
  406. DWORD dwStatus;
  407. if ((dwStatus = Callback_VerifyPinLength(pPins, 0)) != ERROR_SUCCESS)
  408. return dwStatus;
  409. if (pvCallBackCtx == 0)
  410. return NTE_FAIL;
  411. CallbackData* pCallbackData = (CallbackData*)pvCallBackCtx;
  412. HCRYPTPROV hProv = pCallbackData->hProv;
  413. BOOL IsCoherent = pCallbackData->IsCoherent;
  414. if (!IsCoherent)
  415. {
  416. if (!Coherent(hProv))
  417. return NTE_FAIL;
  418. }
  419. DWORD dwPinFree = get_pin_free(hProv);
  420. if (dwPinFree == -1)
  421. dwStatus = NTE_FAIL;
  422. if ((dwStatus == ERROR_SUCCESS) && (dwPinFree == 0))
  423. dwStatus = SCARD_W_CHV_BLOCKED;
  424. if ((dwStatus == ERROR_SUCCESS) && (!verify_pin(hProv, (CHAR*)pPins->pbCurrentPin, pPins->cbCurrentPin)))
  425. dwStatus = SCARD_W_WRONG_CHV;
  426. if (pPins->cbNewPin != 0)
  427. {
  428. if ((dwStatus == ERROR_SUCCESS) && (!change_pin(hProv, USER_PIN, (CHAR*)pPins->pbCurrentPin, pPins->cbCurrentPin, (CHAR*)pPins->pbNewPin, pPins->cbNewPin)))
  429. dwStatus = SCARD_W_WRONG_CHV;
  430. }
  431. if (!IsCoherent)
  432. {
  433. Select_MF(hProv);
  434. SCardEndTransaction(ProvCont[hProv].hCard, SCARD_LEAVE_CARD);
  435. }
  436. return dwStatus;
  437. }
  438. DWORD Callback_VerifyChangePin2( PPINCACHE_PINS pPins, PVOID pvCallBackCtx )
  439. {
  440. DWORD dwStatus;
  441. if ((dwStatus = Callback_VerifyPinLength(pPins, 0)) != ERROR_SUCCESS)
  442. return dwStatus;
  443. if (pvCallBackCtx == 0)
  444. return NTE_FAIL;
  445. HCRYPTPROV hProv = (HCRYPTPROV)pvCallBackCtx;
  446. if (!verify_pin(hProv, (CHAR*)pPins->pbCurrentPin, pPins->cbCurrentPin))
  447. return SCARD_W_WRONG_CHV;
  448. if (pPins->cbNewPin != 0)
  449. {
  450. if (!change_pin(hProv, USER_PIN, (CHAR*)pPins->pbCurrentPin, pPins->cbCurrentPin, (CHAR*)pPins->pbNewPin, pPins->cbNewPin))
  451. return SCARD_W_WRONG_CHV;
  452. }
  453. return ERROR_SUCCESS;
  454. }
  455. //////////////////////////////////////////////////////////////////////////
  456. //
  457. // Query_MSPinCache()
  458. // Wrapper for Microsoft PinCacheQuery
  459. //
  460. //////////////////////////////////////////////////////////////////////////
  461. DWORD Query_MSPinCache( PINCACHE_HANDLE hCache, PBYTE pbPin, PDWORD pcbPin )
  462. {
  463. DWORD dwStatus = PinCacheQuery( hCache, pbPin, pcbPin );
  464. if ( (dwStatus == ERROR_EMPTY) && (*pcbPin == 0) )
  465. return ERROR_EMPTY;
  466. if ( (dwStatus == ERROR_SUCCESS) && (*pcbPin == 0) )
  467. return SCARD_E_INVALID_CHV;
  468. return ERROR_SUCCESS;
  469. }
  470. //////////////////////////////////////////////////////////////////////////
  471. //
  472. // Flush_MSPinCache()
  473. // Wrapper for Microsoft PinCacheFlush
  474. //
  475. //////////////////////////////////////////////////////////////////////////
  476. void Flush_MSPinCache ( PINCACHE_HANDLE *phCache )
  477. {
  478. PinCacheFlush( phCache );
  479. }
  480. //////////////////////////////////////////////////////////////////////////
  481. //
  482. // Wrapper for SCardConnect
  483. //
  484. // fix SCR 43 : Reconnect after the ressource manager had been stopped and
  485. // restarted.
  486. //
  487. //////////////////////////////////////////////////////////////////////////
  488. DWORD ConnectToCard( IN LPCTSTR szReaderFriendlyName,
  489. IN DWORD dwShareMode,
  490. IN DWORD dwPreferredProtocols,
  491. OUT LPSCARDHANDLE phCard,
  492. OUT LPDWORD pdwActiveProtocol
  493. )
  494. {
  495. DWORD dwSts = SCardConnect( hCardContext, szReaderFriendlyName,
  496. dwShareMode, dwPreferredProtocols,
  497. phCard, pdwActiveProtocol );
  498. if (dwSts == SCARD_E_SERVICE_STOPPED)
  499. {
  500. DBG_PRINT(TEXT("ScardConnect fails because RM has been stopped and restarted"));
  501. SCardReleaseContext(hCardContext);
  502. dwSts = SCardEstablishContext( SCARD_SCOPE_SYSTEM, 0, 0, &hCardContext );
  503. if (dwSts == SCARD_S_SUCCESS)
  504. {
  505. dwSts = SCardConnect( hCardContext, szReaderFriendlyName,
  506. dwShareMode, dwPreferredProtocols, phCard, pdwActiveProtocol );
  507. }
  508. }
  509. DBG_PRINT(TEXT("SCardConnect"));
  510. return dwSts;
  511. }
  512. //////////////////////////////////////////////////////////////////////////
  513. //
  514. // Add_MSPinCache()
  515. // Wrapper for Microsoft PinCacheAdd
  516. //
  517. //////////////////////////////////////////////////////////////////////////
  518. DWORD Add_MSPinCache( PINCACHE_HANDLE *phCache,
  519. PPINCACHE_PINS pPins,
  520. PFN_VERIFYPIN_CALLBACK pfnVerifyPinCallback,
  521. PVOID pvCallbackCtx)
  522. {
  523. DWORD dwStatus = PinCacheAdd( phCache,
  524. pPins,
  525. pfnVerifyPinCallback,
  526. pvCallbackCtx );
  527. return dwStatus;
  528. }
  529. // End NK
  530. //////////////////////////////////////////////////////////////////////////
  531. //
  532. // DoSCardTransmit:
  533. // This function performs an SCardTransmit operation, plus retries the
  534. // operation should an SCARD_E_COMM_DATA_LOST or similar error be reported.
  535. //
  536. // Arguments:
  537. // Per SCardTransmit
  538. //
  539. // Return Value:
  540. // Per SCardTransmit
  541. //
  542. // Author:
  543. // Doug Barlow (dbarlow) 1/27/1999
  544. //
  545. //////////////////////////////////////////////////////////////////////////
  546. LONG WINAPI
  547. DoSCardTransmit(
  548. IN SCARDHANDLE hCard,
  549. IN LPCSCARD_IO_REQUEST pioSendPci,
  550. IN LPCBYTE pbSendBuffer,
  551. IN DWORD cbSendLength,
  552. IN OUT LPSCARD_IO_REQUEST pioRecvPci,
  553. OUT LPBYTE pbRecvBuffer,
  554. IN OUT LPDWORD pcbRecvLength)
  555. {
  556. LONG lRet=SCARD_E_UNEXPECTED;
  557. BOOL fAgain = TRUE;
  558. DWORD dwRetryLimit = 3;
  559. DWORD dwLength;
  560. DBG_TIME1;
  561. while (fAgain)
  562. {
  563. if (0 == dwRetryLimit--)
  564. break;
  565. dwLength = *pcbRecvLength;
  566. lRet = SCardTransmit(
  567. hCard,
  568. pioSendPci,
  569. pbSendBuffer,
  570. cbSendLength,
  571. pioRecvPci,
  572. pbRecvBuffer,
  573. &dwLength);
  574. switch (lRet)
  575. {
  576. #ifdef SCARD_E_COMM_DATA_LOST
  577. case SCARD_E_COMM_DATA_LOST:
  578. #endif
  579. case ERROR_SEM_TIMEOUT:
  580. break;
  581. default:
  582. fAgain = FALSE;
  583. *pcbRecvLength = dwLength;
  584. }
  585. }
  586. DBG_TIME2;
  587. DBG_PRINT(TEXT("SCardTransmit(CLA:0x%02X, INS:0x%02X, P1:0x%02X, P2:0x%02X, Li:0x%02X) in %d msec"),
  588. pbSendBuffer[0],
  589. pbSendBuffer[1],
  590. pbSendBuffer[2],
  591. pbSendBuffer[3],
  592. pbSendBuffer[4],
  593. DBG_DELTA);
  594. return lRet;
  595. }
  596. #define SCardTransmit DoSCardTransmit
  597. //////////////////////////////////////////////////////////////////////////
  598. // TT END: La passe a Doug
  599. //////////////////////////////////////////////////////////////////////////
  600. //////////////////////////////////////////////////////////////////////////
  601. //
  602. // TT - 17/10/2000 - Inter-process synchronisation using timestamps
  603. // stored on the card. There is three timestamps:
  604. //
  605. // Public objects timestamp: GemSAFE IADF offset 68
  606. // Private objects timestamp: GemSAFE IADF offset 69
  607. // PIN modification timestamp: GemSAFE IADF offset 70
  608. //
  609. //////////////////////////////////////////////////////////////////////////
  610. BOOL ReadTimestamps( HCRYPTPROV hProv, BYTE* pTSPublic, BYTE* pTSPrivate, BYTE* pTSPIN )
  611. {
  612. // Issue a read binary command at offset 68 of the IADF
  613. bSendBuffer[0] = 0x00;
  614. bSendBuffer[1] = 0xB0;
  615. bSendBuffer[2] = 0x80 | LOBYTE( GPK_IADF_EF );
  616. bSendBuffer[3] = 68 / ProvCont[hProv].dataUnitSize;
  617. bSendBuffer[4] = 3;
  618. cbSendLength = 5;
  619. cbRecvLength = sizeof(bRecvBuffer);
  620. DWORD lRet = SCardTransmit( ProvCont[hProv].hCard, SCARD_PCI_T0, bSendBuffer,
  621. cbSendLength, 0, bRecvBuffer, &cbRecvLength );
  622. if (SCARDPROBLEM(lRet,0x9000,bSendBuffer[4]))
  623. {
  624. RETURN( CRYPT_FAILED, SCARD_W_EOF );
  625. }
  626. *pTSPublic = bRecvBuffer[0];
  627. *pTSPrivate = bRecvBuffer[1];
  628. *pTSPIN = bRecvBuffer[2];
  629. RETURN( CRYPT_SUCCEED, 0 );
  630. }
  631. BOOL WriteTimestamps( HCRYPTPROV hProv, BYTE TSPublic, BYTE TSPrivate, BYTE TSPIN )
  632. {
  633. // Issue a update binary command at offset 68 of the IADF
  634. bSendBuffer[0] = 0x00;
  635. bSendBuffer[1] = 0xD6;
  636. bSendBuffer[2] = 0x80 | LOBYTE( GPK_IADF_EF );
  637. bSendBuffer[3] = 68 / ProvCont[hProv].dataUnitSize;
  638. bSendBuffer[4] = 3;
  639. bSendBuffer[5] = TSPublic;
  640. bSendBuffer[6] = TSPrivate;
  641. bSendBuffer[7] = TSPIN;
  642. cbSendLength = 8;
  643. cbRecvLength = sizeof(bRecvBuffer);
  644. DWORD lRet = SCardTransmit( ProvCont[hProv].hCard, SCARD_PCI_T0, bSendBuffer,
  645. cbSendLength, 0, bRecvBuffer, &cbRecvLength );
  646. if (SCARDPROBLEM(lRet,0x9000,0))
  647. {
  648. RETURN( CRYPT_FAILED, SCARD_W_EOF );
  649. }
  650. RETURN( CRYPT_SUCCEED, 0 );
  651. }
  652. BOOL Slot_Description::ValidateTimestamps( HCRYPTPROV hProv )
  653. {
  654. BYTE TSPublic, TSPrivate, TSPIN;
  655. if (!ReadTimestamps( hProv, &TSPublic, &TSPrivate, &TSPIN ))
  656. return CRYPT_FAILED;
  657. if (m_TSPublic != TSPublic)
  658. {
  659. Read_Public = FALSE;
  660. zap_gpk_objects( ProvCont[hProv].Slot, FALSE );
  661. }
  662. if (m_TSPrivate != TSPrivate)
  663. {
  664. Read_Priv = FALSE;
  665. zap_gpk_objects( ProvCont[hProv].Slot, TRUE );
  666. }
  667. if (m_TSPIN != TSPIN)
  668. {
  669. // ClearPin(); // NK 06.02.2001
  670. Flush_MSPinCache(&hPinCacheHandle);
  671. }
  672. m_TSPublic = TSPublic;
  673. m_TSPrivate = TSPrivate;
  674. m_TSPIN = TSPIN;
  675. return CRYPT_SUCCEED;
  676. }
  677. //////////////////////////////////////////////////////////////////////////
  678. //
  679. // IsWin2000() - Detect if we are running under Win2000 (and above)
  680. //
  681. //////////////////////////////////////////////////////////////////////////
  682. bool IsWin2000()
  683. {
  684. #if (_WIN32_WINNT >= 0x0500)
  685. return true;
  686. #else
  687. OSVERSIONINFO info;
  688. info.dwOSVersionInfoSize = sizeof(info);
  689. GetVersionEx( &info );
  690. if (info.dwPlatformId == VER_PLATFORM_WIN32_NT && info.dwMajorVersion >= 5)
  691. return true;
  692. return false;
  693. #endif
  694. }
  695. ////////////////////////////////////////////////////////////////////////////////
  696. //
  697. // TT 28/07/2000
  698. //
  699. // Detect GPK4000 ATR instead of GPK8000 ATR. This is to ensure
  700. // that the GPK16000 will work as-is with the CSP.
  701. //
  702. // The return value is the error code from SCardStatus()
  703. //
  704. ////////////////////////////////////////////////////////////////////////////////
  705. static DWORD DetectGPK8000( SCARDHANDLE hCard, BOOL* pbGPK8000 )
  706. {
  707. const BYTE ATR_GPK4000[] = { 0x3B, 0x27, 0x00, 0x80, 0x65, 0xA2, 0x04, 0x01, 0x01, 0x37 };
  708. const BYTE ATR_MASK[] = { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE5, 0xFF, 0xFF, 0xFF };
  709. DWORD lRet;
  710. TCHAR szReaderName[1024];
  711. DWORD lenReaderName;
  712. DWORD state;
  713. DWORD protocol;
  714. BYTE ATR[32];
  715. DWORD lenATR;
  716. DWORD i;
  717. lenReaderName = sizeof( szReaderName ) / sizeof( TCHAR );
  718. lenATR = sizeof(ATR);
  719. // Assume we have a GPK4000
  720. *pbGPK8000 = FALSE;
  721. // Read the ATR
  722. lRet = SCardStatus( hCard, szReaderName, &lenReaderName, &state, &protocol, ATR, &lenATR );
  723. if (lRet != SCARD_S_SUCCESS)
  724. return lRet;
  725. // Check for GPK4000
  726. for (i = 0; i < lenATR; ++i)
  727. {
  728. if ( (ATR[i] & ATR_MASK[i]) != (ATR_GPK4000[i] & ATR_MASK[i]) )
  729. {
  730. // Not a GPK4000
  731. *pbGPK8000 = TRUE;
  732. break;
  733. }
  734. }
  735. return SCARD_S_SUCCESS;
  736. }
  737. /*------------------------------------------------------------------------------
  738. // Critical section
  739. ------------------------------------------------------------------------------*/
  740. static CRITICAL_SECTION l_csLocalLock;
  741. void GpkLocalLock()
  742. {
  743. EnterCriticalSection(&l_csLocalLock);
  744. }
  745. void GpkLocalUnlock()
  746. {
  747. LeaveCriticalSection(&l_csLocalLock);
  748. }
  749. /*------------------------------------------------------------------------------
  750. ------------------------------------------------------------------------------*/
  751. static void r_memcpy(BYTE *pbOut, BYTE *pbIn, DWORD dwLen)
  752. {
  753. DWORD i;
  754. for (i = 0; i < dwLen; i++)
  755. {
  756. pbOut[i] = pbIn[dwLen - i -1];
  757. }
  758. }
  759. /*------------------------------------------------------------------------------
  760. ------------------------------------------------------------------------------*/
  761. static BOOL sw_mask(WORD sw, BYTE x)
  762. {
  763. if ((sw == 0x0000) || (x == 0xFF))
  764. {
  765. return (CRYPT_SUCCEED);
  766. }
  767. dwSW1SW2 = (bRecvBuffer[x]*256) + bRecvBuffer[x+1];
  768. if (LOBYTE(sw) == 0xFF)
  769. {
  770. if (bRecvBuffer[x] != HIBYTE(sw))
  771. {
  772. return (CRYPT_FAILED);
  773. }
  774. }
  775. else
  776. {
  777. if ((bRecvBuffer[x] != HIBYTE(sw))
  778. ||(bRecvBuffer[x+1] != LOBYTE(sw))
  779. )
  780. {
  781. return (CRYPT_FAILED);
  782. }
  783. }
  784. return (CRYPT_SUCCEED);
  785. }
  786. BOOL SCARDPROBLEM( LONG result, WORD sc_status, BYTE offset )
  787. {
  788. if (!sw_mask( sc_status, offset ))
  789. return TRUE;
  790. if (result != SCARD_S_SUCCESS)
  791. return TRUE;
  792. return FALSE;
  793. }
  794. /*------------------------------------------------------------------------------
  795. ------------------------------------------------------------------------------*/
  796. static void conv_hex( const char* pInput, WORD wLen, BYTE* pOut )
  797. {
  798. BYTE pin[32];
  799. WORD i;
  800. memcpy( pin, pInput, min(wLen,sizeof(pin)) );
  801. if (wLen & 1)
  802. pin[wLen] = '0';
  803. for (i=0; i < wLen; i+=2)
  804. {
  805. pOut[i/2] = ((pin[i] & 0x0F) << 4) + (pin[i+1] & 0x0F);
  806. }
  807. }
  808. /*------------------------------------------------------------------------------
  809. ------------------------------------------------------------------------------*/
  810. HWND GetAppWindow()
  811. {
  812. HWND hActWnd = g_hMainWnd;
  813. if (!IsWindow(hActWnd))
  814. hActWnd = GetActiveWindow();
  815. return hActWnd;
  816. }
  817. /*------------------------------------------------------------------------------
  818. ------------------------------------------------------------------------------*/
  819. static void clean_slot( DWORD SlotNb, Prov_Context* pContext )
  820. {
  821. Slot_Description* pSlot;
  822. pSlot = &Slot[ SlotNb ];
  823. pSlot->Read_Priv = FALSE;
  824. pSlot->Read_Public = FALSE;
  825. pSlot->ContextCount = 0;
  826. pSlot->GpkMaxSessionKey = 0;
  827. pSlot->NbKeyFile = 0;
  828. // pSlot->ClearPin(); NK 06.02.2001
  829. Flush_MSPinCache(&(pSlot->hPinCacheHandle));
  830. if (pContext->hRSASign != 0)
  831. {
  832. CryptDestroyKey( pContext->hRSASign );
  833. pContext->hRSASign = 0;
  834. }
  835. if (pContext->hRSAKEK != 0)
  836. {
  837. CryptDestroyKey( pContext->hRSAKEK );
  838. pContext->hRSAKEK = 0;
  839. }
  840. }
  841. /*------------------------------------------------------------------------------
  842. ------------------------------------------------------------------------------*/
  843. static int multistrlen( const PTCHAR mszString )
  844. {
  845. int res, tmp;
  846. PTCHAR ptr = mszString;
  847. res = 0;
  848. if (IsNullStr(ptr))
  849. {
  850. ptr++;
  851. res++;
  852. }
  853. while (IsNotNullStr(ptr))
  854. {
  855. tmp = _tcslen(ptr) + 1;
  856. res = res + tmp;
  857. ptr = ptr + tmp;
  858. }
  859. return (res);
  860. }
  861. /*------------------------------------------------------------------------------
  862. ------------------------------------------------------------------------------*/
  863. static LONG BeginTransaction(SCARDHANDLE hCard)
  864. {
  865. DWORD lRet, dwProtocol;
  866. lRet = SCardBeginTransaction(hCard);
  867. if (lRet == SCARD_W_UNPOWERED_CARD || lRet == SCARD_W_RESET_CARD)
  868. {
  869. DBG_PRINT(TEXT("ScardBeginTransaction fails, try to reconnect"));
  870. lRet = SCardReconnect(hCard,
  871. SCARD_SHARE_SHARED,
  872. SCARD_PROTOCOL_T0,
  873. SCARD_LEAVE_CARD,
  874. &dwProtocol);
  875. if (lRet == SCARD_S_SUCCESS)
  876. {
  877. lRet = SCardBeginTransaction(hCard);
  878. }
  879. }
  880. DBG_PRINT(TEXT("SCardBeginTransaction"));
  881. return(lRet);
  882. }
  883. /*------------------------------------------------------------------------------
  884. ------------------------------------------------------------------------------*/
  885. DWORD Select_MF(HCRYPTPROV hProv)
  886. {
  887. DWORD lRet;
  888. // This function is used to make sure to reset the access condition
  889. // on the sensitive files
  890. /* Select GPK Card MF */
  891. bSendBuffer[0] = 0x00; //CLA
  892. bSendBuffer[1] = 0xA4; //INS
  893. bSendBuffer[2] = 0x00; //P1
  894. bSendBuffer[3] = 0x0C; //P2
  895. bSendBuffer[4] = 0x02; //Li
  896. bSendBuffer[5] = HIBYTE(GPK_MF);
  897. bSendBuffer[6] = LOBYTE(GPK_MF);
  898. cbSendLength = 7;
  899. cbRecvLength = sizeof(bRecvBuffer);
  900. lRet = SCardTransmit( ProvCont[hProv].hCard, SCARD_PCI_T0, bSendBuffer,
  901. cbSendLength, 0, bRecvBuffer, &cbRecvLength );
  902. if (SCARDPROBLEM(lRet,0x9000,0x00))
  903. {
  904. DBG_PRINT(TEXT("Select MF failed, lRet = 0x%08X, SW1 = %X%X, SW2 = %X%X"), lRet, (bRecvBuffer[0] & 0xF0) >> 4, (bRecvBuffer[0] & 0x0F), (bRecvBuffer[1] & 0xF0) >> 4, (bRecvBuffer[1] & 0x0F));
  905. RETURN (CRYPT_FAILED, SCARD_E_DIR_NOT_FOUND);
  906. }
  907. if (ProvCont[hProv].dataUnitSize == 0)
  908. {
  909. // TT 03/11/99: Check data unit size
  910. bSendBuffer[0] = 0x80;
  911. bSendBuffer[1] = 0xC0;
  912. bSendBuffer[2] = 0x02;
  913. bSendBuffer[3] = 0xA4;
  914. bSendBuffer[4] = 0x0D;
  915. cbSendLength = 5;
  916. cbRecvLength = sizeof(bRecvBuffer);
  917. lRet = SCardTransmit( ProvCont[hProv].hCard, SCARD_PCI_T0, bSendBuffer,
  918. cbSendLength, 0, bRecvBuffer, &cbRecvLength);
  919. if (SCARDPROBLEM(lRet,0x9000,bSendBuffer[4]))
  920. {
  921. DBG_PRINT(TEXT("Check data unit size failed"));
  922. RETURN (CRYPT_FAILED, SCARD_E_DIR_NOT_FOUND);
  923. }
  924. if (bRecvBuffer[11] & 0x40) // LOCK1 & 0x40
  925. ProvCont[hProv].dataUnitSize = 1;
  926. else
  927. ProvCont[hProv].dataUnitSize = 4;
  928. }
  929. RETURN (CRYPT_SUCCEED, 0);
  930. }
  931. /*------------------------------------------------------------------------------
  932. ------------------------------------------------------------------------------*/
  933. static int get_pin_free(HCRYPTPROV hProv)
  934. {
  935. DWORD lRet;
  936. int nPinFree,
  937. nb, val; // [JMR 02-04]
  938. /* Select GPK PIN EF */
  939. bSendBuffer[0] = 0x00; //CLA
  940. bSendBuffer[1] = 0xA4; //INS
  941. bSendBuffer[2] = 0x02; //P1
  942. bSendBuffer[3] = 0x0C; //P2
  943. bSendBuffer[4] = 0x02; //Li
  944. bSendBuffer[5] = HIBYTE(GPK_PIN_EF);
  945. bSendBuffer[6] = LOBYTE(GPK_PIN_EF);
  946. cbSendLength = 7;
  947. cbRecvLength = sizeof(bRecvBuffer);
  948. lRet = SCardTransmit( ProvCont[hProv].hCard, SCARD_PCI_T0, bSendBuffer,
  949. cbSendLength, 0, bRecvBuffer, &cbRecvLength );
  950. if (SCARDPROBLEM(lRet,0x9000,0x00))
  951. {
  952. SetLastError(lRet);
  953. return (-1);
  954. }
  955. /* Get EF information for User PIN Code (code 0) */
  956. bSendBuffer[0] = 0x80; //CLA
  957. bSendBuffer[1] = 0xC0; //INS
  958. bSendBuffer[2] = 0x02; //P1
  959. bSendBuffer[3] = 0x05; //P2
  960. bSendBuffer[4] = 0x0C; //Lo 4*number of secret codes
  961. cbSendLength = 5;
  962. cbRecvLength = sizeof(bRecvBuffer);
  963. lRet = SCardTransmit( ProvCont[hProv].hCard, SCARD_PCI_T0, bSendBuffer,
  964. cbSendLength, 0, bRecvBuffer, &cbRecvLength );
  965. if (SCARDPROBLEM(lRet,0x9000, bSendBuffer[4]))
  966. {
  967. SetLastError(SCARD_E_UNEXPECTED);
  968. return (-1);
  969. }
  970. // [JMR 02-04] begin
  971. nb = 0;
  972. val = bRecvBuffer[1];
  973. while (val > 0)
  974. {
  975. nb++;
  976. val = val >> 1;
  977. }
  978. nPinFree = bRecvBuffer[0] - nb;
  979. // [JMR 02-04] end
  980. SetLastError(0);
  981. return (max(0, nPinFree));
  982. }
  983. /*------------------------------------------------------------------------------
  984. ------------------------------------------------------------------------------*/
  985. static BOOL verify_pin( HCRYPTPROV hProv,
  986. const char* pPin,
  987. DWORD dwPinLen
  988. )
  989. {
  990. DWORD lRet;
  991. /* Verify User PIN Code (code 0) */
  992. bSendBuffer[0] = 0x00; //CLA
  993. bSendBuffer[1] = 0x20; //INS
  994. bSendBuffer[2] = 0x00; //P1
  995. bSendBuffer[3] = 0x00; //P2
  996. bSendBuffer[4] = 0x08; //Li
  997. // TT 22/09/99: New PIN padding for GPK8000
  998. if (ProvCont[hProv].bGPK_ISO_DF)
  999. {
  1000. memset(&bSendBuffer[5], 0xFF, 8 );
  1001. memcpy(&bSendBuffer[5], pPin, min(strlen(pPin)+1,8) );
  1002. }
  1003. else
  1004. {
  1005. memset(&bSendBuffer[5], 0x00, 8);
  1006. memcpy(&bSendBuffer[5], pPin, dwPinLen);
  1007. }
  1008. // TT - END -
  1009. cbSendLength = 5 + bSendBuffer[4];
  1010. cbRecvLength = sizeof(bRecvBuffer);
  1011. lRet = SCardTransmit( ProvCont[hProv].hCard, SCARD_PCI_T0, bSendBuffer,
  1012. cbSendLength, 0, bRecvBuffer, &cbRecvLength );
  1013. if (ProvCont[hProv].bGPK_ISO_DF)
  1014. {
  1015. memset(&bSendBuffer[5], 0, min(strlen(pPin)+1,8) );
  1016. }
  1017. else
  1018. {
  1019. memset(&bSendBuffer[5], 0, dwPinLen);
  1020. }
  1021. if (SCARDPROBLEM(lRet,0x9000,0x00))
  1022. {
  1023. RETURN(CRYPT_FAILED, SCARD_W_WRONG_CHV);
  1024. }
  1025. RETURN(CRYPT_SUCCEED, 0);
  1026. }
  1027. /*------------------------------------------------------------------------------
  1028. ------------------------------------------------------------------------------*/
  1029. static BOOL change_pin(HCRYPTPROV hProv,
  1030. BYTE secretCode,
  1031. const char* a_pOldPin,
  1032. DWORD dwOldPinLen,
  1033. const char* a_pNewPin,
  1034. DWORD dwNewPinLen
  1035. )
  1036. {
  1037. DWORD lRet;
  1038. // TT - 17/10/2000 - Update the timestamps
  1039. Slot_Description* pSlot = &Slot[ProvCont[hProv].Slot];
  1040. ++pSlot->m_TSPIN;
  1041. if (0 == pSlot->m_TSPIN)
  1042. pSlot->m_TSPIN = 1;
  1043. if (!WriteTimestamps( hProv, pSlot->m_TSPublic, pSlot->m_TSPrivate, pSlot->m_TSPIN ))
  1044. return CRYPT_FAILED;
  1045. // TT - END -
  1046. // TT 22/09/99: New PIN padding for GPK8000
  1047. char pOldPin[PIN_MAX+1];
  1048. char pNewPin[PIN_MAX+1];
  1049. strncpy( pOldPin, a_pOldPin, PIN_MAX );
  1050. pOldPin[sizeof(pOldPin)-1]=0;
  1051. strncpy( pNewPin, a_pNewPin, PIN_MAX );
  1052. pNewPin[sizeof(pNewPin)-1]=0;
  1053. if (ProvCont[hProv].bGPK_ISO_DF)
  1054. {
  1055. if (dwOldPinLen < PIN_MAX)
  1056. {
  1057. pOldPin[dwOldPinLen] = 0;
  1058. ++dwOldPinLen;
  1059. while (dwOldPinLen != PIN_MAX)
  1060. {
  1061. pOldPin[dwOldPinLen] = '\xFF';
  1062. ++dwOldPinLen;
  1063. }
  1064. }
  1065. if (dwNewPinLen < PIN_MAX)
  1066. {
  1067. pNewPin[dwNewPinLen] = 0;
  1068. ++dwNewPinLen;
  1069. while (dwNewPinLen != PIN_MAX)
  1070. {
  1071. pNewPin[dwNewPinLen] = '\xFF';
  1072. ++dwNewPinLen;
  1073. }
  1074. }
  1075. }
  1076. // TT - END -
  1077. /* Change User PIN Code (code 0) */
  1078. bSendBuffer[0] = 0x80; //CLA
  1079. bSendBuffer[1] = 0x24; //INS
  1080. bSendBuffer[2] = 0x00; //P1
  1081. bSendBuffer[3] = secretCode; //P2
  1082. bSendBuffer[4] = 0x08; //Li
  1083. memset(&bSendBuffer[5], 0x00, 8);
  1084. conv_hex(pOldPin, (WORD)dwOldPinLen, &bSendBuffer[5]);
  1085. conv_hex(pNewPin, (WORD)dwNewPinLen, &bSendBuffer[9]);
  1086. cbSendLength = 5 + bSendBuffer[4];
  1087. cbRecvLength = sizeof(bRecvBuffer);
  1088. lRet = SCardTransmit( ProvCont[hProv].hCard, SCARD_PCI_T0, bSendBuffer,
  1089. cbSendLength, 0, bRecvBuffer, &cbRecvLength );
  1090. memset(bSendBuffer, 0, sizeof(bSendBuffer));
  1091. if (SCARDPROBLEM(lRet,0x9000,0x00))
  1092. {
  1093. RETURN(CRYPT_FAILED, SCARD_W_WRONG_CHV);
  1094. }
  1095. RETURN(CRYPT_SUCCEED, 0);
  1096. }
  1097. /* -----------------------------------------------------------------------------
  1098. --------------------------------------------------------------------------------*/
  1099. BOOL StopMonitor( DWORD SlotNb, DWORD* pThreadExitCode )
  1100. {
  1101. HANDLE hThread;
  1102. DWORD threadExitCode;
  1103. DWORD dwStatus;
  1104. if (SlotNb >= MAX_SLOT)
  1105. {
  1106. SetLastError( NTE_FAIL );
  1107. return FALSE;
  1108. }
  1109. hThread = Slot[SlotNb].CheckThread;
  1110. Slot[SlotNb].CheckThread = NULL;
  1111. Slot[SlotNb].CheckThreadStateEmpty = FALSE;
  1112. if (hThread==NULL)
  1113. {
  1114. return TRUE;
  1115. }
  1116. g_fStopMonitor[SlotNb] = TRUE;
  1117. SCardCancel( hCardContextCheck[SlotNb] );
  1118. dwStatus = WaitForSingleObject( hThread, 30000 );
  1119. if (dwStatus == WAIT_TIMEOUT)
  1120. {
  1121. DBG_PRINT( TEXT("THREAD: ...WaitForSingleObject() timeout, thread handle: %08x"), hThread );
  1122. // + [FP]
  1123. // TerminateThread( hThread, 0 );
  1124. // - [FP]
  1125. }
  1126. else
  1127. if (dwStatus == WAIT_FAILED)
  1128. {
  1129. DBG_PRINT( TEXT("THREAD: ...WaitForSingleObject() failed!, thread handle: %08x"), hThread );
  1130. return FALSE;
  1131. }
  1132. GetExitCodeThread( hThread, &threadExitCode );
  1133. if (pThreadExitCode) *pThreadExitCode = threadExitCode;
  1134. CloseHandle( hThread );
  1135. return TRUE;
  1136. }
  1137. /* -----------------------------------------------------------------------------
  1138. Function: CheckReaderThead
  1139. Out:
  1140. ExitCode:
  1141. 0 = any scard error
  1142. 1 = scard context has been cancelled
  1143. 2 = card has been removed
  1144. Global variables
  1145. g_fStopMonitor[SlotNb] can stops the thread
  1146. --------------------------------------------------------------------------------*/
  1147. unsigned WINAPI CheckReaderThread( void* lpParameter )
  1148. {
  1149. DWORD lRet, ExitCode;
  1150. DWORD SlotNb = (DWORD)((DWORD_PTR)lpParameter);
  1151. ExitCode = 0;
  1152. if (SlotNb >= MAX_SLOT)
  1153. {
  1154. return ExitCode;
  1155. }
  1156. DBG_PRINT(TEXT("CheckReaderThread on Slot %d\n"),SlotNb);
  1157. if (hCardContextCheck[SlotNb] == 0)
  1158. {
  1159. lRet = SCardEstablishContext (SCARD_SCOPE_SYSTEM, 0, 0, &hCardContextCheck[SlotNb]);
  1160. if (lRet != SCARD_S_SUCCESS)
  1161. {
  1162. DBG_PRINT(TEXT("CheckReaderThread. SCardEstablishContext returns 0x%x\n"),lRet);
  1163. return ExitCode;
  1164. }
  1165. }
  1166. while (( !ExitCode) && (!g_fStopMonitor[SlotNb]))
  1167. {
  1168. lRet = SCardGetStatusChange(hCardContextCheck[SlotNb], INFINITE, &Slot[SlotNb].ReaderState, 1);
  1169. if (lRet == SCARD_E_CANCELLED)
  1170. {
  1171. ExitCode = 1;
  1172. }
  1173. else
  1174. {
  1175. if (lRet == SCARD_S_SUCCESS)
  1176. {
  1177. if (Slot[SlotNb].ReaderState.dwEventState & SCARD_STATE_EMPTY)
  1178. {
  1179. DBG_PRINT(TEXT("Card has been removed"));
  1180. Slot[SlotNb].CheckThreadStateEmpty = TRUE;
  1181. GpkLocalLock();
  1182. // TT 19/11/99: When the card is removed, reset the PIN
  1183. // Slot[SlotNb].ClearPin();NK 06.02.2001
  1184. Flush_MSPinCache(&(Slot[SlotNb].hPinCacheHandle));
  1185. Slot[SlotNb].Read_Public = FALSE;
  1186. Slot[SlotNb].Read_Priv = FALSE;
  1187. zap_gpk_objects( SlotNb, FALSE );
  1188. zap_gpk_objects( SlotNb, TRUE );
  1189. Slot[SlotNb].NbKeyFile = 0;
  1190. Slot[SlotNb].GpkMaxSessionKey = 0;
  1191. GpkLocalUnlock();
  1192. // the thread has done is job, exit.
  1193. ExitCode = 2 ;
  1194. }
  1195. else
  1196. {
  1197. Slot[SlotNb].ReaderState.dwCurrentState = Slot[SlotNb].ReaderState.dwEventState;
  1198. }
  1199. }
  1200. // [FP] stop the thread on any other error returned by
  1201. //SCardGetStatusChange to avoid endless loop
  1202. else
  1203. {
  1204. DBG_PRINT(TEXT("Problem with RM"));
  1205. Slot[SlotNb].CheckThreadStateEmpty = TRUE;
  1206. GpkLocalLock();
  1207. // Slot[SlotNb].ClearPin();NK 06.02.2001
  1208. Flush_MSPinCache(&(Slot[SlotNb].hPinCacheHandle));
  1209. Slot[SlotNb].Read_Public = FALSE;
  1210. Slot[SlotNb].Read_Priv = FALSE;
  1211. zap_gpk_objects( SlotNb, FALSE );
  1212. zap_gpk_objects( SlotNb, TRUE );
  1213. Slot[SlotNb].NbKeyFile = 0;
  1214. Slot[SlotNb].GpkMaxSessionKey = 0;
  1215. //Slot[SlotNb].CheckThread = 0;
  1216. GpkLocalUnlock();
  1217. ExitCode = 2;
  1218. }
  1219. }
  1220. }
  1221. if (hCardContextCheck[SlotNb] != 0)
  1222. {
  1223. SCardReleaseContext( hCardContextCheck[SlotNb] );
  1224. hCardContextCheck[SlotNb] = 0;
  1225. }
  1226. return ExitCode;
  1227. }
  1228. /*------------------------------------------------------------------------------
  1229. ------------------------------------------------------------------------------*/
  1230. BOOL BeginCheckReaderThread(DWORD SlotNb)
  1231. {
  1232. unsigned checkThreadId;
  1233. DWORD lRet;
  1234. SCARDCONTEXT hCardContextThread;
  1235. if (SlotNb >= MAX_SLOT)
  1236. {
  1237. SetLastError( NTE_FAIL );
  1238. return FALSE;
  1239. }
  1240. // Monitoring thread
  1241. if (Slot[SlotNb].CheckThread == NULL)
  1242. {
  1243. // In this case, use an auxiliairy thread to check if the card has
  1244. // been removed from this reader.
  1245. // checks the initial state
  1246. lRet = SCardEstablishContext (SCARD_SCOPE_SYSTEM, 0, 0, &hCardContextThread);
  1247. if (lRet != SCARD_S_SUCCESS)
  1248. {
  1249. return FALSE;
  1250. }
  1251. Slot[SlotNb].ReaderState.szReader = Slot[SlotNb].szReaderName;
  1252. Slot[SlotNb].ReaderState.dwCurrentState = SCARD_STATE_UNAWARE;
  1253. lRet = SCardGetStatusChange(hCardContextThread, 1, &Slot[SlotNb].ReaderState, 1);
  1254. if (hCardContextThread != 0)
  1255. {
  1256. SCardReleaseContext( hCardContextThread );
  1257. hCardContextCheck[SlotNb] = 0;
  1258. }
  1259. if (lRet != SCARD_S_SUCCESS)
  1260. {
  1261. return FALSE;
  1262. }
  1263. Slot[SlotNb].ReaderState.dwCurrentState = Slot[SlotNb].ReaderState.dwEventState;
  1264. // Allocate and trigger the thread, if there is a card
  1265. g_fStopMonitor[SlotNb] = FALSE;
  1266. Slot[SlotNb].CheckThreadStateEmpty = FALSE;
  1267. if (Slot[SlotNb].ReaderState.dwEventState & SCARD_STATE_PRESENT)
  1268. {
  1269. Slot[SlotNb].CheckThread = (HANDLE)_beginthreadex( 0, 0, CheckReaderThread,
  1270. (LPVOID)((DWORD_PTR)SlotNb), 0, &checkThreadId );
  1271. }
  1272. }
  1273. return TRUE;
  1274. }
  1275. static BOOL PIN_Validation(HCRYPTPROV hProv)
  1276. {
  1277. BOOL CryptResp;
  1278. DWORD nPinFree;
  1279. DWORD SlotNb;
  1280. TCHAR szCspTitle[MAX_STRING];
  1281. PINCACHE_PINS Pins;
  1282. DWORD dwStatus;
  1283. SlotNb = ProvCont[hProv].Slot;
  1284. // Get PIN free presentation number
  1285. nPinFree = get_pin_free(hProv);
  1286. // The flags of the context should be passed to the GUI functions with the global variable
  1287. CspFlags = ProvCont[hProv].Flags;
  1288. // Failure to retreive PIN free presentation count (-1)
  1289. if ( nPinFree == DWORD(-1) )
  1290. {
  1291. // Slot[SlotNb].ClearPin();
  1292. Flush_MSPinCache( &(Slot[SlotNb].hPinCacheHandle) );
  1293. RETURN ( CRYPT_FAILED, NTE_FAIL );
  1294. }
  1295. // PIN is locked
  1296. if ( nPinFree == 0 )
  1297. {
  1298. // Slot[SlotNb].ClearPin();
  1299. Flush_MSPinCache( &(Slot[SlotNb].hPinCacheHandle) );
  1300. if ( ProvCont[hProv].Flags & CRYPT_SILENT )
  1301. {
  1302. RETURN ( CRYPT_FAILED, SCARD_W_CHV_BLOCKED );
  1303. }
  1304. else
  1305. {
  1306. LoadString( g_hInstMod, IDS_GPKCSP_TITLE, szCspTitle, sizeof(szCspTitle)/sizeof(TCHAR) );
  1307. DisplayMessage( TEXT("locked"), szCspTitle, 0 );
  1308. RETURN ( CRYPT_FAILED, SCARD_W_CHV_BLOCKED );
  1309. }
  1310. }
  1311. // Normal PIN verification
  1312. // dwGpkPinLen = strlen(Slot[SlotNb].GetPin());
  1313. dwGpkPinLen = PIN_LEN + 1;
  1314. dwStatus = Query_MSPinCache( Slot[SlotNb].hPinCacheHandle,
  1315. (BYTE*)szGpkPin,
  1316. &dwGpkPinLen );
  1317. if ( (dwStatus != ERROR_SUCCESS) && (dwStatus != ERROR_EMPTY) )
  1318. RETURN (CRYPT_FAILED, dwStatus);
  1319. bNewPin = FALSE;
  1320. bChangePin = FALSE;
  1321. if ( dwStatus == ERROR_EMPTY )
  1322. {
  1323. if (ProvCont[hProv].Flags & CRYPT_SILENT)
  1324. {
  1325. RETURN ( CRYPT_FAILED, NTE_SILENT_CONTEXT );
  1326. }
  1327. for(;;)
  1328. {
  1329. Select_MF( hProv );
  1330. SCardEndTransaction( ProvCont[hProv].hCard, SCARD_LEAVE_CARD );
  1331. DialogBox( g_hInstRes, TEXT("PINDIALOG"), GetAppWindow(), PinDlgProc );
  1332. if ( dwGpkPinLen == 0 )
  1333. {
  1334. RETURN( CRYPT_FAILED, SCARD_W_CANCELLED_BY_USER );
  1335. }
  1336. else
  1337. {
  1338. bool bCardReinserted=false;
  1339. if( !Coherent(hProv, &bCardReinserted) )
  1340. RETURN ( CRYPT_FAILED, NTE_FAIL );
  1341. if(bCardReinserted)
  1342. continue;
  1343. // Slot[SlotNb].SetPin( szGpkPin );
  1344. if (!bChangePin)
  1345. PopulatePins( &Pins, (BYTE *)szGpkPin, dwGpkPinLen, 0, 0 );
  1346. else
  1347. PopulatePins( &Pins, (BYTE *)szGpkPin, dwGpkPinLen, (BYTE *)szGpkNewPin, wGpkNewPinLen );
  1348. dwStatus = Add_MSPinCache( &(Slot[SlotNb].hPinCacheHandle),
  1349. &Pins,
  1350. Callback_VerifyChangePin2,
  1351. (void*)hProv );
  1352. memset(szGpkPin, 0, sizeof(szGpkPin));
  1353. dwGpkPinLen=0;
  1354. memset(szGpkNewPin, 0, sizeof(szGpkNewPin));
  1355. wGpkNewPinLen=0;
  1356. if( dwStatus != ERROR_SUCCESS && dwStatus != SCARD_W_WRONG_CHV )
  1357. {
  1358. RETURN ( CRYPT_FAILED, dwStatus );
  1359. }
  1360. }
  1361. break;
  1362. } // for
  1363. }
  1364. else
  1365. {
  1366. CryptResp = verify_pin( hProv, szGpkPin, dwGpkPinLen );
  1367. if ( CryptResp )
  1368. {
  1369. dwStatus = ERROR_SUCCESS;
  1370. }
  1371. else
  1372. {
  1373. Flush_MSPinCache( &(Slot[SlotNb].hPinCacheHandle) );
  1374. dwStatus = SCARD_W_WRONG_CHV;
  1375. }
  1376. memset(szGpkPin, 0, sizeof(szGpkPin));
  1377. dwGpkPinLen=0;
  1378. }
  1379. if ( dwStatus != ERROR_SUCCESS )
  1380. {
  1381. if ( ProvCont[hProv].Flags & CRYPT_SILENT )
  1382. {
  1383. // Slot[SlotNb].ClearPin();
  1384. //Flush_MSPinCache( &(Slot[SlotNb].hPinCacheHandle) );
  1385. RETURN ( CRYPT_FAILED, SCARD_W_WRONG_CHV );
  1386. }
  1387. do
  1388. {
  1389. bNewPin = FALSE;
  1390. bChangePin = FALSE;
  1391. nPinFree = get_pin_free(hProv);
  1392. // Failure to retrieve PIN free presentation count (-1)
  1393. if ( nPinFree == DWORD(-1) )
  1394. {
  1395. // Slot[SlotNb].ClearPin();
  1396. //Flush_MSPinCache(&(Slot[SlotNb].hPinCacheHandle));
  1397. RETURN ( CRYPT_FAILED, NTE_FAIL );
  1398. }
  1399. else if ( nPinFree > 0 )
  1400. {
  1401. LoadString( g_hInstMod, IDS_GPKCSP_TITLE, szCspTitle, sizeof(szCspTitle)/sizeof(TCHAR) );
  1402. DisplayMessage( TEXT("badpin"), szCspTitle, &nPinFree );
  1403. for(;;)
  1404. {
  1405. Select_MF( hProv );
  1406. SCardEndTransaction( ProvCont[hProv].hCard, SCARD_LEAVE_CARD );
  1407. DialogBox( g_hInstRes, TEXT("PINDIALOG"), GetAppWindow(), PinDlgProc );
  1408. if (dwGpkPinLen != 0)
  1409. {
  1410. bool bCardReinserted=false;
  1411. if ( !Coherent(hProv, &bCardReinserted) )
  1412. RETURN ( CRYPT_FAILED, NTE_FAIL );
  1413. if(bCardReinserted)
  1414. continue;
  1415. if (!bChangePin)
  1416. PopulatePins( &Pins, (BYTE *)szGpkPin, dwGpkPinLen, 0, 0 );
  1417. else
  1418. PopulatePins( &Pins, (BYTE *)szGpkPin, dwGpkPinLen, (BYTE *)szGpkNewPin, wGpkNewPinLen );
  1419. dwStatus = Add_MSPinCache( &(Slot[SlotNb].hPinCacheHandle),
  1420. &Pins,
  1421. Callback_VerifyChangePin2,
  1422. (void*)hProv );
  1423. memset(szGpkPin, 0, sizeof(szGpkPin));
  1424. dwGpkPinLen=0;
  1425. memset(szGpkNewPin, 0, sizeof(szGpkNewPin));
  1426. wGpkNewPinLen=0;
  1427. if ( dwStatus != ERROR_SUCCESS && dwStatus != SCARD_W_WRONG_CHV )
  1428. {
  1429. RETURN ( CRYPT_FAILED, dwStatus );
  1430. }
  1431. }
  1432. break;
  1433. } // for
  1434. }
  1435. }
  1436. while ( dwStatus != ERROR_SUCCESS && dwGpkPinLen != 0 && nPinFree > 0 );
  1437. if ( dwStatus != ERROR_SUCCESS )
  1438. {
  1439. if ( nPinFree == 0 )
  1440. {
  1441. // Slot[SlotNb].ClearPin();
  1442. //Flush_MSPinCache(&(Slot[SlotNb].hPinCacheHandle));
  1443. if ( ProvCont[hProv].Flags & CRYPT_SILENT )
  1444. {
  1445. RETURN ( CRYPT_FAILED, SCARD_W_CHV_BLOCKED );
  1446. }
  1447. else
  1448. {
  1449. LoadString( g_hInstMod, IDS_GPKCSP_TITLE, szCspTitle, sizeof(szCspTitle)/sizeof(TCHAR) );
  1450. DisplayMessage( TEXT("locked"), szCspTitle, 0 );
  1451. RETURN( CRYPT_FAILED, SCARD_W_CHV_BLOCKED );
  1452. }
  1453. }
  1454. else
  1455. {
  1456. // Slot[SlotNb].ClearPin();
  1457. //Flush_MSPinCache(&(Slot[SlotNb].hPinCacheHandle));
  1458. RETURN( CRYPT_FAILED, SCARD_W_CANCELLED_BY_USER );
  1459. }
  1460. }
  1461. }
  1462. memset(szGpkPin, 0x00, PIN_MAX+2);
  1463. memset(szGpkNewPin, 0x00, PIN_MAX+2);
  1464. dwGpkPinLen = 0;
  1465. wGpkNewPinLen = 0;
  1466. RETURN(CRYPT_SUCCEED, 0);
  1467. }
  1468. /*------------------------------------------------------------------------------
  1469. ------------------------------------------------------------------------------*/
  1470. BOOL VerifyDivPIN(HCRYPTPROV hProv, BOOL Local)
  1471. {
  1472. DWORD lRet;
  1473. BYTE MKey[9] = "F1961ACF";
  1474. BYTE ChipSN[8];
  1475. BYTE Data[16];
  1476. BYTE hashData[20];
  1477. DWORD cbData = 20;
  1478. BYTE DivPIN[8];
  1479. HCRYPTHASH hHash = 0;
  1480. // Get Chip Serial Number
  1481. bSendBuffer[0] = 0x80; //CLA
  1482. bSendBuffer[1] = 0xC0; //INS
  1483. bSendBuffer[2] = 0x02; //P1
  1484. bSendBuffer[3] = 0xA0; //P2
  1485. bSendBuffer[4] = 0x08; //Lo
  1486. cbSendLength = 5;
  1487. cbRecvLength = sizeof(bRecvBuffer);
  1488. lRet = SCardTransmit( ProvCont[hProv].hCard, SCARD_PCI_T0, bSendBuffer,
  1489. cbSendLength, 0, bRecvBuffer, &cbRecvLength );
  1490. if (SCARDPROBLEM(lRet,0x9000, bSendBuffer[4]))
  1491. {
  1492. RETURN (CRYPT_FAILED, SCARD_E_UNEXPECTED);
  1493. }
  1494. ZeroMemory( ChipSN, sizeof(ChipSN) );
  1495. memcpy(ChipSN, bRecvBuffer, min(bSendBuffer[4], sizeof(ChipSN)));
  1496. // Create Data buffer
  1497. memcpy(&Data[0], MKey, 8);
  1498. memcpy(&Data[8], ChipSN, 8);
  1499. // Create a hash object
  1500. if (!CryptCreateHash(hProvBase, CALG_SHA, 0, 0, &hHash))
  1501. return CRYPT_FAILED;
  1502. // hash data
  1503. if (!CryptHashData(hHash, Data, 16, 0))
  1504. {
  1505. lRet = GetLastError();
  1506. CryptDestroyHash(hHash);
  1507. RETURN (CRYPT_FAILED, lRet);
  1508. }
  1509. // get the hash value
  1510. ZeroMemory( hashData, sizeof(hashData) );
  1511. if (!CryptGetHashParam(hHash, HP_HASHVAL, hashData, &cbData, 0))
  1512. {
  1513. lRet = GetLastError();
  1514. CryptDestroyHash(hHash);
  1515. RETURN (CRYPT_FAILED, lRet);
  1516. }
  1517. // get the last 8 bytes of the hash value as diversified PIN
  1518. memcpy(DivPIN, &hashData[20-8], 8);
  1519. CryptDestroyHash(hHash);
  1520. // Send the VERIFY COMMAND to the card
  1521. bSendBuffer[0] = 0x00; //CLA
  1522. bSendBuffer[1] = 0x20; //INS
  1523. bSendBuffer[2] = 0x00; //P1
  1524. if (Local)
  1525. {
  1526. bSendBuffer[3] = 0x02; //P2 -> Locally it is the second PIN
  1527. }
  1528. else
  1529. {
  1530. bSendBuffer[3] = 0x00; //P2 -> At the MF level it is the first PIN
  1531. }
  1532. bSendBuffer[4] = 0x08; //Li
  1533. memset(&bSendBuffer[5], 0x00, 8);
  1534. memcpy(&bSendBuffer[5], DivPIN, 8);
  1535. cbSendLength = 5 + bSendBuffer[4];
  1536. cbRecvLength = sizeof(bRecvBuffer);
  1537. lRet = SCardTransmit( ProvCont[hProv].hCard, SCARD_PCI_T0, bSendBuffer,
  1538. cbSendLength, 0, bRecvBuffer, &cbRecvLength );
  1539. if (SCARDPROBLEM(lRet,0x9000,0x00))
  1540. {
  1541. RETURN( CRYPT_FAILED, SCARD_E_INVALID_CHV );
  1542. }
  1543. RETURN( CRYPT_SUCCEED, 0 );
  1544. }
  1545. /*------------------------------------------------------------------------------
  1546. ------------------------------------------------------------------------------*/
  1547. static DWORD Select_Crypto_DF(HCRYPTPROV hProv)
  1548. {
  1549. static BYTE GPK8000_ISO_DF[] = { 0xA0,0,0,0,0x18,0xF,0,1,0x63,0,1 };
  1550. DWORD lRet;
  1551. BOOL CryptResp;
  1552. // This function is used to avoid to presuppose the state in which the
  1553. // card might be in
  1554. BOOL fAgain = TRUE;
  1555. int iRetryLimit = 3;
  1556. while (fAgain)
  1557. {
  1558. if (0 == iRetryLimit--)
  1559. fAgain = FALSE;
  1560. else
  1561. {
  1562. CryptResp = Select_MF(hProv);
  1563. if (CryptResp)
  1564. fAgain = FALSE;
  1565. else
  1566. Sleep(250);
  1567. }
  1568. }
  1569. if (iRetryLimit < 0)
  1570. {
  1571. DBG_PRINT(TEXT("Select_MF failed"));
  1572. return CRYPT_FAILED;
  1573. }
  1574. // TT 22/09/99 : We now check for ISO 7816-5 compliant GPK8000
  1575. ProvCont[hProv].bGPK_ISO_DF = FALSE;
  1576. bSendBuffer[0] = 0x00;
  1577. bSendBuffer[1] = 0xA4; // Select File
  1578. bSendBuffer[2] = 0x04; // Select DF by name
  1579. bSendBuffer[3] = 0x00; // We want a response
  1580. bSendBuffer[4] = sizeof(GPK8000_ISO_DF);
  1581. memcpy( &bSendBuffer[5], GPK8000_ISO_DF, sizeof(GPK8000_ISO_DF) );
  1582. cbSendLength = sizeof(GPK8000_ISO_DF) + 5;
  1583. cbRecvLength = sizeof(bRecvBuffer);
  1584. lRet = SCardTransmit( ProvCont[hProv].hCard, SCARD_PCI_T0, bSendBuffer,
  1585. cbSendLength, 0, bRecvBuffer, &cbRecvLength );
  1586. // TT 17/11/99: Must check the status bytes
  1587. if (!(SCARDPROBLEM(lRet,0x61FF,0x00)))
  1588. {
  1589. ProvCont[hProv].bGPK_ISO_DF = TRUE;
  1590. }
  1591. else
  1592. {
  1593. // Select Dedicated Application DF on GPK Card
  1594. BYTE lenDF = strlen(GPK_DF);
  1595. bSendBuffer[0] = 0x00; //CLA
  1596. bSendBuffer[1] = 0xA4; //INS
  1597. bSendBuffer[2] = 0x04; //P1
  1598. bSendBuffer[3] = 0x00; //P2
  1599. bSendBuffer[4] = lenDF;
  1600. memcpy( &bSendBuffer[5], GPK_DF, lenDF );
  1601. cbSendLength = 5 + lenDF;
  1602. cbRecvLength = sizeof(bRecvBuffer);
  1603. lRet = SCardTransmit( ProvCont[hProv].hCard, SCARD_PCI_T0, bSendBuffer,
  1604. cbSendLength, 0, bRecvBuffer, &cbRecvLength );
  1605. if (SCARDPROBLEM(lRet,0x61FF,0x00))
  1606. {
  1607. DBG_PRINT(TEXT("Select DF failed"));
  1608. RETURN (CRYPT_FAILED, SCARD_E_DIR_NOT_FOUND);
  1609. }
  1610. }
  1611. RETURN (CRYPT_SUCCEED, 0);
  1612. }
  1613. /*------------------------------------------------------------------------------
  1614. ------------------------------------------------------------------------------*/
  1615. static BOOL card_is_present (HCRYPTPROV hProv)
  1616. {
  1617. DWORD lRet;
  1618. DWORD SlotNb;
  1619. SlotNb = ProvCont[hProv].Slot;
  1620. /* Read Serial number to check if card is present */
  1621. bSendBuffer[0] = 0x80; //CLA
  1622. bSendBuffer[1] = 0xC0; //INS
  1623. bSendBuffer[2] = 0x02; //P1
  1624. bSendBuffer[3] = 0xA0; //P2
  1625. bSendBuffer[4] = 0x08; //Lo
  1626. cbSendLength = 5;
  1627. cbRecvLength = sizeof(bRecvBuffer);
  1628. lRet = SCardTransmit(ProvCont[hProv].hCard,
  1629. SCARD_PCI_T0,
  1630. bSendBuffer,
  1631. cbSendLength,
  1632. NULL,
  1633. bRecvBuffer,
  1634. &cbRecvLength
  1635. );
  1636. if (SCARDPROBLEM(lRet,0x9000, bSendBuffer[4]))
  1637. {
  1638. RETURN (CRYPT_FAILED, SCARD_E_UNEXPECTED);
  1639. }
  1640. if (memcmp(bRecvBuffer, Slot[SlotNb].bGpkSerNb, bSendBuffer[4]))
  1641. {
  1642. RETURN (CRYPT_FAILED, SCARD_W_REMOVED_CARD);
  1643. }
  1644. RETURN (CRYPT_SUCCEED, 0);
  1645. }
  1646. /*------------------------------------------------------------------------------
  1647. ------------------------------------------------------------------------------*/
  1648. static DWORD Auxiliary_CSP_key_size (DWORD AlgId)
  1649. {
  1650. DWORD i, dwFlags, cbData,dwBits, res;
  1651. BYTE pbData[1000], *ptr;
  1652. ALG_ID aiAlgid;
  1653. res = 0;
  1654. // Enumerate Algo.
  1655. for (i=0 ; ; i++)
  1656. {
  1657. if (i == 0)
  1658. dwFlags = CRYPT_FIRST;
  1659. else
  1660. dwFlags = 0;
  1661. // Retrieve information about an algorithm.
  1662. cbData = sizeof (pbData);
  1663. SetLastError(0);
  1664. if (!CryptGetProvParam(hProvBase, PP_ENUMALGS, pbData, &cbData, dwFlags))
  1665. {
  1666. break;
  1667. }
  1668. // Extract algorithm information from the �pbData� buffer.
  1669. ptr = pbData;
  1670. aiAlgid = *(ALG_ID UNALIGNED *)ptr;
  1671. if (aiAlgid == AlgId)
  1672. {
  1673. ptr += sizeof(ALG_ID);
  1674. dwBits = *(DWORD UNALIGNED *)ptr;
  1675. res = dwBits;
  1676. break;
  1677. }
  1678. }
  1679. return res;
  1680. }
  1681. /*------------------------------------------------------------------------------
  1682. ------------------------------------------------------------------------------*/
  1683. static BOOL copy_gpk_key( HCRYPTPROV hProv, HCRYPTKEY hKey, DWORD dwAlgid )
  1684. {
  1685. BOOL CryptResp;
  1686. DWORD dwDataLen;
  1687. BYTE pbData[1024];
  1688. DWORD SlotNb;
  1689. SlotNb = ProvCont[hProv].Slot;
  1690. NoDisplay = TRUE;
  1691. if ((hKey >= 1) && (hKey <= MAX_GPK_OBJ))
  1692. {
  1693. dwDataLen = sizeof(pbData);
  1694. ZeroMemory( pbData, sizeof(pbData) );
  1695. if (MyCPExportKey(hProv, hKey, 0, PUBLICKEYBLOB, 0, pbData, &dwDataLen))
  1696. {
  1697. if (dwAlgid == AT_KEYEXCHANGE)
  1698. {
  1699. if (ProvCont[hProv].hRSAKEK != 0)
  1700. {
  1701. CryptResp = CryptDestroyKey (ProvCont[hProv].hRSAKEK);
  1702. if (!CryptResp)
  1703. {
  1704. NoDisplay = FALSE;
  1705. return CRYPT_FAILED;
  1706. }
  1707. ProvCont[hProv].hRSAKEK = 0;
  1708. }
  1709. CryptResp = CryptImportKey( hProvBase, pbData, dwDataLen, 0, 0,
  1710. &ProvCont[hProv].hRSAKEK );
  1711. //Slot[SlotNb].GpkObject[hKey].hKeyBase = ProvCont[hProv].hRSAKEK;
  1712. }
  1713. else
  1714. {
  1715. if (ProvCont[hProv].hRSASign!= 0)
  1716. {
  1717. CryptResp = CryptDestroyKey (ProvCont[hProv].hRSASign);
  1718. if (!CryptResp)
  1719. {
  1720. NoDisplay = FALSE;
  1721. return CRYPT_FAILED;
  1722. }
  1723. ProvCont[hProv].hRSASign = 0;
  1724. }
  1725. CryptResp = CryptImportKey( hProvBase, pbData, dwDataLen, 0, 0,
  1726. &ProvCont[hProv].hRSASign );
  1727. //Slot[SlotNb].GpkObject[hKey].hKeyBase = ProvCont[hProv].hRSASign;
  1728. }
  1729. if (!CryptResp)
  1730. {
  1731. NoDisplay = FALSE;
  1732. return CRYPT_FAILED;
  1733. }
  1734. }
  1735. else
  1736. {
  1737. NoDisplay = FALSE;
  1738. RETURN (CRYPT_FAILED, NTE_BAD_KEY);
  1739. }
  1740. }
  1741. else
  1742. {
  1743. NoDisplay = FALSE;
  1744. RETURN (CRYPT_FAILED, NTE_BAD_KEY);
  1745. }
  1746. NoDisplay = FALSE;
  1747. RETURN(CRYPT_SUCCEED, 0);
  1748. }
  1749. /*------------------------------------------------------------------------------
  1750. ------------------------------------------------------------------------------*/
  1751. static BOOL Select_Key_File(HCRYPTPROV hProv, int KeyFileId)
  1752. {
  1753. DWORD lRet;
  1754. BOOL CryptResp;
  1755. CryptResp = Select_Crypto_DF(hProv);
  1756. if (!CryptResp)
  1757. return CRYPT_FAILED;
  1758. /* Select Key File on GPK Card */
  1759. bSendBuffer[0] = 0x00; //CLA
  1760. bSendBuffer[1] = 0xA4; //INS
  1761. bSendBuffer[2] = 0x02; //P1
  1762. bSendBuffer[3] = 0x0C; //P2
  1763. bSendBuffer[4] = 0x02; //Li
  1764. bSendBuffer[5] = HIBYTE(KeyFileId);
  1765. bSendBuffer[6] = LOBYTE(KeyFileId);
  1766. cbSendLength = 7;
  1767. cbRecvLength = sizeof(bRecvBuffer);
  1768. lRet = SCardTransmit( ProvCont[hProv].hCard, SCARD_PCI_T0, bSendBuffer,
  1769. cbSendLength, 0, bRecvBuffer, &cbRecvLength );
  1770. if (SCARDPROBLEM(lRet,0x9000,0x00))
  1771. {
  1772. RETURN (CRYPT_FAILED, SCARD_E_FILE_NOT_FOUND);
  1773. }
  1774. RETURN (CRYPT_SUCCEED, 0);
  1775. }
  1776. /*------------------------------------------------------------------------------
  1777. ------------------------------------------------------------------------------*/
  1778. static DWORD Read_NbKeyFile(HCRYPTPROV hProv)
  1779. {
  1780. DWORD i = 0;
  1781. while ((i<MAX_REAL_KEY) && Select_Key_File(hProv, GPK_FIRST_KEY + i))
  1782. i++;
  1783. return i;
  1784. }
  1785. /*------------------------------------------------------------------------------
  1786. ------------------------------------------------------------------------------*/
  1787. static void perso_public(HCRYPTPROV hProv, int Start)
  1788. {
  1789. DWORD i, j;
  1790. DWORD SlotNb;
  1791. SlotNb = ProvCont[hProv].Slot;
  1792. for (i = 0; i < Slot[SlotNb].NbKeyFile; i++)
  1793. {
  1794. Slot[SlotNb].GpkObject[Start+4*i+1].IsPrivate = FALSE;
  1795. Slot[SlotNb].GpkObject[Start+4*i+1].Tag = TAG_RSA_PUBLIC;
  1796. Slot[SlotNb].GpkObject[Start+4*i+1].Flags = 0xF000; // Verify + Encrypt + Export + Modifiable
  1797. Slot[SlotNb].GpkObject[Start+4*i+1].FileId = LOBYTE(GPK_FIRST_KEY + i);
  1798. Slot[SlotNb].GpkObject[Start+4*i+2].IsPrivate = FALSE;
  1799. Slot[SlotNb].GpkObject[Start+4*i+2].Tag = TAG_RSA_PUBLIC;
  1800. Slot[SlotNb].GpkObject[Start+4*i+2].Flags = 0xD000; // Verify + Export + Modifiable
  1801. Slot[SlotNb].GpkObject[Start+4*i+2].FileId = LOBYTE(GPK_FIRST_KEY + i);
  1802. Slot[SlotNb].GpkObject[Start+4*i+3].IsPrivate = FALSE;
  1803. Slot[SlotNb].GpkObject[Start+4*i+3].Tag = TAG_RSA_PRIVATE;
  1804. Slot[SlotNb].GpkObject[Start+4*i+3].Flags = 0xB000; // Sign + Decrypt + Modifiable
  1805. Slot[SlotNb].GpkObject[Start+4*i+3].FileId = LOBYTE(GPK_FIRST_KEY + i);
  1806. Slot[SlotNb].GpkObject[Start+4*i+4].IsPrivate = FALSE;
  1807. Slot[SlotNb].GpkObject[Start+4*i+4].Tag = TAG_RSA_PRIVATE;
  1808. Slot[SlotNb].GpkObject[Start+4*i+4].Flags = 0x9000; // Sign + Modifiable
  1809. Slot[SlotNb].GpkObject[Start+4*i+4].FileId = LOBYTE(GPK_FIRST_KEY + i);
  1810. }
  1811. Slot[SlotNb].NbGpkObject = Start+LOBYTE(4*Slot[SlotNb].NbKeyFile);
  1812. for (i = Start+1; i <= Slot[SlotNb].NbGpkObject; i++)
  1813. {
  1814. for (j = 0; j < MAX_FIELD; j++)
  1815. {
  1816. Slot[SlotNb].GpkObject[i].Field[j].bReal = TRUE;
  1817. }
  1818. }
  1819. }
  1820. /*------------------------------------------------------------------------------
  1821. ------------------------------------------------------------------------------*/
  1822. static void perso_priv(HCRYPTPROV hProv, int Start)
  1823. {
  1824. DWORD i, j;
  1825. DWORD SlotNb;
  1826. SlotNb = ProvCont[hProv].Slot;
  1827. for (i = 0; i < Slot[SlotNb].NbKeyFile; i++)
  1828. {
  1829. Slot[SlotNb].GpkObject[Start+4*i+1].IsPrivate = TRUE;
  1830. Slot[SlotNb].GpkObject[Start+4*i+1].Tag = TAG_RSA_PUBLIC;
  1831. Slot[SlotNb].GpkObject[Start+4*i+1].Flags = 0xF000; // Verify + Encrypt + Export + Modifiable
  1832. Slot[SlotNb].GpkObject[Start+4*i+1].FileId = LOBYTE(GPK_FIRST_KEY+i);
  1833. Slot[SlotNb].GpkObject[Start+4*i+2].IsPrivate = TRUE;
  1834. Slot[SlotNb].GpkObject[Start+4*i+2].Tag = TAG_RSA_PUBLIC;
  1835. Slot[SlotNb].GpkObject[Start+4*i+2].Flags = 0xD000; // Verify + Export + Modifiable
  1836. Slot[SlotNb].GpkObject[Start+4*i+2].FileId = LOBYTE(GPK_FIRST_KEY+i);
  1837. Slot[SlotNb].GpkObject[Start+4*i+3].IsPrivate = TRUE;
  1838. Slot[SlotNb].GpkObject[Start+4*i+3].Tag = TAG_RSA_PRIVATE;
  1839. Slot[SlotNb].GpkObject[Start+4*i+3].Flags = 0xB000; // Sign + Decrypt + Modifiable
  1840. Slot[SlotNb].GpkObject[Start+4*i+3].FileId = LOBYTE(GPK_FIRST_KEY+i);
  1841. Slot[SlotNb].GpkObject[Start+4*i+4].IsPrivate = TRUE;
  1842. Slot[SlotNb].GpkObject[Start+4*i+4].Tag = TAG_RSA_PRIVATE;
  1843. Slot[SlotNb].GpkObject[Start+4*i+4].Flags = 0x9000; // Sign + Modifiable
  1844. Slot[SlotNb].GpkObject[Start+4*i+4].FileId = LOBYTE(GPK_FIRST_KEY+i);
  1845. }
  1846. Slot[SlotNb].NbGpkObject = Start+LOBYTE(4*Slot[SlotNb].NbKeyFile);
  1847. for (i = Start+1; i <= Slot[SlotNb].NbGpkObject; i++)
  1848. {
  1849. for (j = 0; j < MAX_FIELD; j++)
  1850. {
  1851. Slot[SlotNb].GpkObject[i].Field[j].bReal = TRUE;
  1852. }
  1853. }
  1854. }
  1855. /*------------------------------------------------------------------------------
  1856. ------------------------------------------------------------------------------*/
  1857. static void perso_card(HCRYPTPROV hProv, int Start)
  1858. {
  1859. perso_public (hProv, Start);
  1860. perso_priv (hProv, Slot[ProvCont[hProv].Slot].NbGpkObject);
  1861. }
  1862. /*------------------------------------------------------------------------------
  1863. ------------------------------------------------------------------------------*/
  1864. static void zap_gpk_objects( DWORD SlotNb, BOOL IsPrivate)
  1865. {
  1866. WORD
  1867. i, j;
  1868. if (IsPrivate)
  1869. {
  1870. for (i = 0; i <= MAX_GPK_OBJ; i++)
  1871. {
  1872. if ((Slot[SlotNb].GpkObject[i].IsPrivate) &&
  1873. (Slot[SlotNb].GpkObject[i].Tag > 0))
  1874. {
  1875. for (j = 0; j < MAX_FIELD; j++)
  1876. {
  1877. if (IsNotNull(Slot[SlotNb].GpkObject[i].Field[j].pValue))
  1878. {
  1879. GMEM_Free(Slot[SlotNb].GpkObject[i].Field[j].pValue);
  1880. }
  1881. }
  1882. for (j = i; j < Slot[SlotNb].NbGpkObject; j++)
  1883. {
  1884. Slot[SlotNb].GpkObject[j] = Slot[SlotNb].GpkObject[j+1];
  1885. }
  1886. ZeroMemory( &Slot[SlotNb].GpkObject[Slot[SlotNb].NbGpkObject], sizeof(GPK_OBJ));
  1887. // Since the object i+1 is now at position i, the new object i has to
  1888. // process again.
  1889. i--;
  1890. Slot[SlotNb].NbGpkObject--;
  1891. }
  1892. }
  1893. }
  1894. else
  1895. {
  1896. for (i = 0; i <= MAX_GPK_OBJ; i++)
  1897. {
  1898. for (j = 0; j < MAX_FIELD; j++)
  1899. {
  1900. if (IsNotNull(Slot[SlotNb].GpkObject[i].Field[j].pValue))
  1901. {
  1902. GMEM_Free(Slot[SlotNb].GpkObject[i].Field[j].pValue);
  1903. }
  1904. }
  1905. }
  1906. ZeroMemory( Slot[SlotNb].GpkObject, sizeof(Slot[SlotNb].GpkObject) );
  1907. ZeroMemory( Slot[SlotNb].GpkPubKeys, sizeof(Slot[SlotNb].GpkPubKeys) );
  1908. Slot[SlotNb].NbGpkObject = 0;
  1909. for (i = 0; i < MAX_REAL_KEY; i++) // version 2.00.002
  1910. Slot[SlotNb].UseFile[i] = FALSE;
  1911. }
  1912. }
  1913. /*------------------------------------------------------------------------------
  1914. ------------------------------------------------------------------------------*/
  1915. static void clean_card(HCRYPTPROV hProv)
  1916. {
  1917. /* Erase the GemSAFE objects of the cards BUT keep the other PKCS#11 objects */
  1918. WORD i, j;
  1919. DWORD SlotNb;
  1920. SlotNb = ProvCont[hProv].Slot;
  1921. for (i = 0; i <= Slot[SlotNb].NbGpkObject; i++)
  1922. {
  1923. if ((Slot[SlotNb].GpkObject[i].Tag <= TAG_CERTIFICATE) &&
  1924. (Slot[SlotNb].GpkObject[i].Tag > 0))
  1925. {
  1926. for (j = 0; j < MAX_FIELD; j++)
  1927. {
  1928. if (IsNotNull(Slot[SlotNb].GpkObject[i].Field[j].pValue))
  1929. {
  1930. GMEM_Free(Slot[SlotNb].GpkObject[i].Field[j].pValue);
  1931. }
  1932. }
  1933. for (j = i; j < Slot[SlotNb].NbGpkObject; j++)
  1934. {
  1935. Slot[SlotNb].GpkObject[j] = Slot[SlotNb].GpkObject[j+1];
  1936. }
  1937. ZeroMemory( &Slot[SlotNb].GpkObject[Slot[SlotNb].NbGpkObject], sizeof(GPK_OBJ) );
  1938. // Since the object i+1 is now at position i, the new object i has to
  1939. // process again.
  1940. i--;
  1941. Slot[SlotNb].NbGpkObject--;
  1942. }
  1943. }
  1944. perso_card (hProv, Slot[SlotNb].NbGpkObject);// value of Slot[SlotNb].NbGpkObject?0?
  1945. ZeroMemory( Slot[SlotNb].GpkPubKeys, sizeof(Slot[SlotNb].GpkPubKeys) );
  1946. }
  1947. /*------------------------------------------------------------------------------
  1948. ------------------------------------------------------------------------------*/
  1949. static BYTE get_gpk_object_nb(HCRYPTPROV hProv, BYTE ObjId, BOOL IsPrivate)
  1950. {
  1951. BYTE i;
  1952. DWORD SlotNb;
  1953. SlotNb = ProvCont[hProv].Slot;
  1954. for (i = 1; i <= Slot[SlotNb].NbGpkObject; i++)
  1955. {
  1956. if ((Slot[SlotNb].GpkObject[i].IsPrivate == IsPrivate)
  1957. &&(Slot[SlotNb].GpkObject[i].ObjId == ObjId)
  1958. )
  1959. {
  1960. break;
  1961. }
  1962. }
  1963. return (i);
  1964. }
  1965. /*------------------------------------------------------------------------------
  1966. ------------------------------------------------------------------------------*/
  1967. static BYTE calc_gpk_field(HCRYPTPROV hProv, BYTE ObjId)
  1968. {
  1969. BYTE i;
  1970. DWORD SlotNb;
  1971. SlotNb = ProvCont[hProv].Slot;
  1972. for (i = Slot[SlotNb].GpkObject[ObjId].LastField; i <= 15; i++)
  1973. {
  1974. if (Slot[SlotNb].GpkObject[ObjId].Flags & 1<<i)
  1975. {
  1976. Slot[SlotNb].GpkObject[ObjId].LastField = i+1;
  1977. break;
  1978. }
  1979. }
  1980. return (i);
  1981. }
  1982. /*------------------------------------------------------------------------------
  1983. ------------------------------------------------------------------------------*/
  1984. static BYTE find_gpk_obj_tag_type( HCRYPTPROV hProv,
  1985. BYTE KeyTag,
  1986. BYTE KeyType,
  1987. BYTE KeyLen,
  1988. BOOL IsExchange,
  1989. BOOL IsPrivate
  1990. )
  1991. {
  1992. BYTE i, tmp;
  1993. DWORD SlotNb;
  1994. BYTE keysetID;
  1995. GPK_OBJ* pObject;
  1996. SlotNb = ProvCont[hProv].Slot;
  1997. tmp = 0;
  1998. for (i = 1; i <= Slot[SlotNb].NbGpkObject; i++)
  1999. {
  2000. pObject = &Slot[SlotNb].GpkObject[i];
  2001. if ( pObject->Tag != KeyTag )
  2002. continue;
  2003. if ( pObject->IsPrivate != IsPrivate )
  2004. continue;
  2005. if (IsExchange && !(pObject->Flags & FLAG_EXCHANGE))
  2006. continue;
  2007. if ( (KeyType == 0xFF)
  2008. || (KeyType == 0x00 && !pObject->IsCreated && pObject->PubKey.KeySize == KeyLen)
  2009. || (KeyType != 0x00 && pObject->IsCreated && pObject->Field[POS_KEY_TYPE].pValue[0] == KeyType)
  2010. )
  2011. {
  2012. // Key file...
  2013. if (!Slot[SlotNb].UseFile[pObject->FileId - GPK_FIRST_KEY])
  2014. {
  2015. // If the file never has been used, use it. Otherwise, keep on the search
  2016. return i;
  2017. }
  2018. else
  2019. {
  2020. // Not a key file...
  2021. // Keep this possible choice. The file has already been
  2022. // used but another one may exist.
  2023. if (ProvCont[hProv].bLegacyKeyset)
  2024. {
  2025. tmp = i;
  2026. }
  2027. else
  2028. {
  2029. if ( (pObject->Flags & FLAG_KEYSET)
  2030. && (pObject->Field[POS_KEYSET].pValue))
  2031. {
  2032. keysetID = pObject->Field[POS_KEYSET].pValue[0];
  2033. if (keysetID == ProvCont[hProv].keysetID)
  2034. {
  2035. tmp = i;
  2036. }
  2037. }
  2038. }
  2039. }
  2040. }
  2041. }
  2042. return tmp;
  2043. }
  2044. /*------------------------------------------------------------------------------
  2045. ------------------------------------------------------------------------------*/
  2046. static BYTE find_gpk_obj_tag_file(HCRYPTPROV hProv, BYTE KeyTag, BYTE FileId, BOOL IsExchange)
  2047. {
  2048. BYTE i;
  2049. DWORD SlotNb;
  2050. GPK_OBJ* pObject;
  2051. SlotNb = ProvCont[hProv].Slot;
  2052. for (i = 1; i <= Slot[SlotNb].NbGpkObject; i++)
  2053. {
  2054. pObject = &Slot[SlotNb].GpkObject[i];
  2055. if (pObject->Tag != KeyTag)
  2056. continue;
  2057. if (pObject->FileId != FileId)
  2058. continue;
  2059. if (pObject->IsPrivate == FALSE)
  2060. continue;
  2061. if (IsExchange && !(pObject->Flags & FLAG_EXCHANGE))
  2062. continue;
  2063. if (!pObject->IsCreated)
  2064. {
  2065. return i;
  2066. }
  2067. }
  2068. return 0;
  2069. }
  2070. /*------------------------------------------------------------------------------
  2071. ------------------------------------------------------------------------------*/
  2072. static BOOL read_gpk_pub_key(HCRYPTPROV hProv,
  2073. HCRYPTKEY hKey,
  2074. GPK_EXP_KEY *PubKey
  2075. )
  2076. {
  2077. DWORD lRet;
  2078. BYTE Sfi, RecLen, RecNum;
  2079. BOOL IsLast = FALSE;
  2080. DWORD SlotNb;
  2081. SlotNb = ProvCont[hProv].Slot;
  2082. ZeroMemory( PubKey, sizeof(GPK_EXP_KEY) );
  2083. /* Check if Public Key file already read to avoid new access if possible */
  2084. if (Slot[SlotNb].GpkPubKeys[Slot[SlotNb].GpkObject[hKey].FileId - GPK_FIRST_KEY].KeySize > 0)
  2085. {
  2086. memcpy(PubKey,
  2087. &(Slot[SlotNb].GpkPubKeys[Slot[SlotNb].GpkObject[hKey].FileId - GPK_FIRST_KEY]),
  2088. sizeof(GPK_EXP_KEY)
  2089. );
  2090. RETURN(CRYPT_SUCCEED, 0);
  2091. }
  2092. /* Initialize Default Public key value */
  2093. memcpy(PubKey->Exposant, "\x01\x00\x01", 3);
  2094. PubKey->ExpSize = 3;
  2095. /* Calculate Short File id of PK file for P2 parameter */
  2096. Sfi = 0x04 | (Slot[SlotNb].GpkObject[hKey].FileId<<3);
  2097. /* First record to read is number 2, number 1 is reserved for TAG_INFO */
  2098. RecNum = 2;
  2099. do
  2100. {
  2101. /* Read Record (RecNum) to get size */
  2102. bSendBuffer[0] = 0x00; //CLA
  2103. bSendBuffer[1] = 0xB2; //INS
  2104. bSendBuffer[2] = RecNum; //P1
  2105. bSendBuffer[3] = Sfi; //P2
  2106. bSendBuffer[4] = 0xFB; //Lo
  2107. cbSendLength = 5;
  2108. cbRecvLength = sizeof(bRecvBuffer);
  2109. lRet = SCardTransmit( ProvCont[hProv].hCard, SCARD_PCI_T0, bSendBuffer,
  2110. cbSendLength, 0, bRecvBuffer, &cbRecvLength );
  2111. if (SCARDPROBLEM(lRet,0x0000,0xFF))
  2112. {
  2113. RETURN (CRYPT_FAILED, SCARD_W_EOF);
  2114. }
  2115. if (2 == cbRecvLength)
  2116. {
  2117. //
  2118. // If the receive length is two bytes, we know there's an error
  2119. // condition.
  2120. //
  2121. if (bRecvBuffer[0] == 0x6C) // Communication bufer exceeded
  2122. {
  2123. // Re-send the request for the same record, this time with
  2124. // the correct record length.
  2125. RecLen = bRecvBuffer[1];
  2126. /* Read Record (RecNum) to get value */
  2127. bSendBuffer[0] = 0x00; //CLA
  2128. bSendBuffer[1] = 0xB2; //INS
  2129. bSendBuffer[2] = RecNum; //P1
  2130. bSendBuffer[3] = Sfi; //P2
  2131. bSendBuffer[4] = RecLen; //Lo
  2132. cbSendLength = 5;
  2133. cbRecvLength = sizeof(bRecvBuffer);
  2134. lRet = SCardTransmit( ProvCont[hProv].hCard, SCARD_PCI_T0, bSendBuffer,
  2135. cbSendLength, 0, bRecvBuffer, &cbRecvLength );
  2136. if (SCARDPROBLEM(lRet,0x9000,bSendBuffer[4]))
  2137. {
  2138. RETURN (CRYPT_FAILED, SCARD_W_EOF);
  2139. }
  2140. }
  2141. else
  2142. {
  2143. // Some other error occurred. We're done.
  2144. IsLast = TRUE;
  2145. break;
  2146. }
  2147. }
  2148. else
  2149. {
  2150. // Received a valid response from the card. Set the correct
  2151. // record length for this case.
  2152. RecLen = (BYTE) (cbRecvLength - 2); // subtract length of status bytes
  2153. }
  2154. /* Which Record is it? */
  2155. switch (bRecvBuffer[0])
  2156. {
  2157. /* This is the Modulus */
  2158. case 0x01:
  2159. {
  2160. ZeroMemory( PubKey->Modulus, PubKey->KeySize );
  2161. PubKey->KeySize = RecLen-1;
  2162. r_memcpy(PubKey->Modulus, &bRecvBuffer[1],RecLen-1);
  2163. }
  2164. break;
  2165. /* This is the Public Exposant */
  2166. case 0x06:
  2167. case 0x07:
  2168. {
  2169. ZeroMemory( PubKey->Exposant, PubKey->ExpSize );
  2170. PubKey->ExpSize = RecLen-1;
  2171. r_memcpy(PubKey->Exposant, &bRecvBuffer[1],RecLen-1);
  2172. }
  2173. break;
  2174. /* This is an unknown or not signifiant record, ignore it */
  2175. default:
  2176. break;
  2177. }
  2178. RecNum++;
  2179. }
  2180. while (!IsLast);
  2181. if ((PubKey->KeySize == 0) || (PubKey->ExpSize == 0))
  2182. {
  2183. RETURN (CRYPT_FAILED, NTE_BAD_PUBLIC_KEY);
  2184. }
  2185. /* Store Public key to avoid new read if requested */
  2186. memcpy(&(Slot[SlotNb].GpkPubKeys[Slot[SlotNb].GpkObject[hKey].FileId - GPK_FIRST_KEY]),
  2187. PubKey,
  2188. sizeof(GPK_EXP_KEY)
  2189. );
  2190. RETURN (CRYPT_SUCCEED, 0);
  2191. }
  2192. /*------------------------------------------------------------------------------
  2193. ------------------------------------------------------------------------------*/
  2194. static BOOL read_gpk_objects(HCRYPTPROV hProv, BOOL IsPrivate)
  2195. {
  2196. DWORD lRet;
  2197. DWORD
  2198. dwGpkObjLen,
  2199. dwNumberofCommands,
  2200. dwLastCommandLen,
  2201. dwCommandLen,
  2202. i, j,
  2203. dwLen,
  2204. dwNb,
  2205. FirstObj;
  2206. BYTE
  2207. curId,
  2208. EmptyBuff[512];
  2209. DWORD SlotNb;
  2210. WORD offset;
  2211. ZeroMemory( EmptyBuff, sizeof(EmptyBuff) );
  2212. SlotNb = ProvCont[hProv].Slot;
  2213. BeginWait();
  2214. zap_gpk_objects( SlotNb, IsPrivate);
  2215. FirstObj = Slot[SlotNb].NbGpkObject;
  2216. /* Select Dedicated Object storage EF on GPK Card */
  2217. bSendBuffer[0] = 0x00; //CLA
  2218. bSendBuffer[1] = 0xA4; //INS
  2219. bSendBuffer[2] = 0x02; //P1
  2220. bSendBuffer[3] = 0x00; //P2
  2221. bSendBuffer[4] = 0x02; //Li
  2222. if (IsPrivate)
  2223. {
  2224. bSendBuffer[5] = HIBYTE(GPK_OBJ_PRIV_EF);
  2225. bSendBuffer[6] = LOBYTE(GPK_OBJ_PRIV_EF);
  2226. }
  2227. else
  2228. {
  2229. bSendBuffer[5] = HIBYTE(GPK_OBJ_PUB_EF);
  2230. bSendBuffer[6] = LOBYTE(GPK_OBJ_PUB_EF);
  2231. }
  2232. cbSendLength = 7;
  2233. cbRecvLength = sizeof(bRecvBuffer);
  2234. lRet = SCardTransmit( ProvCont[hProv].hCard, SCARD_PCI_T0, bSendBuffer,
  2235. cbSendLength, 0, bRecvBuffer, &cbRecvLength );
  2236. if (SCARDPROBLEM(lRet,0x61FF,0x00))
  2237. {
  2238. if (IsPrivate)
  2239. {
  2240. perso_priv (hProv, Slot[SlotNb].NbGpkObject);
  2241. }
  2242. else
  2243. {
  2244. perso_public (hProv, Slot[SlotNb].NbGpkObject);
  2245. }
  2246. RETURN (CRYPT_SUCCEED, 0);
  2247. }
  2248. /* Get Response */
  2249. bSendBuffer[0] = 0x00; //CLA
  2250. bSendBuffer[1] = 0xC0; //INS
  2251. bSendBuffer[2] = 0x00; //P1
  2252. bSendBuffer[3] = 0x00; //P2
  2253. bSendBuffer[4] = bRecvBuffer[1]; //Lo
  2254. cbSendLength = 5;
  2255. cbRecvLength = sizeof(bRecvBuffer);
  2256. lRet = SCardTransmit( ProvCont[hProv].hCard, SCARD_PCI_T0, bSendBuffer,
  2257. cbSendLength, 0, bRecvBuffer, &cbRecvLength );
  2258. if (SCARDPROBLEM(lRet,0x9000,bSendBuffer[4]))
  2259. {
  2260. RETURN (CRYPT_FAILED, SCARD_E_UNEXPECTED);
  2261. }
  2262. dwGpkObjLen = bRecvBuffer[8]*256 + bRecvBuffer[9];
  2263. if (IsNotNull(g_pbGpkObj))
  2264. {
  2265. GMEM_Free(g_pbGpkObj);
  2266. }
  2267. g_pbGpkObj = (BYTE*)GMEM_Alloc(dwGpkObjLen);
  2268. if (IsNull(g_pbGpkObj))
  2269. {
  2270. RETURN (CRYPT_FAILED, NTE_NO_MEMORY);
  2271. }
  2272. /* Read the Objects EF */
  2273. dwNumberofCommands = (dwGpkObjLen-1)/FILE_CHUNK_SIZE + 1;
  2274. dwLastCommandLen = dwGpkObjLen%FILE_CHUNK_SIZE;
  2275. if (dwLastCommandLen == 0)
  2276. {
  2277. dwLastCommandLen = FILE_CHUNK_SIZE;
  2278. }
  2279. dwCommandLen = FILE_CHUNK_SIZE;
  2280. for (i=0; i < dwNumberofCommands ; i++)
  2281. {
  2282. if (i == dwNumberofCommands - 1)
  2283. {
  2284. dwCommandLen = dwLastCommandLen;
  2285. }
  2286. /* Read FILE_CHUCK_SIZE bytes or last bytes */
  2287. bSendBuffer[0] = 0x00; //CLA
  2288. bSendBuffer[1] = 0xB0; //INS
  2289. offset = (WORD)(i * FILE_CHUNK_SIZE) / ProvCont[hProv].dataUnitSize;
  2290. bSendBuffer[2] = HIBYTE( offset );
  2291. bSendBuffer[3] = LOBYTE( offset );
  2292. bSendBuffer[4] = (BYTE) dwCommandLen; //Lo
  2293. cbSendLength = 5;
  2294. cbRecvLength = sizeof(bRecvBuffer);
  2295. lRet = SCardTransmit( ProvCont[hProv].hCard, SCARD_PCI_T0, bSendBuffer,
  2296. cbSendLength, 0, bRecvBuffer, &cbRecvLength );
  2297. if (SCARDPROBLEM(lRet,0x9000,bSendBuffer[4]))
  2298. RETURN( CRYPT_FAILED, SCARD_W_EOF );
  2299. memcpy( &g_pbGpkObj[i*FILE_CHUNK_SIZE], bRecvBuffer, cbRecvLength - 2 );
  2300. if (memcmp(bRecvBuffer, EmptyBuff, cbRecvLength -2) == 0)
  2301. break;
  2302. }
  2303. // Fill Gpk Fixed Objects structure with read Buffer
  2304. i = 0;
  2305. while (i < dwGpkObjLen)
  2306. {
  2307. // No more fixed object
  2308. if (g_pbGpkObj[i] == 0x00)
  2309. {
  2310. i++;
  2311. break;
  2312. }
  2313. if (Slot[SlotNb].NbGpkObject >= MAX_GPK_OBJ)
  2314. RETURN (CRYPT_FAILED, NTE_NO_MEMORY);
  2315. Slot[SlotNb].NbGpkObject++;
  2316. // Initalize fields
  2317. for (j = 0; j < MAX_FIELD; j++)
  2318. {
  2319. Slot[SlotNb].GpkObject[Slot[SlotNb].NbGpkObject].Field[j].bReal = TRUE;
  2320. }
  2321. // Tag
  2322. Slot[SlotNb].GpkObject[Slot[SlotNb].NbGpkObject].Tag = g_pbGpkObj[i];
  2323. i++;
  2324. if (i > dwGpkObjLen-1)
  2325. RETURN( CRYPT_FAILED, SCARD_W_EOF );
  2326. // Flags
  2327. Slot[SlotNb].GpkObject[Slot[SlotNb].NbGpkObject].Flags = (g_pbGpkObj[i]*256) + g_pbGpkObj[i+1];
  2328. i = i + 2;
  2329. // IsPrivate
  2330. Slot[SlotNb].GpkObject[Slot[SlotNb].NbGpkObject].IsPrivate = IsPrivate;
  2331. // IsCreated
  2332. if (Slot[SlotNb].GpkObject[Slot[SlotNb].NbGpkObject].Tag >= TAG_CERTIFICATE)
  2333. {
  2334. Slot[SlotNb].GpkObject[Slot[SlotNb].NbGpkObject].IsCreated = TRUE;
  2335. }
  2336. else if ((Slot[SlotNb].GpkObject[Slot[SlotNb].NbGpkObject].Tag <= TAG_DSA_PRIVATE)
  2337. &&(Slot[SlotNb].GpkObject[Slot[SlotNb].NbGpkObject].Flags & FLAG_KEY_TYPE)
  2338. )
  2339. {
  2340. Slot[SlotNb].GpkObject[Slot[SlotNb].NbGpkObject].IsCreated = TRUE;
  2341. }
  2342. else
  2343. {
  2344. Slot[SlotNb].GpkObject[Slot[SlotNb].NbGpkObject].IsCreated = FALSE;
  2345. }
  2346. // Object Id ?
  2347. if ((Slot[SlotNb].GpkObject[Slot[SlotNb].NbGpkObject].Flags & 0x0FFF) != 0x0000)
  2348. {
  2349. if (i > dwGpkObjLen)
  2350. {
  2351. RETURN (CRYPT_FAILED, SCARD_W_EOF);
  2352. }
  2353. Slot[SlotNb].GpkObject[Slot[SlotNb].NbGpkObject].ObjId = g_pbGpkObj[i];
  2354. i++;
  2355. }
  2356. else
  2357. {
  2358. Slot[SlotNb].GpkObject[Slot[SlotNb].NbGpkObject].ObjId = 0xFF;
  2359. }
  2360. // File Id ?
  2361. if (Slot[SlotNb].GpkObject[Slot[SlotNb].NbGpkObject].Tag <= TAG_CERTIFICATE)
  2362. {
  2363. if (i > dwGpkObjLen)
  2364. {
  2365. RETURN (CRYPT_FAILED, SCARD_W_EOF);
  2366. }
  2367. Slot[SlotNb].GpkObject[Slot[SlotNb].NbGpkObject].FileId = g_pbGpkObj[i];
  2368. i++;
  2369. if (Slot[SlotNb].GpkObject[Slot[SlotNb].NbGpkObject].IsCreated)
  2370. {
  2371. // If the object has been created, the corresponding key file is used
  2372. Slot[SlotNb].UseFile[ Slot[SlotNb].GpkObject[Slot[SlotNb].NbGpkObject].FileId - GPK_FIRST_KEY] = TRUE;
  2373. }
  2374. }
  2375. }
  2376. // Fill Gpk Variable Objects structure with read Buffer
  2377. curId = 0;
  2378. dwNb = 0;
  2379. while (i < dwGpkObjLen)
  2380. {
  2381. if (g_pbGpkObj[i] == 0xFF)
  2382. {
  2383. break;
  2384. }
  2385. // Field length
  2386. dwLen = 0;
  2387. if (g_pbGpkObj[i] & 0x80)
  2388. {
  2389. dwLen = (g_pbGpkObj[i] & 0x7F) * 256;
  2390. i++;
  2391. }
  2392. if (i > dwGpkObjLen)
  2393. {
  2394. RETURN (CRYPT_FAILED, SCARD_W_EOF);
  2395. }
  2396. dwLen = dwLen + g_pbGpkObj[i];
  2397. i++;
  2398. /* Object Id for retrieve object number */
  2399. if (i > dwGpkObjLen)
  2400. {
  2401. RETURN (CRYPT_FAILED, SCARD_W_EOF);
  2402. }
  2403. curId = g_pbGpkObj[i];
  2404. i++;
  2405. dwNb = get_gpk_object_nb(hProv, curId, IsPrivate);
  2406. j = calc_gpk_field(hProv, (BYTE)dwNb);
  2407. /* Object Field length */
  2408. Slot[SlotNb].GpkObject[dwNb].Field[j].Len = (WORD)dwLen;
  2409. /* Object Field value */
  2410. if (dwLen > 0)
  2411. {
  2412. if ((i + dwLen - 1)> dwGpkObjLen)
  2413. {
  2414. RETURN (CRYPT_FAILED, SCARD_W_EOF);
  2415. }
  2416. Slot[SlotNb]. GpkObject[dwNb].Field[j].pValue = (BYTE*)GMEM_Alloc(dwLen);
  2417. if (IsNull(Slot[SlotNb].GpkObject[dwNb].Field[j].pValue))
  2418. {
  2419. RETURN (CRYPT_FAILED, NTE_NO_MEMORY);
  2420. }
  2421. memcpy(Slot[SlotNb].GpkObject[dwNb].Field[j].pValue, &g_pbGpkObj[i], dwLen);
  2422. i = i + dwLen;
  2423. Slot[SlotNb].GpkObject[dwNb].Field[j].bReal = TRUE;
  2424. }
  2425. else
  2426. {
  2427. Slot[SlotNb].GpkObject[dwNb].Field[j].bReal = FALSE;
  2428. }
  2429. }
  2430. /* Read Extra objects attributes */
  2431. for (i = FirstObj+1; i <= Slot[SlotNb].NbGpkObject; i++)
  2432. {
  2433. /* RSA Public or Private keys */
  2434. if ((Slot[SlotNb].GpkObject[i].Tag == TAG_RSA_PUBLIC)
  2435. ||(Slot[SlotNb].GpkObject[i].Tag == TAG_RSA_PRIVATE)
  2436. )
  2437. {
  2438. /* Modulus and Public Exponant */
  2439. if (!read_gpk_pub_key(hProv, i, &(Slot[SlotNb].GpkObject[i].PubKey)))
  2440. return CRYPT_FAILED;
  2441. //if ((Slot[SlotNb].GpkObject[i].Flags & FLAG_EXCHANGE) == FLAG_EXCHANGE)
  2442. //{
  2443. // Slot[SlotNb].GpkObject[i].hKeyBase = ProvCont[hProv].hRSAKEK;
  2444. //}
  2445. //else
  2446. //{
  2447. // Slot[SlotNb].GpkObject[i].hKeyBase = ProvCont[hProv].hRSASign;
  2448. //}
  2449. }
  2450. /* X509 Certificate */
  2451. if (Slot[SlotNb].GpkObject[i].Tag == TAG_CERTIFICATE)
  2452. {
  2453. /* Uncompress Certificate Value if necessary */
  2454. if ((Slot[SlotNb].GpkObject[i].Field[POS_VALUE].Len > 0)
  2455. &&(Slot[SlotNb].GpkObject[i].Field[POS_VALUE].pValue[0] != 0x30)
  2456. )
  2457. {
  2458. BLOC InpBlock, OutBlock;
  2459. InpBlock.usLen = (USHORT)Slot[SlotNb].GpkObject[i].Field[POS_VALUE].Len;
  2460. InpBlock.pData = Slot[SlotNb].GpkObject[i].Field[POS_VALUE].pValue;
  2461. OutBlock.usLen = 0;
  2462. OutBlock.pData = 0;
  2463. if (CC_Uncompress(&InpBlock, &OutBlock) != RV_SUCCESS)
  2464. {
  2465. RETURN(CRYPT_FAILED, SCARD_E_CERTIFICATE_UNAVAILABLE);
  2466. }
  2467. OutBlock.pData = (BYTE*)GMEM_Alloc (OutBlock.usLen);
  2468. if (IsNull(OutBlock.pData))
  2469. {
  2470. RETURN(CRYPT_FAILED, NTE_NO_MEMORY);
  2471. }
  2472. if (CC_Uncompress(&InpBlock, &OutBlock) != RV_SUCCESS)
  2473. {
  2474. GMEM_Free (OutBlock.pData);
  2475. RETURN(CRYPT_FAILED, SCARD_E_CERTIFICATE_UNAVAILABLE);
  2476. }
  2477. GMEM_Free(Slot[SlotNb].GpkObject[i].Field[POS_VALUE].pValue);
  2478. Slot[SlotNb].GpkObject[i].Field[POS_VALUE].pValue = (BYTE*)GMEM_Alloc(OutBlock.usLen);
  2479. if (IsNull(Slot[SlotNb].GpkObject[i].Field[POS_VALUE].pValue))
  2480. {
  2481. GMEM_Free (OutBlock.pData);
  2482. RETURN(CRYPT_FAILED, NTE_NO_MEMORY);
  2483. }
  2484. memcpy(Slot[SlotNb].GpkObject[i].Field[POS_VALUE].pValue,
  2485. OutBlock.pData,
  2486. OutBlock.usLen
  2487. );
  2488. Slot[SlotNb].GpkObject[i].Field[POS_VALUE].Len = OutBlock.usLen;
  2489. GMEM_Free(OutBlock.pData);
  2490. }
  2491. /* Associated RSA key */
  2492. if (Slot[SlotNb].GpkObject[i].FileId != 0)
  2493. {
  2494. if (!read_gpk_pub_key(hProv, i, &(Slot[SlotNb].GpkObject[i].PubKey)))
  2495. return CRYPT_FAILED;
  2496. }
  2497. }
  2498. }
  2499. RETURN (CRYPT_SUCCEED, 0);
  2500. }
  2501. /*------------------------------------------------------------------------------
  2502. ------------------------------------------------------------------------------*/
  2503. static BOOL prepare_write_gpk_objects(HCRYPTPROV hProv, BYTE *pbGpkObj, DWORD *dwGpkObjLen, BOOL IsPrivate)
  2504. {
  2505. DWORD lRet;
  2506. DWORD
  2507. i, j, dwNb;
  2508. WORD
  2509. FieldLen;
  2510. BYTE
  2511. ObjId;
  2512. BLOC
  2513. InpBlock,
  2514. OutBlock;
  2515. DWORD SlotNb;
  2516. DWORD FileLen;
  2517. SlotNb = ProvCont[hProv].Slot;
  2518. i = 0;
  2519. /* Remap Internal GPK ObjId */
  2520. ObjId = 0;
  2521. for (dwNb = 1; dwNb <= Slot[SlotNb].NbGpkObject; dwNb++)
  2522. {
  2523. if (((Slot[SlotNb].GpkObject[dwNb].Flags & 0x0FFF) != 0x0000) &&
  2524. (Slot[SlotNb].GpkObject[dwNb].IsPrivate == IsPrivate)
  2525. )
  2526. {
  2527. Slot[SlotNb].GpkObject[dwNb].ObjId = ObjId;
  2528. ObjId++;
  2529. }
  2530. }
  2531. /* Fixed Object part */
  2532. for (dwNb = 1; dwNb <= Slot[SlotNb].NbGpkObject; dwNb++)
  2533. {
  2534. if (Slot[SlotNb].GpkObject[dwNb].IsPrivate != IsPrivate)
  2535. {
  2536. continue;
  2537. }
  2538. /* Tag */
  2539. if (i > *dwGpkObjLen)
  2540. {
  2541. *dwGpkObjLen = 0;
  2542. RETURN (CRYPT_FAILED, SCARD_E_WRITE_TOO_MANY);
  2543. }
  2544. pbGpkObj[i] = Slot[SlotNb].GpkObject[dwNb].Tag;
  2545. i++;
  2546. /* Flag */
  2547. if (i > *dwGpkObjLen)
  2548. {
  2549. *dwGpkObjLen = 0;
  2550. RETURN (CRYPT_FAILED, SCARD_E_WRITE_TOO_MANY);
  2551. }
  2552. pbGpkObj[i] = HIBYTE(Slot[SlotNb].GpkObject[dwNb].Flags);
  2553. i++;
  2554. if (i > *dwGpkObjLen)
  2555. {
  2556. *dwGpkObjLen = 0;
  2557. RETURN (CRYPT_FAILED, SCARD_E_WRITE_TOO_MANY);
  2558. }
  2559. pbGpkObj[i] = LOBYTE(Slot[SlotNb].GpkObject[dwNb].Flags);
  2560. if (i > *dwGpkObjLen)
  2561. {
  2562. *dwGpkObjLen = 0;
  2563. RETURN (CRYPT_FAILED, SCARD_E_WRITE_TOO_MANY);
  2564. }
  2565. i++;
  2566. /* Object Id ? */
  2567. if (((Slot[SlotNb].GpkObject[dwNb].Flags & 0x0FFF) != 0x0000) &&
  2568. (Slot[SlotNb].GpkObject[dwNb].IsPrivate == IsPrivate)
  2569. )
  2570. {
  2571. if (i > *dwGpkObjLen)
  2572. {
  2573. *dwGpkObjLen = 0;
  2574. RETURN (CRYPT_FAILED, SCARD_E_WRITE_TOO_MANY);
  2575. }
  2576. pbGpkObj[i] = Slot[SlotNb].GpkObject[dwNb].ObjId;
  2577. i++;
  2578. }
  2579. /* File Id ? */
  2580. if (Slot[SlotNb].GpkObject[dwNb].Tag <= TAG_CERTIFICATE)
  2581. {
  2582. if (i > *dwGpkObjLen)
  2583. {
  2584. *dwGpkObjLen = 0;
  2585. RETURN (CRYPT_FAILED, SCARD_E_WRITE_TOO_MANY);
  2586. }
  2587. pbGpkObj[i] = Slot[SlotNb].GpkObject[dwNb].FileId;
  2588. i++;
  2589. }
  2590. }
  2591. if (i > *dwGpkObjLen)
  2592. {
  2593. *dwGpkObjLen = 0;
  2594. RETURN (CRYPT_FAILED, SCARD_E_WRITE_TOO_MANY);
  2595. }
  2596. pbGpkObj[i] = 0x00;
  2597. i++;
  2598. /* Variable Object part */
  2599. for (dwNb = 1; dwNb <= Slot[SlotNb].NbGpkObject; dwNb++)
  2600. {
  2601. if (Slot[SlotNb].GpkObject[dwNb].IsPrivate != IsPrivate)
  2602. {
  2603. continue;
  2604. }
  2605. for (j = 0; j < MAX_FIELD; j++)
  2606. {
  2607. if (( (Slot[SlotNb].GpkObject[dwNb].Field[j].Len != 0) &&
  2608. (Slot[SlotNb].GpkObject[dwNb].Field[j].bReal)
  2609. ) ||
  2610. ( (Slot[SlotNb].GpkObject[dwNb].Field[j].Len == 0) &&
  2611. (!Slot[SlotNb].GpkObject[dwNb].Field[j].bReal)
  2612. )
  2613. )
  2614. {
  2615. OutBlock.usLen = 0;
  2616. /* Field Length */
  2617. if (Slot[SlotNb].GpkObject[dwNb].Field[j].bReal)
  2618. {
  2619. FieldLen = Slot[SlotNb].GpkObject[dwNb].Field[j].Len;
  2620. /* Try to Compress Certificate Value */
  2621. if ((j == POS_VALUE)
  2622. &&(Slot[SlotNb].GpkObject[dwNb].Tag == TAG_CERTIFICATE)
  2623. &&(Slot[SlotNb].GpkObject[dwNb].Field[POS_VALUE].Len > 0)
  2624. &&(Slot[SlotNb].GpkObject[dwNb].Field[POS_VALUE].pValue[0] == 0x30)
  2625. )
  2626. {
  2627. InpBlock.usLen = (USHORT)Slot[SlotNb].GpkObject[dwNb].Field[POS_VALUE].Len;
  2628. InpBlock.pData = Slot[SlotNb].GpkObject[dwNb].Field[POS_VALUE].pValue;
  2629. OutBlock.usLen = InpBlock.usLen+1;
  2630. OutBlock.pData = (BYTE*)GMEM_Alloc(OutBlock.usLen);
  2631. if (IsNull(OutBlock.pData))
  2632. {
  2633. RETURN( CRYPT_FAILED, NTE_NO_MEMORY );
  2634. }
  2635. if (CC_Compress(&InpBlock, &OutBlock) != RV_SUCCESS)
  2636. {
  2637. OutBlock.usLen = 0;
  2638. }
  2639. else
  2640. {
  2641. FieldLen = OutBlock.usLen;
  2642. }
  2643. }
  2644. if (FieldLen > 0x7F)
  2645. {
  2646. if (i > *dwGpkObjLen)
  2647. {
  2648. GMEM_Free(OutBlock.pData);
  2649. *dwGpkObjLen = 0;
  2650. RETURN (CRYPT_FAILED, SCARD_E_WRITE_TOO_MANY);
  2651. }
  2652. pbGpkObj[i] = HIBYTE(FieldLen) | 0x80;
  2653. i++;
  2654. }
  2655. if (i > *dwGpkObjLen)
  2656. {
  2657. GMEM_Free(OutBlock.pData);
  2658. *dwGpkObjLen = 0;
  2659. RETURN (CRYPT_FAILED, SCARD_E_WRITE_TOO_MANY);
  2660. }
  2661. pbGpkObj[i] = LOBYTE(FieldLen);
  2662. i++;
  2663. }
  2664. else
  2665. {
  2666. if (i > *dwGpkObjLen)
  2667. {
  2668. GMEM_Free(OutBlock.pData);
  2669. *dwGpkObjLen = 0;
  2670. RETURN (CRYPT_FAILED, SCARD_E_WRITE_TOO_MANY);
  2671. }
  2672. pbGpkObj[i] = 0x00;
  2673. i++;
  2674. }
  2675. /* Object Id */
  2676. if (i > *dwGpkObjLen)
  2677. {
  2678. GMEM_Free(OutBlock.pData);
  2679. *dwGpkObjLen = 0;
  2680. RETURN (CRYPT_FAILED, SCARD_E_WRITE_TOO_MANY);
  2681. }
  2682. pbGpkObj[i] = Slot[SlotNb].GpkObject[dwNb].ObjId;
  2683. i++;
  2684. /* Field Value */
  2685. if (Slot[SlotNb].GpkObject[dwNb].Field[j].bReal)
  2686. {
  2687. if ((j == POS_VALUE)
  2688. &&(Slot[SlotNb].GpkObject[dwNb].Tag == TAG_CERTIFICATE)
  2689. &&(OutBlock.usLen > 0)
  2690. )
  2691. {
  2692. if ((i+OutBlock.usLen-1) > *dwGpkObjLen)
  2693. {
  2694. GMEM_Free(OutBlock.pData);
  2695. *dwGpkObjLen = 0;
  2696. RETURN (CRYPT_FAILED, SCARD_E_WRITE_TOO_MANY);
  2697. }
  2698. memcpy(&pbGpkObj[i],
  2699. OutBlock.pData,
  2700. OutBlock.usLen
  2701. );
  2702. i = i + OutBlock.usLen;
  2703. GMEM_Free(OutBlock.pData);
  2704. OutBlock.usLen = 0;
  2705. }
  2706. else
  2707. {
  2708. if ((i+Slot[SlotNb].GpkObject[dwNb].Field[j].Len-1) > *dwGpkObjLen)
  2709. {
  2710. *dwGpkObjLen = 0;
  2711. RETURN (CRYPT_FAILED, SCARD_E_WRITE_TOO_MANY);
  2712. }
  2713. memcpy(&pbGpkObj[i],
  2714. Slot[SlotNb].GpkObject[dwNb].Field[j].pValue,
  2715. Slot[SlotNb].GpkObject[dwNb].Field[j].Len
  2716. );
  2717. i = i + Slot[SlotNb].GpkObject[dwNb].Field[j].Len;
  2718. }
  2719. }
  2720. }
  2721. }
  2722. }
  2723. if (i > *dwGpkObjLen)
  2724. {
  2725. RETURN (CRYPT_FAILED, SCARD_E_WRITE_TOO_MANY);
  2726. }
  2727. pbGpkObj[i] = 0xFF;
  2728. *dwGpkObjLen = i+1;
  2729. /* Select Dedicated Object storage EF on GPK Card */
  2730. bSendBuffer[0] = 0x00; //CLA
  2731. bSendBuffer[1] = 0xA4; //INS
  2732. bSendBuffer[2] = 0x02; //P1
  2733. bSendBuffer[3] = 0x00; //P2
  2734. bSendBuffer[4] = 0x02; //Li
  2735. if (IsPrivate)
  2736. {
  2737. bSendBuffer[5] = HIBYTE(GPK_OBJ_PRIV_EF);
  2738. bSendBuffer[6] = LOBYTE(GPK_OBJ_PRIV_EF);
  2739. }
  2740. else
  2741. {
  2742. bSendBuffer[5] = HIBYTE(GPK_OBJ_PUB_EF);
  2743. bSendBuffer[6] = LOBYTE(GPK_OBJ_PUB_EF);
  2744. }
  2745. cbSendLength = 7;
  2746. cbRecvLength = sizeof(bRecvBuffer);
  2747. lRet = SCardTransmit( ProvCont[hProv].hCard, SCARD_PCI_T0, bSendBuffer,
  2748. cbSendLength, 0, bRecvBuffer, &cbRecvLength );
  2749. if (SCARDPROBLEM(lRet,0x61FF,0x00))
  2750. RETURN( CRYPT_FAILED, SCARD_E_FILE_NOT_FOUND );
  2751. /* Get Response */
  2752. bSendBuffer[0] = 0x00; //CLA
  2753. bSendBuffer[1] = 0xC0; //INS
  2754. bSendBuffer[2] = 0x00; //P1
  2755. bSendBuffer[3] = 0x00; //P2
  2756. bSendBuffer[4] = bRecvBuffer[1]; //Lo
  2757. cbSendLength = 5;
  2758. cbRecvLength = sizeof(bRecvBuffer);
  2759. lRet = SCardTransmit( ProvCont[hProv].hCard, SCARD_PCI_T0, bSendBuffer,
  2760. cbSendLength, 0, bRecvBuffer, &cbRecvLength );
  2761. if (SCARDPROBLEM(lRet,0x9000,bSendBuffer[4]))
  2762. RETURN( CRYPT_FAILED, SCARD_E_UNEXPECTED );
  2763. FileLen = bRecvBuffer[8]*256 + bRecvBuffer[9];
  2764. if (*dwGpkObjLen < FileLen)
  2765. {
  2766. RETURN( CRYPT_SUCCEED, 0 );
  2767. }
  2768. else
  2769. {
  2770. *dwGpkObjLen = 0;
  2771. RETURN( CRYPT_FAILED, SCARD_E_WRITE_TOO_MANY );
  2772. }
  2773. }
  2774. /*------------------------------------------------------------------------------
  2775. ------------------------------------------------------------------------------*/
  2776. static BOOL write_gpk_objects(HCRYPTPROV hProv, BYTE *pbGpkObj, DWORD dwGpkObjLen, BOOL IsErase, BOOL IsPrivate)
  2777. {
  2778. DWORD lRet,
  2779. i,
  2780. dwCommandLen,
  2781. dwNumberofCommands,
  2782. dwLastCommandLen,
  2783. FileLen;
  2784. DWORD SlotNb;
  2785. BYTE EmptyBuff[512];
  2786. WORD offset;
  2787. SlotNb = ProvCont[hProv].Slot;
  2788. ZeroMemory( EmptyBuff, sizeof(EmptyBuff) );
  2789. BeginWait();
  2790. // TT - 17/10/2000 - Update the timestamps
  2791. Slot_Description* pSlot = &Slot[SlotNb];
  2792. BYTE& refTimestamp = (IsPrivate) ? pSlot->m_TSPrivate : pSlot->m_TSPublic;
  2793. ++refTimestamp;
  2794. if (0 == refTimestamp)
  2795. refTimestamp = 1;
  2796. if (!WriteTimestamps( hProv, pSlot->m_TSPublic, pSlot->m_TSPrivate, pSlot->m_TSPIN ))
  2797. return CRYPT_FAILED;
  2798. /* Select Dedicated Object storage EF on GPK Card */
  2799. bSendBuffer[0] = 0x00; //CLA
  2800. bSendBuffer[1] = 0xA4; //INS
  2801. bSendBuffer[2] = 0x02; //P1
  2802. bSendBuffer[3] = 0x00; //P2
  2803. bSendBuffer[4] = 0x02; //Li
  2804. if (IsPrivate)
  2805. {
  2806. bSendBuffer[5] = HIBYTE(GPK_OBJ_PRIV_EF);
  2807. bSendBuffer[6] = LOBYTE(GPK_OBJ_PRIV_EF);
  2808. }
  2809. else
  2810. {
  2811. bSendBuffer[5] = HIBYTE(GPK_OBJ_PUB_EF);
  2812. bSendBuffer[6] = LOBYTE(GPK_OBJ_PUB_EF);
  2813. }
  2814. cbSendLength = 7;
  2815. cbRecvLength = sizeof(bRecvBuffer);
  2816. lRet = SCardTransmit( ProvCont[hProv].hCard, SCARD_PCI_T0, bSendBuffer,
  2817. cbSendLength, 0, bRecvBuffer, &cbRecvLength );
  2818. if (SCARDPROBLEM(lRet,0x61FF,0x00))
  2819. RETURN( CRYPT_FAILED, SCARD_E_FILE_NOT_FOUND );
  2820. /* Get Response */
  2821. bSendBuffer[0] = 0x00; //CLA
  2822. bSendBuffer[1] = 0xC0; //INS
  2823. bSendBuffer[2] = 0x00; //P1
  2824. bSendBuffer[3] = 0x00; //P2
  2825. bSendBuffer[4] = bRecvBuffer[1]; //Lo
  2826. cbSendLength = 5;
  2827. cbRecvLength = sizeof(bRecvBuffer);
  2828. lRet = SCardTransmit( ProvCont[hProv].hCard, SCARD_PCI_T0, bSendBuffer,
  2829. cbSendLength, 0, bRecvBuffer, &cbRecvLength );
  2830. if (SCARDPROBLEM(lRet,0x9000,bSendBuffer[4]))
  2831. {
  2832. RETURN (CRYPT_FAILED, SCARD_E_UNEXPECTED);
  2833. }
  2834. FileLen = bRecvBuffer[8]*256 + bRecvBuffer[9];
  2835. /* Write the Objects EF */
  2836. dwNumberofCommands = (dwGpkObjLen-1)/FILE_CHUNK_SIZE + 1;
  2837. dwLastCommandLen = dwGpkObjLen%FILE_CHUNK_SIZE;
  2838. if (dwLastCommandLen == 0)
  2839. {
  2840. dwLastCommandLen = FILE_CHUNK_SIZE;
  2841. }
  2842. dwCommandLen = FILE_CHUNK_SIZE;
  2843. for (i=0; i < dwNumberofCommands ; i++)
  2844. {
  2845. if (i == dwNumberofCommands - 1)
  2846. {
  2847. dwCommandLen = dwLastCommandLen;
  2848. }
  2849. // Write FILE_CHUCK_SIZE bytes or last bytes
  2850. bSendBuffer[0] = 0x00; //CLA
  2851. bSendBuffer[1] = 0xD6; //INS
  2852. offset = (WORD)(i * FILE_CHUNK_SIZE) / ProvCont[hProv].dataUnitSize;
  2853. bSendBuffer[2] = HIBYTE( offset );
  2854. bSendBuffer[3] = LOBYTE( offset );
  2855. bSendBuffer[4] = (BYTE)dwCommandLen; //Li
  2856. memcpy( &bSendBuffer[5], &pbGpkObj[i*FILE_CHUNK_SIZE], dwCommandLen );
  2857. cbSendLength = 5 + dwCommandLen;
  2858. cbRecvLength = sizeof(bRecvBuffer);
  2859. lRet = SCardTransmit( ProvCont[hProv].hCard, SCARD_PCI_T0, bSendBuffer,
  2860. cbSendLength, 0, bRecvBuffer, &cbRecvLength );
  2861. if (SCARDPROBLEM(lRet,0x9000,0x00))
  2862. {
  2863. RETURN (CRYPT_FAILED, SCARD_E_WRITE_TOO_MANY);
  2864. }
  2865. }
  2866. if (IsErase)
  2867. {
  2868. // Align the info on a word (4 bytes) boundary
  2869. if ((dwGpkObjLen % 4) != 0)
  2870. dwGpkObjLen = dwGpkObjLen + 4 - (dwGpkObjLen % 4);
  2871. dwNumberofCommands = ((FileLen - dwGpkObjLen)-1)/FILE_CHUNK_SIZE + 1;
  2872. dwLastCommandLen = (FileLen - dwGpkObjLen)%FILE_CHUNK_SIZE;
  2873. if (dwLastCommandLen == 0)
  2874. {
  2875. dwLastCommandLen = FILE_CHUNK_SIZE;
  2876. }
  2877. dwCommandLen = FILE_CHUNK_SIZE;
  2878. for (i=0; i < dwNumberofCommands ; i++)
  2879. {
  2880. if (i == dwNumberofCommands - 1)
  2881. {
  2882. dwCommandLen = dwLastCommandLen;
  2883. }
  2884. // Write FILE_CHUCK_SIZE bytes or last bytes
  2885. bSendBuffer[0] = 0x00; //CLA
  2886. bSendBuffer[1] = 0xD6; //INS
  2887. offset = (WORD)(i * FILE_CHUNK_SIZE + dwGpkObjLen) / ProvCont[hProv].dataUnitSize;
  2888. bSendBuffer[2] = HIBYTE( offset );
  2889. bSendBuffer[3] = LOBYTE( offset );
  2890. bSendBuffer[4] = (BYTE)dwCommandLen; //Li
  2891. memcpy(&bSendBuffer[5], EmptyBuff, dwCommandLen );
  2892. cbSendLength = 5 + dwCommandLen;
  2893. cbRecvLength = sizeof(bRecvBuffer);
  2894. lRet = SCardTransmit( ProvCont[hProv].hCard, SCARD_PCI_T0, bSendBuffer,
  2895. cbSendLength, 0, bRecvBuffer, &cbRecvLength );
  2896. if (SCARDPROBLEM(lRet,0x9000,0x00))
  2897. {
  2898. RETURN (CRYPT_FAILED, SCARD_E_WRITE_TOO_MANY);
  2899. }
  2900. }
  2901. }
  2902. RETURN (CRYPT_SUCCEED, 0);
  2903. }
  2904. /*------------------------------------------------------------------------------
  2905. ------------------------------------------------------------------------------*/
  2906. static DWORD find_tmp_free(void)
  2907. {
  2908. DWORD i;
  2909. TMP_OBJ* aTemp;
  2910. for (i = 1; i <= MAX_TMP_KEY; i++)
  2911. {
  2912. if (TmpObject[i].hKeyBase == 0x00)
  2913. {
  2914. return (i);
  2915. }
  2916. }
  2917. // realloc TmpObject
  2918. // use aTemp pointer in case of failure
  2919. aTemp = (TMP_OBJ*)GMEM_ReAlloc( TmpObject,
  2920. (MAX_TMP_KEY + REALLOC_SIZE + 1)*sizeof(TMP_OBJ));
  2921. if (IsNotNull(aTemp))
  2922. {
  2923. TmpObject = aTemp;
  2924. MAX_TMP_KEY += REALLOC_SIZE;
  2925. return (MAX_TMP_KEY - REALLOC_SIZE + 1);
  2926. }
  2927. return (0);
  2928. }
  2929. /*------------------------------------------------------------------------------
  2930. ------------------------------------------------------------------------------*/
  2931. static BOOL Context_exist(HCRYPTPROV hProv)
  2932. {
  2933. if ((hProv > 0) && (hProv <= MAX_CONTEXT) && (ProvCont[hProv].hProv != 0))
  2934. return (TRUE);
  2935. else
  2936. return (FALSE);
  2937. }
  2938. /*------------------------------------------------------------------------------
  2939. ------------------------------------------------------------------------------*/
  2940. static BOOL hash_exist(HCRYPTHASH hHash, HCRYPTPROV hProv)
  2941. {
  2942. if ((hHash > 0) && (hHash <= MAX_TMP_HASH) &&
  2943. (hHashGpk[hHash].hHashBase != 0) && (hHashGpk[hHash].hProv == hProv))
  2944. return (TRUE);
  2945. else
  2946. if (hHash == 0) // Special case. The NULL Handle exits
  2947. return (TRUE); // It corresponds to the NULL Handle in the RSA Base
  2948. else
  2949. return (FALSE);
  2950. }
  2951. /*------------------------------------------------------------------------------
  2952. ------------------------------------------------------------------------------*/
  2953. static BOOL key_exist(HCRYPTKEY hKey, HCRYPTPROV hProv)
  2954. {
  2955. if ((hKey > 0) && (hKey <= MAX_TMP_KEY) &&
  2956. (TmpObject[hKey].hKeyBase != 0) && (TmpObject[hKey].hProv == hProv))
  2957. return (TRUE);
  2958. else
  2959. return (FALSE);
  2960. }
  2961. /*------------------------------------------------------------------------------
  2962. ------------------------------------------------------------------------------*/
  2963. static DWORD find_context_free(void)
  2964. {
  2965. DWORD i;
  2966. Prov_Context* aTemp;
  2967. for (i = 1; i <= MAX_CONTEXT; i++)
  2968. {
  2969. if (ProvCont[i].hProv == 0x00)
  2970. {
  2971. return (i);
  2972. }
  2973. }
  2974. // realloc TmpObject
  2975. // use aTemp pointer in case of failure
  2976. aTemp = (Prov_Context*)GMEM_ReAlloc(ProvCont,
  2977. (MAX_CONTEXT + REALLOC_SIZE + 1)*sizeof(Prov_Context));
  2978. if (IsNotNull(aTemp))
  2979. {
  2980. ProvCont = aTemp;
  2981. MAX_CONTEXT += REALLOC_SIZE;
  2982. return (MAX_CONTEXT - REALLOC_SIZE + 1);
  2983. }
  2984. return (0);
  2985. }
  2986. /*------------------------------------------------------------------------------
  2987. ------------------------------------------------------------------------------*/
  2988. static DWORD find_hash_free(void)
  2989. {
  2990. DWORD i;
  2991. TMP_HASH* aTemp;
  2992. for (i = 1; i <= MAX_TMP_HASH; i++)
  2993. {
  2994. if (hHashGpk[i].hHashBase == 0x00)
  2995. {
  2996. return (i);
  2997. }
  2998. }
  2999. // realloc TmpObject
  3000. // use aTemp pointer in case of failure
  3001. aTemp = (TMP_HASH*)GMEM_ReAlloc(hHashGpk,
  3002. (MAX_TMP_HASH + REALLOC_SIZE + 1)*sizeof(TMP_HASH));
  3003. if (IsNotNull(aTemp))
  3004. {
  3005. hHashGpk = aTemp;
  3006. MAX_TMP_HASH += REALLOC_SIZE;
  3007. return (MAX_TMP_HASH - REALLOC_SIZE + 1);
  3008. }
  3009. return (0);
  3010. }
  3011. static BOOL find_reader( DWORD *SlotNb, const PTCHAR szReaderName )
  3012. {
  3013. int i, j;
  3014. DWORD dwReturnSlot = (DWORD)(-1);
  3015. DWORD cchReaders, dwSts;
  3016. LPCTSTR mszReaders = 0, szRdr;
  3017. BOOL fFreedSlot;
  3018. for (;;)
  3019. {
  3020. //
  3021. // Look for an existing slot with this reader name.
  3022. //
  3023. for (i = 0; i < MAX_SLOT; i++)
  3024. {
  3025. if (0 == _tcsnicmp( Slot[i].szReaderName, szReaderName, sizeof(Slot[i].szReaderName) / sizeof(TCHAR)))
  3026. {
  3027. dwReturnSlot = i;
  3028. break;
  3029. }
  3030. }
  3031. if ((DWORD)(-1) != dwReturnSlot)
  3032. break; // All Done!
  3033. //
  3034. // Look for an empty reader slot.
  3035. //
  3036. for (i = 0; i < MAX_SLOT; i++)
  3037. {
  3038. if (IsNullStr(Slot[i].szReaderName))
  3039. {
  3040. _tcsncpy(Slot[i].szReaderName, szReaderName, (sizeof(Slot[i].szReaderName) / sizeof(TCHAR)) - 1);
  3041. Slot[i].szReaderName[(sizeof(Slot[i].szReaderName)/sizeof(TCHAR))-1]=0;
  3042. dwReturnSlot = i;
  3043. break;
  3044. }
  3045. }
  3046. if ((DWORD)(-1) != dwReturnSlot)
  3047. break; // All Done!
  3048. //
  3049. // Look for an existing unused reader, and replace it.
  3050. //
  3051. for (i = 0; i < MAX_SLOT; i++)
  3052. {
  3053. if (0 == Slot[i].ContextCount)
  3054. {
  3055. _tcsncpy( Slot[i].szReaderName, szReaderName, (sizeof(Slot[i].szReaderName) / sizeof(TCHAR)) - 1);
  3056. Slot[i].szReaderName[(sizeof(Slot[i].szReaderName)/sizeof(TCHAR))-1]=0;
  3057. dwReturnSlot = i;
  3058. break;
  3059. }
  3060. }
  3061. if ((DWORD)(-1) != dwReturnSlot)
  3062. break; // All Done!
  3063. //
  3064. // Eliminate any duplicate entries.
  3065. //
  3066. fFreedSlot = FALSE;
  3067. for (i = 0; i < MAX_SLOT; i++)
  3068. {
  3069. if (0 != *Slot[i].szReaderName)
  3070. {
  3071. for (j = i + 1; j < MAX_SLOT; j++)
  3072. {
  3073. if (0 == _tcsnicmp(Slot[i].szReaderName, Slot[j].szReaderName, sizeof(Slot[i].szReaderName) / sizeof(TCHAR)))
  3074. {
  3075. ZeroMemory(&Slot[j], sizeof(Slot_Description));
  3076. fFreedSlot = TRUE;
  3077. }
  3078. }
  3079. }
  3080. }
  3081. if (fFreedSlot)
  3082. continue;
  3083. //
  3084. // Make sure all the entries are valid.
  3085. //
  3086. cchReaders = SCARD_AUTOALLOCATE;
  3087. fFreedSlot = FALSE;
  3088. assert(0 != hCardContext);
  3089. assert(0 == mszReaders);
  3090. dwSts = SCardListReaders( hCardContext, 0, (LPTSTR)&mszReaders, &cchReaders );
  3091. if (SCARD_S_SUCCESS != dwSts)
  3092. goto ErrorExit;
  3093. for (i = 0; i < MAX_SLOT; i++)
  3094. {
  3095. for (szRdr = mszReaders; 0 != *szRdr; szRdr += lstrlen(szRdr) + 1)
  3096. {
  3097. if (0 == _tcsnicmp(szRdr, Slot[i].szReaderName, sizeof(Slot[i].szReaderName) / sizeof(TCHAR)))
  3098. break;
  3099. }
  3100. if (0 == *szRdr)
  3101. {
  3102. ZeroMemory(&Slot[i], sizeof(Slot_Description));
  3103. fFreedSlot = TRUE;
  3104. }
  3105. }
  3106. if (!fFreedSlot)
  3107. goto ErrorExit;
  3108. dwSts = SCardFreeMemory(hCardContext, mszReaders);
  3109. assert(SCARD_S_SUCCESS == dwSts);
  3110. mszReaders = 0;
  3111. }
  3112. *SlotNb = dwReturnSlot;
  3113. return TRUE;
  3114. ErrorExit:
  3115. if (0 != mszReaders)
  3116. SCardFreeMemory(hCardContext, mszReaders);
  3117. return FALSE;
  3118. }
  3119. /*------------------------------------------------------------------------------
  3120. ------------------------------------------------------------------------------*/
  3121. static BOOL copy_tmp_key(HCRYPTPROV hProv,HCRYPTKEY hKey,
  3122. DWORD dwFlags, int Algid,
  3123. BYTE KeyBuff[], DWORD KeyLen,
  3124. BYTE SaltBuff[], DWORD SaltLen)
  3125. {
  3126. BOOL CryptResp;
  3127. DWORD i, dwDataLen, dwAlgid;
  3128. BLOBHEADER BlobHeader;
  3129. BYTE *pbTmp;
  3130. BYTE pbData[1024];
  3131. NoDisplay = TRUE;
  3132. dwDataLen = sizeof(pbData);
  3133. ZeroMemory( pbData, sizeof(pbData) );
  3134. /* Make the Blob for Session key */
  3135. BlobHeader.bType = SIMPLEBLOB;
  3136. BlobHeader.bVersion = CUR_BLOB_VERSION;
  3137. BlobHeader.reserved = 0x0000;
  3138. BlobHeader.aiKeyAlg = Algid;
  3139. memcpy(pbData,
  3140. &BlobHeader,
  3141. sizeof(BlobHeader)
  3142. );
  3143. dwAlgid = CALG_RSA_KEYX;
  3144. memcpy( &pbData[sizeof(BlobHeader)], &dwAlgid, sizeof(DWORD) );
  3145. pbTmp = (BYTE*)GMEM_Alloc(dwRsaIdentityLen);
  3146. if (IsNull(pbTmp))
  3147. {
  3148. RETURN(CRYPT_FAILED, NTE_NO_MEMORY);
  3149. }
  3150. pbTmp[0] = 0x00;
  3151. pbTmp[1] = 0x02;
  3152. CryptGenRandom(hProvBase, dwRsaIdentityLen-KeyLen-3, &pbTmp[2]);
  3153. for (i = 2; i < dwRsaIdentityLen-KeyLen-1; i++)
  3154. {
  3155. if (pbTmp[i] == 0x00)
  3156. {
  3157. pbTmp[i] = 0x01;
  3158. }
  3159. }
  3160. pbTmp[dwRsaIdentityLen-KeyLen-1] = 0x00;
  3161. memcpy( &pbTmp[dwRsaIdentityLen-KeyLen], KeyBuff, KeyLen );
  3162. r_memcpy( &pbData[sizeof(BlobHeader)+sizeof(DWORD)], pbTmp, dwRsaIdentityLen );
  3163. GMEM_Free(pbTmp);
  3164. dwDataLen = sizeof(BLOBHEADER) + sizeof(DWORD) + dwRsaIdentityLen;
  3165. /* Import Session key blob in RSA Base without the SALT, if presents */
  3166. CryptResp = CryptImportKey(hProvBase,
  3167. pbData,
  3168. dwDataLen,
  3169. hRsaIdentityKey,
  3170. dwFlags,
  3171. &(TmpObject[hKey].hKeyBase));
  3172. if (!CryptResp)
  3173. return CRYPT_FAILED;
  3174. TmpObject[hKey].hProv = hProv;
  3175. if (SaltLen > 0)
  3176. {
  3177. // In this case, the key has been created with a SALT
  3178. CRYPT_DATA_BLOB sCrypt_Data_Blob;
  3179. sCrypt_Data_Blob.cbData = SaltLen;
  3180. sCrypt_Data_Blob.pbData = (BYTE*)GMEM_Alloc (sCrypt_Data_Blob.cbData);
  3181. if (IsNull(sCrypt_Data_Blob.pbData))
  3182. {
  3183. RETURN(CRYPT_FAILED, NTE_NO_MEMORY);
  3184. }
  3185. memcpy( sCrypt_Data_Blob.pbData, SaltBuff, SaltLen );
  3186. CryptResp = CryptSetKeyParam( TmpObject[hKey].hKeyBase, KP_SALT_EX, (BYTE*)&sCrypt_Data_Blob, 0 );
  3187. GMEM_Free (sCrypt_Data_Blob.pbData);
  3188. if (!CryptResp)
  3189. return CRYPT_FAILED;
  3190. }
  3191. NoDisplay = FALSE;
  3192. RETURN( CRYPT_SUCCEED, 0 );
  3193. }
  3194. /*------------------------------------------------------------------------------
  3195. ------------------------------------------------------------------------------*/
  3196. static BOOL key_unwrap( HCRYPTPROV hProv,
  3197. HCRYPTKEY hKey,
  3198. BYTE* pIn,
  3199. DWORD dwInLen,
  3200. BYTE* pOut,
  3201. DWORD* pdwOutLen )
  3202. {
  3203. DWORD lRet;
  3204. BYTE GpkKeySize;
  3205. DWORD SlotNb;
  3206. SlotNb = ProvCont[hProv].Slot;
  3207. if (hKey < 1 || hKey > MAX_GPK_OBJ)
  3208. {
  3209. RETURN( CRYPT_FAILED, NTE_BAD_KEY );
  3210. }
  3211. if (!(Slot[SlotNb].GpkObject[hKey].Flags & FLAG_EXCHANGE))
  3212. {
  3213. RETURN( CRYPT_FAILED, NTE_PERM );
  3214. }
  3215. GpkKeySize = Slot[SlotNb].GpkPubKeys[Slot[SlotNb].GpkObject[hKey].FileId - GPK_FIRST_KEY].KeySize;
  3216. if (GpkKeySize == 0)
  3217. {
  3218. RETURN( CRYPT_FAILED, NTE_BAD_KEY );
  3219. }
  3220. if (dwInLen != GpkKeySize)
  3221. {
  3222. RETURN( CRYPT_FAILED, NTE_BAD_DATA );
  3223. }
  3224. // Card Select Context for enveloppe opening
  3225. bSendBuffer[0] = 0x80; //CLA
  3226. bSendBuffer[1] = 0xA6; //INS
  3227. bSendBuffer[2] = Slot[SlotNb].GpkObject[hKey].FileId; //P1
  3228. bSendBuffer[3] = 0x77; //P2
  3229. cbSendLength = 4;
  3230. cbRecvLength = sizeof(bRecvBuffer);
  3231. lRet = SCardTransmit( ProvCont[hProv].hCard, SCARD_PCI_T0, bSendBuffer,
  3232. cbSendLength, 0, bRecvBuffer, &cbRecvLength );
  3233. if (SCARDPROBLEM(lRet,0x9000,0x00))
  3234. {
  3235. RETURN( CRYPT_FAILED, NTE_BAD_KEY_STATE );
  3236. }
  3237. // Open the enveloppe containing the session key
  3238. bSendBuffer[0] = 0x80; //CLA
  3239. bSendBuffer[1] = 0x1C; //INS
  3240. bSendBuffer[2] = 0x00; //P1
  3241. bSendBuffer[3] = 0x00; //P2
  3242. bSendBuffer[4] = (BYTE) dwInLen; //Lo
  3243. memcpy(&bSendBuffer[5], pIn, dwInLen);
  3244. cbSendLength = dwInLen + 5;
  3245. cbRecvLength = sizeof(bRecvBuffer);
  3246. lRet = SCardTransmit( ProvCont[hProv].hCard, SCARD_PCI_T0, bSendBuffer,
  3247. cbSendLength, 0, bRecvBuffer, &cbRecvLength );
  3248. if (SCARDPROBLEM(lRet,0x61FF,0x00))
  3249. RETURN( CRYPT_FAILED, SCARD_E_UNSUPPORTED_FEATURE );
  3250. // Get Response
  3251. bSendBuffer[0] = 0x00; //CLA
  3252. bSendBuffer[1] = 0xC0; //INS
  3253. bSendBuffer[2] = 0x00; //P1
  3254. bSendBuffer[3] = 0x00; //P2
  3255. bSendBuffer[4] = bRecvBuffer[1]; //Lo
  3256. cbSendLength = 5;
  3257. cbRecvLength = sizeof(bRecvBuffer);
  3258. lRet = SCardTransmit( ProvCont[hProv].hCard, SCARD_PCI_T0, bSendBuffer,
  3259. cbSendLength, 0, bRecvBuffer, &cbRecvLength );
  3260. if (SCARDPROBLEM(lRet,0x9000,bSendBuffer[4]))
  3261. RETURN( CRYPT_FAILED, SCARD_E_UNEXPECTED );
  3262. *pdwOutLen = cbRecvLength - 2;
  3263. r_memcpy(pOut, bRecvBuffer, *pdwOutLen);
  3264. RETURN( CRYPT_SUCCEED, 0 );
  3265. }
  3266. /*------------------------------------------------------------------------------
  3267. ------------------------------------------------------------------------------*/
  3268. static BYTE GPKHashMode (HCRYPTHASH hHash)
  3269. {
  3270. BOOL CryptResp;
  3271. DWORD dwLen, dwTypeAlg;
  3272. // This function is called only if the hHash exists
  3273. dwLen = sizeof (DWORD);
  3274. CryptResp = CryptGetHashParam( hHashGpk[hHash].hHashBase, HP_ALGID, (BYTE *)&dwTypeAlg, &dwLen, 0 );
  3275. if (CryptResp)
  3276. {
  3277. switch (dwTypeAlg)
  3278. {
  3279. case CALG_MD5 : return 0x11; break;
  3280. case CALG_SHA : return 0x12; break;
  3281. case CALG_SSL3_SHAMD5 : return 0x18; break;
  3282. }
  3283. }
  3284. return 0;
  3285. }
  3286. /*------------------------------------------------------------------------------
  3287. ------------------------------------------------------------------------------*/
  3288. static BOOL PublicEFExists(HCRYPTPROV hProv)
  3289. {
  3290. // The DF Crypto has been already selected
  3291. DWORD lRet;
  3292. if (ProvCont[hProv].bGPK8000)
  3293. return TRUE; // Public object EF always exists on GPK8000
  3294. // Select Dedicated Object storage EF on GPK Card
  3295. bSendBuffer[0] = 0x00; //CLA
  3296. bSendBuffer[1] = 0xA4; //INS
  3297. bSendBuffer[2] = 0x02; //P1
  3298. bSendBuffer[3] = 0x00; //P2
  3299. bSendBuffer[4] = 0x02; //Li
  3300. bSendBuffer[5] = HIBYTE(GPK_OBJ_PUB_EF);
  3301. bSendBuffer[6] = LOBYTE(GPK_OBJ_PUB_EF);
  3302. cbSendLength = 7;
  3303. cbRecvLength = sizeof(bRecvBuffer);
  3304. lRet = SCardTransmit( ProvCont[hProv].hCard, SCARD_PCI_T0, bSendBuffer,
  3305. cbSendLength, 0, bRecvBuffer, &cbRecvLength );
  3306. if (SCARDPROBLEM(lRet,0x61FF,0x00))
  3307. return FALSE;
  3308. return TRUE;
  3309. }
  3310. /*------------------------------------------------------------------------------
  3311. ------------------------------------------------------------------------------*/
  3312. static BOOL Read_MaxSessionKey_EF( HCRYPTPROV hProv, DWORD* ptrMaxSessionKey )
  3313. {
  3314. DWORD lRet;
  3315. *ptrMaxSessionKey = 0; // default, nothing supported
  3316. // Select System DF on GPK Card
  3317. BYTE lenDF = strlen(SYSTEM_DF);
  3318. bSendBuffer[0] = 0x00; //CLA
  3319. bSendBuffer[1] = 0xA4; //INS
  3320. bSendBuffer[2] = 0x04; //P1
  3321. bSendBuffer[3] = 0x00; //P2
  3322. bSendBuffer[4] = lenDF;
  3323. memcpy( &bSendBuffer[5], SYSTEM_DF, lenDF );
  3324. cbSendLength = 5 + lenDF;
  3325. cbRecvLength = sizeof(bRecvBuffer);
  3326. lRet = SCardTransmit( ProvCont[hProv].hCard, SCARD_PCI_T0, bSendBuffer,
  3327. cbSendLength, 0, bRecvBuffer, &cbRecvLength );
  3328. if (SCARDPROBLEM(lRet,0x61FF,0x00))
  3329. RETURN( CRYPT_FAILED, SCARD_E_DIR_NOT_FOUND );
  3330. // Select Max Session key EF on GPK Card
  3331. bSendBuffer[0] = 0x00; //CLA
  3332. bSendBuffer[1] = 0xA4; //INS
  3333. bSendBuffer[2] = 0x02; //P1
  3334. bSendBuffer[3] = 0x00; //P2
  3335. bSendBuffer[4] = 0x02; //Li
  3336. bSendBuffer[5] = HIBYTE(MAX_SES_KEY_EF);
  3337. bSendBuffer[6] = LOBYTE(MAX_SES_KEY_EF);
  3338. cbSendLength = 7;
  3339. cbRecvLength = sizeof(bRecvBuffer);
  3340. lRet = SCardTransmit( ProvCont[hProv].hCard, SCARD_PCI_T0, bSendBuffer,
  3341. cbSendLength, 0, bRecvBuffer, &cbRecvLength );
  3342. if (SCARDPROBLEM(lRet,0x61FF,0x00))
  3343. {
  3344. RETURN (CRYPT_FAILED, SCARD_E_FILE_NOT_FOUND);
  3345. }
  3346. // Read Max Session key data on GPK Card
  3347. bSendBuffer[0] = 0x00; //CLA
  3348. bSendBuffer[1] = 0xB0; //INS
  3349. bSendBuffer[2] = 0x00; //P1
  3350. bSendBuffer[3] = 0x00; //P2
  3351. bSendBuffer[4] = 0x01; //Li
  3352. cbSendLength = 5;
  3353. cbRecvLength = sizeof(bRecvBuffer);
  3354. lRet = SCardTransmit( ProvCont[hProv].hCard, SCARD_PCI_T0, bSendBuffer,
  3355. cbSendLength, 0, bRecvBuffer, &cbRecvLength );
  3356. if (SCARDPROBLEM(lRet,0x9000, bSendBuffer[4]))
  3357. {
  3358. RETURN(CRYPT_FAILED, NTE_BAD_DATA);
  3359. }
  3360. *ptrMaxSessionKey = (bRecvBuffer[0] * 8);
  3361. RETURN (CRYPT_SUCCEED, 0);
  3362. }
  3363. /*------------------------------------------------------------------------------
  3364. ------------------------------------------------------------------------------*/
  3365. static BOOL init_key_set(HCRYPTPROV hProv, const char* szContainerName)
  3366. {
  3367. BYTE* pbBuff1 = 0;
  3368. WORD wIadfLen;
  3369. DWORD lRet, dwBuff1Len, SlotNb;
  3370. SlotNb = ProvCont[hProv].Slot;
  3371. if (Slot[SlotNb].NbKeyFile == 0)
  3372. Slot[SlotNb].NbKeyFile = Read_NbKeyFile(hProv);
  3373. if (Slot[SlotNb].NbKeyFile == 0 || Slot[SlotNb].NbKeyFile > MAX_REAL_KEY)
  3374. {
  3375. RETURN( CRYPT_FAILED, SCARD_E_FILE_NOT_FOUND );
  3376. }
  3377. // Select GPK EF_IADF
  3378. bSendBuffer[0] = 0x00; //CLA
  3379. bSendBuffer[1] = 0xA4; //INS
  3380. bSendBuffer[2] = 0x02; //P1
  3381. bSendBuffer[3] = 0x00; //P2
  3382. bSendBuffer[4] = 0x02; //Li
  3383. bSendBuffer[5] = HIBYTE(GPK_IADF_EF);
  3384. bSendBuffer[6] = LOBYTE(GPK_IADF_EF);
  3385. cbSendLength = 7;
  3386. cbRecvLength = sizeof(bRecvBuffer);
  3387. lRet = SCardTransmit( ProvCont[hProv].hCard, SCARD_PCI_T0, bSendBuffer,
  3388. cbSendLength, 0, bRecvBuffer, &cbRecvLength );
  3389. if (SCARDPROBLEM(lRet,0x61FF,0x00))
  3390. RETURN( CRYPT_FAILED, SCARD_E_FILE_NOT_FOUND );
  3391. // Get Response
  3392. bSendBuffer[0] = 0x00; //CLA
  3393. bSendBuffer[1] = 0xC0; //INS
  3394. bSendBuffer[2] = 0x00; //P1
  3395. bSendBuffer[3] = 0x00; //P2
  3396. bSendBuffer[4] = bRecvBuffer[1]; //Lo
  3397. cbSendLength = 5;
  3398. cbRecvLength = sizeof(bRecvBuffer);
  3399. lRet = SCardTransmit( ProvCont[hProv].hCard, SCARD_PCI_T0, bSendBuffer,
  3400. cbSendLength, 0, bRecvBuffer, &cbRecvLength );
  3401. if (SCARDPROBLEM(lRet,0x9000,bSendBuffer[4]))
  3402. {
  3403. RETURN( CRYPT_FAILED, SCARD_E_UNEXPECTED );
  3404. }
  3405. wIadfLen = bRecvBuffer[8]*256 + bRecvBuffer[9];
  3406. // Update GPK EF_IADF with Container Name
  3407. memset(bSendBuffer, 0x00, sizeof(bSendBuffer));
  3408. bSendBuffer[0] = 0x00; //CLA
  3409. bSendBuffer[1] = 0xD6; //INS
  3410. bSendBuffer[2] = 0x00; //P1
  3411. bSendBuffer[3] = 8 / ProvCont[hProv].dataUnitSize;
  3412. bSendBuffer[4] = (BYTE)wIadfLen - 8;//Li
  3413. ZeroMemory( &bSendBuffer[5], wIadfLen-8 );
  3414. if (IsNullStr(szContainerName))
  3415. {
  3416. bSendBuffer[5] = 0x30;
  3417. Slot[SlotNb].InitFlag = FALSE;
  3418. }
  3419. else
  3420. {
  3421. bSendBuffer[5] = 0x31;
  3422. Slot[SlotNb].InitFlag = TRUE;
  3423. }
  3424. strncpy( (char*)&bSendBuffer[6], szContainerName, sizeof(bSendBuffer)-7);
  3425. cbSendLength = wIadfLen - 8 + 5;
  3426. cbRecvLength = sizeof(bRecvBuffer);
  3427. lRet = SCardTransmit( ProvCont[hProv].hCard, SCARD_PCI_T0, bSendBuffer,
  3428. cbSendLength, 0, bRecvBuffer, &cbRecvLength );
  3429. if (SCARDPROBLEM(lRet,0x9000,0x00))
  3430. {
  3431. RETURN(CRYPT_FAILED, SCARD_E_UNEXPECTED);
  3432. }
  3433. if (!Select_Crypto_DF(hProv))
  3434. return CRYPT_FAILED;
  3435. // Get Response
  3436. bSendBuffer[0] = 0x00; //CLA
  3437. bSendBuffer[1] = 0xC0; //INS
  3438. bSendBuffer[2] = 0x00; //P1
  3439. bSendBuffer[3] = 0x00; //P2
  3440. bSendBuffer[4] = bRecvBuffer[1]; //Lo
  3441. cbSendLength = 5;
  3442. cbRecvLength = sizeof(bRecvBuffer);
  3443. lRet = SCardTransmit( ProvCont[hProv].hCard, SCARD_PCI_T0, bSendBuffer,
  3444. cbSendLength, 0, bRecvBuffer, &cbRecvLength );
  3445. if (SCARDPROBLEM(lRet,0x9000,bSendBuffer[4]))
  3446. {
  3447. RETURN(CRYPT_FAILED, SCARD_E_UNEXPECTED);
  3448. }
  3449. // Initialize New Container Name
  3450. ZeroMemory( ProvCont[hProv].szContainer, sizeof(ProvCont[hProv].szContainer) );
  3451. memcpy(ProvCont[hProv].szContainer, &bRecvBuffer[5], cbRecvLength - 7);
  3452. if (!PublicEFExists(hProv))
  3453. {
  3454. // The GPK4000suo still has its generation on-board filter. No key has been
  3455. // generated yet.
  3456. RETURN( CRYPT_SUCCEED, 0 );
  3457. }
  3458. // New verify Pin code because DF reselected
  3459. if (!PIN_Validation(hProv))
  3460. {
  3461. lRet = GetLastError();
  3462. Select_MF(hProv);
  3463. RETURN( CRYPT_FAILED, lRet );
  3464. }
  3465. if (read_gpk_objects( hProv, FALSE ))
  3466. {
  3467. if (read_gpk_objects( hProv, TRUE ))
  3468. {
  3469. /* Re-personalize the card BUT keep the PKCS#11 objects not related
  3470. to the GemSAFE application */
  3471. Slot[SlotNb].Read_Public = FALSE;
  3472. Slot[SlotNb].Read_Priv = FALSE;
  3473. clean_card(hProv);
  3474. }
  3475. else
  3476. {
  3477. /* An error occured in the card; ERASE all the objects */
  3478. Slot[SlotNb].Read_Public = FALSE;
  3479. zap_gpk_objects(SlotNb, FALSE);
  3480. /* Re-personalize the card */
  3481. perso_card(hProv, 0);
  3482. }
  3483. }
  3484. else
  3485. {
  3486. /* An error occured in the card; ERASE all the objects */
  3487. Slot[SlotNb].Read_Public = FALSE;
  3488. zap_gpk_objects(SlotNb, FALSE);
  3489. /* Re-personalize the card */
  3490. perso_card(hProv, 0);
  3491. }
  3492. pbBuff1 = (BYTE*)GMEM_Alloc(MAX_GPK_PUBLIC);
  3493. if (IsNull(pbBuff1))
  3494. RETURN( CRYPT_FAILED, NTE_NO_MEMORY );
  3495. bool bErrorInTryOccured=false;
  3496. __try
  3497. {
  3498. dwBuff1Len = MAX_GPK_PUBLIC;
  3499. if (prepare_write_gpk_objects( hProv, pbBuff1, &dwBuff1Len, FALSE ))
  3500. {
  3501. if (!write_gpk_objects( hProv, pbBuff1, dwBuff1Len, TRUE, FALSE ))
  3502. bErrorInTryOccured=true;
  3503. }
  3504. else bErrorInTryOccured=true;
  3505. }
  3506. __finally
  3507. {
  3508. GMEM_Free( pbBuff1 );
  3509. }
  3510. if(bErrorInTryOccured)
  3511. return CRYPT_FAILED;
  3512. pbBuff1 = (BYTE*)GMEM_Alloc( MAX_GPK_PRIVATE );
  3513. if (IsNull(pbBuff1))
  3514. RETURN( CRYPT_FAILED, NTE_NO_MEMORY );
  3515. __try
  3516. {
  3517. dwBuff1Len = MAX_GPK_PRIVATE;
  3518. if (prepare_write_gpk_objects( hProv, pbBuff1, &dwBuff1Len, TRUE ))
  3519. {
  3520. if (!write_gpk_objects( hProv, pbBuff1, dwBuff1Len, TRUE, TRUE ))
  3521. bErrorInTryOccured=true;
  3522. }
  3523. else bErrorInTryOccured=true;
  3524. }
  3525. __finally
  3526. {
  3527. GMEM_Free( pbBuff1 );
  3528. }
  3529. if(bErrorInTryOccured)
  3530. return CRYPT_FAILED;
  3531. RETURN( CRYPT_SUCCEED, 0 );
  3532. }
  3533. /*------------------------------------------------------------------------------
  3534. * static int ExtractContent(ASN1 *pAsn1)
  3535. *
  3536. * Description : Extract contents of a Asn1 block 'pAsn1->Asn1' and place it
  3537. * in 'pAsn1->Content'.
  3538. *
  3539. * Remarks : Field Asn1.pData is allocated by calling function.
  3540. *
  3541. * In : pAsn1->Asn1.pData
  3542. *
  3543. * Out : This fileds are filled (if RV_SUCCESS) :
  3544. * - Tag
  3545. * - Asn1.usLen
  3546. * - Content.usLen
  3547. * - Content.pData
  3548. *
  3549. * Responses : RV_SUCCESS : All is OK.
  3550. * RV_INVALID_DATA : Asn1 block format not supported.
  3551. *
  3552. ------------------------------------------------------------------------------*/
  3553. static int ExtractContent(ASN1 *pAsn1)
  3554. {
  3555. BYTE* pData;
  3556. int NbBytes, i;
  3557. pData = pAsn1->Asn1.pData;
  3558. if ((pData[0] & 0x1F) == 0x1F)
  3559. {
  3560. // High-tag-number: not supported
  3561. return RV_INVALID_DATA;
  3562. }
  3563. else
  3564. {
  3565. pAsn1->Tag = pData[0];
  3566. }
  3567. if (pData[1] == 0x80)
  3568. {
  3569. // Constructed, indefinite-length method : not supported
  3570. return (RV_INVALID_DATA);
  3571. }
  3572. else if (pData[1] > 0x82)
  3573. {
  3574. // Constructed, definite-length method : too long
  3575. return (RV_INVALID_DATA);
  3576. }
  3577. else if (pData[1] < 0x80)
  3578. {
  3579. // Primitive, definite-length method
  3580. pAsn1->Content.usLen = pData[1];
  3581. pAsn1->Content.pData = &pData[2];
  3582. pAsn1->Asn1.usLen = pAsn1->Content.usLen + 2;
  3583. }
  3584. else
  3585. {
  3586. // Constructed, definite-length method
  3587. NbBytes = pData[1] & 0x7F;
  3588. pAsn1->Content.usLen = 0;
  3589. for (i = 0; i < NbBytes; i++)
  3590. {
  3591. pAsn1->Content.usLen = (pAsn1->Content.usLen << 8) + pData[2+i];
  3592. }
  3593. pAsn1->Content.pData = &pData[2+NbBytes];
  3594. pAsn1->Asn1.usLen = pAsn1->Content.usLen + 2 + NbBytes;
  3595. }
  3596. return RV_SUCCESS;
  3597. }
  3598. /**********************************************************************************/
  3599. static BOOL Read_Priv_Obj (HCRYPTPROV hProv)
  3600. {
  3601. DWORD lRet;
  3602. if (!PIN_Validation(hProv))
  3603. {
  3604. lRet = GetLastError();
  3605. Select_MF(hProv);
  3606. SCardEndTransaction(ProvCont[hProv].hCard, SCARD_LEAVE_CARD);
  3607. RETURN( CRYPT_FAILED, lRet );
  3608. }
  3609. if (!Slot[ProvCont[hProv].Slot].Read_Priv)
  3610. {
  3611. if (!read_gpk_objects(hProv, TRUE))
  3612. {
  3613. lRet = GetLastError();
  3614. Select_MF(hProv);
  3615. SCardEndTransaction(ProvCont[hProv].hCard, SCARD_LEAVE_CARD);
  3616. RETURN( CRYPT_FAILED, lRet );
  3617. }
  3618. Slot[ProvCont[hProv].Slot].Read_Priv = TRUE;
  3619. }
  3620. RETURN( CRYPT_SUCCEED, 0 );
  3621. }
  3622. /**********************************************************************************/
  3623. BOOL Coherent(HCRYPTPROV hProv, bool *bCardReinserted)
  3624. {
  3625. DWORD lRet, SlotNb;
  3626. if(bCardReinserted)
  3627. {
  3628. *bCardReinserted=false;
  3629. }
  3630. if (!Context_exist(hProv))
  3631. RETURN( CRYPT_FAILED, NTE_BAD_UID );
  3632. // [mv - 15/05/98]
  3633. // No access to the card in this case
  3634. if ( ProvCont[hProv].Flags & CRYPT_VERIFYCONTEXT &&
  3635. ProvCont[hProv].isContNameNullBlank )
  3636. {
  3637. RETURN( CRYPT_SUCCEED, 0 );
  3638. }
  3639. SlotNb = ProvCont[hProv].Slot;
  3640. // The thread is stopping, wait for it
  3641. if ( Slot[SlotNb].CheckThreadStateEmpty)
  3642. {
  3643. DWORD threadExitCode;
  3644. StopMonitor(SlotNb,&threadExitCode);
  3645. // TT 19/11/99: When the card is removed, reset the PIN
  3646. //Slot[SlotNb].ClearPin(); [FP] already cleared
  3647. Slot[SlotNb].Read_Public = FALSE;
  3648. Slot[SlotNb].Read_Priv = FALSE;
  3649. zap_gpk_objects( SlotNb, FALSE );
  3650. zap_gpk_objects( SlotNb, TRUE );
  3651. Slot[SlotNb].NbKeyFile = 0;
  3652. Slot[SlotNb].GpkMaxSessionKey = 0;
  3653. // [FP] req for Whistler, if card has been removed, ask card to continue
  3654. SCARDHANDLE hCard = 0;
  3655. TCHAR szReaderName[512];
  3656. DWORD dwFlags = ProvCont[hProv].Flags;
  3657. if (dwFlags & CRYPT_NEWKEYSET) dwFlags = dwFlags^CRYPT_NEWKEYSET; // always find the keyset on the card
  3658. DWORD dwStatus = OpenCard(ProvCont[hProv].szContainer, dwFlags, &hCard, szReaderName, sizeof(szReaderName)/sizeof(TCHAR));
  3659. if ((hCard == 0) || (dwStatus != SCARD_S_SUCCESS))
  3660. {
  3661. if ((dwStatus == SCARD_E_CANCELLED) && (dwFlags & CRYPT_SILENT))
  3662. {
  3663. // Silent reconnection to the card failed
  3664. dwStatus = SCARD_W_REMOVED_CARD;
  3665. }
  3666. //ReleaseProvider(hProv);
  3667. Slot[SlotNb].CheckThreadStateEmpty = TRUE;
  3668. RETURN (CRYPT_FAILED, dwStatus);
  3669. }
  3670. else
  3671. {
  3672. if (ProvCont[hProv].Slot != g_FuncSlotNb)
  3673. {
  3674. DWORD OldSlotNb = SlotNb;
  3675. SlotNb = ProvCont[hProv].Slot = g_FuncSlotNb;
  3676. //copy slot info
  3677. //Slot[SlotNb].SetPin(Slot[OldSlotNb].GetPin());
  3678. Slot[SlotNb].InitFlag = Slot[OldSlotNb].InitFlag;
  3679. memcpy(Slot[SlotNb].bGpkSerNb, Slot[OldSlotNb].bGpkSerNb, 8);
  3680. Slot[SlotNb].ContextCount = Slot[OldSlotNb].ContextCount;
  3681. //Slot[SlotNb].CheckThread = Slot[OldSlotNb].CheckThread;
  3682. // clean old slot
  3683. Slot[OldSlotNb].ContextCount = 0;
  3684. // Slot[OldSlotNb].ClearPin();
  3685. // synchronize other contexts
  3686. for (DWORD i = 1; i < MAX_CONTEXT; i++)
  3687. {
  3688. if (Context_exist(i))
  3689. {
  3690. if (ProvCont[i].Slot == OldSlotNb)
  3691. {
  3692. ProvCont[i].Slot = SlotNb;
  3693. ProvCont[i].hCard = 0;
  3694. ProvCont[i].bDisconnected = TRUE;
  3695. }
  3696. }
  3697. }
  3698. }
  3699. else
  3700. {
  3701. // synchronize other contexts
  3702. for (DWORD i = 1; i < MAX_CONTEXT; i++)
  3703. {
  3704. if (Context_exist(i))
  3705. {
  3706. if ((ProvCont[i].Slot == SlotNb) && (i != hProv))
  3707. {
  3708. ProvCont[i].hCard = 0;
  3709. ProvCont[i].bDisconnected = TRUE;
  3710. }
  3711. }
  3712. }
  3713. }
  3714. // compare SN
  3715. bSendBuffer[0] = 0x80; //CLA
  3716. bSendBuffer[1] = 0xC0; //INS
  3717. bSendBuffer[2] = 0x02; //P1
  3718. bSendBuffer[3] = 0xA0; //P2
  3719. bSendBuffer[4] = 0x08; //Lo
  3720. cbSendLength = 5;
  3721. cbRecvLength = sizeof(bRecvBuffer);
  3722. lRet = SCardTransmit(hCard,
  3723. SCARD_PCI_T0,
  3724. bSendBuffer,
  3725. cbSendLength,
  3726. NULL,
  3727. bRecvBuffer,
  3728. &cbRecvLength);
  3729. if (SCARDPROBLEM(lRet,0x9000, bSendBuffer[4]))
  3730. {
  3731. //ReleaseProvider(hProv);
  3732. RETURN (CRYPT_FAILED, (SCARD_S_SUCCESS == lRet) ? NTE_FAIL : lRet);
  3733. }
  3734. if (memcmp(Slot[SlotNb].bGpkSerNb, bRecvBuffer, bSendBuffer[4]) != 0)
  3735. {
  3736. //ReleaseProvider(hProv);
  3737. RETURN (CRYPT_FAILED, NTE_FAIL);
  3738. }
  3739. }
  3740. ProvCont[hProv].hCard = hCard;
  3741. if(bCardReinserted)
  3742. {
  3743. *bCardReinserted=true;
  3744. }
  3745. // reassign hKeyBase
  3746. //BOOL CryptResp;
  3747. //HCRYPTKEY hPubKey = 0;
  3748. //CryptResp = MyCPGetUserKey(hProv, AT_KEYEXCHANGE, &hPubKey);
  3749. //if (CryptResp && hPubKey !=0 && ProvCont[hProv].hRSAKEK!=0)
  3750. // Slot[SlotNb].GpkObject[hPubKey].hKeyBase = ProvCont[hProv].hRSAKEK;
  3751. //CryptResp = MyCPGetUserKey(hProv, AT_SIGNATURE, &hPubKey);
  3752. //if (CryptResp && hPubKey !=0 && ProvCont[hProv].hRSASign!=0)
  3753. // Slot[SlotNb].GpkObject[hPubKey].hKeyBase = ProvCont[hProv].hRSASign;
  3754. }
  3755. if (ProvCont[hProv].bDisconnected)
  3756. {
  3757. DWORD dwProto;
  3758. DWORD dwSts = ConnectToCard( Slot[SlotNb].szReaderName,
  3759. SCARD_SHARE_SHARED, SCARD_PROTOCOL_T0,
  3760. &ProvCont[hProv].hCard, &dwProto );
  3761. if (dwSts != SCARD_S_SUCCESS)
  3762. {
  3763. //ReleaseProvider(hProv);
  3764. RETURN( CRYPT_FAILED, dwSts );
  3765. }
  3766. ProvCont[hProv].bDisconnected = FALSE;
  3767. }
  3768. //////////////////////////////////////////////////////////
  3769. /*if (!Prepare_CardBeginTransaction(hProv))
  3770. return CRYPT_FAILED;
  3771. lRet = SCardBeginTransaction(ProvCont[hProv].hCard);
  3772. if (SCARDPROBLEM(lRet,0x0000,0xFF))
  3773. {
  3774. RETURN (CRYPT_FAILED, lRet);
  3775. }*/
  3776. lRet = BeginTransaction(ProvCont[hProv].hCard);
  3777. if (lRet != SCARD_S_SUCCESS)
  3778. {
  3779. RETURN (CRYPT_FAILED, lRet);
  3780. }
  3781. // Monitoring thread
  3782. BeginCheckReaderThread(SlotNb);
  3783. // Make sure that the card has not been replaced by another one [JMR 27-07]
  3784. if (!Select_Crypto_DF(hProv))
  3785. {
  3786. lRet = GetLastError();
  3787. clean_slot(SlotNb, &ProvCont[hProv]);
  3788. SCardEndTransaction(ProvCont[hProv].hCard, SCARD_LEAVE_CARD);
  3789. RETURN (CRYPT_FAILED, lRet);
  3790. }
  3791. // TT - START 17/10/2000 - Check the card's timestamps
  3792. if (!Slot[SlotNb].ValidateTimestamps(hProv))
  3793. {
  3794. SCardEndTransaction(ProvCont[hProv].hCard, SCARD_LEAVE_CARD);
  3795. return CRYPT_FAILED;
  3796. }
  3797. // TT - END 17/10/2000
  3798. // Check modif flags
  3799. if (!Slot[SlotNb].Read_Public)
  3800. {
  3801. if (!read_gpk_objects(hProv, FALSE))
  3802. {
  3803. lRet = GetLastError();
  3804. Select_MF(hProv);
  3805. SCardEndTransaction(ProvCont[hProv].hCard, SCARD_LEAVE_CARD);
  3806. RETURN (CRYPT_FAILED, lRet);
  3807. }
  3808. Slot[SlotNb].Read_Public = TRUE;
  3809. Slot[SlotNb].Read_Priv = FALSE;
  3810. }
  3811. RETURN (CRYPT_SUCCEED, 0);
  3812. }
  3813. /*------------------------------------------------------------------------------
  3814. * int MakeLabel(BYTE *pValue, USHORT usValueLen,
  3815. * BYTE *pLabel, USHORT *pusLabelLen
  3816. * )
  3817. *
  3818. * In : pValue : Certificat value
  3819. * usValueLen : Value length
  3820. *
  3821. * Out : pLabel : Certificate Label
  3822. * pLabelLen : Field length
  3823. *
  3824. * Responses : RV_SUCCESS : All is OK.
  3825. * RV_INVALID_DATA : Bad certificate value format.
  3826. * RV_BUFFER_TOO_SMALL : At least one buffer is to small.
  3827. *
  3828. ------------------------------------------------------------------------------*/
  3829. int MakeLabel(BYTE *pValue, USHORT usValueLen,
  3830. BYTE *pLabel, USHORT *pusLabelLen
  3831. )
  3832. {
  3833. ASN1
  3834. AttributeTypePart,
  3835. AttributeValuePart,
  3836. AVA,
  3837. RDN,
  3838. Value,
  3839. tbsCert,
  3840. serialNumberPart,
  3841. signaturePart,
  3842. issuerPart,
  3843. validityPart,
  3844. subjectPart;
  3845. BLOC
  3846. OrganizationName,
  3847. CommonName;
  3848. BOOL
  3849. bValuesToBeReturned;
  3850. BYTE
  3851. *pCurrentRDN,
  3852. *pCurrent;
  3853. int
  3854. rv;
  3855. OrganizationName.pData = 0;
  3856. OrganizationName.usLen = 0;
  3857. CommonName.pData = 0;
  3858. CommonName.usLen = 0;
  3859. bValuesToBeReturned = (pLabel != 0);
  3860. Value.Asn1.pData = pValue;
  3861. rv = ExtractContent(&Value);
  3862. if (rv != RV_SUCCESS) return rv;
  3863. tbsCert.Asn1.pData = Value.Content.pData;
  3864. rv = ExtractContent(&tbsCert);
  3865. if (rv != RV_SUCCESS) return rv;
  3866. pCurrent = tbsCert.Content.pData;
  3867. if (pCurrent[0] == 0xA0)
  3868. {
  3869. // We have A0 03 02 01 vv where vv is the version
  3870. pCurrent += 5;
  3871. }
  3872. serialNumberPart.Asn1.pData = pCurrent;
  3873. rv = ExtractContent(&serialNumberPart);
  3874. if (rv != RV_SUCCESS) return rv;
  3875. pCurrent = serialNumberPart.Content.pData + serialNumberPart.Content.usLen;
  3876. signaturePart.Asn1.pData = pCurrent;
  3877. rv = ExtractContent(&signaturePart);
  3878. if (rv != RV_SUCCESS) return rv;
  3879. pCurrent = signaturePart.Content.pData + signaturePart.Content.usLen;
  3880. issuerPart.Asn1.pData = pCurrent;
  3881. rv = ExtractContent(&issuerPart);
  3882. if (rv != RV_SUCCESS) return rv;
  3883. pCurrent = issuerPart.Content.pData + issuerPart.Content.usLen;
  3884. validityPart.Asn1.pData = pCurrent;
  3885. rv = ExtractContent(&validityPart);
  3886. if (rv != RV_SUCCESS) return rv;
  3887. pCurrent = validityPart.Content.pData + validityPart.Content.usLen;
  3888. subjectPart.Asn1.pData = pCurrent;
  3889. rv = ExtractContent(&subjectPart);
  3890. if (rv != RV_SUCCESS) return rv;
  3891. pCurrent = subjectPart.Content.pData + subjectPart.Content.usLen;
  3892. // Search field 'OrganizationName' in 'Issuer'
  3893. pCurrent = issuerPart.Content.pData;
  3894. while (pCurrent < issuerPart.Content.pData + issuerPart.Content.usLen)
  3895. {
  3896. RDN.Asn1.pData = pCurrent;
  3897. rv = ExtractContent(&RDN);
  3898. if (rv != RV_SUCCESS) return rv;
  3899. pCurrentRDN = RDN.Content.pData;
  3900. while (pCurrentRDN < RDN.Content.pData + RDN.Content.usLen)
  3901. {
  3902. AVA.Asn1.pData = pCurrentRDN;
  3903. rv = ExtractContent(&AVA);
  3904. if (rv != RV_SUCCESS) return rv;
  3905. AttributeTypePart.Asn1.pData = AVA.Content.pData;
  3906. rv = ExtractContent(&AttributeTypePart);
  3907. if (rv != RV_SUCCESS) return rv;
  3908. AttributeValuePart.Asn1.pData = AttributeTypePart.Content.pData
  3909. + AttributeTypePart.Content.usLen;
  3910. rv = ExtractContent(&AttributeValuePart);
  3911. if (rv != RV_SUCCESS) return rv;
  3912. // Search 'OrganisationName'
  3913. if (!memcmp("\x55\x04\x0A",
  3914. AttributeTypePart.Content.pData,
  3915. AttributeTypePart.Content.usLen)
  3916. )
  3917. {
  3918. OrganizationName = AttributeValuePart.Content;
  3919. }
  3920. pCurrentRDN = AVA.Content.pData + AVA.Content.usLen;
  3921. }
  3922. pCurrent = RDN.Content.pData + RDN.Content.usLen;
  3923. }
  3924. // Search 'CommonName' in 'Subject'
  3925. pCurrent = subjectPart.Content.pData;
  3926. while (pCurrent < subjectPart.Content.pData + subjectPart.Content.usLen)
  3927. {
  3928. RDN.Asn1.pData = pCurrent;
  3929. rv = ExtractContent(&RDN);
  3930. if (rv != RV_SUCCESS) return rv;
  3931. pCurrentRDN = RDN.Content.pData;
  3932. while (pCurrentRDN < RDN.Content.pData + RDN.Content.usLen)
  3933. {
  3934. AVA.Asn1.pData = pCurrentRDN;
  3935. rv = ExtractContent(&AVA);
  3936. if (rv != RV_SUCCESS) return rv;
  3937. AttributeTypePart.Asn1.pData = AVA.Content.pData;
  3938. rv = ExtractContent(&AttributeTypePart);
  3939. if (rv != RV_SUCCESS) return rv;
  3940. AttributeValuePart.Asn1.pData = AttributeTypePart.Content.pData
  3941. + AttributeTypePart.Content.usLen;
  3942. rv = ExtractContent(&AttributeValuePart);
  3943. if (rv != RV_SUCCESS) return rv;
  3944. // Search 'CommonName'
  3945. if (!memcmp("\x55\x04\x03",
  3946. AttributeTypePart.Content.pData,
  3947. AttributeTypePart.Content.usLen)
  3948. )
  3949. {
  3950. CommonName = AttributeValuePart.Content;
  3951. }
  3952. pCurrentRDN = AVA.Content.pData + AVA.Content.usLen;
  3953. }
  3954. pCurrent = RDN.Content.pData + RDN.Content.usLen;
  3955. }
  3956. if (bValuesToBeReturned)
  3957. {
  3958. if ((*pusLabelLen < OrganizationName.usLen + CommonName.usLen + 6)
  3959. )
  3960. {
  3961. return (RV_BUFFER_TOO_SMALL);
  3962. }
  3963. memcpy(pLabel,
  3964. CommonName.pData,
  3965. CommonName.usLen
  3966. );
  3967. memcpy(&pLabel[CommonName.usLen],
  3968. "'s ",
  3969. 3
  3970. );
  3971. memcpy(&pLabel[CommonName.usLen+3],
  3972. OrganizationName.pData,
  3973. OrganizationName.usLen
  3974. );
  3975. memcpy(&pLabel[CommonName.usLen+3+OrganizationName.usLen],
  3976. " ID",
  3977. 3
  3978. );
  3979. *pusLabelLen = OrganizationName.usLen + CommonName.usLen + 6;
  3980. }
  3981. else
  3982. {
  3983. *pusLabelLen = OrganizationName.usLen + CommonName.usLen + 6;
  3984. }
  3985. return RV_SUCCESS;
  3986. }
  3987. /* -----------------------------------------------------------------------------
  3988. [DCB3] vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv [DCB3]
  3989. --------------------------------------------------------------------------------*/
  3990. static LPCSTR read_gpk_keyset(SCARDHANDLE hLocalCard)
  3991. {
  3992. DWORD lRet;
  3993. BYTE lenDF;
  3994. /*lRet = SCardBeginTransaction(hLocalCard);
  3995. if (SCARD_S_SUCCESS != lRet)
  3996. goto ErrorExit;*/
  3997. lRet = BeginTransaction(hLocalCard);
  3998. if (lRet != SCARD_S_SUCCESS)
  3999. goto ErrorExit;
  4000. /* Select GPK Card MF */
  4001. bSendBuffer[0] = 0x00; //CLA
  4002. bSendBuffer[1] = 0xA4; //INS
  4003. bSendBuffer[2] = 0x00; //P1
  4004. bSendBuffer[3] = 0x0C; //P2
  4005. bSendBuffer[4] = 0x02; //Li
  4006. bSendBuffer[5] = HIBYTE(GPK_MF);
  4007. bSendBuffer[6] = LOBYTE(GPK_MF);
  4008. cbSendLength = 7;
  4009. cbRecvLength = sizeof(bRecvBuffer);
  4010. lRet = SCardTransmit( hLocalCard, SCARD_PCI_T0, bSendBuffer,
  4011. cbSendLength, 0, bRecvBuffer, &cbRecvLength );
  4012. if (SCARDPROBLEM(lRet,0x9000,0x00))
  4013. goto ErrorExit;
  4014. /* Select Dedicated Application DF on GPK Card */
  4015. lenDF = strlen(GPK_DF);
  4016. bSendBuffer[0] = 0x00; //CLA
  4017. bSendBuffer[1] = 0xA4; //INS
  4018. bSendBuffer[2] = 0x04; //P1
  4019. bSendBuffer[3] = 0x00; //P2
  4020. bSendBuffer[4] = lenDF;
  4021. memcpy( &bSendBuffer[5], GPK_DF, lenDF );
  4022. cbSendLength = 5 + lenDF;
  4023. cbRecvLength = sizeof(bRecvBuffer);
  4024. lRet = SCardTransmit( hLocalCard, SCARD_PCI_T0, bSendBuffer,
  4025. cbSendLength, 0, bRecvBuffer, &cbRecvLength );
  4026. if (SCARDPROBLEM(lRet,0x61FF,0x00))
  4027. goto ErrorExit;
  4028. /* Get Response of the Select DF to obtain the IADF */
  4029. bSendBuffer[0] = 0x00; //CLA
  4030. bSendBuffer[1] = 0xC0; //INS
  4031. bSendBuffer[2] = 0x00; //P1
  4032. bSendBuffer[3] = 0x00; //P2
  4033. bSendBuffer[4] = bRecvBuffer[1]; //Lo
  4034. cbSendLength = 5;
  4035. cbRecvLength = sizeof(bRecvBuffer);
  4036. lRet = SCardTransmit( hLocalCard, SCARD_PCI_T0, bSendBuffer,
  4037. cbSendLength, 0, bRecvBuffer, &cbRecvLength );
  4038. if (SCARDPROBLEM(lRet,0x9000,bSendBuffer[4]))
  4039. goto ErrorExit;
  4040. bRecvBuffer[cbRecvLength - 2] = 0;
  4041. SCardEndTransaction(hLocalCard, SCARD_LEAVE_CARD);
  4042. return (LPCSTR)&bRecvBuffer[5];
  4043. ErrorExit:
  4044. SCardEndTransaction(hLocalCard, SCARD_LEAVE_CARD);
  4045. return 0;
  4046. }
  4047. /* -----------------------------------------------------------------------------
  4048. [DCB3] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [DCB3]
  4049. --------------------------------------------------------------------------------*/
  4050. /* -----------------------------------------------------------------------------
  4051. --------------------------------------------------------------------------------*/
  4052. GPK_OBJ* FindKeySet( Slot_Description* pSlot, LPCSTR szDesiredContainer )
  4053. {
  4054. GPK_OBJ* pFirstObject = &pSlot->GpkObject[1];
  4055. GPK_OBJ* pLastObject = pFirstObject + pSlot->NbGpkObject;
  4056. GPK_OBJ* pObject;
  4057. int len;
  4058. if (IsNullStr( szDesiredContainer))
  4059. return 0;
  4060. len = strlen( szDesiredContainer );
  4061. for (pObject = pFirstObject; pObject != pLastObject; ++pObject)
  4062. {
  4063. if ( (pObject->Tag & 0x7F) == TAG_KEYSET )
  4064. {
  4065. if ( pObject->Field[POS_LABEL].Len == len )
  4066. {
  4067. if (0==memcmp( szDesiredContainer, pObject->Field[POS_LABEL].pValue, len))
  4068. {
  4069. // Found the keyset
  4070. return pObject;
  4071. }
  4072. }
  4073. }
  4074. }
  4075. return 0;
  4076. }
  4077. GPK_OBJ* FindKeySetByID( Slot_Description* pSlot, BYTE keysetID )
  4078. {
  4079. GPK_OBJ* pFirstObject = &pSlot->GpkObject[1];
  4080. GPK_OBJ* pLastObject = pFirstObject + pSlot->NbGpkObject;
  4081. GPK_OBJ* pObject;
  4082. for (pObject = pFirstObject; pObject != pLastObject; ++pObject)
  4083. {
  4084. if ( (pObject->Tag & 0x7F) == TAG_KEYSET )
  4085. {
  4086. if (pObject->Field[POS_ID].Len > 0)
  4087. {
  4088. if (keysetID == pObject->Field[POS_ID].pValue[0])
  4089. {
  4090. // Found the keyset
  4091. return pObject;
  4092. }
  4093. }
  4094. }
  4095. }
  4096. return 0;
  4097. }
  4098. GPK_OBJ* FindFirstKeyset( Slot_Description* pSlot )
  4099. {
  4100. GPK_OBJ* pFirstObject = &pSlot->GpkObject[1];
  4101. GPK_OBJ* pLastObject = pFirstObject + pSlot->NbGpkObject;
  4102. GPK_OBJ* pObject;
  4103. for (pObject = pFirstObject; pObject != pLastObject; ++pObject)
  4104. {
  4105. if ( (pObject->Tag & 0x7F) == TAG_KEYSET )
  4106. {
  4107. return pObject;
  4108. }
  4109. }
  4110. return 0;
  4111. }
  4112. BOOL DetectLegacy( Slot_Description* pSlot )
  4113. {
  4114. BOOL bHasPublicKey = FALSE;
  4115. BOOL bHasKeyset = FALSE;
  4116. GPK_OBJ* pFirstObject = &pSlot->GpkObject[1];
  4117. GPK_OBJ* pLastObject = pFirstObject + pSlot->NbGpkObject;
  4118. GPK_OBJ* pObject;
  4119. for (pObject = pFirstObject; pObject != pLastObject; ++pObject)
  4120. {
  4121. if (((pObject->Tag & 0x7F) == TAG_RSA_PUBLIC) &&
  4122. ( pObject->IsCreated == TRUE))
  4123. bHasPublicKey = TRUE;
  4124. if ( (pObject->Tag & 0x7F) == TAG_KEYSET )
  4125. bHasKeyset = TRUE;
  4126. }
  4127. if (bHasPublicKey && !bHasKeyset)
  4128. return TRUE;
  4129. else
  4130. return FALSE;
  4131. }
  4132. //////////////////////////////////////////////////////////////////////////////////////
  4133. //
  4134. // Initialize the specified slot
  4135. //
  4136. //////////////////////////////////////////////////////////////////////////////////////
  4137. void InitializeSlot( DWORD SlotNb )
  4138. {
  4139. if (SlotNb >= MAX_SLOT)
  4140. {
  4141. SetLastError( NTE_FAIL );
  4142. return;
  4143. }
  4144. if (!InitSlot[SlotNb])
  4145. {
  4146. TCHAR szBuff[128];
  4147. _tcsncpy(szBuff, Slot[SlotNb].szReaderName, 127);
  4148. szBuff[127]=0;
  4149. ZeroMemory(&Slot[SlotNb], sizeof(Slot_Description));
  4150. _tcsncpy(Slot[SlotNb].szReaderName, szBuff, 127);
  4151. Slot[SlotNb].szReaderName[127]=0;
  4152. InitSlot[SlotNb] = TRUE;
  4153. }
  4154. if (Slot[SlotNb].CheckThreadStateEmpty)
  4155. {
  4156. DBG_PRINT(TEXT("Thread had stopped, wait for it"));
  4157. DWORD threadExitCode;
  4158. StopMonitor(SlotNb,&threadExitCode);
  4159. // TT 19/11/99: When the card is removed, reset the PIN
  4160. // Slot[SlotNb].ClearPin();
  4161. Flush_MSPinCache(&(Slot[SlotNb].hPinCacheHandle)); // NK 06.02.2001 #5 5106
  4162. Slot[SlotNb].Read_Public = FALSE;
  4163. Slot[SlotNb].Read_Priv = FALSE;
  4164. zap_gpk_objects( SlotNb, FALSE );
  4165. zap_gpk_objects( SlotNb, TRUE );
  4166. Slot[SlotNb].NbKeyFile = 0;
  4167. Slot[SlotNb].GpkMaxSessionKey = 0;
  4168. // [FP] +
  4169. /*
  4170. for (DWORD i = 1; i < MAX_CONTEXT; i++)
  4171. {
  4172. if (Context_exist(i))
  4173. {
  4174. if (ProvCont[i].Slot == SlotNb)
  4175. {
  4176. ProvCont[i].hCard = 0;
  4177. ProvCont[i].bDisconnected = TRUE;
  4178. }
  4179. }
  4180. }
  4181. */
  4182. // [FP] -
  4183. }
  4184. // Monitoring thread
  4185. BeginCheckReaderThread(SlotNb);
  4186. }
  4187. /* -----------------------------------------------------------------------------
  4188. --------------------------------------------------------------------------------*/
  4189. SCARDHANDLE WINAPI funcConnect (SCARDCONTEXT hSCardContext, LPTSTR szReader, LPTSTR mszCards, PVOID pvUserData)
  4190. {
  4191. SCARDHANDLE hCard;
  4192. DWORD dwProto, dwSts;
  4193. GpkLocalLock();
  4194. hCard = 0;
  4195. dwSts = ConnectToCard( szReader, SCARD_SHARE_SHARED,
  4196. SCARD_PROTOCOL_T0, &hCard, &dwProto );
  4197. if (dwSts != SCARD_S_SUCCESS)
  4198. {
  4199. hCard =0;
  4200. GpkLocalUnlock();
  4201. return 0;
  4202. }
  4203. if (!find_reader( &g_FuncSlotNb, szReader ))
  4204. {
  4205. GpkLocalUnlock();
  4206. return 0;
  4207. }
  4208. GpkLocalUnlock();
  4209. return hCard;
  4210. }
  4211. /* -----------------------------------------------------------------------------
  4212. --------------------------------------------------------------------------------*/
  4213. // TT 05/10/99
  4214. BOOL WINAPI funcCheck( SCARDCONTEXT hSCardContext, SCARDHANDLE hCard, void* pvUserData )
  4215. {
  4216. GPK_OBJ* pKeySet = 0;
  4217. int hProv = 0;
  4218. int SlotNb = g_FuncSlotNb;
  4219. BOOL bGPK8000;
  4220. BOOL bResult;
  4221. GpkLocalLock();
  4222. ProvCont[hProv].hCard = hCard;
  4223. ProvCont[hProv].Slot = SlotNb;
  4224. ProvCont[hProv].dataUnitSize = 0;
  4225. //GpkLocalLock();
  4226. /*if (!Prepare_CardBeginTransaction(0))
  4227. {
  4228. GpkLocalUnlock();
  4229. return FALSE;
  4230. }*/
  4231. if (BeginTransaction(hCard) != SCARD_S_SUCCESS)
  4232. {
  4233. GpkLocalUnlock();
  4234. return FALSE;
  4235. }
  4236. LPCSTR szDesiredContainer = (char*)pvUserData;
  4237. /*
  4238. GPK_OBJ* pKeySet = 0;
  4239. int hProv = 0;
  4240. int SlotNb = g_FuncSlotNb;
  4241. BOOL bGPK8000;
  4242. BOOL bResult;
  4243. */
  4244. InitializeSlot( SlotNb );
  4245. // If we are acquiring a new keyset, we return TRUE
  4246. if ( szDesiredContainer == 0 || *szDesiredContainer == 0)
  4247. {
  4248. SCardEndTransaction(hCard, SCARD_LEAVE_CARD);
  4249. GpkLocalUnlock();
  4250. return TRUE;
  4251. }
  4252. // Read the public objects
  4253. /*
  4254. ProvCont[hProv].hCard = hCard;
  4255. ProvCont[hProv].Slot = SlotNb;
  4256. ProvCont[hProv].dataUnitSize = 0;
  4257. */
  4258. bResult = Select_Crypto_DF( hProv );
  4259. if (bResult)
  4260. {
  4261. bResult = Slot[SlotNb].ValidateTimestamps(hProv);
  4262. if (bResult && !Slot[SlotNb].Read_Public)
  4263. {
  4264. bResult = read_gpk_objects( hProv, FALSE );
  4265. if (bResult)
  4266. {
  4267. Slot[SlotNb].Read_Public = TRUE;
  4268. Slot[SlotNb].Read_Priv = FALSE;
  4269. }
  4270. }
  4271. if (bResult)
  4272. {
  4273. pKeySet = FindKeySet( &Slot[SlotNb], szDesiredContainer );
  4274. if (pKeySet==0)
  4275. {
  4276. if (DetectGPK8000( hCard, &bGPK8000 ) == SCARD_S_SUCCESS)
  4277. {
  4278. bResult = FALSE;
  4279. if (!bGPK8000)
  4280. {
  4281. BOOL bLegacy = DetectLegacy( &Slot[SlotNb] );
  4282. if (bLegacy)
  4283. {
  4284. LPCSTR szCardContainer = read_gpk_keyset( hCard );
  4285. if (szCardContainer!=0)
  4286. {
  4287. bResult = (0 == strcmp(szCardContainer, szDesiredContainer));
  4288. }
  4289. }
  4290. }
  4291. }
  4292. }
  4293. else
  4294. {
  4295. bResult = TRUE;
  4296. }
  4297. }
  4298. }
  4299. ZeroMemory( &ProvCont[hProv], sizeof(ProvCont[hProv]) );
  4300. SCardEndTransaction(hCard, SCARD_LEAVE_CARD);
  4301. GpkLocalUnlock();
  4302. return bResult;
  4303. }
  4304. // TT: END
  4305. /* -----------------------------------------------------------------------------
  4306. --------------------------------------------------------------------------------*/
  4307. void WINAPI funcDisconnect( SCARDCONTEXT hSCardContext, SCARDHANDLE hCard, PVOID pvUserData )
  4308. {
  4309. SCardDisconnect( hCard, SCARD_LEAVE_CARD );
  4310. }
  4311. /*------------------------------------------------------------------------------
  4312. ------------------------------------------------------------------------------*/
  4313. static DWORD OpenCard(CHAR* szContainerAsked, DWORD dwFlags, SCARDHANDLE* hCard, PTCHAR szReaderName, DWORD dwReaderNameLen)
  4314. {
  4315. OPENCARDNAME open_card;
  4316. TCHAR szCardName[512],
  4317. szOpenDlgTitle[MAX_STRING];
  4318. ZeroMemory( szReaderName, dwReaderNameLen * sizeof(TCHAR) );
  4319. ZeroMemory( szCardName, sizeof(szCardName) );
  4320. open_card.dwStructSize = sizeof(open_card);
  4321. open_card.hwndOwner = GetAppWindow();
  4322. open_card.hSCardContext = hCardContext;
  4323. open_card.lpstrGroupNames = 0;
  4324. open_card.nMaxGroupNames = 0;
  4325. open_card.lpstrCardNames = mszCardList;
  4326. open_card.nMaxCardNames = multistrlen(mszCardList)+1;
  4327. open_card.rgguidInterfaces = 0;
  4328. open_card.cguidInterfaces = 0;
  4329. open_card.lpstrRdr = szReaderName;
  4330. open_card.nMaxRdr = dwReaderNameLen;
  4331. open_card.lpstrCard = szCardName;
  4332. open_card.nMaxCard = sizeof(szCardName) / sizeof(TCHAR);
  4333. LoadString(g_hInstRes, 1017, szOpenDlgTitle, sizeof(szOpenDlgTitle)/sizeof(TCHAR));
  4334. open_card.lpstrTitle = szOpenDlgTitle;
  4335. if (dwFlags & CRYPT_SILENT)
  4336. open_card.dwFlags = SC_DLG_NO_UI;
  4337. else
  4338. open_card.dwFlags = SC_DLG_MINIMAL_UI;
  4339. if (dwFlags & CRYPT_NEWKEYSET) // [DCB3]
  4340. open_card.pvUserData = 0; // [DCB3]
  4341. else // [DCB3]
  4342. open_card.pvUserData = szContainerAsked; // [DCB3]
  4343. open_card.dwShareMode = SCARD_SHARE_SHARED;
  4344. open_card.dwPreferredProtocols = SCARD_PROTOCOL_T0;
  4345. open_card.dwActiveProtocol = 0;
  4346. open_card.lpfnConnect = funcConnect;
  4347. open_card.lpfnCheck = funcCheck;
  4348. open_card.lpfnDisconnect = funcDisconnect;
  4349. open_card.hCardHandle = 0;
  4350. GpkLocalUnlock();
  4351. DWORD dwStatus = GetOpenCardName (&open_card);
  4352. DBG_PRINT(TEXT("dwStatus = 0x%08X, open_card.hCardHandle = 0x%08X"), dwStatus, open_card.hCardHandle);
  4353. GpkLocalLock();
  4354. *hCard = open_card.hCardHandle;
  4355. return(dwStatus);
  4356. }
  4357. /* -----------------------------------------------------------------------------
  4358. --------------------------------------------------------------------------------*/
  4359. void ReleaseProvider(HCRYPTPROV hProv)
  4360. {
  4361. BOOL CryptResp;
  4362. DWORD i;
  4363. DWORD dwProto; //[FP]
  4364. /* Release Hash parameters */
  4365. for (i = 1; i <= MAX_TMP_HASH; i++)
  4366. {
  4367. if ((hHashGpk[i].hHashBase != 0) && (hHashGpk[i].hProv == hProv))
  4368. {
  4369. CryptResp = CryptDestroyHash(hHashGpk[i].hHashBase);
  4370. hHashGpk[i].hHashBase = 0;
  4371. hHashGpk[i].hProv = 0;
  4372. }
  4373. }
  4374. /* Release Key parameters */
  4375. for (i = 1; i <= MAX_TMP_KEY; i++)
  4376. {
  4377. if ((TmpObject[i].hKeyBase != 0) && (TmpObject[i].hProv == hProv))
  4378. {
  4379. CryptResp = CryptDestroyKey(TmpObject[i].hKeyBase);
  4380. TmpObject[i].hKeyBase = 0;
  4381. TmpObject[i].hProv = 0;
  4382. }
  4383. }
  4384. ProvCont[hProv].hProv = 0;
  4385. if ((ProvCont[hProv].Flags & CRYPT_VERIFYCONTEXT) &&
  4386. (ProvCont[hProv].isContNameNullBlank))
  4387. {
  4388. }
  4389. else
  4390. {
  4391. // + [FP] if a transaction is opened, close it and reconnect in shared mode
  4392. if (ProvCont[hProv].bCardTransactionOpened)
  4393. {
  4394. // Select_MF(hProv); [FP] PIN not presented
  4395. SCardEndTransaction(ProvCont[hProv].hCard, SCARD_LEAVE_CARD);
  4396. SCardReconnect(ProvCont[hProv].hCard, SCARD_SHARE_SHARED, SCARD_PROTOCOL_T0, SCARD_LEAVE_CARD, &dwProto);
  4397. ProvCont[hProv].bCardTransactionOpened = FALSE;
  4398. }
  4399. // - [FP]
  4400. if (ProvCont[hProv].hRSAKEK != 0)
  4401. {
  4402. CryptDestroyKey( ProvCont[hProv].hRSAKEK );
  4403. ProvCont[hProv].hRSAKEK = 0;
  4404. }
  4405. if (ProvCont[hProv].hRSASign != 0)
  4406. {
  4407. CryptDestroyKey( ProvCont[hProv].hRSASign );
  4408. ProvCont[hProv].hRSASign = 0;
  4409. }
  4410. if (ProvCont[hProv].hCard != 0)
  4411. {
  4412. SCardDisconnect(ProvCont[hProv].hCard, SCARD_LEAVE_CARD);
  4413. ProvCont[hProv].hCard = 0;
  4414. }
  4415. if (countCardContextRef == 0)
  4416. {
  4417. if (hCardContext != 0)
  4418. SCardReleaseContext(hCardContext);
  4419. hCardContext = 0;
  4420. }
  4421. }
  4422. ProvCont[hProv].Flags = 0;
  4423. ProvCont[hProv].isContNameNullBlank = TRUE;
  4424. ProvCont[hProv].hCard = 0;
  4425. ProvCont[hProv].Slot = 0;
  4426. }
  4427. DWORD getAuxMaxKeyLength(HCRYPTPROV hProv)
  4428. {
  4429. BYTE *ptr = 0;
  4430. DWORD i;
  4431. ALG_ID aiAlgid;
  4432. DWORD dwBits;
  4433. BYTE pbData[1000];
  4434. DWORD cbData;
  4435. DWORD dwFlags = 0;
  4436. DWORD maxLength = 0;
  4437. // Enumerate the supported algorithms.
  4438. for (i=0 ; ; i++)
  4439. {
  4440. if (i == 0)
  4441. dwFlags = CRYPT_FIRST;
  4442. else
  4443. dwFlags = 0;
  4444. cbData = 1000;
  4445. if (!CryptGetProvParam(hProv, PP_ENUMALGS, pbData, &cbData, dwFlags))
  4446. break;
  4447. // Extract algorithm information from the �pbData� buffer.
  4448. ptr = pbData;
  4449. aiAlgid = *(ALG_ID UNALIGNED *)ptr;
  4450. ptr += sizeof(ALG_ID);
  4451. dwBits = *(DWORD UNALIGNED *)ptr;
  4452. switch (aiAlgid)
  4453. {
  4454. case CALG_DES: dwBits += 8;
  4455. break;
  4456. case CALG_3DES_112: dwBits += 16;
  4457. break;
  4458. case CALG_3DES: dwBits += 24;
  4459. break;
  4460. }
  4461. if (GET_ALG_CLASS(aiAlgid) == ALG_CLASS_DATA_ENCRYPT)
  4462. {
  4463. maxLength = max(maxLength, dwBits);
  4464. }
  4465. }
  4466. return maxLength;
  4467. }
  4468. /* -----------------------------------------------------------------------------
  4469. [FP] used in the case of PRIVATEKEYBLOB in MyCPImportKey
  4470. --------------------------------------------------------------------------------*/
  4471. BOOL LoadPrivateKey(SCARDHANDLE hCard,
  4472. BYTE Sfi,
  4473. WORD ElementLen,
  4474. CONST BYTE* pbData,
  4475. DWORD dwDataLen
  4476. )
  4477. {
  4478. DWORD lRet;
  4479. /* Load SK APDU command */
  4480. bSendBuffer[0] = 0x80; //CLA
  4481. bSendBuffer[1] = 0x18; //INS
  4482. bSendBuffer[2] = Sfi; //P1
  4483. bSendBuffer[3] = (BYTE)ElementLen; //P2
  4484. bSendBuffer[4] = (BYTE)dwDataLen; //Li
  4485. memcpy(&bSendBuffer[5], pbData, dwDataLen);
  4486. cbSendLength = 5 + dwDataLen;
  4487. cbRecvLength = sizeof(bRecvBuffer);
  4488. lRet = SCardTransmit( hCard, SCARD_PCI_T0, bSendBuffer,
  4489. cbSendLength, 0, bRecvBuffer, &cbRecvLength );
  4490. memset(bSendBuffer, 0, sizeof(bSendBuffer));
  4491. if(SCARDPROBLEM(lRet, 0x9000, 0x00))
  4492. {
  4493. SetLastError(lRet);
  4494. return (FALSE);
  4495. }
  4496. return (TRUE);
  4497. }
  4498. /*******************************************************************************
  4499. * BOOL WINAPI DllMain (HINSTANCE hInstDLL,
  4500. * DWORD fdwRaison,
  4501. * LPVOID lpReserved
  4502. * )
  4503. *
  4504. * Description :
  4505. *
  4506. * Remarks :
  4507. *
  4508. * In :
  4509. *
  4510. * Out :
  4511. *
  4512. * Responses :
  4513. *
  4514. *******************************************************************************/
  4515. BOOL WINAPI DllMain (HINSTANCE hInstDLL,
  4516. DWORD fdwRaison,
  4517. LPVOID lpReserved
  4518. )
  4519. {
  4520. int i;
  4521. BOOL ReturnValue = TRUE;
  4522. switch (fdwRaison)
  4523. {
  4524. case DLL_PROCESS_ATTACH:
  4525. {
  4526. DBG_PRINT(TEXT("DLL_PROCESS_ATTACH [start]..."));
  4527. g_hInstMod = hInstDLL;
  4528. // Allocation of TmpObject, hHashGpk and ProvCont
  4529. TmpObject= (TMP_OBJ*)GMEM_Alloc((MAX_TMP_KEY + 1)*sizeof(TMP_OBJ));
  4530. hHashGpk = (TMP_HASH*)GMEM_Alloc((MAX_TMP_HASH + 1)*sizeof(TMP_HASH));
  4531. ProvCont = (Prov_Context*)GMEM_Alloc((MAX_CONTEXT + 1)*sizeof(Prov_Context));
  4532. if (IsNull(TmpObject) || IsNull(hHashGpk) || IsNull (ProvCont))
  4533. {
  4534. ReturnValue = FALSE;
  4535. break;
  4536. }
  4537. ZeroMemory( ProvCont, (MAX_CONTEXT+1) * sizeof(Prov_Context) );
  4538. ZeroMemory( TmpObject, (MAX_TMP_KEY+1) * sizeof(TMP_OBJ) );
  4539. ZeroMemory( hHashGpk, (MAX_TMP_HASH+1) * sizeof(TMP_HASH) );
  4540. try
  4541. {
  4542. InitializeCriticalSection(&l_csLocalLock);
  4543. }
  4544. catch(...)
  4545. {
  4546. ReturnValue=FALSE;
  4547. }
  4548. DBG_PRINT(TEXT("...[end] DLL_PROCESS_ATTACH"));
  4549. break;
  4550. }
  4551. case DLL_PROCESS_DETACH:
  4552. {
  4553. DBG_PRINT(TEXT("DLL_PROCESS_DETACH [start]..."));
  4554. ReturnValue = TRUE;
  4555. // Deallocation of TmpObject, hHashGpk and ProvCont
  4556. if (TmpObject != 0)
  4557. GMEM_Free(TmpObject);
  4558. if (hHashGpk != 0)
  4559. GMEM_Free(hHashGpk);
  4560. if (ProvCont != 0)
  4561. GMEM_Free(ProvCont);
  4562. for (i=0; i< MAX_SLOT; i++)
  4563. {
  4564. if (Slot[i].CheckThread != NULL)
  4565. {
  4566. // + [FP]
  4567. g_fStopMonitor[i] = TRUE;
  4568. SCardCancel( hCardContextCheck[i] );
  4569. // TerminateThread( Slot[i].CheckThread, 0 );
  4570. // - [FP]
  4571. CloseHandle( Slot[i].CheckThread );
  4572. Slot[i].CheckThread = NULL;
  4573. }
  4574. }
  4575. if (hProvBase != 0)
  4576. {
  4577. CryptDestroyKey(hRsaIdentityKey);
  4578. CryptReleaseContext(hProvBase, 0);
  4579. }
  4580. CC_Exit();
  4581. DeleteCriticalSection(&l_csLocalLock);
  4582. DBG_PRINT(TEXT("...[end] DLL_PROCESS_DETACH"));
  4583. }
  4584. break;
  4585. case DLL_THREAD_ATTACH:
  4586. InterlockedIncrement( &g_threadAttach );
  4587. break;
  4588. case DLL_THREAD_DETACH:
  4589. InterlockedDecrement( &g_threadAttach );
  4590. break;
  4591. }
  4592. return (ReturnValue);
  4593. }
  4594. /* -----------------------------------------------------------------------------
  4595. --------------------------------------------------------------------------------*/
  4596. BOOL InitAcquire()
  4597. {
  4598. BOOL CryptResp;
  4599. DWORD dwIgn, lRet;
  4600. TCHAR szCspName[MAX_STRING];
  4601. TCHAR szCspBaseName[256];
  4602. TCHAR szDictionaryName[256];
  4603. TCHAR szEntry[MAX_STRING];
  4604. HKEY hRegKey;
  4605. int i;
  4606. // Initialize arrays here instead of using static initializers.
  4607. for (i = 0; i < MAX_SLOT; ++i)
  4608. hCardContextCheck[i] = 0;
  4609. for (i = 0; i < MAX_SLOT; ++i)
  4610. InitSlot[i] = FALSE;
  4611. ZeroMemory( Slot, sizeof(Slot) );
  4612. for (i = 0; i < MAX_SLOT; ++i)
  4613. Slot[i].CheckThreadStateEmpty = FALSE;
  4614. OSVERSIONINFO osver;
  4615. HCRYPTPROV hProvTest;
  4616. LoadString(g_hInstMod, IDS_GPKCSP_ENTRY, szEntry, sizeof(szEntry)/sizeof(TCHAR));
  4617. DBG_PRINT(TEXT(" Registry entry: \"%s\"\n"), szEntry );
  4618. lRet = RegCreateKeyEx( HKEY_LOCAL_MACHINE, szEntry, 0, TEXT(""), REG_OPTION_NON_VOLATILE,
  4619. KEY_READ, 0, &hRegKey, &dwIgn );
  4620. // Detect provider available
  4621. CryptResp = CryptAcquireContext( &hProvTest, 0, MS_ENHANCED_PROV, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT );
  4622. if (CryptResp)
  4623. {
  4624. lstrcpy( szCspBaseName, MS_ENHANCED_PROV );
  4625. CryptReleaseContext( hProvTest, 0 );
  4626. }
  4627. else
  4628. {
  4629. lstrcpy( szCspBaseName, MS_DEF_PROV );
  4630. }
  4631. DBG_PRINT(TEXT(" Base CSP provider: \"%s\"\n"), szCspBaseName );
  4632. hProvBase = 0;
  4633. osver.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
  4634. GetVersionEx (&osver);
  4635. if (osver.dwPlatformId==VER_PLATFORM_WIN32_NT && osver.dwMajorVersion > 4)
  4636. {
  4637. CryptResp = CryptAcquireContext( &hProvBase, 0, szCspBaseName, PROV_RSA_FULL,
  4638. CRYPT_VERIFYCONTEXT | CRYPT_MACHINE_KEYSET );
  4639. if (!CryptResp)
  4640. return CRYPT_FAILED;
  4641. }
  4642. else
  4643. {
  4644. LoadString(g_hInstMod, IDS_GPKCSP_NAME, szCspName, sizeof(szCspName)/sizeof(TCHAR));
  4645. CryptResp = CryptAcquireContext( &hProvBase, szCspName, szCspBaseName,
  4646. PROV_RSA_FULL, CRYPT_DELETEKEYSET );
  4647. if (0 != hProvBase)
  4648. {
  4649. CryptReleaseContext(hProvBase, 0);
  4650. }
  4651. LoadString(g_hInstMod, IDS_GPKCSP_NAME, szCspName, sizeof(szCspName)/sizeof(TCHAR));
  4652. CryptResp = CryptAcquireContext( &hProvBase, szCspName, szCspBaseName,
  4653. PROV_RSA_FULL, CRYPT_NEWKEYSET );
  4654. if (!CryptResp)
  4655. return CRYPT_FAILED;
  4656. }
  4657. /* Set a Dummy RSA exchange key in RSA Base */
  4658. CryptResp = CryptImportKey( hProvBase, PrivateBlob, sizeof(PrivateBlob),
  4659. 0, 0, &hRsaIdentityKey );
  4660. if (!CryptResp)
  4661. {
  4662. lRet = GetLastError();
  4663. CryptReleaseContext( hProvBase, 0 );
  4664. RETURN( CRYPT_FAILED, lRet );
  4665. }
  4666. RC2_Key_Size = (BYTE) (Auxiliary_CSP_key_size (CALG_RC2) / 8);
  4667. if (RC2_Key_Size == 0)
  4668. {
  4669. lRet = GetLastError();
  4670. CryptDestroyKey(hRsaIdentityKey); // MV - 13/03/98
  4671. CryptReleaseContext(hProvBase, 0); // MV - 13/03/98
  4672. RETURN( CRYPT_FAILED, lRet );
  4673. }
  4674. RSA_KEK_Size = (BYTE) (Auxiliary_CSP_key_size (CALG_RSA_KEYX) / 8);
  4675. if (RSA_KEK_Size == 0)
  4676. {
  4677. lRet = GetLastError();
  4678. CryptDestroyKey(hRsaIdentityKey); // MV - 13/03/98
  4679. CryptReleaseContext(hProvBase, 0); // MV - 13/03/98
  4680. RETURN( CRYPT_FAILED, lRet );
  4681. }
  4682. AuxMaxSessionKeyLength = getAuxMaxKeyLength(hProvBase) / 8;
  4683. if (AuxMaxSessionKeyLength == 0)
  4684. {
  4685. lRet = GetLastError();
  4686. CryptDestroyKey(hRsaIdentityKey); // MV - 13/03/98
  4687. CryptReleaseContext(hProvBase, 0); // MV - 13/03/98
  4688. RETURN( CRYPT_FAILED, lRet );
  4689. }
  4690. // CARD_LIST UPDATE
  4691. LoadString(g_hInstMod, IDS_GPKCSP_CARDLIST, mszCardList, sizeof(mszCardList)/sizeof(TCHAR));
  4692. DBG_PRINT(TEXT(" Card list entry string: \"%s\"\n"), mszCardList );
  4693. #ifndef UNICODE
  4694. dwIgn = sizeof(mszCardList);
  4695. lRet = RegQueryValueEx( hRegKey, "Card List", 0, 0, (BYTE*)mszCardList, &dwIgn );
  4696. #else
  4697. BYTE bCardList[MAX_PATH];
  4698. DWORD dwCardListLen = MAX_PATH;
  4699. lRet = RegQueryValueEx( hRegKey, TEXT("Card List"), 0, 0, bCardList, &dwCardListLen );
  4700. MultiByteToWideChar( CP_ACP, 0, (char*)bCardList, MAX_PATH, mszCardList, MAX_PATH );
  4701. #endif
  4702. // Find in the base registry the name (and the path) for the dictionary
  4703. DBG_PRINT(TEXT(" Reading dictionary name...\n") );
  4704. #ifndef UNICODE
  4705. dwIgn = sizeof(szDictionaryName);
  4706. lRet = RegQueryValueEx( hRegKey, "X509 Dictionary Name", 0, 0, (BYTE*)szDictionaryName, &dwIgn );
  4707. #else
  4708. BYTE bDictName[256];
  4709. DWORD dwDictNameLen = 256;
  4710. lRet = RegQueryValueEx( hRegKey, TEXT("X509 Dictionary Name"), 0, 0, bDictName, &dwDictNameLen );
  4711. if (lRet == ERROR_SUCCESS)
  4712. {
  4713. // always use the resource dictionary
  4714. lRet = 2;
  4715. //MultiByteToWideChar( CP_ACP, 0, (char*)bDictName, 256, szDictionaryName, 256);
  4716. }
  4717. #endif
  4718. // Try to use registry dict first
  4719. if (lRet == ERROR_SUCCESS && IsNotNull( szDictionaryName ))
  4720. {
  4721. lRet = CC_Init( DICT_FILE, (BYTE*)szDictionaryName );
  4722. if (lRet != RV_SUCCESS)
  4723. lRet = CC_Init( DICT_STANDARD, 0 );
  4724. }
  4725. else
  4726. lRet = CC_Init( DICT_STANDARD, 0 );
  4727. RegCloseKey(hRegKey);
  4728. if (lRet)
  4729. {
  4730. CryptDestroyKey(hRsaIdentityKey);
  4731. CryptReleaseContext(hProvBase, 0);
  4732. RETURN (CRYPT_FAILED, NTE_NOT_FOUND);
  4733. }
  4734. // Key gen time for GPK8000
  4735. g_GPK8000KeyGenTime512 = 0;
  4736. g_GPK8000KeyGenTime1024 = 0;
  4737. lRet = RegCreateKeyEx( HKEY_LOCAL_MACHINE, TEXT("SOFTWARE\\Gemplus\\Cryptography\\SmartCards"),
  4738. 0, TEXT(""), REG_OPTION_NON_VOLATILE, KEY_READ, 0, &hRegKey, 0 );
  4739. if (lRet == ERROR_SUCCESS)
  4740. {
  4741. dwIgn = sizeof(g_GPK8000KeyGenTime512);
  4742. lRet = RegQueryValueEx( hRegKey, TEXT("GPK8000KeyGenTime512"), 0, 0, (BYTE*)&g_GPK8000KeyGenTime512, &dwIgn );
  4743. dwIgn = sizeof(g_GPK8000KeyGenTime1024);
  4744. lRet = RegQueryValueEx( hRegKey, TEXT("GPK8000KeyGenTime1024"), 0, 0, (BYTE*)&g_GPK8000KeyGenTime1024, &dwIgn );
  4745. RegCloseKey(hRegKey);
  4746. }
  4747. RETURN (CRYPT_SUCCEED, 0);
  4748. }
  4749. /* -----------------------------------------------------------------------------
  4750. --------------------------------------------------------------------------------*/
  4751. BOOL LegacyAcquireDeleteKeySet( HCRYPTPROV* phProv,
  4752. const char* szContainer,
  4753. const char* szContainerAsked,
  4754. DWORD BuffFlags )
  4755. {
  4756. BOOL CryptResp;
  4757. //DWORD i;
  4758. DWORD SlotNb;
  4759. SlotNb = ProvCont[*phProv].Slot;
  4760. /*if (Slot[SlotNb].ContextCount > 0)
  4761. {
  4762. fLocked = TRUE;
  4763. }
  4764. else
  4765. {
  4766. // Must have exclusive access to destroy a keyset
  4767. DWORD protocol;
  4768. lRet = SCardReconnect( ProvCont[*phProv].hCard, SCARD_SHARE_EXCLUSIVE,
  4769. SCARD_PROTOCOL_T0, SCARD_LEAVE_CARD, &protocol );
  4770. if (lRet==SCARD_S_SUCCESS)
  4771. fLocked = FALSE;
  4772. else if (lRet==SCARD_E_SHARING_VIOLATION)
  4773. fLocked = TRUE;
  4774. else
  4775. RETURN( CRYPT_FAILED, lRet );
  4776. }
  4777. if (fLocked)
  4778. RETURN( CRYPT_FAILED, SCARD_E_SHARING_VIOLATION );*/
  4779. if (BuffFlags & CRYPT_VERIFYCONTEXT)
  4780. RETURN( CRYPT_FAILED, NTE_BAD_FLAGS );
  4781. if (IsNotNullStr(szContainer))
  4782. {
  4783. // Accept only if the container asked is the same as the one on the card
  4784. // OR if the container asked is NULL (default key set)
  4785. if (IsNotNullStr(szContainerAsked) && strcmp(szContainer, szContainerAsked))
  4786. {
  4787. RETURN( CRYPT_FAILED, NTE_KEYSET_NOT_DEF );
  4788. }
  4789. /* Release Microsoft RSA Base Module */
  4790. //for (i = 1; i <= MAX_GPK_OBJ; i++)
  4791. //{
  4792. // if (Slot[SlotNb].GpkObject[i].hKeyBase != 0)
  4793. // {
  4794. // CryptResp = CryptDestroyKey(Slot[SlotNb].GpkObject[i].hKeyBase);
  4795. // }
  4796. //}
  4797. //ProvCont[*phProv].hRSASign = 0;
  4798. //ProvCont[*phProv].hRSAKEK = 0;
  4799. if (ProvCont[*phProv].hRSAKEK != 0)
  4800. {
  4801. CryptDestroyKey( ProvCont[*phProv].hRSAKEK );
  4802. ProvCont[*phProv].hRSAKEK = 0;
  4803. }
  4804. if (ProvCont[*phProv].hRSASign != 0)
  4805. {
  4806. CryptDestroyKey( ProvCont[*phProv].hRSASign );
  4807. ProvCont[*phProv].hRSASign = 0;
  4808. }
  4809. ProvCont[*phProv].hProv = *phProv;
  4810. ProvCont[*phProv].Flags = BuffFlags;
  4811. if (!PIN_Validation(*phProv))
  4812. return CRYPT_FAILED;
  4813. ProvCont[*phProv].hProv = 0;
  4814. ProvCont[*phProv].Flags = 0;
  4815. CryptResp = init_key_set(*phProv, "");
  4816. if (!CryptResp)
  4817. return CRYPT_FAILED;
  4818. // Update the container name
  4819. strcpy( ProvCont[*phProv].szContainer, "" );
  4820. RETURN( CRYPT_SUCCEED, 0 );
  4821. }
  4822. else
  4823. {
  4824. RETURN( CRYPT_FAILED, NTE_BAD_KEYSET_PARAM );
  4825. }
  4826. }
  4827. // TT 12/10/99: Bug #1454
  4828. void DeleteGPKObject( Slot_Description* pSlot, int i )
  4829. {
  4830. GPK_OBJ* pObject = &pSlot->GpkObject[i];
  4831. int j;
  4832. // Delete object #i
  4833. // Release Microsoft RSA Base Module
  4834. if (pObject->hKeyBase != 0)
  4835. {
  4836. CryptDestroyKey( pObject->hKeyBase );
  4837. pObject->hKeyBase = 0;
  4838. }
  4839. // First free all memory for this object
  4840. for (j=0; j<MAX_FIELD; ++j)
  4841. {
  4842. if (pObject->Field[j].pValue)
  4843. {
  4844. GMEM_Free( pObject->Field[j].pValue );
  4845. pObject->Field[j].pValue = 0;
  4846. pObject->Field[j].Len = 0;
  4847. }
  4848. }
  4849. if (i < pSlot->NbGpkObject)
  4850. {
  4851. // Patch the hole
  4852. memmove( pObject, pObject + 1, (pSlot->NbGpkObject - i) * sizeof(GPK_OBJ) );
  4853. }
  4854. // Clear last object
  4855. ZeroMemory( &pSlot->GpkObject[pSlot->NbGpkObject], sizeof(GPK_OBJ) );
  4856. --pSlot->NbGpkObject;
  4857. }
  4858. // TT: End
  4859. BOOL AcquireDeleteKeySet( HCRYPTPROV* phProv,
  4860. const char* szContainer,
  4861. const char* szContainerAsked,
  4862. DWORD BuffFlags )
  4863. {
  4864. Prov_Context* pContext;
  4865. GPK_OBJ* pKeySet;
  4866. GPK_OBJ* pObject;
  4867. Slot_Description* pSlot;
  4868. BYTE keysetID;
  4869. int i, j, k;
  4870. BYTE* pbBuff1;
  4871. DWORD dwBuff1Len;
  4872. DWORD lRet;
  4873. DWORD SlotNb = ProvCont[*phProv].Slot;
  4874. /*if (Slot[SlotNb].ContextCount > 0)
  4875. {
  4876. fLocked = TRUE;
  4877. }
  4878. else
  4879. {
  4880. // Must have exclusive access to destroy a keyset
  4881. DWORD protocol;
  4882. lRet = SCardReconnect( ProvCont[*phProv].hCard, SCARD_SHARE_EXCLUSIVE,
  4883. SCARD_PROTOCOL_T0, SCARD_LEAVE_CARD, &protocol );
  4884. if (lRet==SCARD_S_SUCCESS)
  4885. fLocked = FALSE;
  4886. else if (lRet==SCARD_E_SHARING_VIOLATION)
  4887. fLocked = TRUE;
  4888. else
  4889. RETURN( CRYPT_FAILED, lRet );
  4890. }
  4891. if (fLocked)
  4892. {
  4893. RETURN( CRYPT_FAILED, SCARD_E_SHARING_VIOLATION );
  4894. }*/
  4895. if (BuffFlags & CRYPT_VERIFYCONTEXT)
  4896. {
  4897. RETURN( CRYPT_FAILED, NTE_BAD_FLAGS );
  4898. }
  4899. pContext = &ProvCont[*phProv];
  4900. pSlot = &Slot[ pContext->Slot ];
  4901. // if default keyset, let's use the first
  4902. // one available =)
  4903. if ( IsNullStr(szContainerAsked) )
  4904. {
  4905. pKeySet = FindFirstKeyset( pSlot );
  4906. }
  4907. else
  4908. {
  4909. // Check if keyset is on the card
  4910. pKeySet = FindKeySet( pSlot, szContainerAsked );
  4911. }
  4912. if (!pKeySet)
  4913. {
  4914. RETURN( CRYPT_FAILED, NTE_KEYSET_NOT_DEF );
  4915. }
  4916. // Must validate PIN to destroy the key objects
  4917. //pContext->hRSASign = 0;
  4918. //pContext->hRSAKEK = 0;
  4919. if (pContext->hRSAKEK != 0)
  4920. {
  4921. CryptDestroyKey( pContext->hRSAKEK );
  4922. pContext->hRSAKEK = 0;
  4923. }
  4924. if (pContext->hRSASign != 0)
  4925. {
  4926. CryptDestroyKey( pContext->hRSASign );
  4927. pContext->hRSASign = 0;
  4928. }
  4929. pContext->hProv = *phProv;
  4930. pContext->Flags = BuffFlags;
  4931. if (!PIN_Validation(*phProv))
  4932. {
  4933. // SetLastError() already used by PIN_Validation()
  4934. return CRYPT_FAILED;
  4935. }
  4936. if (!Read_Priv_Obj(*phProv))
  4937. return CRYPT_FAILED;
  4938. // TT 12/10/99: Bug #1454
  4939. keysetID = pKeySet->Field[POS_ID].pValue[0];
  4940. // Find objects in the keyset and destroy them
  4941. for (i = 1; i <= pSlot->NbGpkObject; ++i)
  4942. {
  4943. pObject = &pSlot->GpkObject[i];
  4944. if (pObject->Flags & FLAG_KEYSET && pObject->Field[POS_KEYSET].pValue[0] == keysetID)
  4945. {
  4946. // If we found a key, "zap it"
  4947. if (pObject->Tag >= TAG_RSA_PUBLIC && pObject->Tag <= TAG_DSA_PRIVATE)
  4948. {
  4949. // Zap all keys with the same FileId
  4950. BYTE FileId = pObject->FileId;
  4951. for (j = 1; j<= pSlot->NbGpkObject; ++j)
  4952. {
  4953. GPK_OBJ* pObj = &pSlot->GpkObject[j];
  4954. if (pObj->Tag >= TAG_RSA_PUBLIC && pObj->Tag <= TAG_DSA_PRIVATE)
  4955. {
  4956. if (pObj->FileId == FileId)
  4957. {
  4958. pObj->Flags &= 0xF000;
  4959. pObj->ObjId = 0xFF;
  4960. // Release the fields
  4961. for (k=0; k<MAX_FIELD; ++k)
  4962. {
  4963. if (pObj->Field[k].pValue)
  4964. {
  4965. GMEM_Free( pObj->Field[k].pValue );
  4966. pObj->Field[k].pValue = 0;
  4967. pObj->Field[k].Len = 0;
  4968. }
  4969. pObj->Field[k].bReal = TRUE;
  4970. }
  4971. pObj->LastField = 0;
  4972. pObj->IsCreated = FALSE; //PYR 00/08/08 ensure that find_gpk_obj_tag_type will still work
  4973. // Release Microsoft RSA Base Module
  4974. //if (pObj->hKeyBase != 0)
  4975. //{
  4976. // CryptDestroyKey( pObj->hKeyBase );
  4977. // pObj->hKeyBase = 0;
  4978. //}
  4979. // PYR 00/08/08. This key becomes available
  4980. pSlot->UseFile[FileId - GPK_FIRST_KEY] = FALSE;
  4981. }
  4982. }
  4983. }
  4984. }
  4985. else
  4986. {
  4987. // Not a key, destroy the object
  4988. DeleteGPKObject( pSlot, i );
  4989. --i;
  4990. }
  4991. }
  4992. }
  4993. // Destroy the keyset object
  4994. DeleteGPKObject( pSlot, (int)(pKeySet - &pSlot->GpkObject[0]) );
  4995. // TT: End
  4996. // TT 12/10/99: Bug #1454 - Update the card
  4997. pbBuff1 = (BYTE*)GMEM_Alloc( MAX_GPK_PUBLIC );
  4998. if (IsNull(pbBuff1))
  4999. {
  5000. RETURN( CRYPT_FAILED, NTE_NO_MEMORY );
  5001. }
  5002. dwBuff1Len = MAX_GPK_PUBLIC;
  5003. if (!prepare_write_gpk_objects (pContext->hProv, pbBuff1, &dwBuff1Len, FALSE))
  5004. {
  5005. lRet = GetLastError();
  5006. GMEM_Free (pbBuff1);
  5007. RETURN( CRYPT_FAILED, lRet );
  5008. }
  5009. if (!write_gpk_objects(pContext->hProv, pbBuff1, dwBuff1Len, TRUE, FALSE))
  5010. {
  5011. lRet = GetLastError();
  5012. GMEM_Free (pbBuff1);
  5013. RETURN( CRYPT_FAILED, lRet );
  5014. }
  5015. GMEM_Free( pbBuff1 );
  5016. pbBuff1 = (BYTE*)GMEM_Alloc( MAX_GPK_PRIVATE );
  5017. if (IsNull(pbBuff1))
  5018. {
  5019. RETURN( CRYPT_FAILED, NTE_NO_MEMORY );
  5020. }
  5021. dwBuff1Len = MAX_GPK_PRIVATE;
  5022. if (!prepare_write_gpk_objects (pContext->hProv, pbBuff1, &dwBuff1Len, TRUE))
  5023. {
  5024. lRet = GetLastError();
  5025. GMEM_Free (pbBuff1);
  5026. RETURN( CRYPT_FAILED, lRet );
  5027. }
  5028. if (!write_gpk_objects(pContext->hProv, pbBuff1, dwBuff1Len, TRUE, TRUE))
  5029. {
  5030. lRet = GetLastError();
  5031. GMEM_Free (pbBuff1);
  5032. RETURN( CRYPT_FAILED, lRet );
  5033. }
  5034. GMEM_Free( pbBuff1 );
  5035. // TT: End
  5036. // Byebye context
  5037. pContext->hProv = 0;
  5038. pContext->Flags = 0;
  5039. pContext->szContainer[0] = 0;
  5040. RETURN( CRYPT_SUCCEED, 0 );
  5041. }
  5042. /* -----------------------------------------------------------------------------
  5043. --------------------------------------------------------------------------------*/
  5044. BOOL LegacyAcquireNewKeySet( IN HCRYPTPROV* phProv,
  5045. OUT char* szContainer,
  5046. IN const char* szContainerAsked,
  5047. IN DWORD BuffFlags )
  5048. {
  5049. BOOL CryptResp, fLocked;
  5050. DWORD i, SlotNb;
  5051. HCRYPTKEY hPubKey;
  5052. // +NK 06.02.2001
  5053. // BYTE bPinValue[PIN_MAX+2];
  5054. DWORD dwPinLength;
  5055. DWORD dwStatus;
  5056. // -
  5057. ProvCont[*phProv].keysetID = 0;
  5058. SlotNb = ProvCont[*phProv].Slot;
  5059. // If another AcquireContext - without its related ReleaseContest -
  5060. // has been done before, this new AcquireContext can not be done
  5061. if (BuffFlags & CRYPT_VERIFYCONTEXT)
  5062. {
  5063. RETURN (CRYPT_FAILED, NTE_BAD_FLAGS);
  5064. }
  5065. /* IN CASE THAT A DELETEKEY IS NOT DONE FOR A RE-ENROLLMENT */
  5066. // Reserve the Provider Context handle since the Acquire Context succeeded
  5067. ProvCont[*phProv].hProv = *phProv;
  5068. ProvCont[*phProv].Flags = BuffFlags;
  5069. if (Slot[SlotNb].InitFlag)
  5070. {
  5071. CryptResp = MyCPGetUserKey(*phProv, AT_KEYEXCHANGE, &hPubKey);
  5072. if (CryptResp)
  5073. {
  5074. RETURN (CRYPT_FAILED, NTE_TOKEN_KEYSET_STORAGE_FULL);
  5075. }
  5076. else
  5077. {
  5078. CryptResp = MyCPGetUserKey(*phProv, AT_SIGNATURE, &hPubKey);
  5079. if (CryptResp)
  5080. {
  5081. RETURN (CRYPT_FAILED, NTE_TOKEN_KEYSET_STORAGE_FULL);
  5082. }
  5083. }
  5084. }
  5085. // If another AcquireContext - without its related ReleaseContest -
  5086. // has been done before, this new AcquireContext can not be done
  5087. // {DCB} -- It's possible that the application that marked this busy
  5088. // exited without calling CryptReleaseContext. Hence, it's
  5089. // possible that this check will fail even if no one else
  5090. // is using the card. By making this check last, we reduce
  5091. // the likelyhood that this bug is encountered.
  5092. fLocked = FALSE;
  5093. if (fLocked)
  5094. {
  5095. RETURN (CRYPT_FAILED, SCARD_E_SHARING_VIOLATION);
  5096. }
  5097. // +NK 06.02.2001
  5098. // if ((BuffFlags & CRYPT_SILENT) && (IsNullStr(Slot[SlotNb].GetPin())))
  5099. dwStatus = Query_MSPinCache( Slot[SlotNb].hPinCacheHandle,
  5100. NULL,
  5101. &dwPinLength );
  5102. if ( (dwStatus != ERROR_SUCCESS) && (dwStatus != ERROR_EMPTY) )
  5103. RETURN (CRYPT_FAILED, dwStatus);
  5104. if ((BuffFlags & CRYPT_SILENT) && (dwStatus == ERROR_EMPTY))
  5105. // -
  5106. {
  5107. RETURN (CRYPT_FAILED, NTE_SILENT_CONTEXT);
  5108. }
  5109. if (!PIN_Validation(*phProv))
  5110. return CRYPT_FAILED;
  5111. /* If the PIN code can be or has been entered, read the description of the
  5112. private key parameters*/
  5113. CspFlags = BuffFlags;
  5114. if (IsNullStr(szContainerAsked))
  5115. {
  5116. // no szContainerAsked is specified, create the keyset object with default name
  5117. CryptResp = init_key_set(*phProv, CSP_DEFAULTKEYSETNAME);
  5118. }
  5119. else
  5120. {
  5121. CryptResp = init_key_set(*phProv, szContainerAsked);
  5122. }
  5123. if (!CryptResp)
  5124. return CRYPT_FAILED;
  5125. if (PublicEFExists(*phProv))
  5126. {
  5127. for (i = 1; i <= Slot[SlotNb].NbGpkObject; i++)
  5128. {
  5129. if ((Slot[SlotNb].GpkObject[i].Tag == TAG_RSA_PUBLIC)||
  5130. (Slot[SlotNb].GpkObject[i].Tag == TAG_RSA_PRIVATE))
  5131. {
  5132. read_gpk_pub_key(*phProv, i, &(Slot[SlotNb].GpkObject[i].PubKey));
  5133. }
  5134. }
  5135. }
  5136. else
  5137. {
  5138. for (i = 1; i <= Slot[SlotNb].NbGpkObject; i++)
  5139. {
  5140. if ((Slot[SlotNb].GpkObject[i].Tag == TAG_RSA_PUBLIC)||
  5141. (Slot[SlotNb].GpkObject[i].Tag == TAG_RSA_PRIVATE))
  5142. {
  5143. Slot[SlotNb].GpkObject[i].PubKey.KeySize = 0;
  5144. }
  5145. }
  5146. }
  5147. // Update the container name
  5148. if (IsNullStr(szContainerAsked))
  5149. {
  5150. // no szContainerAsked is specified, use default name
  5151. strcpy( szContainer, CSP_DEFAULTKEYSETNAME );
  5152. }
  5153. else
  5154. {
  5155. strcpy( szContainer, szContainerAsked );
  5156. }
  5157. Slot[SlotNb].ContextCount++;
  5158. countCardContextRef++;
  5159. ProvCont[*phProv].keysetID = 0xFF;
  5160. RETURN (CRYPT_SUCCEED, 0);
  5161. }
  5162. BOOL CreateKeyset( HCRYPTPROV hProv, Slot_Description* pSlot, LPCSTR szName, BYTE* pKeySetID )
  5163. {
  5164. GPK_OBJ* pObject;
  5165. BYTE* pbBuff1;
  5166. DWORD dwBuff1Len;
  5167. int lRet;
  5168. BYTE keysetID;
  5169. int i, len;
  5170. *pKeySetID = 0;
  5171. if (pSlot->NbGpkObject >= MAX_GPK_OBJ)
  5172. {
  5173. RETURN (CRYPT_FAILED, NTE_NO_MEMORY);
  5174. }
  5175. pObject = &pSlot->GpkObject[ pSlot->NbGpkObject + 1 ];
  5176. ZeroMemory( pObject, sizeof(*pObject) );
  5177. // Find an unused keyset ID
  5178. for (keysetID = 1; keysetID < 0xFF; ++keysetID)
  5179. {
  5180. if (FindKeySetByID( pSlot, keysetID ) == 0)
  5181. break; // Found one =)
  5182. }
  5183. if (keysetID == 0xFF)
  5184. {
  5185. RETURN (CRYPT_FAILED, NTE_NO_MEMORY);
  5186. }
  5187. // Now initialize the fields
  5188. for (i=0; i<MAX_FIELD; ++i)
  5189. pObject->Field[i].bReal = TRUE;
  5190. pObject->Tag = TAG_KEYSET;
  5191. pObject->Flags = FLAG_ID | FLAG_LABEL;
  5192. pObject->ObjId = pSlot->NbGpkObject + 1;
  5193. pObject->IsPrivate = FALSE;
  5194. // Keyset ID
  5195. pObject->Field[POS_ID].Len = 1;
  5196. pObject->Field[POS_ID].pValue = (BYTE*)GMEM_Alloc( 1 );
  5197. if(IsNull(pObject->Field[POS_ID].pValue))
  5198. {
  5199. RETURN (CRYPT_FAILED, NTE_NO_MEMORY);
  5200. }
  5201. pObject->Field[POS_ID].pValue[0] = keysetID;
  5202. // Keyset name
  5203. len = strlen( szName );
  5204. pObject->Field[POS_LABEL].Len = (WORD)len;
  5205. pObject->Field[POS_LABEL].pValue = (BYTE*)GMEM_Alloc( len );
  5206. if(IsNull(pObject->Field[POS_LABEL].pValue))
  5207. {
  5208. RETURN (CRYPT_FAILED, NTE_NO_MEMORY);
  5209. }
  5210. memcpy( pObject->Field[POS_LABEL].pValue, szName, len );
  5211. // One more object!
  5212. ++(pSlot->NbGpkObject);
  5213. *pKeySetID = keysetID;
  5214. // TT 29/09/99: Save the keyset object =)
  5215. pbBuff1 = (BYTE*)GMEM_Alloc(MAX_GPK_PUBLIC);
  5216. if (IsNull(pbBuff1))
  5217. {
  5218. RETURN (CRYPT_FAILED, NTE_NO_MEMORY);
  5219. }
  5220. dwBuff1Len = MAX_GPK_PUBLIC;
  5221. if (!prepare_write_gpk_objects (hProv, pbBuff1, &dwBuff1Len, FALSE))
  5222. {
  5223. lRet = GetLastError();
  5224. GMEM_Free (pbBuff1);
  5225. RETURN (CRYPT_FAILED, lRet);
  5226. }
  5227. if (!write_gpk_objects(hProv, pbBuff1, dwBuff1Len, FALSE, FALSE))
  5228. {
  5229. lRet = GetLastError();
  5230. GMEM_Free (pbBuff1);
  5231. RETURN (CRYPT_FAILED, lRet);
  5232. }
  5233. GMEM_Free (pbBuff1);
  5234. // TT - END -
  5235. RETURN( CRYPT_SUCCEED, 0 );
  5236. }
  5237. BOOL AcquireNewKeySet( IN HCRYPTPROV* phProv,
  5238. OUT char* szContainer,
  5239. IN const char* szContainerAsked,
  5240. DWORD BuffFlags )
  5241. {
  5242. Slot_Description* pSlot;
  5243. int SlotNb;
  5244. SlotNb = ProvCont[*phProv].Slot;
  5245. pSlot = &Slot[SlotNb];
  5246. ProvCont[*phProv].keysetID = 0;
  5247. // If another AcquireContext - without its related ReleaseContest -
  5248. // has been done before, this new AcquireContext can not be done
  5249. if (BuffFlags & CRYPT_VERIFYCONTEXT)
  5250. {
  5251. RETURN( CRYPT_FAILED, NTE_BAD_FLAGS );
  5252. }
  5253. // Check if keyset already exist on the card
  5254. if (FindKeySet( pSlot, szContainerAsked ))
  5255. {
  5256. RETURN( CRYPT_FAILED, NTE_EXISTS );
  5257. }
  5258. // Reserve the Provider Context handle since the Acquire Context succeeded
  5259. ProvCont[*phProv].hProv = *phProv;
  5260. ProvCont[*phProv].Flags = BuffFlags;
  5261. CspFlags = BuffFlags;
  5262. if (IsNullStr(szContainerAsked))
  5263. {
  5264. // no szContainerAsked is specified, create the keyset object with default name
  5265. if (!CreateKeyset( *phProv, pSlot, CSP_DEFAULTKEYSETNAME, &ProvCont[*phProv].keysetID ))
  5266. {
  5267. return FALSE;
  5268. }
  5269. // Update the container name
  5270. strcpy( szContainer, CSP_DEFAULTKEYSETNAME );
  5271. }
  5272. else
  5273. {
  5274. // Create the keyset object
  5275. if (!CreateKeyset( *phProv, pSlot, szContainerAsked, &ProvCont[*phProv].keysetID ))
  5276. {
  5277. return FALSE;
  5278. }
  5279. // Update the container name
  5280. strcpy( szContainer, szContainerAsked );
  5281. }
  5282. ++(pSlot->ContextCount);
  5283. ++countCardContextRef;
  5284. RETURN( CRYPT_SUCCEED, 0 );
  5285. }
  5286. /* -----------------------------------------------------------------------------
  5287. --------------------------------------------------------------------------------*/
  5288. BOOL LegacyAcquireUseKeySet( HCRYPTPROV* phProv,
  5289. const char* szContainer,
  5290. const char* szContainerAsked,
  5291. DWORD BuffFlags )
  5292. {
  5293. BOOL CryptResp;
  5294. HCRYPTKEY hPubKey;
  5295. DWORD SlotNb;
  5296. SlotNb = ProvCont[*phProv].Slot;
  5297. ProvCont[*phProv].keysetID = 0;
  5298. if (IsNullStr(szContainer))
  5299. {
  5300. RETURN( CRYPT_FAILED, NTE_KEYSET_NOT_DEF );
  5301. }
  5302. // Accept only if the container asked is the same as the one on the card
  5303. // OR if the container asked is NULL and a reader is specified (SECURE LOGON)
  5304. if (IsNotNullStr(szContainerAsked) && strcmp(szContainer, szContainerAsked))
  5305. {
  5306. RETURN( CRYPT_FAILED, NTE_BAD_KEYSET );
  5307. }
  5308. // Reserve the Provider Context handle since the Acquire Context succeeded
  5309. ProvCont[*phProv].hProv = *phProv;
  5310. ProvCont[*phProv].Flags = BuffFlags;
  5311. hPubKey = 0;
  5312. CryptResp = MyCPGetUserKey(*phProv, AT_KEYEXCHANGE, &hPubKey);
  5313. // Copy the key into the RSA Base, if the key exists AND it has not been imported
  5314. // previously
  5315. if ((CryptResp) && (hPubKey != 0) && (ProvCont[*phProv].hRSAKEK == 0))
  5316. {
  5317. if (!copy_gpk_key(*phProv, hPubKey, AT_KEYEXCHANGE))
  5318. return CRYPT_FAILED;
  5319. }
  5320. hPubKey = 0;
  5321. CryptResp = MyCPGetUserKey(*phProv, AT_SIGNATURE, &hPubKey);
  5322. // Copy the key into the RSA Base, if the key exists AND it has not been imported
  5323. // previously
  5324. if (CryptResp && hPubKey!=0 && ProvCont[*phProv].hRSASign==0)
  5325. {
  5326. if (!copy_gpk_key(*phProv, hPubKey, AT_SIGNATURE))
  5327. return CRYPT_FAILED;
  5328. }
  5329. Slot[SlotNb].ContextCount++;
  5330. countCardContextRef++;
  5331. ProvCont[*phProv].keysetID = 0xFF;
  5332. RETURN( CRYPT_SUCCEED, 0 );
  5333. }
  5334. BOOL AcquireUseKeySet( HCRYPTPROV* phProv,
  5335. const char* szContainer,
  5336. const char* szContainerAsked,
  5337. DWORD BuffFlags )
  5338. {
  5339. BOOL CryptResp;
  5340. HCRYPTKEY hPubKey;
  5341. DWORD SlotNb;
  5342. GPK_OBJ* pKeySet;
  5343. SlotNb = ProvCont[*phProv].Slot;
  5344. ProvCont[*phProv].keysetID = 0;
  5345. // Secure logon doesn't specify a keyset name, let's use the first
  5346. // one available =)
  5347. if ( IsNullStr(szContainerAsked) )
  5348. {
  5349. pKeySet = FindFirstKeyset( &Slot[SlotNb] );
  5350. }
  5351. else
  5352. {
  5353. // Check if keyset is on the card
  5354. pKeySet = FindKeySet( &Slot[SlotNb], szContainerAsked );
  5355. }
  5356. if (pKeySet==0)
  5357. {
  5358. RETURN( CRYPT_FAILED, NTE_KEYSET_NOT_DEF );
  5359. }
  5360. // Found the container...
  5361. memcpy( ProvCont[*phProv].szContainer, (char*)pKeySet->Field[POS_LABEL].pValue,
  5362. pKeySet->Field[POS_LABEL].Len );
  5363. // Reserve the Provider Context handle since the Acquire Context succeeded
  5364. ProvCont[*phProv].hProv = *phProv;
  5365. ProvCont[*phProv].Flags = BuffFlags;
  5366. ProvCont[*phProv].keysetID = pKeySet->Field[POS_ID].pValue[0];
  5367. hPubKey = 0;
  5368. CryptResp = MyCPGetUserKey(*phProv, AT_KEYEXCHANGE, &hPubKey);
  5369. // Copy the key into the RSA Base, if the key exists AND it has not been imported
  5370. // previously
  5371. if ((CryptResp) && (hPubKey != 0) && (ProvCont[*phProv].hRSAKEK == 0))
  5372. {
  5373. if (!copy_gpk_key(*phProv, hPubKey, AT_KEYEXCHANGE))
  5374. {
  5375. return CRYPT_FAILED;
  5376. }
  5377. }
  5378. hPubKey = 0;
  5379. CryptResp = MyCPGetUserKey(*phProv, AT_SIGNATURE, &hPubKey);
  5380. // Copy the key into the RSA Base, if the key exists AND it has not been imported
  5381. // previously
  5382. if ((CryptResp) && (hPubKey != 0) && (ProvCont[*phProv].hRSASign == 0))
  5383. {
  5384. if (!copy_gpk_key(*phProv, hPubKey, AT_SIGNATURE))
  5385. {
  5386. return CRYPT_FAILED;
  5387. }
  5388. }
  5389. Slot[SlotNb].ContextCount++;
  5390. countCardContextRef++;
  5391. RETURN( CRYPT_SUCCEED, 0 );
  5392. }
  5393. /*
  5394. - MyCPAcquireContext
  5395. -
  5396. * Purpose:
  5397. * The CPAcquireContext function is used to acquire a context
  5398. * handle to a cryptograghic service provider (CSP).
  5399. *
  5400. *
  5401. * Parameters:
  5402. * OUT phProv - Handle to a CSP
  5403. * OUT pszIdentity - Pointer to a string which is the
  5404. * identity of the logged on user
  5405. * IN dwFlags - Flags values
  5406. * IN pVTable - Pointer to table of function pointers
  5407. *
  5408. * Returns:
  5409. */
  5410. BOOL WINAPI MyCPAcquireContext(OUT HCRYPTPROV *phProv,
  5411. IN LPCSTR pszContainer,
  5412. IN DWORD dwFlags,
  5413. IN PVTableProvStruc pVTable
  5414. )
  5415. {
  5416. SCARD_READERSTATE ReaderState;
  5417. DWORD dwStatus;
  5418. DWORD dwProto, ind, ind2;
  5419. DWORD BuffFlags;
  5420. DWORD lRet;
  5421. DWORD SlotNb;
  5422. BOOL CryptResp;
  5423. char szContainerAsked[MAX_PATH];
  5424. TCHAR szReaderName[512],
  5425. szReaderFriendlyName[512],
  5426. szModulePath[MAX_PATH],
  5427. szCspTitle[MAX_STRING],
  5428. szCspText[MAX_STRING];
  5429. *phProv = 0;
  5430. if (IsNull(hFirstInstMod))
  5431. {
  5432. hFirstInstMod = g_hInstMod;
  5433. dwStatus = GetModuleFileName( g_hInstMod, szModulePath, sizeof(szModulePath)/sizeof(TCHAR) );
  5434. if (dwStatus)
  5435. LoadLibrary(szModulePath);
  5436. }
  5437. if (bFirstGUILoad)
  5438. {
  5439. bFirstGUILoad = FALSE;
  5440. dwStatus = GetModuleFileName( g_hInstMod, szModulePath, sizeof(szModulePath)/sizeof(TCHAR) );
  5441. if (dwStatus)
  5442. {
  5443. #ifdef MS_BUILD
  5444. // Microsoft uses "gpkrsrc.dll"
  5445. _tcscpy(&szModulePath[_tcslen(szModulePath) - 7], TEXT("rsrc.dll"));
  5446. #else
  5447. // Gemplus uses "gpkgui.dll"
  5448. _tcscpy(&szModulePath[_tcslen(szModulePath) - 7], TEXT("gui.dll"));
  5449. #endif
  5450. DBG_PRINT(TEXT("Trying to load resource DLL: \"%s\""), szModulePath );
  5451. g_hInstRes = LoadLibrary(szModulePath);
  5452. DBG_PRINT(TEXT("Result is g_hInstRes = %08x, error is %08x"), g_hInstRes, (g_hInstRes) ? GetLastError(): 0 );
  5453. if (IsNull(g_hInstRes))
  5454. {
  5455. if (!(dwFlags & CRYPT_SILENT))
  5456. {
  5457. LoadString(g_hInstMod, IDS_GPKCSP_TITLE, szCspTitle, sizeof(szCspTitle)/sizeof(TCHAR));
  5458. LoadString(g_hInstMod, IDS_GPKCSP_NOGUI, szCspText, sizeof(szCspText)/sizeof(TCHAR));
  5459. MessageBox(0, szCspText, szCspTitle, MB_OK | MB_ICONEXCLAMATION);
  5460. }
  5461. RETURN( CRYPT_FAILED, NTE_PROVIDER_DLL_FAIL );
  5462. }
  5463. }
  5464. else
  5465. {
  5466. if (!(dwFlags & CRYPT_SILENT))
  5467. {
  5468. LoadString(g_hInstMod, IDS_GPKCSP_TITLE, szCspTitle, sizeof(szCspTitle)/sizeof(TCHAR));
  5469. LoadString(g_hInstMod, IDS_GPKCSP_NOGUI, szCspText, sizeof(szCspText)/sizeof(TCHAR));
  5470. MessageBox(0, szCspText, szCspTitle, MB_OK | MB_ICONEXCLAMATION);
  5471. }
  5472. RETURN( CRYPT_FAILED, NTE_PROVIDER_DLL_FAIL );
  5473. }
  5474. }
  5475. g_hMainWnd = 0;
  5476. if (pVTable)
  5477. {
  5478. if (pVTable->FuncReturnhWnd != 0)
  5479. {
  5480. // cspdk.h doesn't define the calling convention properly
  5481. typedef void (__stdcall *STDCALL_CRYPT_RETURN_HWND)(HWND *phWnd);
  5482. STDCALL_CRYPT_RETURN_HWND pfnFuncRreturnhWnd = (STDCALL_CRYPT_RETURN_HWND)pVTable->FuncReturnhWnd;
  5483. pfnFuncRreturnhWnd( &g_hMainWnd );
  5484. }
  5485. }
  5486. // If it is the first AcquireContext done by the application, then
  5487. // prepare the RSA BASE and initialize some variables;
  5488. if (hProvBase == 0)
  5489. {
  5490. CryptResp = InitAcquire();
  5491. if (!CryptResp)
  5492. return CRYPT_FAILED;
  5493. }
  5494. BuffFlags = dwFlags;
  5495. if (dwFlags & CRYPT_VERIFYCONTEXT)
  5496. dwFlags = dwFlags^CRYPT_VERIFYCONTEXT;
  5497. if (dwFlags & CRYPT_SILENT)
  5498. dwFlags = dwFlags^CRYPT_SILENT;
  5499. if (dwFlags & CRYPT_MACHINE_KEYSET) // This flag is ignored by this CSP
  5500. dwFlags = dwFlags^CRYPT_MACHINE_KEYSET;
  5501. // Parse the container name
  5502. ZeroMemory( szReaderFriendlyName, sizeof(szReaderFriendlyName) );
  5503. ZeroMemory( szContainerAsked, sizeof(szContainerAsked) );
  5504. if (IsNotNull (pszContainer))
  5505. {
  5506. ind = 0;
  5507. if (pszContainer[ind] == '\\')
  5508. {
  5509. ind = 4;
  5510. while ((pszContainer[ind] != 0x00) && (pszContainer[ind] != '\\'))
  5511. {
  5512. szReaderFriendlyName[ind-4] = pszContainer[ind];
  5513. ind++;
  5514. }
  5515. if (pszContainer[ind] == '\\')
  5516. {
  5517. ind++;
  5518. }
  5519. }
  5520. ind2 = 0;
  5521. while ((pszContainer[ind] != 0x00) && (ind2<sizeof(szContainerAsked)-1))
  5522. {
  5523. szContainerAsked[ind2] = pszContainer[ind];
  5524. ind++;
  5525. ind2++;
  5526. }
  5527. }
  5528. // Find a free handle for this new AcquireContext
  5529. *phProv = find_context_free();
  5530. if (*phProv == 0)
  5531. {
  5532. RETURN (CRYPT_FAILED, NTE_NO_MEMORY);
  5533. }
  5534. ProvCont[*phProv].isContNameNullBlank = IsNullStr(pszContainer); // [mv - 15/05/98]
  5535. ProvCont[*phProv].bCardTransactionOpened = FALSE; // [FP]
  5536. if ((BuffFlags & CRYPT_VERIFYCONTEXT) && (ProvCont[*phProv].isContNameNullBlank)) // [mv - 15/05/98]
  5537. {
  5538. // return a velid handle, but without any access to the card
  5539. ProvCont[*phProv].hProv = *phProv;
  5540. ProvCont[*phProv].Flags = BuffFlags;
  5541. RETURN( CRYPT_SUCCEED, 0 );
  5542. }
  5543. else
  5544. {
  5545. /* Calais IRM Establish Context */
  5546. if (hCardContext == 0) // mv
  5547. {
  5548. lRet = SCardEstablishContext( SCARD_SCOPE_SYSTEM, 0, 0, &hCardContext );
  5549. if (SCARDPROBLEM(lRet,0x0000,0xFF))
  5550. {
  5551. hCardContext = 0;
  5552. countCardContextRef = 0;
  5553. ReleaseProvider(*phProv);
  5554. *phProv = 0;
  5555. RETURN( CRYPT_FAILED, lRet );
  5556. }
  5557. }
  5558. #if (_WIN32_WINNT < 0x0500)
  5559. // Read the reader list
  5560. char* pAllocatedBuff = 0;
  5561. __try
  5562. {
  5563. static s_bInit = false;
  5564. if (!s_bInit)
  5565. {
  5566. DWORD i, BuffLength;
  5567. char* Buff;
  5568. lRet = SCardListReaders(hCardContext, 0, 0, &BuffLength);
  5569. if (SCARDPROBLEM(lRet,0x0000,0xFF))
  5570. {
  5571. ReleaseProvider(*phProv);
  5572. *phProv = 0;
  5573. RETURN( CRYPT_FAILED, lRet );
  5574. }
  5575. pAllocatedBuff = (char*)GMEM_Alloc(BuffLength);
  5576. if (pAllocatedBuff == 0)
  5577. {
  5578. ReleaseProvider(*phProv);
  5579. *phProv = 0;
  5580. RETURN( CRYPT_FAILED, NTE_NO_MEMORY );
  5581. }
  5582. Buff = pAllocatedBuff;
  5583. lRet = SCardListReaders(hCardContext, 0, Buff, &BuffLength);
  5584. if (SCARDPROBLEM(lRet,0x0000,0xFF))
  5585. {
  5586. ReleaseProvider(*phProv);
  5587. *phProv = 0;
  5588. RETURN( CRYPT_FAILED, lRet );
  5589. }
  5590. i = 0;
  5591. while (strlen(Buff) != 0 && i < MAX_SLOT)
  5592. {
  5593. ZeroMemory( Slot[i].szReaderName, sizeof(Slot[i].szReaderName) );
  5594. strncpy(Slot[i].szReaderName, Buff, (sizeof(Slot[i].szReaderName)/sizeof(TCHAR))-1);
  5595. Slot[i].szReaderName[(sizeof(Slot[i].szReaderName)/sizeof(TCHAR))-1]=0;
  5596. Buff = Buff + strlen(Buff) + 1;
  5597. i++;
  5598. }
  5599. if (strlen(Buff) != 0)
  5600. {
  5601. ReleaseProvider(*phProv);
  5602. *phProv = 0;
  5603. RETURN( CRYPT_FAILED, NTE_FAIL );
  5604. }
  5605. for (; i < MAX_SLOT; i++)
  5606. {
  5607. ZeroMemory( Slot[i].szReaderName, sizeof(Slot[i].szReaderName) );
  5608. }
  5609. s_bInit = true;
  5610. }
  5611. }
  5612. __finally
  5613. {
  5614. if (pAllocatedBuff)
  5615. {
  5616. GMEM_Free( pAllocatedBuff );
  5617. pAllocatedBuff = 0;
  5618. }
  5619. }
  5620. // If the ReaderFriendlyName is NULL, scan the list of readers to find the one
  5621. // containing the container key set that is looked for.
  5622. // This fix is to work around the bug on the
  5623. // OPEN_CARD - Ressource Manager v1.0 (NT4, Win 95) -
  5624. if (!IsWin2000() && IsNullStr(szReaderFriendlyName))
  5625. {
  5626. SCARDHANDLE hCard;
  5627. int NbMatch = 0;
  5628. GpkLocalUnlock();
  5629. __try
  5630. {
  5631. DWORD i;
  5632. char szSlotReaderName[512];
  5633. for (i = 0; i < MAX_SLOT; i++)
  5634. {
  5635. strncpy(szSlotReaderName, Slot[i].szReaderName, sizeof(szSlotReaderName)-1);
  5636. szSlotReaderName[sizeof(szSlotReaderName)-1]=0;
  5637. if (IsNotNullStr (szSlotReaderName))
  5638. {
  5639. hCard = funcConnect (hCardContext, szSlotReaderName, mszCardList, 0);
  5640. if (hCard != 0)
  5641. {
  5642. //if (SCardBeginTransaction(hCard) == SCARD_S_SUCCESS)
  5643. //{
  5644. if (funcCheck (hCardContext, hCard, szContainerAsked))
  5645. {
  5646. strncpy (szReaderFriendlyName, szSlotReaderName, (sizeof(szReaderFriendlyName)/sizeof(TCHAR))-1);
  5647. szReaderFriendlyName[(sizeof(szReaderFriendlyName)/sizeof(TCHAR))-1]=0;
  5648. NbMatch++;
  5649. }
  5650. // SCardEndTransaction(hCard, SCARD_LEAVE_CARD);
  5651. //}
  5652. funcDisconnect (hCardContext, hCard, 0);
  5653. }
  5654. }
  5655. }
  5656. }
  5657. __finally
  5658. {
  5659. GpkLocalLock();
  5660. }
  5661. // If there are more than one match, the user has to chose
  5662. if (NbMatch != 1)
  5663. {
  5664. ZeroMemory( szReaderFriendlyName, sizeof(szReaderFriendlyName) );
  5665. }
  5666. }
  5667. #endif // (_WIN32_WINNT < 0x0500)
  5668. if (IsNullStr(szReaderFriendlyName))
  5669. {
  5670. SCARDHANDLE hCard = 0;
  5671. dwStatus = OpenCard(szContainerAsked, BuffFlags, &hCard, szReaderName, sizeof(szReaderName)/sizeof(TCHAR));
  5672. if ((hCard == 0) || (dwStatus != SCARD_S_SUCCESS))
  5673. {
  5674. ReleaseProvider(*phProv);
  5675. *phProv = 0;
  5676. RETURN (CRYPT_FAILED, dwStatus);
  5677. }
  5678. ProvCont[*phProv].hCard = hCard;
  5679. ReaderState.szReader = szReaderName;
  5680. ReaderState.dwCurrentState = SCARD_STATE_UNAWARE;
  5681. SCardGetStatusChange(hCardContext, 1, &ReaderState, 1);
  5682. _tcscpy(szReaderName, ReaderState.szReader);
  5683. if (!find_reader (&(ProvCont[*phProv].Slot), szReaderName))
  5684. {
  5685. ReleaseProvider(*phProv);
  5686. *phProv = 0;
  5687. RETURN( CRYPT_FAILED, SCARD_E_READER_UNAVAILABLE );
  5688. }
  5689. }
  5690. else
  5691. {
  5692. DWORD dwSts = ConnectToCard( szReaderFriendlyName,
  5693. SCARD_SHARE_SHARED, SCARD_PROTOCOL_T0,
  5694. &ProvCont[*phProv].hCard, &dwProto );
  5695. if (dwSts != SCARD_S_SUCCESS)
  5696. {
  5697. ReleaseProvider(*phProv);
  5698. *phProv = 0;
  5699. RETURN( CRYPT_FAILED, dwSts );
  5700. }
  5701. ReaderState.szReader = szReaderFriendlyName;
  5702. ReaderState.dwCurrentState = SCARD_STATE_UNAWARE;
  5703. SCardGetStatusChange(hCardContext, 1, &ReaderState, 1);
  5704. _tcscpy(szReaderName, ReaderState.szReader);
  5705. if (!find_reader (&(ProvCont[*phProv].Slot), szReaderFriendlyName))
  5706. {
  5707. ReleaseProvider(*phProv);
  5708. *phProv = 0;
  5709. RETURN( CRYPT_FAILED, SCARD_E_READER_UNAVAILABLE );
  5710. }
  5711. }
  5712. // Now we know which reader is used. start a thread to check that reader if necessary
  5713. lRet = BeginTransaction(ProvCont[*phProv].hCard);
  5714. if (lRet != SCARD_S_SUCCESS)
  5715. {
  5716. ReleaseProvider(*phProv);
  5717. *phProv = 0;
  5718. RETURN (CRYPT_FAILED, lRet);
  5719. }
  5720. SlotNb = ProvCont[*phProv].Slot;
  5721. InitializeSlot( SlotNb );
  5722. // TT 30/07/99
  5723. lRet = DetectGPK8000( ProvCont[*phProv].hCard, &ProvCont[*phProv].bGPK8000 );
  5724. if (lRet != SCARD_S_SUCCESS)
  5725. {
  5726. SCardEndTransaction(ProvCont[*phProv].hCard, SCARD_LEAVE_CARD);
  5727. ReleaseProvider(*phProv);
  5728. *phProv = 0;
  5729. RETURN (CRYPT_FAILED, lRet );
  5730. }
  5731. ProvCont[*phProv].bLegacyKeyset = FALSE;
  5732. // TT: END
  5733. ProvCont[*phProv].hRSASign = 0;
  5734. ProvCont[*phProv].hRSAKEK = 0;
  5735. ProvCont[*phProv].keysetID = 0xFF; // TT: GPK8000 support
  5736. ProvCont[*phProv].bGPK_ISO_DF = FALSE;
  5737. ProvCont[*phProv].dataUnitSize = 0;
  5738. ProvCont[*phProv].bDisconnected = FALSE;
  5739. if (!Select_MF(*phProv))
  5740. {
  5741. // [FP] +
  5742. DBG_PRINT(TEXT("Try to reconnect"));
  5743. //DWORD dwProto;
  5744. lRet = SCardReconnect(ProvCont[*phProv].hCard, SCARD_SHARE_SHARED, SCARD_PROTOCOL_T0 | SCARD_PROTOCOL_T1, SCARD_RESET_CARD, &dwProto);
  5745. if (lRet != SCARD_S_SUCCESS) RETURN (CRYPT_FAILED, lRet);
  5746. DBG_PRINT(TEXT("Try Select_MF again"));
  5747. if (!Select_MF(*phProv))
  5748. {
  5749. DBG_PRINT(TEXT("Second Select_MF fails"));
  5750. // [FP] -
  5751. lRet = GetLastError();
  5752. SCardEndTransaction(ProvCont[*phProv].hCard, SCARD_LEAVE_CARD);
  5753. ReleaseProvider(*phProv);
  5754. *phProv = 0;
  5755. RETURN( CRYPT_FAILED, lRet );
  5756. }
  5757. }
  5758. // Read Serial number to store it
  5759. bSendBuffer[0] = 0x80; //CLA
  5760. bSendBuffer[1] = 0xC0; //INS
  5761. bSendBuffer[2] = 0x02; //P1
  5762. bSendBuffer[3] = 0xA0; //P2
  5763. bSendBuffer[4] = 0x08; //Lo
  5764. cbSendLength = 5;
  5765. cbRecvLength = sizeof(bRecvBuffer);
  5766. lRet = SCardTransmit(ProvCont[*phProv].hCard,
  5767. SCARD_PCI_T0,
  5768. bSendBuffer,
  5769. cbSendLength,
  5770. NULL,
  5771. bRecvBuffer,
  5772. &cbRecvLength);
  5773. if (SCARDPROBLEM(lRet,0x9000, bSendBuffer[4]))
  5774. {
  5775. SCardEndTransaction(ProvCont[*phProv].hCard, SCARD_LEAVE_CARD);
  5776. ReleaseProvider(*phProv);
  5777. *phProv = 0;
  5778. RETURN (CRYPT_FAILED,
  5779. (SCARD_S_SUCCESS == lRet) ? NTE_BAD_KEYSET : lRet);
  5780. }
  5781. memcpy(Slot[SlotNb].bGpkSerNb, bRecvBuffer, bSendBuffer[4]);
  5782. if (!Select_Crypto_DF(*phProv))
  5783. {
  5784. lRet = GetLastError();
  5785. SCardEndTransaction(ProvCont[*phProv].hCard, SCARD_LEAVE_CARD);
  5786. ReleaseProvider(*phProv);
  5787. *phProv = 0;
  5788. RETURN( CRYPT_FAILED, lRet );
  5789. }
  5790. // Get the response from the Select DF to obtain the IADF
  5791. bSendBuffer[0] = 0x00; //CLA
  5792. bSendBuffer[1] = 0xC0; //INS
  5793. bSendBuffer[2] = 0x00; //P1
  5794. bSendBuffer[3] = 0x00; //P2
  5795. bSendBuffer[4] = bRecvBuffer[1]; //Lo
  5796. cbSendLength = 5;
  5797. cbRecvLength = sizeof(bRecvBuffer);
  5798. lRet = SCardTransmit( ProvCont[*phProv].hCard, SCARD_PCI_T0, bSendBuffer,
  5799. cbSendLength, 0, bRecvBuffer, &cbRecvLength );
  5800. if (SCARDPROBLEM(lRet,0x9000,bSendBuffer[4]))
  5801. {
  5802. Select_MF(*phProv);
  5803. SCardEndTransaction(ProvCont[*phProv].hCard, SCARD_LEAVE_CARD);
  5804. ReleaseProvider(*phProv);
  5805. *phProv = 0;
  5806. RETURN( CRYPT_FAILED, (SCARD_S_SUCCESS == lRet) ? NTE_BAD_KEYSET : lRet );
  5807. }
  5808. ZeroMemory( ProvCont[*phProv].szContainer, sizeof(ProvCont[*phProv].szContainer));
  5809. if (bRecvBuffer[4] == 0x30)
  5810. Slot[SlotNb].InitFlag = FALSE;
  5811. else
  5812. {
  5813. Slot[SlotNb].InitFlag = TRUE;
  5814. if (ProvCont[*phProv].bGPK8000)
  5815. {
  5816. // Find the keyset's name
  5817. // This is done in AcquireUseKeySet()
  5818. ZeroMemory( ProvCont[*phProv].szContainer, sizeof(ProvCont[*phProv].szContainer) );
  5819. }
  5820. else
  5821. {
  5822. memcpy(ProvCont[*phProv].szContainer, &bRecvBuffer[5], cbRecvLength - 7);
  5823. }
  5824. }
  5825. // inserted by sven: Force re-reading of all objects to detect modifications by other processes
  5826. Slot[SlotNb].m_TSPublic=Slot[SlotNb].m_TSPrivate=0;
  5827. // read the description of the public key parameters
  5828. if (!Slot[SlotNb].ValidateTimestamps(*phProv))
  5829. return CRYPT_FAILED;
  5830. if (!Slot[SlotNb].Read_Public)
  5831. {
  5832. if (!read_gpk_objects(*phProv, FALSE))
  5833. {
  5834. lRet = GetLastError();
  5835. Select_MF(*phProv);
  5836. SCardEndTransaction(ProvCont[*phProv].hCard, SCARD_LEAVE_CARD);
  5837. ReleaseProvider(*phProv);
  5838. *phProv = 0;
  5839. RETURN (CRYPT_FAILED, lRet);
  5840. }
  5841. Slot[SlotNb].Read_Public = TRUE;
  5842. Slot[SlotNb].Read_Priv = FALSE;
  5843. }
  5844. }
  5845. // TT 05/10/99
  5846. if (!ProvCont[*phProv].bGPK8000)
  5847. {
  5848. ProvCont[*phProv].bLegacyKeyset = DetectLegacy( &Slot[SlotNb] );
  5849. if (!ProvCont[*phProv].bLegacyKeyset)
  5850. {
  5851. ZeroMemory( ProvCont[*phProv].szContainer, sizeof(ProvCont[*phProv].szContainer) );
  5852. }
  5853. }
  5854. // TT - END -
  5855. if (dwFlags == CRYPT_DELETEKEYSET)
  5856. {
  5857. if (ProvCont[*phProv].bLegacyKeyset)
  5858. CryptResp = LegacyAcquireDeleteKeySet(phProv, ProvCont[*phProv].szContainer, szContainerAsked, BuffFlags);
  5859. else
  5860. CryptResp = AcquireDeleteKeySet(phProv, ProvCont[*phProv].szContainer, szContainerAsked, BuffFlags);
  5861. lRet = GetLastError();
  5862. Select_MF (*phProv);
  5863. SCardEndTransaction(ProvCont[*phProv].hCard, SCARD_LEAVE_CARD);
  5864. ReleaseProvider(*phProv);
  5865. *phProv = 0;
  5866. RETURN( CryptResp, lRet );
  5867. }
  5868. else if (dwFlags == CRYPT_NEWKEYSET)
  5869. {
  5870. if (ProvCont[*phProv].bLegacyKeyset)
  5871. CryptResp = LegacyAcquireNewKeySet(phProv, ProvCont[*phProv].szContainer, szContainerAsked, BuffFlags);
  5872. else
  5873. CryptResp = AcquireNewKeySet( phProv, ProvCont[*phProv].szContainer, szContainerAsked, BuffFlags );
  5874. lRet = GetLastError();
  5875. Select_MF (*phProv);
  5876. SCardEndTransaction(ProvCont[*phProv].hCard, SCARD_LEAVE_CARD);
  5877. if (!CryptResp)
  5878. {
  5879. ReleaseProvider (*phProv);
  5880. *phProv = 0;
  5881. }
  5882. RETURN( CryptResp, lRet );
  5883. }
  5884. else if (dwFlags == 0)
  5885. {
  5886. if (ProvCont[*phProv].bLegacyKeyset)
  5887. CryptResp = LegacyAcquireUseKeySet(phProv, ProvCont[*phProv].szContainer, szContainerAsked, BuffFlags);
  5888. else
  5889. CryptResp = AcquireUseKeySet(phProv, ProvCont[*phProv].szContainer, szContainerAsked, BuffFlags);
  5890. lRet = GetLastError();
  5891. //Select_MF (*phProv); // [FP] PIN not presented
  5892. SCardEndTransaction(ProvCont[*phProv].hCard, SCARD_LEAVE_CARD);
  5893. if (!CryptResp)
  5894. {
  5895. ReleaseProvider (*phProv);
  5896. *phProv = 0;
  5897. }
  5898. RETURN( CryptResp, lRet );
  5899. }
  5900. else
  5901. {
  5902. SCardEndTransaction(ProvCont[*phProv].hCard, SCARD_LEAVE_CARD);
  5903. ReleaseProvider(*phProv);
  5904. *phProv = 0;
  5905. RETURN( CRYPT_FAILED, NTE_BAD_FLAGS );
  5906. }
  5907. }
  5908. /*
  5909. - MyCPGetProvParam
  5910. -
  5911. * Purpose:
  5912. * Allows applications to get various aspects of the
  5913. * operations of a provider
  5914. *
  5915. * Parameters:
  5916. * IN hProv - Handle to a CSP
  5917. * IN dwParam - Parameter number
  5918. * OUT pbData - Pointer to data
  5919. * IN pdwDataLen - Length of parameter data
  5920. * IN dwFlags - Flags values
  5921. *
  5922. * Returns:
  5923. */
  5924. BOOL WINAPI MyCPGetProvParam( IN HCRYPTPROV hProv,
  5925. IN DWORD dwParam,
  5926. IN BYTE* pbData,
  5927. IN DWORD* pdwDataLen,
  5928. IN DWORD dwFlags )
  5929. {
  5930. DWORD lRet;
  5931. BOOL CryptResp;
  5932. DWORD SlotNb;
  5933. ALG_ID aiAlgid;
  5934. BOOL algNotSupported;
  5935. TCHAR szCspName[MAX_STRING];
  5936. //BYTE* ptr = 0;
  5937. if (!Context_exist(hProv))
  5938. {
  5939. RETURN( CRYPT_FAILED, NTE_BAD_UID );
  5940. }
  5941. SlotNb = ProvCont[hProv].Slot;
  5942. if (dwFlags & CRYPT_MACHINE_KEYSET)
  5943. {
  5944. RETURN( CRYPT_FAILED, NTE_BAD_FLAGS );
  5945. }
  5946. if ((dwFlags == CRYPT_FIRST)
  5947. &&(dwParam != PP_ENUMALGS)
  5948. &&(dwParam != PP_ENUMALGS_EX)
  5949. &&(dwParam != PP_ENUMCONTAINERS)
  5950. )
  5951. {
  5952. RETURN( CRYPT_FAILED, NTE_BAD_FLAGS );
  5953. }
  5954. switch (dwParam)
  5955. {
  5956. case PP_UNIQUE_CONTAINER:
  5957. case PP_CONTAINER:
  5958. // [mv - 15/05/98]
  5959. if ((ProvCont[hProv].Flags & CRYPT_VERIFYCONTEXT) &&
  5960. (ProvCont[hProv].isContNameNullBlank))
  5961. {
  5962. RETURN (CRYPT_FAILED, NTE_PERM);
  5963. }
  5964. if (IsNotNull(pbData))
  5965. {
  5966. if (*pdwDataLen < strlen(ProvCont[hProv].szContainer)+1)
  5967. {
  5968. *pdwDataLen = strlen(ProvCont[hProv].szContainer)+1;
  5969. RETURN (CRYPT_FAILED, ERROR_MORE_DATA);
  5970. }
  5971. strcpy( (char*)pbData, ProvCont[hProv].szContainer);
  5972. }
  5973. *pdwDataLen = strlen(ProvCont[hProv].szContainer)+1;
  5974. break;
  5975. case PP_ENUMALGS:
  5976. case PP_ENUMALGS_EX:
  5977. CryptResp = CryptGetProvParam(hProvBase,
  5978. dwParam,
  5979. pbData,
  5980. pdwDataLen,
  5981. dwFlags
  5982. );
  5983. if (!CryptResp)
  5984. {
  5985. lRet = GetLastError();
  5986. RETURN (CRYPT_FAILED, lRet);
  5987. }
  5988. if (NULL != pbData)
  5989. {
  5990. // Extract algorithm information from 'pbData' buffer.
  5991. BYTE *ptr = pbData;
  5992. aiAlgid = *(ALG_ID UNALIGNED *)ptr;
  5993. BOOL b512exist = FALSE,
  5994. b1024exist = FALSE;
  5995. for ( unsigned i = 0 ; i < Slot[SlotNb].NbKeyFile; ++i )
  5996. {
  5997. if (Slot[SlotNb].GpkPubKeys[i].KeySize == 512/8) b512exist = TRUE;
  5998. else if (Slot[SlotNb].GpkPubKeys[i].KeySize == 1024/8) b1024exist = TRUE;
  5999. }
  6000. // Can happen if card is removed
  6001. if (!b512exist && !b1024exist)
  6002. Slot[SlotNb].NbKeyFile = 0;
  6003. if (aiAlgid == CALG_RSA_KEYX)
  6004. {
  6005. if (PP_ENUMALGS_EX == dwParam)
  6006. {
  6007. PROV_ENUMALGS_EX *penAlg = (PROV_ENUMALGS_EX *)pbData;
  6008. if (Slot[SlotNb].NbKeyFile==0)
  6009. {
  6010. penAlg->dwDefaultLen = RSA_KEK_Size * 8;
  6011. penAlg->dwMinLen = 512;
  6012. penAlg->dwMaxLen = RSA_KEK_Size * 8;
  6013. }
  6014. else
  6015. {
  6016. penAlg->dwDefaultLen = RSA_KEK_Size * 8;
  6017. penAlg->dwMinLen = (b512exist) ? 512 : 1024;
  6018. penAlg->dwMaxLen = (b1024exist) ? 1024 : 512;
  6019. if (penAlg->dwMaxLen > (DWORD)RSA_KEK_Size * 8)
  6020. penAlg->dwMaxLen = (DWORD)RSA_KEK_Size * 8;
  6021. }
  6022. }
  6023. else
  6024. {
  6025. PROV_ENUMALGS *penAlg = (PROV_ENUMALGS *)pbData;
  6026. if (Slot[SlotNb].NbKeyFile==0)
  6027. penAlg->dwBitLen = RSA_KEK_Size * 8;
  6028. else
  6029. {
  6030. penAlg->dwBitLen = (b1024exist) ? 1024 : 512;
  6031. if (penAlg->dwBitLen > (DWORD)RSA_KEK_Size * 8)
  6032. penAlg->dwBitLen = (DWORD)RSA_KEK_Size * 8;
  6033. }
  6034. }
  6035. }
  6036. else if (aiAlgid == CALG_RSA_SIGN)
  6037. {
  6038. if (PP_ENUMALGS_EX == dwParam)
  6039. {
  6040. PROV_ENUMALGS_EX *penAlg = (PROV_ENUMALGS_EX *)pbData;
  6041. if (Slot[SlotNb].NbKeyFile==0)
  6042. {
  6043. penAlg->dwDefaultLen = 1024;
  6044. penAlg->dwMinLen = 512;
  6045. penAlg->dwMaxLen = 1024;
  6046. }
  6047. else
  6048. {
  6049. penAlg->dwDefaultLen = (b1024exist) ? 1024 : 512;
  6050. penAlg->dwMinLen = (b512exist) ? 512 : 1024;
  6051. penAlg->dwMaxLen = (b1024exist) ? 1024 : 512;
  6052. }
  6053. }
  6054. else
  6055. {
  6056. PROV_ENUMALGS *penAlg = (PROV_ENUMALGS *)pbData;
  6057. if (Slot[SlotNb].NbKeyFile==0)
  6058. penAlg->dwBitLen = 1024;
  6059. else
  6060. penAlg->dwBitLen = (b1024exist) ? 1024 : 512;
  6061. }
  6062. }
  6063. else if ( ProvCont[hProv].Flags & CRYPT_VERIFYCONTEXT &&
  6064. ProvCont[hProv].isContNameNullBlank )
  6065. {
  6066. // No access to the card has been done in this case
  6067. }
  6068. else if ((dwFlags != CRYPT_FIRST ) && (Slot[SlotNb].GpkMaxSessionKey == 0))
  6069. {
  6070. // card was removed, nothing to do
  6071. }
  6072. else if (GET_ALG_CLASS(aiAlgid) == ALG_CLASS_DATA_ENCRYPT)
  6073. {
  6074. // The max session key in the card is only for encryption
  6075. // There is a card in the Reader,
  6076. // read the max session key, if not already done
  6077. if (Slot[SlotNb].GpkMaxSessionKey == 0)
  6078. {
  6079. CryptResp = Read_MaxSessionKey_EF(hProv,
  6080. &(Slot[SlotNb].GpkMaxSessionKey));
  6081. // if the DF of EF is not here, maxSessionKey==0
  6082. }
  6083. // skip the algo if not supported by the card
  6084. do
  6085. {
  6086. algNotSupported = FALSE;
  6087. if (dwParam == PP_ENUMALGS)
  6088. {
  6089. PROV_ENUMALGS *penAlg = (PROV_ENUMALGS *)pbData;
  6090. // TT Hack: "Unknown cryptographic algorithm" at winlogon problem.
  6091. if (penAlg->aiAlgid == CALG_RC2 && Slot[SlotNb].GpkMaxSessionKey < 128)
  6092. {
  6093. penAlg->dwBitLen = 40;
  6094. }
  6095. // DES needs 64 bits of unwrap capability
  6096. if (penAlg->aiAlgid == CALG_DES && Slot[SlotNb].GpkMaxSessionKey < 64)
  6097. algNotSupported = TRUE;
  6098. else
  6099. // Limit encryption algorithms to unwrap capabilities
  6100. if (GET_ALG_CLASS(penAlg->aiAlgid)==ALG_CLASS_DATA_ENCRYPT)
  6101. {
  6102. if (penAlg->dwBitLen > Slot[SlotNb].GpkMaxSessionKey)
  6103. algNotSupported = TRUE;
  6104. }
  6105. }
  6106. else
  6107. {
  6108. PROV_ENUMALGS_EX *penAlg = (PROV_ENUMALGS_EX *)pbData;
  6109. // TT Hack: "Unknown cryptographic algorithm" at winlogon problem.
  6110. if (penAlg->aiAlgid == CALG_RC2 && Slot[SlotNb].GpkMaxSessionKey < 128)
  6111. {
  6112. penAlg->dwDefaultLen = 40;
  6113. penAlg->dwMinLen = 40;
  6114. penAlg->dwMaxLen = 40;
  6115. }
  6116. // DES needs 64 bits of unwrap capability
  6117. if (penAlg->aiAlgid == CALG_DES && Slot[SlotNb].GpkMaxSessionKey < 64)
  6118. algNotSupported = TRUE;
  6119. else
  6120. // Limit encryption algorithms to unwrap capabilities
  6121. if (GET_ALG_CLASS(penAlg->aiAlgid)==ALG_CLASS_DATA_ENCRYPT)
  6122. {
  6123. if (penAlg->dwMinLen > Slot[SlotNb].GpkMaxSessionKey)
  6124. algNotSupported = TRUE;
  6125. else
  6126. {
  6127. if (penAlg->dwMaxLen > Slot[SlotNb].GpkMaxSessionKey)
  6128. penAlg->dwMaxLen = Slot[SlotNb].GpkMaxSessionKey;
  6129. if (penAlg->dwDefaultLen > penAlg->dwMaxLen)
  6130. penAlg->dwDefaultLen = penAlg->dwMaxLen;
  6131. }
  6132. }
  6133. }
  6134. if (algNotSupported)
  6135. {
  6136. // Algo not supported, read the next one
  6137. dwFlags = 0;
  6138. CryptResp = CryptGetProvParam( hProvBase, dwParam, pbData, pdwDataLen, dwFlags );
  6139. if (!CryptResp)
  6140. return CRYPT_FAILED;
  6141. }
  6142. } while (algNotSupported);
  6143. }
  6144. }
  6145. break;
  6146. case PP_ENUMCONTAINERS:
  6147. {
  6148. if ((ProvCont[hProv].Flags & CRYPT_VERIFYCONTEXT) &&
  6149. (ProvCont[hProv].isContNameNullBlank))
  6150. {
  6151. static CHAR* lpszCurrentContainerInList = 0; // multi sz strings of containters
  6152. static CHAR mszContainerList[(MAX_SLOT * 128) + 1];
  6153. DWORD dwContainerListLen = 0;
  6154. static DWORD dwContainerMaxLen = 0;
  6155. if (dwFlags == CRYPT_FIRST)
  6156. {
  6157. // List readers
  6158. SCARDCONTEXT hCardEnumContext;
  6159. lRet = SCardEstablishContext(SCARD_SCOPE_SYSTEM, 0, 0, &hCardEnumContext);
  6160. if (lRet != SCARD_S_SUCCESS)
  6161. {
  6162. if (lRet == SCARD_E_NO_SERVICE)
  6163. lRet = ERROR_NO_MORE_ITEMS;
  6164. RETURN (CRYPT_FAILED, lRet);
  6165. }
  6166. PTCHAR mszReaderList = 0;
  6167. DWORD dwReaderListLen = 0;
  6168. lRet = SCardListReaders(hCardEnumContext, 0, mszReaderList, &dwReaderListLen);
  6169. if (lRet != SCARD_S_SUCCESS)
  6170. {
  6171. if (lRet == SCARD_E_NO_READERS_AVAILABLE)
  6172. lRet = ERROR_NO_MORE_ITEMS;
  6173. SCardReleaseContext(hCardEnumContext);
  6174. RETURN (CRYPT_FAILED, lRet);
  6175. }
  6176. mszReaderList = (PTCHAR)GMEM_Alloc(dwReaderListLen * sizeof(TCHAR));
  6177. if (IsNull(mszReaderList))
  6178. {
  6179. SCardReleaseContext(hCardEnumContext);
  6180. RETURN (CRYPT_FAILED, NTE_NO_MEMORY);
  6181. }
  6182. lRet = SCardListReaders(hCardEnumContext, 0, mszReaderList, &dwReaderListLen);
  6183. if (lRet != SCARD_S_SUCCESS)
  6184. {
  6185. GMEM_Free(mszReaderList);
  6186. SCardReleaseContext(hCardEnumContext);
  6187. RETURN (CRYPT_FAILED, lRet);
  6188. }
  6189. SCardReleaseContext(hCardEnumContext);
  6190. // For each reader, find the container if any
  6191. PTCHAR szReader = 0;
  6192. PTCHAR szReader2 = 0;
  6193. CHAR szContainer[128];
  6194. DWORD dwContainerLen = 128;
  6195. HCRYPTPROV hReaderProv;
  6196. for (szReader = mszReaderList; *szReader != 0; szReader += (_tcsclen(szReader) + 1))
  6197. {
  6198. szReader2 = (PTCHAR)GMEM_Alloc((_tcslen(szReader) + 5)*sizeof(TCHAR));
  6199. if (IsNull(szReader2))
  6200. {
  6201. GMEM_Free(mszReaderList);
  6202. RETURN (CRYPT_FAILED, NTE_NO_MEMORY);
  6203. }
  6204. _tcscpy(szReader2, TEXT("\\\\.\\"));
  6205. _tcscat(szReader2, szReader);
  6206. CHAR szReaderChar[128];
  6207. #ifndef UNICODE
  6208. strncpy(szReaderChar, szReader2, sizeof(szReaderChar)-1);
  6209. szReaderChar[sizeof(szReaderChar)-1]=0;
  6210. #else
  6211. WideCharToMultiByte(CP_ACP, 0, szReader2, -1, szReaderChar, 128, 0, 0);
  6212. #endif
  6213. GMEM_Free(szReader2);
  6214. if (!MyCPAcquireContext(&hReaderProv, szReaderChar, CRYPT_VERIFYCONTEXT | CRYPT_SILENT, 0))
  6215. {
  6216. DWORD dwGLE = GetLastError();
  6217. if (dwGLE == NTE_KEYSET_NOT_DEF ||
  6218. dwGLE == SCARD_W_REMOVED_CARD ||
  6219. dwGLE == SCARD_E_DIR_NOT_FOUND || // likely to happen with a non Gemplus card
  6220. dwGLE == SCARD_E_PROTO_MISMATCH) // likely to happen with T=1 card
  6221. {
  6222. continue;
  6223. }
  6224. else
  6225. {
  6226. GMEM_Free(mszReaderList);
  6227. RETURN (CRYPT_FAILED, NTE_FAIL);
  6228. }
  6229. }
  6230. dwContainerLen = 128;
  6231. if (!MyCPGetProvParam(hReaderProv, PP_CONTAINER, (BYTE*)szContainer, &dwContainerLen, 0))
  6232. {
  6233. GMEM_Free(mszReaderList);
  6234. RETURN (CRYPT_FAILED, NTE_FAIL);
  6235. }
  6236. MyCPReleaseContext(hReaderProv, 0);
  6237. strcpy(&mszContainerList[dwContainerListLen], szContainer);
  6238. dwContainerListLen += dwContainerLen;
  6239. dwContainerMaxLen = max(dwContainerMaxLen, dwContainerLen);
  6240. }
  6241. GMEM_Free(mszReaderList);
  6242. lpszCurrentContainerInList = mszContainerList;
  6243. }
  6244. // Return containers one by one
  6245. if (lpszCurrentContainerInList == 0 || *lpszCurrentContainerInList == 0)
  6246. RETURN (CRYPT_FAILED, ERROR_NO_MORE_ITEMS);
  6247. if (IsNotNull(pbData))
  6248. {
  6249. if (*pdwDataLen < dwContainerMaxLen)
  6250. {
  6251. *pdwDataLen = dwContainerMaxLen;
  6252. RETURN (CRYPT_FAILED, ERROR_MORE_DATA);
  6253. }
  6254. strcpy((CHAR*)pbData, lpszCurrentContainerInList);
  6255. *pdwDataLen = strlen(lpszCurrentContainerInList) + 1;
  6256. lpszCurrentContainerInList += strlen(lpszCurrentContainerInList) + 1;
  6257. }
  6258. else
  6259. {
  6260. *pdwDataLen = dwContainerMaxLen;
  6261. }
  6262. }
  6263. else
  6264. {
  6265. if (dwFlags == CRYPT_FIRST)
  6266. {
  6267. if (!MyCPGetProvParam(hProv, PP_CONTAINER, pbData, pdwDataLen, 0))
  6268. {
  6269. RETURN (CRYPT_FAILED, GetLastError());
  6270. }
  6271. }
  6272. else
  6273. {
  6274. RETURN (CRYPT_FAILED, ERROR_NO_MORE_ITEMS);
  6275. }
  6276. }
  6277. }
  6278. break;
  6279. case PP_IMPTYPE:
  6280. if (IsNotNull(pbData))
  6281. {
  6282. DWORD dwType = CRYPT_IMPL_MIXED | CRYPT_IMPL_REMOVABLE;
  6283. if (*pdwDataLen < sizeof(DWORD))
  6284. {
  6285. *pdwDataLen = sizeof(DWORD);
  6286. RETURN (CRYPT_FAILED, ERROR_MORE_DATA);
  6287. }
  6288. memcpy(pbData, &dwType, sizeof(dwType));
  6289. }
  6290. *pdwDataLen = sizeof(DWORD);
  6291. break;
  6292. case PP_KEYX_KEYSIZE_INC:
  6293. case PP_SIG_KEYSIZE_INC:
  6294. if (IsNotNull(pbData))
  6295. {
  6296. BOOL b512exist = FALSE,
  6297. b1024exist = FALSE;
  6298. for ( unsigned i = 0 ; i < Slot[SlotNb].NbKeyFile; ++i )
  6299. {
  6300. if (Slot[SlotNb].GpkPubKeys[i].KeySize == 512) b512exist = TRUE;
  6301. else if (Slot[SlotNb].GpkPubKeys[i].KeySize == 1024) b1024exist = TRUE;
  6302. }
  6303. // Can happen if card is removed
  6304. if (!b512exist && !b1024exist)
  6305. Slot[SlotNb].NbKeyFile = 0;
  6306. if (dwParam == PP_KEYX_KEYSIZE_INC && b1024exist && RSA_KEK_Size * 8 < 1024)
  6307. b1024exist = FALSE;
  6308. DWORD dwSize = 0;
  6309. if (b512exist && b1024exist)
  6310. dwSize = 512;
  6311. if (*pdwDataLen < sizeof(DWORD))
  6312. {
  6313. *pdwDataLen = sizeof(DWORD);
  6314. RETURN (CRYPT_FAILED, ERROR_MORE_DATA);
  6315. }
  6316. memcpy(pbData, &dwSize, sizeof(dwSize));
  6317. }
  6318. *pdwDataLen = sizeof(DWORD);
  6319. break;
  6320. case PP_NAME:
  6321. LoadString(g_hInstMod, IDS_GPKCSP_NAME, szCspName, sizeof(szCspName)/sizeof(TCHAR));
  6322. if (IsNotNull(pbData))
  6323. {
  6324. if (*pdwDataLen < (_tcslen(szCspName)+1))
  6325. {
  6326. *pdwDataLen = (_tcslen(szCspName)+1);
  6327. RETURN (CRYPT_FAILED, ERROR_MORE_DATA);
  6328. }
  6329. #ifndef UNICODE
  6330. strcpy((CHAR*)pbData, szCspName);
  6331. #else
  6332. char szCspName1[MAX_STRING];
  6333. WideCharToMultiByte(CP_ACP, 0, szCspName, MAX_STRING, szCspName1, MAX_STRING, 0, 0);
  6334. strcpy((CHAR*)pbData, szCspName1);
  6335. #endif
  6336. }
  6337. *pdwDataLen = (_tcslen(szCspName)+1);
  6338. break;
  6339. case PP_VERSION:
  6340. if (IsNotNull(pbData))
  6341. {
  6342. if (*pdwDataLen < sizeof(DWORD))
  6343. {
  6344. *pdwDataLen = sizeof(DWORD);
  6345. RETURN (CRYPT_FAILED, ERROR_MORE_DATA);
  6346. }
  6347. pbData[0] = 20;
  6348. pbData[1] = 2;
  6349. pbData[2] = 0;
  6350. pbData[3] = 0;
  6351. }
  6352. *pdwDataLen = sizeof(DWORD);
  6353. break;
  6354. case PP_PROVTYPE:
  6355. if (IsNotNull(pbData))
  6356. {
  6357. if (*pdwDataLen < sizeof(DWORD))
  6358. {
  6359. *pdwDataLen = sizeof(DWORD);
  6360. RETURN (CRYPT_FAILED, ERROR_MORE_DATA);
  6361. }
  6362. *(LPDWORD)pbData = PROV_RSA_FULL;
  6363. }
  6364. *pdwDataLen = sizeof(DWORD);
  6365. break;
  6366. case PP_KEYSPEC:
  6367. if (IsNotNull(pbData))
  6368. {
  6369. DWORD dwSpec = AT_KEYEXCHANGE | AT_SIGNATURE;
  6370. if (*pdwDataLen < sizeof(DWORD))
  6371. {
  6372. *pdwDataLen = sizeof(DWORD);
  6373. RETURN (CRYPT_FAILED, ERROR_MORE_DATA);
  6374. }
  6375. memcpy(pbData, &dwSpec, sizeof(dwSpec));
  6376. }
  6377. *pdwDataLen = sizeof(DWORD);
  6378. break;
  6379. // + [FP] Proprietary functions used to load a RSA private key into the GPK card
  6380. case GPP_SERIAL_NUMBER:
  6381. if (dwFlags != 0)
  6382. {
  6383. RETURN (CRYPT_FAILED, NTE_BAD_FLAGS);
  6384. }
  6385. if ((ProvCont[hProv].Flags & CRYPT_VERIFYCONTEXT) &&
  6386. (ProvCont[hProv].isContNameNullBlank))
  6387. {
  6388. RETURN (CRYPT_FAILED, NTE_PERM);
  6389. }
  6390. if (IsNotNull(pbData))
  6391. {
  6392. if (*pdwDataLen < 8)
  6393. {
  6394. *pdwDataLen = 8;
  6395. RETURN (CRYPT_FAILED, ERROR_MORE_DATA);
  6396. }
  6397. CryptResp = Select_MF(hProv);
  6398. if (!CryptResp)
  6399. return CRYPT_FAILED;
  6400. bSendBuffer[0] = 0x80; //CLA
  6401. bSendBuffer[1] = 0xC0; //INS
  6402. bSendBuffer[2] = 0x02; //P1
  6403. bSendBuffer[3] = 0xA0; //P2
  6404. bSendBuffer[4] = 0x08; //Lo
  6405. cbSendLength = 5;
  6406. cbRecvLength = sizeof(bRecvBuffer);
  6407. lRet = SCardTransmit( ProvCont[hProv].hCard, SCARD_PCI_T0, bSendBuffer,
  6408. cbSendLength, 0, bRecvBuffer, &cbRecvLength );
  6409. if (SCARDPROBLEM(lRet, 0x9000, bSendBuffer[4]))
  6410. {
  6411. RETURN (CRYPT_FAILED, SCARD_E_UNEXPECTED);
  6412. }
  6413. memcpy(pbData, bRecvBuffer, bSendBuffer[4]);
  6414. }
  6415. *pdwDataLen = 8;
  6416. break;
  6417. case GPP_SESSION_RANDOM:
  6418. if (dwFlags != 0)
  6419. {
  6420. RETURN (CRYPT_FAILED, NTE_BAD_FLAGS);
  6421. }
  6422. if ((ProvCont[hProv].Flags & CRYPT_VERIFYCONTEXT) &&
  6423. (ProvCont[hProv].isContNameNullBlank))
  6424. {
  6425. RETURN (CRYPT_FAILED, NTE_PERM);
  6426. }
  6427. if (IsNotNull(pbData))
  6428. {
  6429. if (*pdwDataLen < 8)
  6430. {
  6431. *pdwDataLen = 8;
  6432. RETURN (CRYPT_FAILED, ERROR_MORE_DATA);
  6433. }
  6434. if (Slot[SlotNb].NbKeyFile == 0) // [FP] here instead of MyCPImportKey because
  6435. { // it does a Select_Crypto_DF and we have to do
  6436. Slot[SlotNb].NbKeyFile = Read_NbKeyFile(hProv); // it before the select file key
  6437. }
  6438. /* Select File Key */
  6439. bSendBuffer[0] = 0x80; //CLA
  6440. bSendBuffer[1] = 0x28; //INS
  6441. bSendBuffer[2] = 0x00; //P1
  6442. bSendBuffer[3] = (BYTE)(0x3F01 /*& 0x1F*/); //P2
  6443. bSendBuffer[4] = 0x08; //Lc
  6444. memcpy(&bSendBuffer[5], pbData, 0x08);
  6445. cbSendLength = 13;
  6446. cbRecvLength = sizeof(bRecvBuffer);
  6447. lRet = SCardTransmit( ProvCont[hProv].hCard, SCARD_PCI_T0, bSendBuffer,
  6448. cbSendLength, 0, bRecvBuffer, &cbRecvLength );
  6449. if(SCARDPROBLEM(lRet, 0x61FF, 0x00))
  6450. {
  6451. RETURN(CRYPT_FAILED, lRet);
  6452. }
  6453. /* Get Response */
  6454. bSendBuffer[0] = 0x00; //CLA
  6455. bSendBuffer[1] = 0xC0; //INS
  6456. bSendBuffer[2] = 0x00; //P1
  6457. bSendBuffer[3] = 0x00; //P2
  6458. bSendBuffer[4] = bRecvBuffer[1]; //Lo
  6459. cbSendLength = 5;
  6460. cbRecvLength = sizeof(bRecvBuffer);
  6461. lRet = SCardTransmit( ProvCont[hProv].hCard, SCARD_PCI_T0, bSendBuffer,
  6462. cbSendLength, 0, bRecvBuffer, &cbRecvLength );
  6463. if(SCARDPROBLEM(lRet, 0x9000, bSendBuffer[4]))
  6464. {
  6465. RETURN(CRYPT_FAILED, lRet);
  6466. }
  6467. memcpy(pbData, &bRecvBuffer[4], 8);
  6468. ProvCont[hProv].bCardTransactionOpened = TRUE;
  6469. }
  6470. *pdwDataLen = 8;
  6471. break;
  6472. case GPP_IMPORT_MECHANISM:
  6473. if (IsNotNull(pbData))
  6474. {
  6475. DWORD dwMechanism = GCRYPT_IMPORT_SECURE;
  6476. if (*pdwDataLen < sizeof(DWORD))
  6477. {
  6478. *pdwDataLen = sizeof(DWORD);
  6479. RETURN (CRYPT_FAILED, ERROR_MORE_DATA);
  6480. }
  6481. memcpy(pbData, &dwMechanism, sizeof(dwMechanism));
  6482. }
  6483. *pdwDataLen = sizeof(DWORD);
  6484. break;
  6485. // - [FP]
  6486. default:
  6487. RETURN (CRYPT_FAILED, NTE_BAD_TYPE);
  6488. }
  6489. RETURN (CRYPT_SUCCEED, 0);
  6490. }
  6491. /*
  6492. - MyCPReleaseContext
  6493. -
  6494. * Purpose:
  6495. * The CPReleaseContext function is used to release a
  6496. * context created by CryptAcquireContext.
  6497. *
  6498. * Parameters:
  6499. * IN phProv - Handle to a CSP
  6500. * IN dwFlags - Flags values
  6501. *
  6502. * Returns:
  6503. */
  6504. BOOL WINAPI MyCPReleaseContext( HCRYPTPROV hProv, DWORD dwFlags )
  6505. {
  6506. DWORD SlotNb;
  6507. if (!Context_exist(hProv))
  6508. {
  6509. RETURN (CRYPT_FAILED, NTE_BAD_UID);
  6510. }
  6511. if ( ProvCont[hProv].Flags & CRYPT_VERIFYCONTEXT &&
  6512. ProvCont[hProv].isContNameNullBlank)
  6513. {
  6514. }
  6515. else
  6516. {
  6517. SlotNb = ProvCont[hProv].Slot;
  6518. if (Slot[SlotNb].ContextCount > 0)
  6519. Slot[SlotNb].ContextCount--;
  6520. if (countCardContextRef > 0)
  6521. countCardContextRef--;
  6522. }
  6523. if (ProvCont[hProv].Flags & CRYPT_VERIFYCONTEXT &&
  6524. ProvCont[hProv].isContNameNullBlank)
  6525. {
  6526. // No access to the card has been done in this case
  6527. }
  6528. else
  6529. {
  6530. // Select_MF(hProv); [FP] PIN not presented
  6531. // SCardEndTransaction(ProvCont[hProv].hCard, SCARD_LEAVE_CARD); [FP] coherence not checked
  6532. }
  6533. ReleaseProvider(hProv);
  6534. /* PYR 11/08/00: Do not unload
  6535. if (IsNotNull(g_hInstRes) && Slot[SlotNb].ContextCount == 0)
  6536. {
  6537. bFirstGUILoad = TRUE;
  6538. FreeLibrary(g_hInstRes);
  6539. g_hInstRes = 0;
  6540. }
  6541. */
  6542. //If dwFlags is not set to zero, this function returns FALSE but the CSP is released
  6543. //PYR 08/08/00. Note that CryptoAPI will not call again CPReleaseContext with the same handle.
  6544. if (dwFlags != 0)
  6545. {
  6546. RETURN (CRYPT_FAILED, NTE_BAD_FLAGS);
  6547. }
  6548. else
  6549. {
  6550. RETURN( CRYPT_SUCCEED, 0 );
  6551. }
  6552. }
  6553. /*
  6554. - MyCPSetProvParam
  6555. -
  6556. * Purpose:
  6557. * Allows applications to customize various aspects of the
  6558. * operations of a provider
  6559. *
  6560. * Parameters:
  6561. * IN hProv - Handle to a CSP
  6562. * IN dwParam - Parameter number
  6563. * IN pbData - Pointer to data
  6564. * IN dwFlags - Flags values
  6565. *
  6566. * Returns:
  6567. */
  6568. BOOL WINAPI MyCPSetProvParam(IN HCRYPTPROV hProv,
  6569. IN DWORD dwParam,
  6570. IN CONST BYTE *pbData,
  6571. IN DWORD dwFlags
  6572. )
  6573. {
  6574. DWORD SlotNb;
  6575. // + [FP] for GPP_CHANGE_PIN
  6576. const char* Buff;
  6577. char szOldPin[PIN_LEN + 1];
  6578. char szNewPin[PIN_LEN + 1];
  6579. // - [FP]
  6580. // + NK 06.02.2001
  6581. PINCACHE_PINS Pins;
  6582. CallbackData sCallbackData;
  6583. DWORD dwStatus;
  6584. // -
  6585. if (!Context_exist(hProv))
  6586. {
  6587. RETURN (CRYPT_FAILED, NTE_BAD_UID);
  6588. }
  6589. SlotNb = ProvCont[hProv].Slot;
  6590. switch (dwParam)
  6591. {
  6592. case PP_KEYEXCHANGE_PIN:
  6593. case PP_SIGNATURE_PIN:
  6594. {
  6595. // Slot[SlotNb].ClearPin();
  6596. // Slot[SlotNb].SetPin( (char*)pbData );
  6597. PopulatePins( &Pins, (BYTE *)pbData, strlen( (char*)pbData ), NULL, 0 );
  6598. sCallbackData.hProv = hProv;
  6599. sCallbackData.IsCoherent = FALSE;
  6600. // SlotNb may not be the same before and after Add_MSPinCache because of the call
  6601. // to Coherent in the callback of the pin cache function. To be sure that we save
  6602. // the handle to the good slot, we store it after the call
  6603. PINCACHE_HANDLE hPinCacheHandle = Slot[SlotNb].hPinCacheHandle;
  6604. if ( (dwStatus = Add_MSPinCache( &hPinCacheHandle,
  6605. &Pins,
  6606. Callback_VerifyChangePin,
  6607. (void*)&sCallbackData )) != ERROR_SUCCESS )
  6608. {
  6609. RETURN (CRYPT_FAILED, dwStatus);
  6610. }
  6611. Slot[ProvCont[hProv].Slot].hPinCacheHandle = hPinCacheHandle;
  6612. break;
  6613. }
  6614. case PP_KEYSET_SEC_DESCR:
  6615. break; // Assume success.
  6616. case GPP_CHANGE_PIN:
  6617. if (dwFlags != 0)
  6618. {
  6619. RETURN( CRYPT_FAILED, NTE_BAD_FLAGS );
  6620. }
  6621. if ( ProvCont[hProv].Flags & CRYPT_VERIFYCONTEXT &&
  6622. ProvCont[hProv].isContNameNullBlank )
  6623. {
  6624. RETURN( CRYPT_FAILED, NTE_PERM );
  6625. }
  6626. // parse input buffer
  6627. Buff = (char*)pbData;
  6628. memset(szOldPin, 0x00, PIN_LEN + 1);
  6629. strncpy(szOldPin, Buff, PIN_LEN);
  6630. Buff = Buff + strlen(Buff) + 1;
  6631. memset(szNewPin, 0x00, PIN_LEN + 1);
  6632. strncpy(szNewPin, Buff, PIN_LEN);
  6633. PopulatePins( &Pins, (BYTE *)szOldPin, strlen(szOldPin), (BYTE *)szNewPin, strlen(szNewPin) );
  6634. sCallbackData.hProv = hProv;
  6635. sCallbackData.IsCoherent = TRUE;
  6636. dwStatus = Add_MSPinCache( &(Slot[SlotNb].hPinCacheHandle),
  6637. &Pins,
  6638. Callback_VerifyChangePin,
  6639. (void*)&sCallbackData );
  6640. memset(szOldPin, 0x00, PIN_LEN + 1);
  6641. memset(szNewPin, 0x00, PIN_LEN + 1);
  6642. if(szOldPin[0] || szNewPin[0]) { MessageBeep(0); } // to prevent compiler from optimization
  6643. if(dwStatus!=ERROR_SUCCESS)
  6644. {
  6645. RETURN (CRYPT_FAILED, dwStatus);
  6646. }
  6647. break;
  6648. default:
  6649. RETURN( CRYPT_FAILED, E_NOTIMPL );
  6650. }
  6651. RETURN( CRYPT_SUCCEED, 0 );
  6652. }
  6653. /*******************************************************************************
  6654. Key Generation and Exchange Functions
  6655. *******************************************************************************/
  6656. /*
  6657. - MyCPDeriveKey
  6658. -
  6659. * Purpose:
  6660. * Derive cryptographic keys from base data
  6661. *
  6662. *
  6663. * Parameters:
  6664. * IN hProv - Handle to a CSP
  6665. * IN Algid - Algorithm identifier
  6666. * IN hHash - Handle to hash
  6667. * IN dwFlags - Flags values
  6668. * OUT phKey - Handle to a generated key
  6669. *
  6670. * Returns:
  6671. */
  6672. BOOL WINAPI MyCPDeriveKey(IN HCRYPTPROV hProv,
  6673. IN ALG_ID Algid,
  6674. IN HCRYPTHASH hHash,
  6675. IN DWORD dwFlags,
  6676. OUT HCRYPTKEY *phKey
  6677. )
  6678. {
  6679. BOOL CryptResp;
  6680. HCRYPTKEY hKey;
  6681. *phKey = 0;
  6682. if (!Context_exist(hProv))
  6683. RETURN( CRYPT_FAILED, NTE_BAD_UID );
  6684. if (!hash_exist(hHash, hProv))
  6685. RETURN( CRYPT_FAILED, NTE_BAD_HASH );
  6686. hKey = find_tmp_free();
  6687. if (hKey == 0)
  6688. RETURN( CRYPT_FAILED, NTE_NO_MEMORY );
  6689. // In fact, the flags are processed implicitly in the RSA Base
  6690. CryptResp = CryptDeriveKey( hProvBase, Algid, hHashGpk[hHash].hHashBase,
  6691. dwFlags, &TmpObject[hKey].hKeyBase );
  6692. if (!CryptResp)
  6693. return CRYPT_FAILED;
  6694. TmpObject[hKey].hProv = hProv;
  6695. *phKey = hKey + MAX_GPK_OBJ;
  6696. RETURN( CRYPT_SUCCEED, 0 );
  6697. }
  6698. /*
  6699. - MyCPDestroyKey
  6700. -
  6701. * Purpose:
  6702. * Destroys the cryptographic key that is being referenced
  6703. * with the hKey parameter
  6704. *
  6705. *
  6706. * Parameters:
  6707. * IN hProv - Handle to a CSP
  6708. * IN hKey - Handle to a key
  6709. *
  6710. * Returns:
  6711. */
  6712. BOOL WINAPI MyCPDestroyKey(IN HCRYPTPROV hProv,
  6713. IN HCRYPTKEY hKey
  6714. )
  6715. {
  6716. BOOL CryptResp;
  6717. if (!Context_exist(hProv))
  6718. RETURN( CRYPT_FAILED, NTE_BAD_UID );
  6719. if (hKey == 0)
  6720. RETURN( CRYPT_FAILED, NTE_BAD_KEY );
  6721. if (ProvCont[hProv].Flags & CRYPT_VERIFYCONTEXT)
  6722. RETURN( CRYPT_FAILED, NTE_PERM );
  6723. if (hKey <= MAX_GPK_OBJ)
  6724. RETURN( CRYPT_SUCCEED, 0 );
  6725. if (!key_exist(hKey-MAX_GPK_OBJ, hProv))
  6726. RETURN( CRYPT_FAILED, NTE_BAD_KEY );
  6727. if (TmpObject[hKey-MAX_GPK_OBJ].hKeyBase != 0)
  6728. {
  6729. CryptResp = CryptDestroyKey(TmpObject[hKey-MAX_GPK_OBJ].hKeyBase);
  6730. if (!CryptResp)
  6731. return CRYPT_FAILED;
  6732. }
  6733. TmpObject[hKey-MAX_GPK_OBJ].hKeyBase = 0;
  6734. TmpObject[hKey-MAX_GPK_OBJ].hProv = 0;
  6735. RETURN( CRYPT_SUCCEED, 0 );
  6736. }
  6737. /*
  6738. - MyCPExportKey
  6739. -
  6740. * Purpose:
  6741. * Export cryptographic keys out of a CSP in a secure manner
  6742. *
  6743. *
  6744. * Parameters:
  6745. * IN hProv - Handle to the CSP user
  6746. * IN hKey - Handle to the key to export
  6747. * IN hPubKey - Handle to the exchange public key value of
  6748. * the destination user
  6749. * IN dwBlobType - Type of key blob to be exported
  6750. * IN dwFlags - Flags values
  6751. * OUT pbData - Key blob data
  6752. * OUT pdwDataLen - Length of key blob in bytes
  6753. *
  6754. * Returns:
  6755. */
  6756. BOOL WINAPI MyCPExportKey(IN HCRYPTPROV hProv,
  6757. IN HCRYPTKEY hKey,
  6758. IN HCRYPTKEY hPubKey,
  6759. IN DWORD dwBlobType,
  6760. IN DWORD dwFlags,
  6761. OUT BYTE *pbData,
  6762. OUT DWORD *pdwDataLen
  6763. )
  6764. {
  6765. BOOL CryptResp;
  6766. DWORD dwBlobLen;
  6767. HCRYPTKEY hTmpKey,hKeyExp;
  6768. BLOBHEADER BlobHeader;
  6769. RSAPUBKEY RsaPubKey;
  6770. GPK_EXP_KEY PubKey;
  6771. DWORD SlotNb;
  6772. if (!Context_exist(hProv))
  6773. {
  6774. *pdwDataLen = 0;
  6775. RETURN( CRYPT_FAILED, NTE_BAD_UID );
  6776. }
  6777. SlotNb = ProvCont[hProv].Slot;
  6778. if (hKey == 0)
  6779. {
  6780. RETURN( CRYPT_FAILED, NTE_BAD_KEY );
  6781. }
  6782. else if (hKey <= MAX_GPK_OBJ)
  6783. {
  6784. if ( ProvCont[hProv].Flags & CRYPT_VERIFYCONTEXT &&
  6785. ProvCont[hProv].isContNameNullBlank )
  6786. {
  6787. RETURN( CRYPT_FAILED, NTE_PERM );
  6788. }
  6789. if (dwBlobType == PUBLICKEYBLOB)
  6790. {
  6791. if (dwFlags != 0)
  6792. RETURN( CRYPT_FAILED, NTE_BAD_FLAGS );
  6793. if (hPubKey != 0)
  6794. {
  6795. *pdwDataLen = 0;
  6796. RETURN( CRYPT_FAILED, NTE_BAD_KEY );
  6797. }
  6798. if (Slot[SlotNb].GpkObject[hKey].FileId == 0x00)
  6799. {
  6800. *pdwDataLen = 0;
  6801. RETURN( CRYPT_FAILED, NTE_BAD_KEY );
  6802. }
  6803. if ( Slot[SlotNb].GpkObject[hKey].Field[POS_KEY_TYPE].Len == 0 ||
  6804. ( Slot[SlotNb].GpkObject[hKey].Field[POS_KEY_TYPE].pValue[0] != AT_KEYEXCHANGE &&
  6805. Slot[SlotNb].GpkObject[hKey].Field[POS_KEY_TYPE].pValue[0] != AT_SIGNATURE ) )
  6806. {
  6807. *pdwDataLen = 0;
  6808. RETURN( CRYPT_FAILED, NTE_BAD_KEY );
  6809. }
  6810. PubKey = Slot[SlotNb].GpkPubKeys[Slot[SlotNb].GpkObject[hKey].FileId - GPK_FIRST_KEY];
  6811. if (PubKey.KeySize == 0)
  6812. {
  6813. *pdwDataLen = 0;
  6814. RETURN( CRYPT_FAILED, NTE_BAD_KEY );
  6815. }
  6816. if (PubKey.ExpSize > sizeof(DWORD))
  6817. {
  6818. *pdwDataLen = 0;
  6819. RETURN( CRYPT_FAILED, NTE_BAD_KEY );
  6820. }
  6821. dwBlobLen = sizeof(BLOBHEADER) +
  6822. sizeof(RSAPUBKEY) +
  6823. PubKey.KeySize;
  6824. if (IsNull(pbData))
  6825. {
  6826. *pdwDataLen = dwBlobLen;
  6827. RETURN( CRYPT_SUCCEED, 0 );
  6828. }
  6829. else if (*pdwDataLen < dwBlobLen)
  6830. {
  6831. *pdwDataLen = dwBlobLen;
  6832. RETURN( CRYPT_FAILED, ERROR_MORE_DATA );
  6833. }
  6834. BlobHeader.bType = PUBLICKEYBLOB;
  6835. BlobHeader.bVersion = CUR_BLOB_VERSION;
  6836. BlobHeader.reserved = 0x0000;
  6837. if (Slot[SlotNb].GpkObject[hKey].Field[POS_KEY_TYPE].pValue[0] == AT_KEYEXCHANGE)
  6838. {
  6839. BlobHeader.aiKeyAlg = CALG_RSA_KEYX;
  6840. }
  6841. else
  6842. {
  6843. BlobHeader.aiKeyAlg = CALG_RSA_SIGN;
  6844. }
  6845. RsaPubKey.magic = 0x31415352;
  6846. RsaPubKey.bitlen = PubKey.KeySize * 8;
  6847. RsaPubKey.pubexp = 0;
  6848. memcpy( &RsaPubKey.pubexp, PubKey.Exposant, sizeof(DWORD) );
  6849. memcpy( pbData, &BlobHeader, sizeof(BlobHeader) );
  6850. memcpy( &pbData[sizeof(BlobHeader)], &RsaPubKey, sizeof(RsaPubKey) );
  6851. r_memcpy( &pbData[sizeof(BlobHeader)+ sizeof(RsaPubKey) ], PubKey.Modulus, PubKey.KeySize );
  6852. *pdwDataLen = dwBlobLen;
  6853. }
  6854. else
  6855. {
  6856. *pdwDataLen = 0;
  6857. RETURN( CRYPT_FAILED, NTE_BAD_TYPE );
  6858. }
  6859. }
  6860. /* Temporary key */
  6861. else if (key_exist( hKey - MAX_GPK_OBJ, hProv ))
  6862. {
  6863. hTmpKey = hKey - MAX_GPK_OBJ;
  6864. if (hPubKey == 0)
  6865. {
  6866. *pdwDataLen = 0;
  6867. RETURN( CRYPT_FAILED, NTE_BAD_KEY );
  6868. }
  6869. if (hPubKey <= MAX_GPK_OBJ)
  6870. {
  6871. //hKeyExp = Slot[SlotNb].GpkObject[hPubKey].hKeyBase;
  6872. if ((Slot[SlotNb].GpkObject[hPubKey].Field[POS_KEY_TYPE].Len == 0) ||
  6873. ((Slot[SlotNb].GpkObject[hPubKey].Field[POS_KEY_TYPE].pValue[0] != AT_KEYEXCHANGE) &&
  6874. (Slot[SlotNb].GpkObject[hPubKey].Field[POS_KEY_TYPE].pValue[0] != AT_SIGNATURE)))
  6875. {
  6876. *pdwDataLen = 0;
  6877. RETURN(CRYPT_FAILED, NTE_BAD_KEY);
  6878. }
  6879. if (Slot[SlotNb].GpkObject[hPubKey].Field[POS_KEY_TYPE].pValue[0] == AT_KEYEXCHANGE)
  6880. {
  6881. hKeyExp = ProvCont[hProv].hRSAKEK;
  6882. }
  6883. else
  6884. {
  6885. hKeyExp = ProvCont[hProv].hRSASign;
  6886. }
  6887. }
  6888. else
  6889. {
  6890. if (!key_exist(hPubKey-MAX_GPK_OBJ, hProv))
  6891. {
  6892. *pdwDataLen = 0;
  6893. RETURN( CRYPT_FAILED, NTE_BAD_KEY );
  6894. }
  6895. else
  6896. {
  6897. hKeyExp = TmpObject[hPubKey-MAX_GPK_OBJ].hKeyBase;
  6898. }
  6899. }
  6900. CryptResp = CryptExportKey( TmpObject[hTmpKey].hKeyBase, hKeyExp, dwBlobType,
  6901. dwFlags, pbData, pdwDataLen );
  6902. if (!CryptResp)
  6903. return CRYPT_FAILED;
  6904. }
  6905. /* Unknown key handle */
  6906. else
  6907. {
  6908. *pdwDataLen = 0;
  6909. RETURN( CRYPT_FAILED, NTE_BAD_KEY );
  6910. }
  6911. RETURN( CRYPT_SUCCEED, 0 );
  6912. }
  6913. /*------------------------------------------------------------------------------
  6914. ------------------------------------------------------------------------------*/
  6915. static BOOL gen_key_on_board8000( HCRYPTPROV hProv, BYTE fileId )
  6916. {
  6917. BOOL Is1024 = FALSE;
  6918. ULONG ulStart, ulEnd;
  6919. BYTE KeyType, Sfi;
  6920. //char szTmp[100];
  6921. WORD wKeySize = 0;
  6922. SCARDHANDLE hCard;
  6923. DWORD lRet;
  6924. hCard = ProvCont[hProv].hCard;
  6925. BeginWait();
  6926. /*-------------------------------------------------------------------------*/
  6927. /* Call on board generation for specified key file */
  6928. /*-------------------------------------------------------------------------*/
  6929. Sfi = 0x04 | (fileId<<3);
  6930. /* Read Record (TAG_INFO) to get key size */
  6931. bSendBuffer[0] = 0x00; //CLA
  6932. bSendBuffer[1] = 0xB2; //INS
  6933. bSendBuffer[2] = 0x01; //P1
  6934. bSendBuffer[3] = Sfi; //P2
  6935. bSendBuffer[4] = 0x07; //Lo
  6936. cbSendLength = 5;
  6937. cbRecvLength = sizeof(bRecvBuffer);
  6938. lRet = SCardTransmit( hCard, SCARD_PCI_T0, bSendBuffer,
  6939. cbSendLength, 0, bRecvBuffer, &cbRecvLength
  6940. );
  6941. if(SCARDPROBLEM(lRet,0x9000,bSendBuffer[4]))
  6942. {
  6943. EndWait();
  6944. return CRYPT_FAILED;
  6945. }
  6946. KeyType = bRecvBuffer[1];
  6947. if (KeyType == 0x11)
  6948. {
  6949. Is1024 = TRUE;
  6950. wKeySize = 1024;
  6951. }
  6952. else if (KeyType == 0x00)
  6953. {
  6954. Is1024 = FALSE;
  6955. wKeySize = 512;
  6956. }
  6957. else
  6958. {
  6959. EndWait();
  6960. return CRYPT_FAILED;
  6961. }
  6962. Sfi = 0x80 | (fileId);
  6963. // + [FP]
  6964. //sprintf(szTmp,
  6965. // "RSA %d bit key pair on-board generation",
  6966. // wKeySize
  6967. // );
  6968. //ShowProgress(GetActiveWindow(), szTmp, "Operation in progress...", 0);
  6969. ShowProgressWrapper(wKeySize);
  6970. // - [FP]
  6971. ulStart = GetTickCount();
  6972. if (Is1024)
  6973. {
  6974. ulEnd = ulStart + (TIME_GEN_1024 * 1000);
  6975. }
  6976. else
  6977. {
  6978. ulEnd = ulStart + (TIME_GEN_512 * 1000);
  6979. }
  6980. GEN_KEY:
  6981. /* Call on-board generation */
  6982. bSendBuffer[0] = 0x80; //CLA
  6983. bSendBuffer[1] = 0xD2; //INS
  6984. bSendBuffer[2] = Sfi; //P1
  6985. bSendBuffer[3] = KeyType; //P2
  6986. cbSendLength = 4;
  6987. cbRecvLength = sizeof(bRecvBuffer);
  6988. lRet = SCardTransmit( hCard, SCARD_PCI_T0, bSendBuffer,
  6989. cbSendLength, 0, bRecvBuffer, &cbRecvLength );
  6990. if(SCARDPROBLEM(lRet,0x9000,0x00))
  6991. {
  6992. DestroyProgress();
  6993. EndWait();
  6994. return CRYPT_FAILED;
  6995. }
  6996. /* Wait for generation is successfull */
  6997. if (Is1024 && g_GPK8000KeyGenTime1024 > 0)
  6998. {
  6999. Wait( 1, 1, g_GPK8000KeyGenTime1024 );
  7000. }
  7001. else
  7002. if (!Is1024 && g_GPK8000KeyGenTime512 > 0)
  7003. {
  7004. Wait( 1, 1, g_GPK8000KeyGenTime512 );
  7005. }
  7006. do
  7007. {
  7008. /* Get response to know if generation successfull */
  7009. bSendBuffer[0] = 0x00; //CLA
  7010. bSendBuffer[1] = 0xC0; //INS
  7011. bSendBuffer[2] = 0x00; //P1
  7012. bSendBuffer[3] = 0x00; //P2
  7013. bSendBuffer[4] = 0x42; //Le
  7014. if (Is1024)
  7015. {
  7016. bSendBuffer[4] = 0x82; //Le
  7017. }
  7018. cbSendLength = 5;
  7019. cbRecvLength = sizeof(bRecvBuffer);
  7020. lRet = SCardTransmit( hCard, SCARD_PCI_T0, bSendBuffer,
  7021. cbSendLength, 0, bRecvBuffer, &cbRecvLength );
  7022. if(SCARDPROBLEM(lRet,0x9000,0x00))
  7023. {
  7024. if ((dwSW1SW2 == 0x6a88) || (dwSW1SW2 == 0x9220))
  7025. {
  7026. goto GEN_KEY;
  7027. }
  7028. }
  7029. // + [FP]
  7030. //sprintf(szTmp,
  7031. // "Operation started since %d seconds",
  7032. // (GetTickCount() - ulStart) / 1000
  7033. // );
  7034. //ChangeProgressText(szTmp);
  7035. ChangeProgressWrapper((GetTickCount() - ulStart) / 1000);
  7036. // - [FP]
  7037. if (GetTickCount() > ulEnd)
  7038. {
  7039. break;
  7040. }
  7041. }
  7042. while ((lRet != SCARD_S_SUCCESS) || (dwSW1SW2 != 0x9000));
  7043. DestroyProgress();
  7044. if ((lRet != SCARD_S_SUCCESS) || (dwSW1SW2 != 0x9000))
  7045. {
  7046. EndWait();
  7047. return CRYPT_FAILED;
  7048. }
  7049. EndWait();
  7050. return CRYPT_SUCCEED;
  7051. }
  7052. /*------------------------------------------------------------------------------
  7053. ------------------------------------------------------------------------------*/
  7054. static BOOL gen_key_on_board (HCRYPTPROV hProv)
  7055. {
  7056. BOOL IsLast = FALSE,
  7057. IsExport = TRUE,
  7058. Is1024 = FALSE;
  7059. BYTE Sfi, TmpKeyLength;
  7060. WORD wPubSize;
  7061. DWORD i, lRet ,dwLen,
  7062. dwNumberofCommands,
  7063. dwLastCommandLen,
  7064. dwCommandLen;
  7065. DWORD SlotNb;
  7066. WORD offset;
  7067. SlotNb = ProvCont[hProv].Slot;
  7068. if (Slot[SlotNb].NbKeyFile == 0)
  7069. Slot[SlotNb].NbKeyFile = Read_NbKeyFile(hProv);
  7070. if (Slot[SlotNb].NbKeyFile == 0 || Slot[SlotNb].NbKeyFile > MAX_REAL_KEY)
  7071. {
  7072. RETURN( CRYPT_FAILED, SCARD_E_FILE_NOT_FOUND );
  7073. }
  7074. if (!Select_MF(hProv))
  7075. return CRYPT_FAILED;
  7076. if (!VerifyDivPIN(hProv, FALSE))
  7077. return CRYPT_FAILED;
  7078. if (!Select_Crypto_DF(hProv))
  7079. return CRYPT_FAILED;
  7080. if (!PIN_Validation(hProv))
  7081. return CRYPT_FAILED;
  7082. if (!VerifyDivPIN(hProv, TRUE))
  7083. return CRYPT_FAILED;
  7084. /*-------------------------------------------------------------------------*/
  7085. /* Call on board generation for each key file */
  7086. /*-------------------------------------------------------------------------*/
  7087. i = 0;
  7088. do
  7089. {
  7090. Sfi = 0x04 | ((GPK_FIRST_KEY+(BYTE)i)<<3);
  7091. /* Read Record (TAG_INFO) to get key size */
  7092. bSendBuffer[0] = 0x00; //CLA
  7093. bSendBuffer[1] = 0xB2; //INS
  7094. bSendBuffer[2] = 0x01; //P1
  7095. bSendBuffer[3] = Sfi; //P2
  7096. bSendBuffer[4] = 0x07; //Lo
  7097. cbSendLength = 5;
  7098. cbRecvLength = sizeof(bRecvBuffer);
  7099. lRet = SCardTransmit( ProvCont[hProv].hCard, SCARD_PCI_T0, bSendBuffer,
  7100. cbSendLength, 0, bRecvBuffer, &cbRecvLength );
  7101. if (SCARDPROBLEM(lRet,0x9000,bSendBuffer[4]))
  7102. {
  7103. EndWait();
  7104. RETURN( CRYPT_FAILED, SCARD_E_UNEXPECTED );
  7105. }
  7106. if (bRecvBuffer[1] == 0x11)
  7107. {
  7108. IsExport = FALSE;
  7109. Is1024 = TRUE;
  7110. }
  7111. else
  7112. {
  7113. Is1024 = FALSE;
  7114. }
  7115. TmpKeyLength = bRecvBuffer[1];
  7116. Sfi = 0x80 | (GPK_FIRST_KEY+(BYTE)i);
  7117. GEN_KEY:
  7118. /* Call on-board generation */
  7119. bSendBuffer[0] = 0x80; //CLA
  7120. bSendBuffer[1] = 0xD2; //INS
  7121. bSendBuffer[2] = Sfi; //P1
  7122. bSendBuffer[3] = TmpKeyLength; //P2
  7123. cbSendLength = 4;
  7124. cbRecvLength = sizeof(bRecvBuffer);
  7125. lRet = SCardTransmit( ProvCont[hProv].hCard, SCARD_PCI_T0, bSendBuffer,
  7126. cbSendLength, 0, bRecvBuffer, &cbRecvLength );
  7127. if (SCARDPROBLEM(lRet,0x9000,0x00))
  7128. {
  7129. // if the first key has been generate successfully -- meaning??
  7130. if (dwSW1SW2 == 0x6982) // 0x6982: access condition not fulfilled
  7131. {
  7132. i++; // skip and generate another key
  7133. continue;
  7134. }
  7135. EndWait();
  7136. RETURN( CRYPT_FAILED, SCARD_E_UNEXPECTED );
  7137. }
  7138. /* Wait for generation is successfull */
  7139. if (Is1024)
  7140. {
  7141. Wait( i+1, Slot[SlotNb].NbKeyFile, TIME_GEN_1024 );
  7142. }
  7143. else
  7144. {
  7145. Wait( i+1, Slot[SlotNb].NbKeyFile, TIME_GEN_512 );
  7146. }
  7147. /* Get response to know if generation successfull */
  7148. bSendBuffer[0] = 0x00; //CLA
  7149. bSendBuffer[1] = 0xC0; //INS
  7150. bSendBuffer[2] = 0x00; //P1
  7151. bSendBuffer[3] = 0x00; //P2
  7152. bSendBuffer[4] = 0x42; //Le
  7153. if (Is1024)
  7154. {
  7155. bSendBuffer[4] = 0x82; //Le
  7156. }
  7157. cbSendLength = 5;
  7158. cbRecvLength = sizeof(bRecvBuffer);
  7159. lRet = SCardTransmit( ProvCont[hProv].hCard, SCARD_PCI_T0, bSendBuffer,
  7160. cbSendLength, 0, bRecvBuffer, &cbRecvLength );
  7161. if (SCARDPROBLEM(lRet,0x9000,0x00))
  7162. {
  7163. if (dwSW1SW2 == 0x6a88) // 0x6a88: key selection error
  7164. {
  7165. goto GEN_KEY;
  7166. }
  7167. EndWait();
  7168. RETURN(CRYPT_FAILED, SCARD_E_UNEXPECTED);
  7169. }
  7170. /* Freeze key file */
  7171. bSendBuffer[0] = 0x80; //CLA
  7172. bSendBuffer[1] = 0x16; //INS
  7173. bSendBuffer[2] = 0x02; //P1
  7174. bSendBuffer[3] = 0x00; //P2
  7175. bSendBuffer[4] = 0x05; //Li
  7176. bSendBuffer[5] = 0x00;
  7177. bSendBuffer[6] = 0x07+(BYTE)i;
  7178. bSendBuffer[7] = 0x40;
  7179. bSendBuffer[8] = 0x40;
  7180. bSendBuffer[9] = 0x00;
  7181. cbSendLength = 10;
  7182. cbRecvLength = sizeof(bRecvBuffer);
  7183. lRet = SCardTransmit( ProvCont[hProv].hCard, SCARD_PCI_T0, bSendBuffer,
  7184. cbSendLength, 0, bRecvBuffer, &cbRecvLength );
  7185. if (SCARDPROBLEM(lRet,0x9000,0x00))
  7186. {
  7187. EndWait();
  7188. RETURN( CRYPT_FAILED, SCARD_E_UNEXPECTED );
  7189. }
  7190. i++;
  7191. }
  7192. while (i < Slot[SlotNb].NbKeyFile); // version 2.00.002, it was "(i<MAX_REAL_KEY)"
  7193. /*-------------------------------------------------------------------------*/
  7194. /* Erase on board generation filter */
  7195. /*-------------------------------------------------------------------------*/
  7196. /* Call erase command */
  7197. bSendBuffer[0] = 0x80; //CLA
  7198. bSendBuffer[1] = 0xD4; //INS
  7199. bSendBuffer[2] = 0x00; //P1
  7200. bSendBuffer[3] = 0x00; //P2
  7201. cbSendLength = 4;
  7202. cbRecvLength = sizeof(bRecvBuffer);
  7203. lRet = SCardTransmit( ProvCont[hProv].hCard, SCARD_PCI_T0, bSendBuffer,
  7204. cbSendLength, 0, bRecvBuffer, &cbRecvLength );
  7205. if (SCARDPROBLEM(lRet,0x9000,0x00))
  7206. {
  7207. EndWait();
  7208. RETURN(CRYPT_FAILED, SCARD_E_UNEXPECTED);
  7209. }
  7210. /*-------------------------------------------------------------------------*/
  7211. /* Public Part */
  7212. /*-------------------------------------------------------------------------*/
  7213. wPubSize = EF_PUBLIC_SIZE;
  7214. if (IsExport)
  7215. {
  7216. wPubSize = wPubSize + DIFF_US_EXPORT;
  7217. }
  7218. /* Create EF for Public Object storage */
  7219. bSendBuffer[0] = 0x80; //CLA
  7220. bSendBuffer[1] = 0xE0; //INS
  7221. bSendBuffer[2] = 0x02; //P1
  7222. bSendBuffer[3] = 0x00; //P2
  7223. bSendBuffer[4] = 0x0C; //Li
  7224. bSendBuffer[5] = HIBYTE(GPK_OBJ_PUB_EF); //File Id
  7225. bSendBuffer[6] = LOBYTE(GPK_OBJ_PUB_EF);
  7226. bSendBuffer[7] = 0x01; //FDB
  7227. bSendBuffer[8] = 0x00; //Rec Len
  7228. bSendBuffer[9] = HIBYTE(wPubSize); //Body Length
  7229. bSendBuffer[10] = LOBYTE(wPubSize);
  7230. bSendBuffer[11] = 0x00; //AC1
  7231. bSendBuffer[12] = 0x00;
  7232. bSendBuffer[13] = 0xC0; //AC2
  7233. bSendBuffer[14] = 0x00;
  7234. bSendBuffer[15] = 0x00; //AC3
  7235. bSendBuffer[16] = 0x00;
  7236. cbSendLength = 17;
  7237. cbRecvLength = sizeof(bRecvBuffer);
  7238. lRet = SCardTransmit( ProvCont[hProv].hCard, SCARD_PCI_T0, bSendBuffer,
  7239. cbSendLength, 0, bRecvBuffer, &cbRecvLength );
  7240. if (SCARDPROBLEM(lRet,0x9000,0x00))
  7241. {
  7242. EndWait();
  7243. RETURN(CRYPT_FAILED, SCARD_E_UNEXPECTED);
  7244. }
  7245. /* Select Public Object storage EF */
  7246. bSendBuffer[0] = 0x00; //CLA
  7247. bSendBuffer[1] = 0xA4; //INS
  7248. bSendBuffer[2] = 0x02; //P1
  7249. bSendBuffer[3] = 0x00; //P2
  7250. bSendBuffer[4] = 0x02; //Li
  7251. bSendBuffer[5] = HIBYTE(GPK_OBJ_PUB_EF);
  7252. bSendBuffer[6] = LOBYTE(GPK_OBJ_PUB_EF);
  7253. cbSendLength = 7;
  7254. cbRecvLength = sizeof(bRecvBuffer);
  7255. lRet = SCardTransmit( ProvCont[hProv].hCard, SCARD_PCI_T0, bSendBuffer,
  7256. cbSendLength, 0, bRecvBuffer, &cbRecvLength );
  7257. if (SCARDPROBLEM(lRet,0x61FF,0x00))
  7258. {
  7259. EndWait();
  7260. RETURN(CRYPT_FAILED, SCARD_E_UNEXPECTED);
  7261. }
  7262. dwLen = sizeof(InitValue[Slot[SlotNb].NbKeyFile-1]);//wPubSize;
  7263. /* Write the Objects EF */
  7264. dwNumberofCommands = (dwLen-1)/FILE_CHUNK_SIZE + 1;
  7265. dwLastCommandLen = dwLen%FILE_CHUNK_SIZE;
  7266. if (dwLastCommandLen == 0)
  7267. {
  7268. dwLastCommandLen = FILE_CHUNK_SIZE;
  7269. }
  7270. dwCommandLen = FILE_CHUNK_SIZE;
  7271. for (i=0; i < dwNumberofCommands ; i++)
  7272. {
  7273. if (i == dwNumberofCommands - 1)
  7274. {
  7275. dwCommandLen = dwLastCommandLen;
  7276. }
  7277. /* Write FILE_CHUCK_SIZE bytes or last bytes */
  7278. bSendBuffer[0] = 0x00; //CLA
  7279. bSendBuffer[1] = 0xD6; //INS
  7280. // TT 03/11/99
  7281. //bSendBuffer[2] = HIBYTE(i*FILE_CHUNK_SIZE/4); //P1
  7282. //bSendBuffer[3] = LOBYTE(i*FILE_CHUNK_SIZE/4); //P2
  7283. offset = (WORD)(i * FILE_CHUNK_SIZE) / ProvCont[hProv].dataUnitSize;
  7284. bSendBuffer[2] = HIBYTE( offset );
  7285. bSendBuffer[3] = LOBYTE( offset );
  7286. bSendBuffer[4] = (BYTE)dwCommandLen; //Li
  7287. memcpy(&bSendBuffer[5],
  7288. &InitValue[Slot[SlotNb].NbKeyFile-1][i*FILE_CHUNK_SIZE],
  7289. dwCommandLen
  7290. );
  7291. cbSendLength = 5 + dwCommandLen;
  7292. cbRecvLength = sizeof(bRecvBuffer);
  7293. lRet = SCardTransmit( ProvCont[hProv].hCard, SCARD_PCI_T0, bSendBuffer,
  7294. cbSendLength, 0, bRecvBuffer, &cbRecvLength );
  7295. if (SCARDPROBLEM(lRet,0x9000, 0x00))
  7296. {
  7297. EndWait();
  7298. RETURN(CRYPT_FAILED, SCARD_E_UNEXPECTED);
  7299. }
  7300. }
  7301. /*-------------------------------------------------------------------------*/
  7302. /* Private Part */
  7303. /*-------------------------------------------------------------------------*/
  7304. /* Create EF for Private Object storage */
  7305. bSendBuffer[0] = 0x80; //CLA
  7306. bSendBuffer[1] = 0xE0; //INS
  7307. bSendBuffer[2] = 0x02; //P1
  7308. bSendBuffer[3] = 0x00; //P2
  7309. bSendBuffer[4] = 0x0C; //Li
  7310. bSendBuffer[5] = HIBYTE(GPK_OBJ_PRIV_EF); //File Id
  7311. bSendBuffer[6] = LOBYTE(GPK_OBJ_PRIV_EF);
  7312. bSendBuffer[7] = 0x01; //FDB
  7313. bSendBuffer[8] = 0x00; //Rec Len
  7314. bSendBuffer[9] = HIBYTE(EF_PRIVATE_SIZE); //Body Length
  7315. bSendBuffer[10] = LOBYTE(EF_PRIVATE_SIZE);
  7316. bSendBuffer[11] = 0x40; //AC1
  7317. bSendBuffer[12] = 0x80;
  7318. bSendBuffer[13] = 0xC0; //AC2
  7319. bSendBuffer[14] = 0x80;
  7320. bSendBuffer[15] = 0x40; //AC3
  7321. bSendBuffer[16] = 0x80;
  7322. cbSendLength = 17;
  7323. cbRecvLength = sizeof(bRecvBuffer);
  7324. lRet = SCardTransmit( ProvCont[hProv].hCard, SCARD_PCI_T0, bSendBuffer,
  7325. cbSendLength, 0, bRecvBuffer, &cbRecvLength );
  7326. if (SCARDPROBLEM(lRet,0x9000,0x00))
  7327. {
  7328. EndWait();
  7329. RETURN(CRYPT_FAILED, SCARD_E_UNEXPECTED);
  7330. }
  7331. /* Select Private Object storage EF */
  7332. bSendBuffer[0] = 0x00; //CLA
  7333. bSendBuffer[1] = 0xA4; //INS
  7334. bSendBuffer[2] = 0x02; //P1
  7335. bSendBuffer[3] = 0x00; //P2
  7336. bSendBuffer[4] = 0x02; //Li
  7337. bSendBuffer[5] = HIBYTE(GPK_OBJ_PRIV_EF);
  7338. bSendBuffer[6] = LOBYTE(GPK_OBJ_PRIV_EF);
  7339. cbSendLength = 7;
  7340. cbRecvLength = sizeof(bRecvBuffer);
  7341. lRet = SCardTransmit( ProvCont[hProv].hCard, SCARD_PCI_T0, bSendBuffer,
  7342. cbSendLength, 0, bRecvBuffer, &cbRecvLength );
  7343. if (SCARDPROBLEM(lRet,0x61FF,0x00))
  7344. {
  7345. EndWait();
  7346. RETURN(CRYPT_FAILED, SCARD_E_UNEXPECTED);
  7347. }
  7348. dwLen = sizeof(InitValue[Slot[SlotNb].NbKeyFile-1]);//EF_PRIVATE_SIZE;
  7349. /* Write the Objects EF */
  7350. dwNumberofCommands = (dwLen-1)/FILE_CHUNK_SIZE + 1;
  7351. dwLastCommandLen = dwLen%FILE_CHUNK_SIZE;
  7352. if (dwLastCommandLen == 0)
  7353. {
  7354. dwLastCommandLen = FILE_CHUNK_SIZE;
  7355. }
  7356. dwCommandLen = FILE_CHUNK_SIZE;
  7357. for (i=0; i < dwNumberofCommands ; i++)
  7358. {
  7359. if (i == dwNumberofCommands - 1)
  7360. {
  7361. dwCommandLen = dwLastCommandLen;
  7362. }
  7363. // Write FILE_CHUCK_SIZE bytes or last bytes
  7364. bSendBuffer[0] = 0x00; //CLA
  7365. bSendBuffer[1] = 0xD6; //INS
  7366. offset = (WORD)(i * FILE_CHUNK_SIZE) / ProvCont[hProv].dataUnitSize;
  7367. bSendBuffer[2] = HIBYTE( offset );
  7368. bSendBuffer[3] = LOBYTE( offset );
  7369. bSendBuffer[4] = (BYTE)dwCommandLen; //Li
  7370. memcpy(&bSendBuffer[5],
  7371. &InitValue[Slot[SlotNb].NbKeyFile-1][i*FILE_CHUNK_SIZE],
  7372. dwCommandLen
  7373. );
  7374. cbSendLength = 5 + dwCommandLen;
  7375. cbRecvLength = sizeof(bRecvBuffer);
  7376. lRet = SCardTransmit( ProvCont[hProv].hCard, SCARD_PCI_T0, bSendBuffer,
  7377. cbSendLength, 0, bRecvBuffer, &cbRecvLength );
  7378. if (SCARDPROBLEM(lRet,0x9000, 0x00))
  7379. {
  7380. EndWait();
  7381. RETURN(CRYPT_FAILED, SCARD_E_UNEXPECTED);
  7382. }
  7383. }
  7384. EndWait();
  7385. RETURN (CRYPT_SUCCEED, 0);
  7386. }
  7387. /*
  7388. - MyCPGenKey
  7389. -
  7390. * Purpose:
  7391. * Generate cryptographic keys
  7392. *
  7393. *
  7394. * Parameters:
  7395. * IN hProv - Handle to a CSP
  7396. * IN Algid - Algorithm identifier
  7397. * IN dwFlags - Flags values
  7398. * OUT phKey - Handle to a generated key
  7399. *
  7400. * Returns:
  7401. */
  7402. BOOL WINAPI MyCPGenKey(IN HCRYPTPROV hProv,
  7403. IN ALG_ID Algid,
  7404. IN DWORD dwFlags,
  7405. OUT HCRYPTKEY *phKey
  7406. )
  7407. {
  7408. HCRYPTKEY hKey, hKeyPriv;
  7409. BOOL bSessKey;
  7410. BYTE *pbBuff1 = 0, i;
  7411. BYTE KeyBuff[50], SaltBuff[50];
  7412. BYTE SaltLen, KeyLen;
  7413. DWORD lRet,
  7414. dwBuff1Len,
  7415. SlotNb;
  7416. int nbKey;
  7417. BOOL bAllSameSize;
  7418. BOOL b512avail;
  7419. BOOL b1024avail;
  7420. // +NK 06.02.2001
  7421. DWORD dwPinLength;
  7422. // -
  7423. *phKey = 0;
  7424. bSessKey = FALSE;
  7425. if (!Context_exist(hProv))
  7426. {
  7427. RETURN (CRYPT_FAILED, NTE_BAD_UID);
  7428. }
  7429. SlotNb = ProvCont[hProv].Slot;
  7430. if (Algid == AT_KEYEXCHANGE || Algid == AT_SIGNATURE)
  7431. {
  7432. if (ProvCont[hProv].Flags & CRYPT_VERIFYCONTEXT)
  7433. {
  7434. RETURN( CRYPT_FAILED, NTE_PERM );
  7435. }
  7436. if (Slot[SlotNb].NbKeyFile == 0)
  7437. Slot[SlotNb].NbKeyFile = Read_NbKeyFile(hProv);
  7438. if (Slot[SlotNb].NbKeyFile == 0 || Slot[SlotNb].NbKeyFile > MAX_REAL_KEY)
  7439. {
  7440. RETURN (CRYPT_FAILED, SCARD_E_FILE_NOT_FOUND); // should not bigger than MAX_REAL_KEY
  7441. }
  7442. }
  7443. switch (Algid)
  7444. {
  7445. case AT_SIGNATURE:
  7446. //
  7447. // Verisign Enrollment process does not respect this fact
  7448. //
  7449. // if (dwFlags & CRYPT_EXPORTABLE)
  7450. // {
  7451. // RETURN (CRYPT_FAILED, NTE_BAD_FLAGS);
  7452. // }
  7453. if (ProvCont[hProv].Flags & CRYPT_VERIFYCONTEXT)
  7454. {
  7455. RETURN( CRYPT_FAILED, NTE_PERM );
  7456. }
  7457. // + NK 06.02.2001
  7458. // if ((ProvCont[hProv].Flags & CRYPT_SILENT) && (IsNullStr(Slot[SlotNb].GetPin())))
  7459. lRet = Query_MSPinCache( Slot[SlotNb].hPinCacheHandle,
  7460. NULL,
  7461. &dwPinLength );
  7462. if ((lRet != ERROR_SUCCESS) && (lRet != ERROR_EMPTY))
  7463. RETURN (CRYPT_FAILED, lRet);
  7464. if ((ProvCont[hProv].Flags & CRYPT_SILENT) && (lRet == ERROR_EMPTY))
  7465. // - NK
  7466. {
  7467. RETURN( CRYPT_FAILED, NTE_SILENT_CONTEXT );
  7468. }
  7469. if (!PublicEFExists(hProv))
  7470. {
  7471. if (!gen_key_on_board(hProv))
  7472. {
  7473. return CRYPT_FAILED;
  7474. }
  7475. else
  7476. {
  7477. if (!read_gpk_objects(hProv, FALSE))
  7478. return CRYPT_FAILED;
  7479. Slot[SlotNb].Read_Public = TRUE;
  7480. Slot[SlotNb].Read_Priv = FALSE;
  7481. }
  7482. }
  7483. if (!Read_Priv_Obj(hProv))
  7484. return CRYPT_FAILED;
  7485. if (HIWORD(dwFlags) != 0x0000)
  7486. {
  7487. KeyLen = HIWORD(dwFlags) / 8;
  7488. //check for the keylen, only 512 or 1024 key are supported for now
  7489. if (( KeyLen != 64 && KeyLen != 128 ) || (HIWORD(dwFlags) & 7))
  7490. {
  7491. RETURN (CRYPT_FAILED, NTE_BAD_LEN);
  7492. }
  7493. // [FP] +
  7494. switch(Slot[SlotNb].NbKeyFile)
  7495. {
  7496. case 2:
  7497. if ((Slot[SlotNb].GpkPubKeys[0].KeySize == 64) &&
  7498. (Slot[SlotNb].GpkPubKeys[1].KeySize == 64) && // GPK4K Intl
  7499. (KeyLen == 128))
  7500. RETURN (CRYPT_FAILED, NTE_BAD_LEN);
  7501. break;
  7502. case 4:
  7503. break;
  7504. default:
  7505. RETURN (CRYPT_FAILED, NTE_FAIL);
  7506. }
  7507. // [FP] +
  7508. }
  7509. else
  7510. {
  7511. KeyLen = 0;
  7512. // Read key file lengths
  7513. nbKey = Slot[SlotNb].NbKeyFile;
  7514. for (i = 0; i<nbKey; ++i)
  7515. KeyLenFile[i] = Slot[SlotNb].GpkPubKeys[i].KeySize;
  7516. // If all keys have the same size, use that size
  7517. bAllSameSize = TRUE;
  7518. for (i = 1; i<nbKey; ++i)
  7519. {
  7520. if (KeyLenFile[i] != KeyLenFile[0])
  7521. {
  7522. bAllSameSize = FALSE;
  7523. break;
  7524. }
  7525. }
  7526. if (bAllSameSize)
  7527. KeyLen = KeyLenFile[0];
  7528. else
  7529. {
  7530. // TT - BUG #1504: If only one key size is available, try to use it
  7531. b512avail = find_gpk_obj_tag_type( hProv, TAG_RSA_PUBLIC, 0, 512/8, FALSE, FALSE ) != 0;
  7532. b1024avail = find_gpk_obj_tag_type( hProv, TAG_RSA_PUBLIC, 0, 1024/8, FALSE, FALSE ) != 0;
  7533. if (!b512avail && !b1024avail)
  7534. {
  7535. RETURN (CRYPT_FAILED, NTE_FAIL );
  7536. }
  7537. if (b512avail && !b1024avail) KeyLen = 512/8;
  7538. else if (!b512avail && b1024avail) KeyLen = 1024/8;
  7539. else
  7540. {
  7541. // TT - END
  7542. if (ProvCont[hProv].Flags & CRYPT_SILENT)
  7543. {
  7544. // Check if default key length (1024) is available
  7545. for (i = 0; i<nbKey; ++i)
  7546. {
  7547. if (KeyLenFile[i] == 0x80)
  7548. {
  7549. KeyLen = 0x80;
  7550. break;
  7551. }
  7552. }
  7553. if (KeyLen==0)
  7554. {
  7555. // Take smallest key size available
  7556. KeyLen = KeyLenFile[0];
  7557. for (i = 1; i<nbKey; ++i)
  7558. {
  7559. if (KeyLenFile[i] < KeyLen)
  7560. KeyLen = KeyLenFile[i];
  7561. }
  7562. }
  7563. }
  7564. else
  7565. {
  7566. DialogBox(g_hInstRes, TEXT("KEYDIALOG"), GetAppWindow(), KeyDlgProc);
  7567. if (KeyLenChoice == 0)
  7568. {
  7569. RETURN (CRYPT_FAILED, NTE_BAD_LEN);
  7570. }
  7571. else
  7572. {
  7573. KeyLen = KeyLenChoice;
  7574. }
  7575. }
  7576. }
  7577. }
  7578. }
  7579. // AT_SIGNATURE
  7580. hKey = find_gpk_obj_tag_type(hProv, TAG_RSA_PUBLIC, 0x00, KeyLen, FALSE, FALSE);
  7581. if ((hKey != 0)
  7582. &&(find_gpk_obj_tag_type(hProv, TAG_RSA_PUBLIC, AT_SIGNATURE, 0x00, FALSE, FALSE) == 0)
  7583. &&(find_gpk_obj_tag_type(hProv, TAG_CERTIFICATE, AT_SIGNATURE, 0x00, FALSE, FALSE) == 0)
  7584. )
  7585. {
  7586. *phKey = hKey;
  7587. }
  7588. else
  7589. {
  7590. RETURN (CRYPT_FAILED, NTE_FAIL );
  7591. }
  7592. // TT 24/09/99: On board key generation for GPK8000
  7593. if (ProvCont[hProv].bGPK8000)
  7594. {
  7595. if (!gen_key_on_board8000( hProv, Slot[SlotNb].GpkObject[hKey].FileId ))
  7596. {
  7597. RETURN( CRYPT_FAILED, NTE_FAIL );
  7598. }
  7599. }
  7600. // TT - END -
  7601. hKeyPriv = find_gpk_obj_tag_file(hProv,
  7602. TAG_RSA_PRIVATE,
  7603. Slot[SlotNb].GpkObject[hKey].FileId,
  7604. FALSE
  7605. );
  7606. if ( hKeyPriv == 0 )
  7607. {
  7608. RETURN (CRYPT_FAILED, NTE_SIGNATURE_FILE_BAD);
  7609. }
  7610. if ((HIWORD(dwFlags) != 0) &&
  7611. (Slot[SlotNb].GpkObject[hKeyPriv].PubKey.KeySize != (HIWORD(dwFlags) / 8))
  7612. )
  7613. {
  7614. RETURN (CRYPT_FAILED, NTE_BAD_FLAGS);
  7615. }
  7616. Slot[SlotNb].GpkObject[hKey].Field[POS_KEY_TYPE].pValue = (BYTE*)GMEM_Alloc(1);
  7617. if (IsNull (Slot[SlotNb].GpkObject[hKey].Field[POS_KEY_TYPE].pValue))
  7618. {
  7619. RETURN (CRYPT_FAILED, NTE_NO_MEMORY);
  7620. }
  7621. Slot[SlotNb].GpkObject[hKeyPriv].Field[POS_KEY_TYPE].pValue = (BYTE*)GMEM_Alloc(1);
  7622. if (IsNull (Slot[SlotNb].GpkObject[hKeyPriv].Field[POS_KEY_TYPE].pValue))
  7623. {
  7624. GMEM_Free (Slot[SlotNb].GpkObject[hKey].Field[POS_KEY_TYPE].pValue);
  7625. RETURN (CRYPT_FAILED, NTE_NO_MEMORY);
  7626. }
  7627. Slot[SlotNb].GpkObject[hKey].IsCreated = TRUE;
  7628. Slot[SlotNb].GpkObject[hKey].Flags = Slot[SlotNb].GpkObject[hKey].Flags | FLAG_KEY_TYPE;
  7629. Slot[SlotNb].GpkObject[hKey].Field[POS_KEY_TYPE].Len = 1;
  7630. Slot[SlotNb].GpkObject[hKey].Field[POS_KEY_TYPE].pValue[0] = AT_SIGNATURE;
  7631. Slot[SlotNb].GpkObject[hKey].Field[POS_KEY_TYPE].bReal = TRUE;
  7632. /* Set Flags of automatic fields for PKCS#11 compatibility */
  7633. Slot[SlotNb].GpkObject[hKey].Flags = Slot[SlotNb].GpkObject[hKey].Flags | FLAG_ID;
  7634. Slot[SlotNb].GpkObject[hKey].Field[POS_ID].Len = 0;
  7635. Slot[SlotNb].GpkObject[hKey].Field[POS_ID].bReal = FALSE;
  7636. Slot[SlotNb].GpkObject[hKeyPriv].IsCreated = TRUE;
  7637. Slot[SlotNb].GpkObject[hKeyPriv].Flags = Slot[SlotNb].GpkObject[hKeyPriv].Flags | FLAG_KEY_TYPE;
  7638. Slot[SlotNb].GpkObject[hKeyPriv].Field[POS_KEY_TYPE].Len = 1;
  7639. Slot[SlotNb].GpkObject[hKeyPriv].Field[POS_KEY_TYPE].pValue[0] = AT_SIGNATURE;
  7640. Slot[SlotNb].GpkObject[hKeyPriv].Field[POS_KEY_TYPE].bReal = TRUE;
  7641. /* Set Flags of automatic fields for PKCS#11 compatibility */
  7642. Slot[SlotNb].GpkObject[hKeyPriv].Flags = Slot[SlotNb].GpkObject[hKeyPriv].Flags | FLAG_ID;
  7643. Slot[SlotNb].GpkObject[hKeyPriv].Field[POS_ID].Len = 0;
  7644. Slot[SlotNb].GpkObject[hKeyPriv].Field[POS_ID].bReal = FALSE;
  7645. if (!ProvCont[hProv].bLegacyKeyset)
  7646. {
  7647. Slot[SlotNb].GpkObject[hKey].Flags |= FLAG_KEYSET;
  7648. Slot[SlotNb].GpkObject[hKey].Field[POS_KEYSET].Len = 1;
  7649. Slot[SlotNb].GpkObject[hKey].Field[POS_KEYSET].pValue = (BYTE*)GMEM_Alloc(1);
  7650. if(IsNull(Slot[SlotNb].GpkObject[hKey].Field[POS_KEYSET].pValue))
  7651. {
  7652. RETURN (CRYPT_FAILED, NTE_NO_MEMORY);
  7653. }
  7654. Slot[SlotNb].GpkObject[hKey].Field[POS_KEYSET].pValue[0] = ProvCont[hProv].keysetID;
  7655. Slot[SlotNb].GpkObject[hKey].Field[POS_KEYSET].bReal = TRUE;
  7656. Slot[SlotNb].GpkObject[hKeyPriv].Flags |= FLAG_KEYSET;
  7657. Slot[SlotNb].GpkObject[hKeyPriv].Field[POS_KEYSET].Len = 1;
  7658. Slot[SlotNb].GpkObject[hKeyPriv].Field[POS_KEYSET].pValue = (BYTE*)GMEM_Alloc(1);
  7659. if(IsNull(Slot[SlotNb].GpkObject[hKeyPriv].Field[POS_KEYSET].pValue))
  7660. {
  7661. RETURN (CRYPT_FAILED, NTE_NO_MEMORY);
  7662. }
  7663. Slot[SlotNb].GpkObject[hKeyPriv].Field[POS_KEYSET].pValue[0] = ProvCont[hProv].keysetID;
  7664. Slot[SlotNb].GpkObject[hKeyPriv].Field[POS_KEYSET].bReal = TRUE;
  7665. }
  7666. // Set the file containing the key to USE, add "- GPK_FIRST_KEY" here. version 2.00.002
  7667. Slot[SlotNb].UseFile [Slot[SlotNb].GpkObject[hKey].FileId- GPK_FIRST_KEY] = TRUE;
  7668. break;
  7669. case AT_KEYEXCHANGE:
  7670. //
  7671. // Verisign Enrollment process does not respect this fact
  7672. //
  7673. // if (dwFlags & CRYPT_EXPORTABLE)
  7674. // {
  7675. // RETURN (CRYPT_FAILED, NTE_BAD_FLAGS);
  7676. // }
  7677. if (ProvCont[hProv].Flags & CRYPT_VERIFYCONTEXT)
  7678. {
  7679. RETURN (CRYPT_FAILED, NTE_PERM);
  7680. }
  7681. // + NK 06.02.2001
  7682. // if ((ProvCont[hProv].Flags & CRYPT_SILENT) && (IsNullStr(Slot[SlotNb].GetPin())))
  7683. lRet = Query_MSPinCache( Slot[SlotNb].hPinCacheHandle,
  7684. NULL,
  7685. &dwPinLength );
  7686. if ( (lRet != ERROR_SUCCESS) && (lRet != ERROR_EMPTY) )
  7687. RETURN (CRYPT_FAILED, lRet);
  7688. if ((ProvCont[hProv].Flags & CRYPT_SILENT) && (lRet == ERROR_EMPTY))
  7689. // - NK
  7690. {
  7691. RETURN (CRYPT_FAILED, NTE_SILENT_CONTEXT);
  7692. }
  7693. if (!PublicEFExists(hProv))
  7694. {
  7695. if (!gen_key_on_board(hProv))
  7696. {
  7697. return CRYPT_FAILED;
  7698. }
  7699. else
  7700. {
  7701. if (!read_gpk_objects(hProv, FALSE))
  7702. return CRYPT_FAILED;
  7703. Slot[SlotNb].Read_Public = TRUE;
  7704. Slot[SlotNb].Read_Priv = FALSE;
  7705. }
  7706. }
  7707. if (!Read_Priv_Obj(hProv))
  7708. return CRYPT_FAILED;
  7709. if (HIWORD(dwFlags) != 0x0000)
  7710. {
  7711. KeyLen = HIWORD(dwFlags) / 8;
  7712. //check for the keylen, only 512 or 1024 key are supported for now
  7713. if (( KeyLen != 64 && KeyLen != 128 ) || (HIWORD(dwFlags) & 7))
  7714. {
  7715. RETURN (CRYPT_FAILED, NTE_BAD_LEN);
  7716. }
  7717. // [FP] +
  7718. switch(Slot[SlotNb].NbKeyFile)
  7719. {
  7720. case 2:
  7721. if ((Slot[SlotNb].GpkPubKeys[0].KeySize == 64) &&
  7722. (Slot[SlotNb].GpkPubKeys[1].KeySize == 64) && // GPK4K Intl
  7723. (KeyLen == 128))
  7724. RETURN (CRYPT_FAILED, NTE_BAD_LEN);
  7725. break;
  7726. case 4:
  7727. if ((Slot[SlotNb].GpkPubKeys[0].KeySize == 64) &&
  7728. (Slot[SlotNb].GpkPubKeys[1].KeySize == 64) &&
  7729. (Slot[SlotNb].GpkPubKeys[2].KeySize == 64) &&
  7730. (Slot[SlotNb].GpkPubKeys[3].KeySize == 128) && // GPK8K Intl
  7731. (KeyLen == 128))
  7732. RETURN (CRYPT_FAILED, NTE_BAD_LEN);
  7733. break;
  7734. default:
  7735. RETURN (CRYPT_FAILED, NTE_FAIL);
  7736. }
  7737. // [FP] +
  7738. }
  7739. else
  7740. {
  7741. KeyLen = 0;
  7742. // Read key file lengths
  7743. nbKey = Slot[SlotNb].NbKeyFile;
  7744. for (i = 0; i<nbKey; ++i)
  7745. KeyLenFile[i] = Slot[SlotNb].GpkPubKeys[i].KeySize;
  7746. // If all keys have the same size, use that size
  7747. bAllSameSize = TRUE;
  7748. for (i = 1; i<nbKey; ++i)
  7749. {
  7750. if (KeyLenFile[i] != KeyLenFile[0])
  7751. {
  7752. bAllSameSize = FALSE;
  7753. break;
  7754. }
  7755. }
  7756. if (bAllSameSize)
  7757. KeyLen = KeyLenFile[0];
  7758. else
  7759. {
  7760. // TT - BUG #1504: If only one key size is available, try to use it
  7761. b512avail = find_gpk_obj_tag_type( hProv, TAG_RSA_PUBLIC, 0, 512/8, TRUE, FALSE ) != 0;
  7762. b1024avail = find_gpk_obj_tag_type( hProv, TAG_RSA_PUBLIC, 0, 1024/8, TRUE, FALSE ) != 0;
  7763. if (!b512avail && !b1024avail)
  7764. {
  7765. RETURN (CRYPT_FAILED, NTE_FAIL );
  7766. }
  7767. if (b512avail && !b1024avail) KeyLen = 512/8;
  7768. else if (!b512avail && b1024avail) KeyLen = 1024/8;
  7769. else
  7770. {
  7771. // TT - END
  7772. // Check if default key length is available
  7773. for (i = 0; i<nbKey; ++i)
  7774. {
  7775. if (KeyLenFile[i] == RSA_KEK_Size)
  7776. {
  7777. KeyLen = RSA_KEK_Size;
  7778. break;
  7779. }
  7780. }
  7781. if (KeyLen==0)
  7782. {
  7783. // Take smallest key size available
  7784. KeyLen = KeyLenFile[0];
  7785. for (i = 1; i<nbKey; ++i)
  7786. {
  7787. if (KeyLenFile[i] < KeyLen)
  7788. KeyLen = KeyLenFile[i];
  7789. }
  7790. }
  7791. }
  7792. }
  7793. }
  7794. if (KeyLen > RSA_KEK_Size)
  7795. {
  7796. RETURN (CRYPT_FAILED, NTE_BAD_LEN);
  7797. }
  7798. // AT_EXCHANGE
  7799. hKey = find_gpk_obj_tag_type(hProv, TAG_RSA_PUBLIC, 0x00, KeyLen, TRUE, FALSE);
  7800. if ((hKey != 0)
  7801. &&(find_gpk_obj_tag_type(hProv, TAG_RSA_PUBLIC, AT_KEYEXCHANGE, 0x00, TRUE, FALSE) == 0)
  7802. &&(find_gpk_obj_tag_type(hProv, TAG_CERTIFICATE, AT_KEYEXCHANGE, 0x00, FALSE, FALSE) == 0)
  7803. )
  7804. {
  7805. *phKey = hKey;
  7806. }
  7807. else
  7808. {
  7809. RETURN (CRYPT_FAILED, NTE_FAIL );
  7810. }
  7811. // TT 24/09/99: On board key generation for GPK8000
  7812. if (ProvCont[hProv].bGPK8000)
  7813. {
  7814. if (!gen_key_on_board8000( hProv, Slot[SlotNb].GpkObject[hKey].FileId ))
  7815. {
  7816. RETURN( CRYPT_FAILED, NTE_FAIL );
  7817. }
  7818. }
  7819. // TT - END -
  7820. hKeyPriv = find_gpk_obj_tag_file(hProv,
  7821. TAG_RSA_PRIVATE,
  7822. Slot[SlotNb].GpkObject[hKey].FileId,
  7823. TRUE
  7824. );
  7825. if ( hKeyPriv == 0 )
  7826. {
  7827. RETURN (CRYPT_FAILED, NTE_SIGNATURE_FILE_BAD);
  7828. }
  7829. if ((HIWORD(dwFlags) != 0) &&
  7830. (Slot[SlotNb].GpkObject[hKeyPriv].PubKey.KeySize != (HIWORD(dwFlags) / 8))
  7831. )
  7832. {
  7833. RETURN (CRYPT_FAILED, NTE_BAD_FLAGS);
  7834. }
  7835. Slot[SlotNb].GpkObject[hKey].Field[POS_KEY_TYPE].pValue = (BYTE*)GMEM_Alloc(1);
  7836. if (IsNull (Slot[SlotNb].GpkObject[hKey].Field[POS_KEY_TYPE].pValue))
  7837. {
  7838. RETURN (CRYPT_FAILED, NTE_NO_MEMORY);
  7839. }
  7840. Slot[SlotNb].GpkObject[hKeyPriv].Field[POS_KEY_TYPE].pValue = (BYTE*)GMEM_Alloc(1);
  7841. if (IsNull (Slot[SlotNb].GpkObject[hKeyPriv].Field[POS_KEY_TYPE].pValue))
  7842. {
  7843. GMEM_Free (Slot[SlotNb].GpkObject[hKey].Field[POS_KEY_TYPE].pValue);
  7844. RETURN (CRYPT_FAILED, NTE_NO_MEMORY);
  7845. }
  7846. Slot[SlotNb].GpkObject[hKey].IsCreated = TRUE;
  7847. Slot[SlotNb].GpkObject[hKey].Flags = Slot[SlotNb].GpkObject[hKey].Flags | FLAG_KEY_TYPE;
  7848. Slot[SlotNb].GpkObject[hKey].Field[POS_KEY_TYPE].Len = 1;
  7849. Slot[SlotNb].GpkObject[hKey].Field[POS_KEY_TYPE].pValue[0] = AT_KEYEXCHANGE;
  7850. Slot[SlotNb].GpkObject[hKey].Field[POS_KEY_TYPE].bReal = TRUE;
  7851. /* Set Flags of automatic fields for PKCS#11 compatibility */
  7852. Slot[SlotNb].GpkObject[hKey].Flags = Slot[SlotNb].GpkObject[hKey].Flags | FLAG_ID;
  7853. Slot[SlotNb].GpkObject[hKey].Field[POS_ID].Len = 0;
  7854. Slot[SlotNb].GpkObject[hKey].Field[POS_ID].bReal = FALSE;
  7855. Slot[SlotNb].GpkObject[hKeyPriv].IsCreated = TRUE;
  7856. Slot[SlotNb].GpkObject[hKeyPriv].Flags = Slot[SlotNb].GpkObject[hKeyPriv].Flags | FLAG_KEY_TYPE;
  7857. Slot[SlotNb].GpkObject[hKeyPriv].Field[POS_KEY_TYPE].Len = 1;
  7858. Slot[SlotNb].GpkObject[hKeyPriv].Field[POS_KEY_TYPE].pValue[0] = AT_KEYEXCHANGE;
  7859. Slot[SlotNb].GpkObject[hKeyPriv].Field[POS_KEY_TYPE].bReal = TRUE;
  7860. /* Set Flags of automatic fields for PKCS#11 compatibility */
  7861. Slot[SlotNb].GpkObject[hKeyPriv].Flags = Slot[SlotNb].GpkObject[hKeyPriv].Flags | FLAG_ID;
  7862. Slot[SlotNb].GpkObject[hKeyPriv].Field[POS_ID].Len = 0;
  7863. Slot[SlotNb].GpkObject[hKeyPriv].Field[POS_ID].bReal = FALSE;
  7864. if (!ProvCont[hProv].bLegacyKeyset)
  7865. {
  7866. Slot[SlotNb].GpkObject[hKey].Flags |= FLAG_KEYSET;
  7867. Slot[SlotNb].GpkObject[hKey].Field[POS_KEYSET].Len = 1;
  7868. Slot[SlotNb].GpkObject[hKey].Field[POS_KEYSET].pValue = (BYTE*)GMEM_Alloc(1);
  7869. if(IsNull(Slot[SlotNb].GpkObject[hKey].Field[POS_KEYSET].pValue))
  7870. {
  7871. RETURN (CRYPT_FAILED, NTE_NO_MEMORY);
  7872. }
  7873. Slot[SlotNb].GpkObject[hKey].Field[POS_KEYSET].pValue[0] = ProvCont[hProv].keysetID;
  7874. Slot[SlotNb].GpkObject[hKey].Field[POS_KEYSET].bReal = TRUE;
  7875. Slot[SlotNb].GpkObject[hKeyPriv].Flags |= FLAG_KEYSET;
  7876. Slot[SlotNb].GpkObject[hKeyPriv].Field[POS_KEYSET].Len = 1;
  7877. Slot[SlotNb].GpkObject[hKeyPriv].Field[POS_KEYSET].pValue = (BYTE*)GMEM_Alloc(1);
  7878. if(IsNull(Slot[SlotNb].GpkObject[hKeyPriv].Field[POS_KEYSET].pValue))
  7879. {
  7880. RETURN (CRYPT_FAILED, NTE_NO_MEMORY);
  7881. }
  7882. Slot[SlotNb].GpkObject[hKeyPriv].Field[POS_KEYSET].pValue[0] = ProvCont[hProv].keysetID;
  7883. Slot[SlotNb].GpkObject[hKeyPriv].Field[POS_KEYSET].bReal = TRUE;
  7884. }
  7885. // Set the file containing the key to USE, add "- GPK_FIRST_KEY" here, version 2.00.002
  7886. Slot[SlotNb].UseFile [Slot[SlotNb].GpkObject[hKey].FileId - GPK_FIRST_KEY] = TRUE;
  7887. break;
  7888. case CALG_RC2:
  7889. KeyLen = RC2_Key_Size;
  7890. SaltLen = 0;
  7891. if (dwFlags & CRYPT_CREATE_SALT)
  7892. {
  7893. SaltLen = RC2_128_SIZE - RC2_Key_Size;
  7894. }
  7895. bSessKey = TRUE;
  7896. break;
  7897. case CALG_RC4:
  7898. KeyLen = RC2_Key_Size;
  7899. SaltLen = 0;
  7900. if (dwFlags & CRYPT_CREATE_SALT)
  7901. {
  7902. SaltLen = RC2_128_SIZE - RC2_Key_Size;
  7903. }
  7904. bSessKey = TRUE;
  7905. break;
  7906. case CALG_DES:
  7907. KeyLen = DES_SIZE;
  7908. SaltLen = 0;
  7909. if (dwFlags & CRYPT_CREATE_SALT)
  7910. {
  7911. RETURN (CRYPT_FAILED, NTE_BAD_FLAGS);
  7912. }
  7913. bSessKey = TRUE;
  7914. break;
  7915. case CALG_3DES_112:
  7916. KeyLen = DES3_112_SIZE;
  7917. SaltLen = 0;
  7918. if (dwFlags & CRYPT_CREATE_SALT)
  7919. {
  7920. RETURN (CRYPT_FAILED, NTE_BAD_FLAGS);
  7921. }
  7922. bSessKey = TRUE;
  7923. break;
  7924. case CALG_3DES:
  7925. KeyLen = DES3_SIZE;
  7926. SaltLen = 0;
  7927. if (dwFlags & CRYPT_CREATE_SALT)
  7928. {
  7929. RETURN (CRYPT_FAILED, NTE_BAD_FLAGS);
  7930. }
  7931. bSessKey = TRUE;
  7932. break;
  7933. default:
  7934. RETURN (CRYPT_FAILED, NTE_BAD_ALGID);
  7935. }
  7936. if (!bSessKey)
  7937. {
  7938. CspFlags = ProvCont[hProv].Flags;
  7939. pbBuff1 = (BYTE*)GMEM_Alloc (MAX_GPK_PUBLIC);
  7940. if (IsNull(pbBuff1))
  7941. {
  7942. RETURN (CRYPT_FAILED, NTE_NO_MEMORY);
  7943. }
  7944. dwBuff1Len = MAX_GPK_PUBLIC;
  7945. if (!prepare_write_gpk_objects (hProv, pbBuff1, &dwBuff1Len, FALSE))
  7946. {
  7947. lRet = GetLastError();
  7948. GMEM_Free (pbBuff1);
  7949. RETURN (CRYPT_FAILED, lRet);
  7950. }
  7951. if (!write_gpk_objects(hProv, pbBuff1, dwBuff1Len, FALSE, FALSE))
  7952. {
  7953. lRet = GetLastError();
  7954. GMEM_Free (pbBuff1);
  7955. RETURN (CRYPT_FAILED, lRet);
  7956. }
  7957. GMEM_Free (pbBuff1);
  7958. pbBuff1 = (BYTE*)GMEM_Alloc (MAX_GPK_PRIVATE);
  7959. if (IsNull(pbBuff1))
  7960. {
  7961. RETURN (CRYPT_FAILED, NTE_NO_MEMORY);
  7962. }
  7963. dwBuff1Len = MAX_GPK_PRIVATE;
  7964. if (!prepare_write_gpk_objects (hProv, pbBuff1, &dwBuff1Len, TRUE))
  7965. {
  7966. lRet = GetLastError();
  7967. GMEM_Free (pbBuff1);
  7968. RETURN (CRYPT_FAILED, lRet);
  7969. }
  7970. if (!write_gpk_objects(hProv, pbBuff1, dwBuff1Len, FALSE, TRUE))
  7971. {
  7972. lRet = GetLastError();
  7973. GMEM_Free (pbBuff1);
  7974. RETURN (CRYPT_FAILED, lRet);
  7975. }
  7976. GMEM_Free (pbBuff1);
  7977. /* Copy Gpk Key in Microsoft RSA base Module */
  7978. Slot[SlotNb].GpkPubKeys[Slot[SlotNb].GpkObject[*phKey].FileId - GPK_FIRST_KEY].KeySize = 0;
  7979. if (!read_gpk_pub_key( hProv, *phKey, &Slot[SlotNb].GpkObject[*phKey].PubKey ))
  7980. return CRYPT_FAILED;
  7981. if (!copy_gpk_key(hProv, *phKey, Algid))
  7982. return CRYPT_FAILED;
  7983. }
  7984. else
  7985. {
  7986. hKey = find_tmp_free();
  7987. if (hKey == 0)
  7988. {
  7989. RETURN (CRYPT_FAILED, NTE_NO_MEMORY);
  7990. }
  7991. if (KeyLen > AuxMaxSessionKeyLength)
  7992. {
  7993. RETURN (CRYPT_FAILED, NTE_BAD_LEN);
  7994. }
  7995. // Notice: Implicitly we also need in this case to establish a transaction
  7996. // with the card. OK done by the wrapper
  7997. if ((ProvCont[hProv].Flags & CRYPT_VERIFYCONTEXT) &&
  7998. (ProvCont[hProv].isContNameNullBlank))
  7999. {
  8000. if (!CryptGenKey (hProvBase, Algid, dwFlags, &(TmpObject[hKey].hKeyBase)))
  8001. return CRYPT_FAILED;
  8002. TmpObject[hKey].hProv = hProv;
  8003. *phKey = hKey + MAX_GPK_OBJ;
  8004. RETURN (CRYPT_SUCCEED, 0);
  8005. }
  8006. if (!MyCPGenRandom(hProv, KeyLen, KeyBuff))
  8007. return CRYPT_FAILED;
  8008. if (SaltLen != 0)
  8009. {
  8010. if (!MyCPGenRandom(hProv, SaltLen, SaltBuff))
  8011. return CRYPT_FAILED;
  8012. }
  8013. /* Copy Session Key in Microsoft RSA base Module*/
  8014. if (dwFlags & CRYPT_CREATE_SALT) // CryptImport does not deal with that flag
  8015. dwFlags ^= CRYPT_CREATE_SALT; // however, it is consider anyhow with the
  8016. // SaltLen parameter.
  8017. if (!copy_tmp_key(hProv, hKey, dwFlags, Algid, KeyBuff, KeyLen, SaltBuff, SaltLen))
  8018. return CRYPT_FAILED;
  8019. *phKey = hKey + MAX_GPK_OBJ;
  8020. }
  8021. RETURN (CRYPT_SUCCEED, 0);
  8022. }
  8023. /*
  8024. - MyCPGenRandom
  8025. -
  8026. * Purpose:
  8027. * Used to fill a buffer with random bytes
  8028. *
  8029. *
  8030. * Parameters:
  8031. * IN hProv - Handle to the user identifcation
  8032. * OUT pbBuffer - Pointer to the buffer where the random
  8033. * bytes are to be placed
  8034. * IN dwLen - Number of bytes of random data requested
  8035. *
  8036. * Returns:
  8037. */
  8038. BOOL WINAPI MyCPGenRandom(IN HCRYPTPROV hProv,
  8039. IN DWORD dwLen,
  8040. IN OUT BYTE *pbBuffer
  8041. )
  8042. {
  8043. DWORD i, dwMod, dwLastCommandLen, lRet;
  8044. if (!Context_exist(hProv))
  8045. {
  8046. RETURN (CRYPT_FAILED, NTE_BAD_UID);
  8047. }
  8048. if ((ProvCont[hProv].Flags & CRYPT_VERIFYCONTEXT) &&
  8049. (ProvCont[hProv].isContNameNullBlank))
  8050. {
  8051. RETURN (CRYPT_FAILED, NTE_PERM);
  8052. }
  8053. if (dwLen==0)
  8054. {
  8055. RETURN (CRYPT_SUCCEED, 0);
  8056. }
  8057. /* Generate random by blocks of 32 bytes */
  8058. dwMod = (dwLen-1)/32 + 1;
  8059. dwLastCommandLen = dwLen%32;
  8060. if (dwLastCommandLen == 0)
  8061. {
  8062. dwLastCommandLen = 32;
  8063. }
  8064. for (i=0 ; i < dwMod ; i++)
  8065. {
  8066. /* Ask card for a 32 bytes random number */
  8067. bSendBuffer[0] = 0x80; //CLA
  8068. bSendBuffer[1] = 0x84; //INS
  8069. bSendBuffer[2] = 0x00; //P1
  8070. bSendBuffer[3] = 0x00; //P2
  8071. bSendBuffer[4] = 0x20; //Lo
  8072. cbSendLength = 5;
  8073. cbRecvLength = sizeof(bRecvBuffer);
  8074. lRet = SCardTransmit( ProvCont[hProv].hCard, SCARD_PCI_T0, bSendBuffer,
  8075. cbSendLength, 0, bRecvBuffer, &cbRecvLength );
  8076. if (SCARDPROBLEM(lRet,0x9000,bSendBuffer[4]))
  8077. {
  8078. RETURN (CRYPT_FAILED, SCARD_E_UNSUPPORTED_FEATURE);
  8079. }
  8080. memcpy(&pbBuffer[i*32],
  8081. bRecvBuffer,
  8082. ((i == dwMod - 1) ? dwLastCommandLen : 32)
  8083. );
  8084. }
  8085. RETURN (CRYPT_SUCCEED, 0);
  8086. }
  8087. /*
  8088. - MyCPGetKeyParam
  8089. -
  8090. * Purpose:
  8091. * Allows applications to get various aspects of the
  8092. * operations of a key
  8093. *
  8094. * Parameters:
  8095. * IN hProv - Handle to a CSP
  8096. * IN hKey - Handle to a key
  8097. * IN dwParam - Parameter number
  8098. * IN pbData - Pointer to data
  8099. * IN pdwDataLen - Length of parameter data
  8100. * IN dwFlags - Flags values
  8101. *
  8102. * Returns:
  8103. */
  8104. BOOL WINAPI MyCPGetKeyParam(IN HCRYPTPROV hProv,
  8105. IN HCRYPTKEY hKey,
  8106. IN DWORD dwParam,
  8107. IN BYTE *pbData,
  8108. IN DWORD *pdwDataLen,
  8109. IN DWORD dwFlags
  8110. )
  8111. {
  8112. BOOL CryptResp;
  8113. BYTE hCert;
  8114. BYTE KeyType;
  8115. BYTE KeyId;
  8116. BYTE GpkKeySize;
  8117. DWORD SlotNb;
  8118. if (!Context_exist(hProv))
  8119. {
  8120. RETURN (CRYPT_FAILED, NTE_BAD_UID);
  8121. }
  8122. SlotNb = ProvCont[hProv].Slot;
  8123. /* Resident Key */
  8124. if (hKey == 0)
  8125. {
  8126. RETURN (CRYPT_FAILED, NTE_BAD_KEY);
  8127. }
  8128. else if (hKey <= MAX_GPK_OBJ)
  8129. {
  8130. if (dwFlags != 0)
  8131. {
  8132. RETURN (CRYPT_FAILED, NTE_BAD_FLAGS);
  8133. }
  8134. // [mv - 15/05/98]
  8135. if ((ProvCont[hProv].Flags & CRYPT_VERIFYCONTEXT) &&
  8136. (ProvCont[hProv].isContNameNullBlank))
  8137. {
  8138. RETURN (CRYPT_FAILED, NTE_PERM);
  8139. }
  8140. if (Slot[SlotNb].GpkObject[hKey].FileId == 0)
  8141. {
  8142. RETURN (CRYPT_FAILED, NTE_BAD_KEY);
  8143. }
  8144. if (Slot[SlotNb].GpkObject[hKey].Field[POS_KEY_TYPE].Len == 0)
  8145. {
  8146. RETURN (CRYPT_FAILED, NTE_BAD_KEY);
  8147. }
  8148. KeyId = Slot[SlotNb].GpkObject[hKey].Field[POS_KEY_TYPE].pValue[0];
  8149. switch (dwParam)
  8150. {
  8151. case KP_ALGID:
  8152. if (IsNotNull(pbData))
  8153. {
  8154. DWORD dwAlgid;
  8155. if (*pdwDataLen < sizeof(DWORD))
  8156. {
  8157. *pdwDataLen = sizeof(DWORD);
  8158. RETURN (CRYPT_FAILED, ERROR_MORE_DATA);
  8159. }
  8160. switch (KeyId)
  8161. {
  8162. case AT_KEYEXCHANGE:
  8163. dwAlgid = CALG_RSA_KEYX;
  8164. break;
  8165. case AT_SIGNATURE:
  8166. dwAlgid = CALG_RSA_SIGN;
  8167. break;
  8168. default:
  8169. RETURN (CRYPT_FAILED, NTE_BAD_TYPE);
  8170. }
  8171. memcpy(pbData, &dwAlgid, sizeof(DWORD));
  8172. }
  8173. *pdwDataLen = sizeof(DWORD);
  8174. break;
  8175. case KP_BLOCKLEN:
  8176. case KP_KEYLEN:
  8177. if (IsNotNull(pbData))
  8178. {
  8179. DWORD dwBlockLen;
  8180. if (*pdwDataLen < sizeof(DWORD))
  8181. {
  8182. *pdwDataLen = sizeof(DWORD);
  8183. RETURN (CRYPT_FAILED, ERROR_MORE_DATA);
  8184. }
  8185. GpkKeySize = Slot[SlotNb].GpkPubKeys[Slot[SlotNb].GpkObject[hKey].FileId - GPK_FIRST_KEY].KeySize;
  8186. if (GpkKeySize == 0)
  8187. {
  8188. RETURN (CRYPT_FAILED, NTE_BAD_KEY);
  8189. }
  8190. dwBlockLen = GpkKeySize*8;
  8191. memcpy(pbData, &dwBlockLen, sizeof(DWORD));
  8192. }
  8193. *pdwDataLen = sizeof(DWORD);
  8194. break;
  8195. case KP_PERMISSIONS:
  8196. if (IsNotNull(pbData))
  8197. {
  8198. DWORD dwPerm;
  8199. if (*pdwDataLen < sizeof(DWORD))
  8200. {
  8201. *pdwDataLen = sizeof(DWORD);
  8202. RETURN (CRYPT_FAILED, ERROR_MORE_DATA);
  8203. }
  8204. switch (KeyId)
  8205. {
  8206. case AT_KEYEXCHANGE:
  8207. dwPerm = 0
  8208. | CRYPT_ENCRYPT // Allow encryption
  8209. | CRYPT_DECRYPT // Allow decryption
  8210. // CRYPT_EXPORT // Allow key to be exported
  8211. | CRYPT_READ // Allow parameters to be read
  8212. | CRYPT_WRITE // Allow parameters to be set
  8213. | CRYPT_MAC // Allow MACs to be used with key
  8214. | CRYPT_EXPORT_KEY// Allow key to be used for exporting keys
  8215. | CRYPT_IMPORT_KEY// Allow key to be used for importing keys
  8216. ;
  8217. break;
  8218. case AT_SIGNATURE:
  8219. dwPerm = 0
  8220. // CRYPT_ENCRYPT // Allow encryption
  8221. // CRYPT_DECRYPT // Allow decryption
  8222. // CRYPT_EXPORT // Allow key to be exported
  8223. | CRYPT_READ // Allow parameters to be read
  8224. | CRYPT_WRITE // Allow parameters to be set
  8225. | CRYPT_MAC // Allow MACs to be used with key
  8226. // CRYPT_EXPORT_KEY// Allow key to be used for exporting keys
  8227. // CRYPT_IMPORT_KEY// Allow key to be used for importing keys
  8228. ;
  8229. break;
  8230. default:
  8231. RETURN (CRYPT_FAILED, NTE_BAD_TYPE);
  8232. }
  8233. memcpy(pbData, &dwPerm, sizeof(DWORD));
  8234. }
  8235. *pdwDataLen = sizeof(DWORD);
  8236. break;
  8237. case KP_CERTIFICATE:
  8238. KeyType = Slot[SlotNb].GpkObject[hKey].Field[POS_KEY_TYPE].pValue[0];
  8239. hCert = find_gpk_obj_tag_type( hProv, TAG_CERTIFICATE, KeyType,
  8240. 0x00, FALSE, FALSE );
  8241. if (hCert == 0)
  8242. {
  8243. RETURN( CRYPT_FAILED, SCARD_E_NO_SUCH_CERTIFICATE );
  8244. }
  8245. /* Retrieve Certificate Value */
  8246. if (IsNotNull(pbData))
  8247. {
  8248. if (*pdwDataLen < Slot[SlotNb].GpkObject[hCert].Field[POS_VALUE].Len)
  8249. {
  8250. *pdwDataLen = Slot[SlotNb].GpkObject[hCert].Field[POS_VALUE].Len;
  8251. RETURN (CRYPT_FAILED, ERROR_MORE_DATA);
  8252. }
  8253. memcpy(pbData,
  8254. Slot[SlotNb].GpkObject[hCert].Field[POS_VALUE].pValue,
  8255. Slot[SlotNb].GpkObject[hCert].Field[POS_VALUE].Len
  8256. );
  8257. }
  8258. *pdwDataLen = Slot[SlotNb].GpkObject[hCert].Field[POS_VALUE].Len;
  8259. break;
  8260. default:
  8261. RETURN (CRYPT_FAILED, NTE_BAD_TYPE);
  8262. }
  8263. }
  8264. /* Session Key */
  8265. else if (key_exist (hKey-MAX_GPK_OBJ, hProv))
  8266. {
  8267. CryptResp = CryptGetKeyParam (TmpObject[hKey-MAX_GPK_OBJ].hKeyBase,
  8268. dwParam,
  8269. pbData,
  8270. pdwDataLen,
  8271. dwFlags);
  8272. if (!CryptResp)
  8273. return CRYPT_FAILED;
  8274. }
  8275. /* Bad Key */
  8276. else
  8277. {
  8278. RETURN (CRYPT_FAILED, NTE_BAD_KEY);
  8279. }
  8280. RETURN (CRYPT_SUCCEED, 0);
  8281. }
  8282. /*
  8283. - MyCPGetUserKey
  8284. -
  8285. * Purpose:
  8286. * Gets a handle to a permanent user key
  8287. *
  8288. *
  8289. * Parameters:
  8290. * IN hProv - Handle to the user identifcation
  8291. * IN dwKeySpec - Specification of the key to retrieve
  8292. * OUT phUserKey - Pointer to key handle of retrieved key
  8293. *
  8294. * Returns:
  8295. */
  8296. BOOL WINAPI MyCPGetUserKey(IN HCRYPTPROV hProv,
  8297. IN DWORD dwKeySpec,
  8298. OUT HCRYPTKEY *phUserKey
  8299. )
  8300. {
  8301. HCRYPTKEY hKey;
  8302. GPK_EXP_KEY aPubKey;
  8303. DWORD dwLen;
  8304. *phUserKey = 0;
  8305. if (!Context_exist(hProv))
  8306. {
  8307. RETURN (CRYPT_FAILED, NTE_BAD_UID);
  8308. }
  8309. /* Bug # 1103
  8310. if ((ProvCont[hProv].Flags & CRYPT_VERIFYCONTEXT) &&
  8311. (ProvCont[hProv].isContNameNullBlank))
  8312. */
  8313. if ( ProvCont[hProv].Flags & CRYPT_VERIFYCONTEXT )
  8314. {
  8315. RETURN (CRYPT_FAILED, NTE_PERM);
  8316. }
  8317. if (!PublicEFExists(hProv))
  8318. {
  8319. RETURN (CRYPT_FAILED, NTE_NO_KEY);
  8320. }
  8321. if (dwKeySpec != AT_KEYEXCHANGE && dwKeySpec != AT_SIGNATURE)
  8322. {
  8323. RETURN (CRYPT_FAILED, NTE_BAD_KEY);
  8324. }
  8325. if (dwKeySpec == AT_KEYEXCHANGE)
  8326. {
  8327. hKey = find_gpk_obj_tag_type(hProv,
  8328. TAG_RSA_PUBLIC,
  8329. (BYTE)dwKeySpec,
  8330. 0x00,
  8331. TRUE,
  8332. FALSE
  8333. );
  8334. // get the key length
  8335. if (hKey != 0)
  8336. {
  8337. if (!read_gpk_pub_key(hProv, hKey, &aPubKey))
  8338. {
  8339. hKey = 0;
  8340. }
  8341. else
  8342. {
  8343. dwLen = aPubKey.KeySize;
  8344. if (dwLen > RSA_KEK_Size)
  8345. {
  8346. hKey = 0;
  8347. }
  8348. }
  8349. }
  8350. }
  8351. else
  8352. {
  8353. hKey = find_gpk_obj_tag_type(hProv,
  8354. TAG_RSA_PUBLIC,
  8355. (BYTE)dwKeySpec,
  8356. 0x00,
  8357. FALSE,
  8358. FALSE
  8359. );
  8360. }
  8361. if (hKey == 0)
  8362. {
  8363. RETURN (CRYPT_FAILED, NTE_NO_KEY);
  8364. }
  8365. *phUserKey = hKey;
  8366. RETURN (CRYPT_SUCCEED, 0);
  8367. }
  8368. /*
  8369. - MyCPImportKey
  8370. -
  8371. * Purpose:
  8372. * Import cryptographic keys
  8373. *
  8374. *
  8375. * Parameters:
  8376. * IN hProv - Handle to the CSP user
  8377. * IN pbData - Key blob data
  8378. * IN dwDataLen - Length of the key blob data
  8379. * IN hPubKey - Handle to the exchange public key value of
  8380. * the destination user
  8381. * IN dwFlags - Flags values
  8382. * OUT phKey - Pointer to the handle to the key which was
  8383. * Imported
  8384. *
  8385. * Returns:
  8386. */
  8387. BOOL WINAPI MyCPImportKey(IN HCRYPTPROV hProv,
  8388. IN CONST BYTE *pbData,
  8389. IN DWORD dwDataLen,
  8390. IN HCRYPTKEY hPubKey,
  8391. IN DWORD dwFlags,
  8392. OUT HCRYPTKEY *phKey
  8393. )
  8394. {
  8395. DWORD lRet;
  8396. BOOL CryptResp;
  8397. HCRYPTKEY hTmpKey, hPrivKey;
  8398. BLOBHEADER BlobHeader;
  8399. DWORD dwAlgid, dwBlobLen;
  8400. BYTE* pBlob;
  8401. BYTE* pBlobOut;
  8402. DWORD SlotNb;
  8403. // + [FP] for PRIVATEKEYBLOB
  8404. BOOL GpkObj;
  8405. GPK_EXP_KEY aPubKey;
  8406. DWORD dwKeyLen;
  8407. BYTE bKeyType;
  8408. BOOL IsExchange;
  8409. HCRYPTKEY hKey;
  8410. BYTE bSfi;
  8411. BYTE *pbBuff1 = 0;
  8412. DWORD dwBuff1Len;
  8413. // - [FP]
  8414. // + NK 07.02.2001
  8415. DWORD dwPinLength;
  8416. // -NK
  8417. if (!Context_exist(hProv))
  8418. {
  8419. RETURN (CRYPT_FAILED, NTE_BAD_UID);
  8420. }
  8421. SlotNb = ProvCont[hProv].Slot;
  8422. if ((IsNull(pbData)) || (dwDataLen < sizeof(BLOBHEADER)+sizeof(RSAPUBKEY)))
  8423. {
  8424. RETURN (CRYPT_FAILED, NTE_BAD_DATA);
  8425. }
  8426. memcpy(&BlobHeader, pbData, sizeof(BLOBHEADER));
  8427. if (BlobHeader.bVersion != CUR_BLOB_VERSION)
  8428. {
  8429. RETURN (CRYPT_FAILED, NTE_BAD_VER);
  8430. }
  8431. switch (BlobHeader.bType)
  8432. {
  8433. case PUBLICKEYBLOB:
  8434. {
  8435. hTmpKey = find_tmp_free();
  8436. if (hTmpKey == 0)
  8437. {
  8438. RETURN (CRYPT_FAILED, NTE_NO_MEMORY);
  8439. }
  8440. /* Copy Session Key in Microsoft RSA base Module */
  8441. CryptResp = CryptImportKey(hProvBase,
  8442. pbData,
  8443. dwDataLen,
  8444. 0,
  8445. dwFlags,
  8446. &(TmpObject[hTmpKey].hKeyBase));
  8447. if (!CryptResp)
  8448. return CRYPT_FAILED;
  8449. TmpObject[hTmpKey].hProv = hProv;
  8450. *phKey = hTmpKey+MAX_GPK_OBJ;
  8451. }
  8452. break;
  8453. case SIMPLEBLOB:
  8454. {
  8455. if (ProvCont[hProv].Flags & CRYPT_VERIFYCONTEXT)
  8456. {
  8457. RETURN (CRYPT_FAILED, NTE_PERM);
  8458. }
  8459. // + NK 06.02.2001
  8460. // if ((ProvCont[hProv].Flags & CRYPT_SILENT) && (IsNullStr(Slot[SlotNb].GetPin())))
  8461. lRet = Query_MSPinCache( Slot[SlotNb].hPinCacheHandle,
  8462. NULL,
  8463. &dwPinLength );
  8464. if ( (lRet != ERROR_SUCCESS) && (lRet != ERROR_EMPTY) )
  8465. RETURN (CRYPT_FAILED, lRet);
  8466. if ((ProvCont[hProv].Flags & CRYPT_SILENT) && (lRet == ERROR_EMPTY))
  8467. // - NK
  8468. {
  8469. RETURN (CRYPT_FAILED, NTE_SILENT_CONTEXT);
  8470. }
  8471. // Verify the PINs
  8472. if (!PIN_Validation(hProv))
  8473. return CRYPT_FAILED;
  8474. if (!VerifyDivPIN(hProv, TRUE))
  8475. return CRYPT_FAILED;
  8476. switch (BlobHeader.aiKeyAlg)
  8477. {
  8478. case CALG_RC2:
  8479. case CALG_RC4:
  8480. case CALG_DES:
  8481. case CALG_3DES_112:
  8482. case CALG_3DES: break;
  8483. default:
  8484. RETURN (CRYPT_FAILED, NTE_BAD_ALGID);
  8485. }
  8486. memcpy( &dwAlgid, &pbData[sizeof(BlobHeader)], sizeof(DWORD) );
  8487. switch (dwAlgid)
  8488. {
  8489. case CALG_RSA_KEYX:
  8490. CryptResp = MyCPGetUserKey(hProv, AT_KEYEXCHANGE, &hPrivKey);
  8491. if ((!CryptResp) || (hPrivKey == 0))
  8492. {
  8493. RETURN (CRYPT_FAILED, NTE_BAD_DATA);
  8494. }
  8495. break;
  8496. case CALG_RSA_SIGN:
  8497. RETURN (CRYPT_FAILED, NTE_BAD_DATA);
  8498. break;
  8499. default:
  8500. RETURN (CRYPT_FAILED, NTE_BAD_DATA);
  8501. }
  8502. dwBlobLen = dwDataLen-sizeof(BLOBHEADER)-sizeof(DWORD);
  8503. pBlob = (BYTE*)GMEM_Alloc(dwBlobLen);
  8504. if (IsNull(pBlob))
  8505. RETURN (CRYPT_FAILED, NTE_NO_MEMORY);
  8506. pBlobOut = (BYTE*)GMEM_Alloc(dwBlobLen);
  8507. if (IsNull(pBlobOut))
  8508. {
  8509. GMEM_Free (pBlob);
  8510. RETURN (CRYPT_FAILED, NTE_NO_MEMORY);
  8511. }
  8512. bool bErrorInTryOccured=false;
  8513. DWORD dwErrorCode=ERROR_SUCCESS;
  8514. __try
  8515. {
  8516. memcpy( pBlob, &pbData[sizeof(BLOBHEADER)+sizeof(DWORD)], dwBlobLen );
  8517. hTmpKey = find_tmp_free();
  8518. if (hTmpKey == 0)
  8519. {
  8520. bErrorInTryOccured=true;
  8521. dwErrorCode=NTE_NO_MEMORY;
  8522. __leave;
  8523. }
  8524. // RETURN( CRYPT_FAILED, NTE_NO_MEMORY );
  8525. CryptResp = key_unwrap( hProv, hPrivKey, pBlob, dwBlobLen, pBlobOut, &dwBlobLen );
  8526. if (!CryptResp)
  8527. {
  8528. bErrorInTryOccured=true;
  8529. __leave;
  8530. }
  8531. //return CRYPT_FAILED;
  8532. if (dwBlobLen > AuxMaxSessionKeyLength)
  8533. {
  8534. bErrorInTryOccured=true;
  8535. dwErrorCode=NTE_BAD_KEY;
  8536. __leave;
  8537. }
  8538. // RETURN( CRYPT_FAILED, NTE_BAD_KEY );
  8539. /* Copy Session Key in Microsoft RSA base Module */
  8540. if (!copy_tmp_key(hProv, hTmpKey, dwFlags, BlobHeader.aiKeyAlg, pBlobOut, dwBlobLen, 0, 0))
  8541. {
  8542. bErrorInTryOccured=true;
  8543. __leave;
  8544. }
  8545. //return CRYPT_FAILED;
  8546. *phKey = hTmpKey+MAX_GPK_OBJ;
  8547. }
  8548. __finally
  8549. {
  8550. GMEM_Free(pBlob);
  8551. GMEM_Free(pBlobOut);
  8552. }
  8553. if(bErrorInTryOccured)
  8554. {
  8555. if(dwErrorCode==ERROR_SUCCESS)
  8556. return CRYPT_FAILED;
  8557. else
  8558. RETURN(CRYPT_FAILED, dwErrorCode);
  8559. }
  8560. }
  8561. break;
  8562. // + [FP]
  8563. case PRIVATEKEYBLOB:
  8564. {
  8565. if (ProvCont[hProv].Flags & CRYPT_VERIFYCONTEXT)
  8566. {
  8567. RETURN (CRYPT_FAILED, NTE_PERM);
  8568. }
  8569. // + NK 06.02.2001
  8570. // if ((ProvCont[hProv].Flags & CRYPT_SILENT) && (IsNullStr(Slot[SlotNb].GetPin())))
  8571. lRet = Query_MSPinCache( Slot[SlotNb].hPinCacheHandle,
  8572. NULL,
  8573. &dwPinLength );
  8574. if ( (lRet != ERROR_SUCCESS) && (lRet != ERROR_EMPTY) )
  8575. RETURN (CRYPT_FAILED, lRet);
  8576. if ((ProvCont[hProv].Flags & CRYPT_SILENT) && (lRet == ERROR_EMPTY))
  8577. // - NK
  8578. {
  8579. RETURN (CRYPT_FAILED, NTE_SILENT_CONTEXT);
  8580. }
  8581. if (Slot[SlotNb].NbKeyFile == 0 || Slot[SlotNb].NbKeyFile > MAX_REAL_KEY)
  8582. {
  8583. RETURN (CRYPT_FAILED, SCARD_E_FILE_NOT_FOUND); // should not bigger than MAX_REAL_KEY
  8584. }
  8585. // get the key type
  8586. bKeyType = (BlobHeader.aiKeyAlg == CALG_RSA_KEYX) ? AT_KEYEXCHANGE : AT_SIGNATURE;
  8587. IsExchange = (BlobHeader.aiKeyAlg == CALG_RSA_KEYX) ? TRUE : FALSE;
  8588. // get the key size (in bits)
  8589. memcpy(&dwKeyLen,
  8590. &pbData[sizeof(BlobHeader)+ sizeof(DWORD)],
  8591. sizeof(DWORD)
  8592. );
  8593. if (bKeyType == AT_KEYEXCHANGE)
  8594. {
  8595. if ((dwKeyLen / 8) > RSA_KEK_Size)
  8596. {
  8597. RETURN (CRYPT_FAILED, NTE_BAD_LEN);
  8598. }
  8599. }
  8600. GpkObj = TRUE;
  8601. hKey = find_gpk_obj_tag_type(hProv, TAG_RSA_PUBLIC, bKeyType, 0x00, IsExchange, FALSE);
  8602. if (hKey != 0)
  8603. {
  8604. if (!read_gpk_pub_key(hProv, hKey, &aPubKey))
  8605. {
  8606. RETURN (CRYPT_FAILED, NTE_FAIL);
  8607. }
  8608. if ((dwKeyLen / 8) != aPubKey.KeySize)
  8609. {
  8610. RETURN (CRYPT_FAILED, NTE_BAD_LEN);
  8611. }
  8612. }
  8613. else
  8614. {
  8615. GpkObj = FALSE;
  8616. // find a file on the card
  8617. hKey = find_gpk_obj_tag_type(hProv, TAG_RSA_PUBLIC, 0x00, (BYTE)(dwKeyLen / 8), IsExchange, FALSE);
  8618. if ((hKey != 0)
  8619. &&(find_gpk_obj_tag_type(hProv, TAG_RSA_PUBLIC, bKeyType, 0x00, IsExchange, FALSE) == 0)
  8620. &&(find_gpk_obj_tag_type(hProv, TAG_CERTIFICATE, bKeyType, 0x00, FALSE, FALSE) == 0)
  8621. )
  8622. {
  8623. *phKey = hKey;
  8624. }
  8625. else
  8626. {
  8627. RETURN (CRYPT_FAILED, NTE_FAIL);
  8628. }
  8629. }
  8630. bSfi = Slot[SlotNb].GpkObject[hKey].FileId;
  8631. if (!Read_Priv_Obj(hProv))
  8632. return CRYPT_FAILED;
  8633. if (!VerifyDivPIN(hProv, TRUE))
  8634. return CRYPT_FAILED;
  8635. // load the public key in the card
  8636. // Update record 2 (modulus)
  8637. bSendBuffer[0] = 0x00; //CLA
  8638. bSendBuffer[1] = 0xDC; //INS
  8639. bSendBuffer[2] = 0x02; //P1
  8640. bSendBuffer[3] = (BYTE)(bSfi << 3) + 0x04; //P2
  8641. bSendBuffer[4] = (BYTE)(TAG_LEN + (dwKeyLen / 8)); //Li
  8642. bSendBuffer[5] = TAG_MODULUS;
  8643. memcpy(&bSendBuffer[6], &pbData[sizeof(BlobHeader) + sizeof(RSAPUBKEY)], dwKeyLen / 8);
  8644. cbSendLength = 5 + bSendBuffer[4];
  8645. cbRecvLength = sizeof(bRecvBuffer);
  8646. lRet = SCardTransmit( ProvCont[hProv].hCard, SCARD_PCI_T0, bSendBuffer,
  8647. cbSendLength, 0, bRecvBuffer, &cbRecvLength );
  8648. if(SCARDPROBLEM(lRet, 0x9000, 0x00))
  8649. {
  8650. RETURN (CRYPT_FAILED, NTE_FAIL);
  8651. }
  8652. // Update record 3 (public exponent)
  8653. bSendBuffer[0] = 0x00; //CLA
  8654. bSendBuffer[1] = 0xDC; //INS
  8655. bSendBuffer[2] = 0x03; //P1
  8656. bSendBuffer[3] = (BYTE)(bSfi << 3) + 0x04; //P2
  8657. bSendBuffer[4] = (BYTE)(TAG_LEN + PUB_EXP_LEN); //Li
  8658. bSendBuffer[5] = TAG_PUB_EXP;
  8659. memcpy(&bSendBuffer[6], &pbData[sizeof(BlobHeader) + (2 * sizeof(DWORD))], PUB_EXP_LEN);
  8660. cbSendLength = 5 + bSendBuffer[4];
  8661. cbRecvLength = sizeof(bRecvBuffer);
  8662. lRet = SCardTransmit( ProvCont[hProv].hCard, SCARD_PCI_T0, bSendBuffer,
  8663. cbSendLength, 0, bRecvBuffer, &cbRecvLength );
  8664. if(SCARDPROBLEM(lRet, 0x9000, 0x00))
  8665. {
  8666. RETURN (CRYPT_FAILED, NTE_FAIL);
  8667. }
  8668. // load the private key in the card
  8669. if (dwKeyLen == 512)
  8670. {
  8671. if (!LoadPrivateKey(ProvCont[hProv].hCard,
  8672. bSfi,
  8673. (WORD)(dwKeyLen / 16 * 5),
  8674. &pbData[sizeof(BlobHeader)+ sizeof(RSAPUBKEY) + (dwKeyLen/8)],
  8675. 168
  8676. )
  8677. )
  8678. {
  8679. RETURN (CRYPT_FAILED, NTE_FAIL);
  8680. }
  8681. }
  8682. else if (dwKeyLen == 1024)
  8683. {
  8684. // PRIME 1 CRT part
  8685. if (!LoadPrivateKey(ProvCont[hProv].hCard,
  8686. bSfi,
  8687. (WORD)(dwKeyLen / 16),
  8688. &pbData[sizeof(BlobHeader)+ sizeof(RSAPUBKEY) + (dwKeyLen/8)],
  8689. 72
  8690. )
  8691. )
  8692. {
  8693. RETURN (CRYPT_FAILED, NTE_FAIL);
  8694. }
  8695. // PRIME 2 CRT part
  8696. if (!LoadPrivateKey(ProvCont[hProv].hCard,
  8697. bSfi,
  8698. (WORD)(dwKeyLen / 16),
  8699. &pbData[sizeof(BlobHeader)+ sizeof(RSAPUBKEY) + (dwKeyLen/8) + 72],
  8700. 72
  8701. )
  8702. )
  8703. {
  8704. RETURN (CRYPT_FAILED, NTE_FAIL);
  8705. }
  8706. // COEFFICIENT CRT part
  8707. if (!LoadPrivateKey(ProvCont[hProv].hCard,
  8708. bSfi,
  8709. (WORD)(dwKeyLen / 16),
  8710. &pbData[sizeof(BlobHeader)+ sizeof(RSAPUBKEY) + (dwKeyLen/8) + 144],
  8711. 72
  8712. )
  8713. )
  8714. {
  8715. RETURN (CRYPT_FAILED, NTE_FAIL);
  8716. }
  8717. // EXPONENT 1 CRT part
  8718. if (!LoadPrivateKey(ProvCont[hProv].hCard,
  8719. bSfi,
  8720. (WORD)(dwKeyLen / 16),
  8721. &pbData[sizeof(BlobHeader)+ sizeof(RSAPUBKEY) + (dwKeyLen/8) + 216],
  8722. 72
  8723. )
  8724. )
  8725. {
  8726. RETURN (CRYPT_FAILED, NTE_FAIL);
  8727. }
  8728. // EXPONENT 2 CRT part
  8729. if (!LoadPrivateKey(ProvCont[hProv].hCard,
  8730. bSfi,
  8731. (WORD)(dwKeyLen / 16),
  8732. &pbData[sizeof(BlobHeader)+ sizeof(RSAPUBKEY) + (dwKeyLen/8) + 288],
  8733. 72
  8734. )
  8735. )
  8736. {
  8737. RETURN (CRYPT_FAILED, NTE_FAIL);
  8738. }
  8739. }
  8740. else
  8741. {
  8742. RETURN (CRYPT_FAILED, NTE_BAD_LEN);
  8743. }
  8744. if (!GpkObj)
  8745. {
  8746. hPrivKey = find_gpk_obj_tag_file(hProv, TAG_RSA_PRIVATE, Slot[SlotNb].GpkObject[hKey].FileId, TRUE);
  8747. if ( hPrivKey == 0 )
  8748. {
  8749. RETURN (CRYPT_FAILED, NTE_SIGNATURE_FILE_BAD);
  8750. }
  8751. Slot[SlotNb].GpkObject[hKey].Field[POS_KEY_TYPE].pValue = (BYTE*)GMEM_Alloc(1);
  8752. if (IsNull(Slot[SlotNb].GpkObject[hKey].Field[POS_KEY_TYPE].pValue))
  8753. {
  8754. RETURN (CRYPT_FAILED, NTE_NO_MEMORY);
  8755. }
  8756. Slot[SlotNb].GpkObject[hPrivKey].Field[POS_KEY_TYPE].pValue = (BYTE*)GMEM_Alloc(1);
  8757. if (IsNull(Slot[SlotNb].GpkObject[hPrivKey].Field[POS_KEY_TYPE].pValue))
  8758. {
  8759. GMEM_Free(Slot[SlotNb].GpkObject[hKey].Field[POS_KEY_TYPE].pValue);
  8760. RETURN (CRYPT_FAILED, NTE_NO_MEMORY);
  8761. }
  8762. Slot[SlotNb].GpkObject[hKey].IsCreated = TRUE;
  8763. Slot[SlotNb].GpkObject[hKey].Flags = Slot[SlotNb].GpkObject[hKey].Flags | FLAG_KEY_TYPE;
  8764. Slot[SlotNb].GpkObject[hKey].Field[POS_KEY_TYPE].Len = 1;
  8765. Slot[SlotNb].GpkObject[hKey].Field[POS_KEY_TYPE].pValue[0] = bKeyType;
  8766. Slot[SlotNb].GpkObject[hKey].Field[POS_KEY_TYPE].bReal = TRUE;
  8767. /* Set Flags of automatic fields for PKCS#11 compatibility */
  8768. Slot[SlotNb].GpkObject[hKey].Flags = Slot[SlotNb].GpkObject[hKey].Flags | FLAG_ID;
  8769. Slot[SlotNb].GpkObject[hKey].Field[POS_ID].Len = 0;
  8770. Slot[SlotNb].GpkObject[hKey].Field[POS_ID].bReal = FALSE;
  8771. Slot[SlotNb].GpkObject[hPrivKey].IsCreated = TRUE;
  8772. Slot[SlotNb].GpkObject[hPrivKey].Flags = Slot[SlotNb].GpkObject[hPrivKey].Flags | FLAG_KEY_TYPE;
  8773. Slot[SlotNb].GpkObject[hPrivKey].Field[POS_KEY_TYPE].Len = 1;
  8774. Slot[SlotNb].GpkObject[hPrivKey].Field[POS_KEY_TYPE].pValue[0] = bKeyType;
  8775. Slot[SlotNb].GpkObject[hPrivKey].Field[POS_KEY_TYPE].bReal = TRUE;
  8776. /* Set Flags of automatic fields for PKCS#11 compatibility */
  8777. Slot[SlotNb].GpkObject[hPrivKey].Flags = Slot[SlotNb].GpkObject[hPrivKey].Flags | FLAG_ID;
  8778. Slot[SlotNb].GpkObject[hPrivKey].Field[POS_ID].Len = 0;
  8779. Slot[SlotNb].GpkObject[hPrivKey].Field[POS_ID].bReal = FALSE;
  8780. if (!ProvCont[hProv].bLegacyKeyset)
  8781. {
  8782. Slot[SlotNb].GpkObject[hKey].Flags |= FLAG_KEYSET;
  8783. Slot[SlotNb].GpkObject[hKey].Field[POS_KEYSET].Len = 1;
  8784. Slot[SlotNb].GpkObject[hKey].Field[POS_KEYSET].pValue = (BYTE*)GMEM_Alloc(1);
  8785. if(IsNull(Slot[SlotNb].GpkObject[hKey].Field[POS_KEYSET].pValue))
  8786. {
  8787. RETURN (CRYPT_FAILED, NTE_NO_MEMORY);
  8788. }
  8789. Slot[SlotNb].GpkObject[hKey].Field[POS_KEYSET].pValue[0] = ProvCont[hProv].keysetID;
  8790. Slot[SlotNb].GpkObject[hKey].Field[POS_KEYSET].bReal = TRUE;
  8791. Slot[SlotNb].GpkObject[hPrivKey].Flags |= FLAG_KEYSET;
  8792. Slot[SlotNb].GpkObject[hPrivKey].Field[POS_KEYSET].Len = 1;
  8793. Slot[SlotNb].GpkObject[hPrivKey].Field[POS_KEYSET].pValue = (BYTE*)GMEM_Alloc(1);
  8794. if(IsNull(Slot[SlotNb].GpkObject[hPrivKey].Field[POS_KEYSET].pValue))
  8795. {
  8796. RETURN (CRYPT_FAILED, NTE_NO_MEMORY);
  8797. }
  8798. Slot[SlotNb].GpkObject[hPrivKey].Field[POS_KEYSET].pValue[0] = ProvCont[hProv].keysetID;
  8799. Slot[SlotNb].GpkObject[hPrivKey].Field[POS_KEYSET].bReal = TRUE;
  8800. }
  8801. // set the file containing the key to USE, add "- GPK_FIRST_KEY" here, version 2.00.002
  8802. Slot[SlotNb].UseFile[Slot[SlotNb].GpkObject[hKey].FileId - GPK_FIRST_KEY] = TRUE;
  8803. pbBuff1 = (BYTE*)GMEM_Alloc (MAX_GPK_PUBLIC);
  8804. if (IsNull(pbBuff1))
  8805. {
  8806. RETURN (CRYPT_FAILED, NTE_NO_MEMORY);
  8807. }
  8808. dwBuff1Len = MAX_GPK_PUBLIC;
  8809. if (!prepare_write_gpk_objects (hProv, pbBuff1, &dwBuff1Len, FALSE))
  8810. {
  8811. lRet = GetLastError();
  8812. GMEM_Free (pbBuff1);
  8813. RETURN (CRYPT_FAILED, lRet);
  8814. }
  8815. if (!write_gpk_objects(hProv, pbBuff1, dwBuff1Len, FALSE, FALSE))
  8816. {
  8817. lRet = GetLastError();
  8818. GMEM_Free (pbBuff1);
  8819. RETURN (CRYPT_FAILED, lRet);
  8820. }
  8821. GMEM_Free (pbBuff1);
  8822. pbBuff1 = (BYTE*)GMEM_Alloc (MAX_GPK_PRIVATE);
  8823. if (IsNull(pbBuff1))
  8824. {
  8825. RETURN (CRYPT_FAILED, NTE_NO_MEMORY);
  8826. }
  8827. dwBuff1Len = MAX_GPK_PRIVATE;
  8828. if (!prepare_write_gpk_objects (hProv, pbBuff1, &dwBuff1Len, TRUE))
  8829. {
  8830. lRet = GetLastError();
  8831. GMEM_Free (pbBuff1);
  8832. RETURN (CRYPT_FAILED, lRet);
  8833. }
  8834. if (!write_gpk_objects(hProv, pbBuff1, dwBuff1Len, FALSE, TRUE))
  8835. {
  8836. lRet = GetLastError();
  8837. GMEM_Free (pbBuff1);
  8838. RETURN (CRYPT_FAILED, lRet);
  8839. }
  8840. GMEM_Free (pbBuff1);
  8841. // copy Gpk Key in Microsoft RSA base Module
  8842. if (!copy_gpk_key(hProv, *phKey, bKeyType))
  8843. return CRYPT_FAILED;
  8844. }
  8845. break;
  8846. }
  8847. // - [FP]
  8848. case SYMMETRICWRAPKEYBLOB:
  8849. {
  8850. hTmpKey = find_tmp_free();
  8851. if (hTmpKey == 0)
  8852. {
  8853. RETURN (CRYPT_FAILED, NTE_NO_MEMORY);
  8854. }
  8855. // find the handle of imported key
  8856. HCRYPTKEY hEncKey;
  8857. if ((hPubKey <= MAX_GPK_OBJ) || (!key_exist(hPubKey-MAX_GPK_OBJ, hProv)))
  8858. {
  8859. RETURN (CRYPT_FAILED, NTE_BAD_KEY);
  8860. }
  8861. else
  8862. {
  8863. hEncKey = TmpObject[hPubKey-MAX_GPK_OBJ].hKeyBase;
  8864. }
  8865. /* import Session Key in Microsoft Base Module */
  8866. CryptResp = CryptImportKey(hProvBase,
  8867. pbData,
  8868. dwDataLen,
  8869. hEncKey,
  8870. dwFlags,
  8871. &(TmpObject[hTmpKey].hKeyBase));
  8872. if (!CryptResp)
  8873. return CRYPT_FAILED;
  8874. TmpObject[hTmpKey].hProv = hProv;
  8875. *phKey = hTmpKey+MAX_GPK_OBJ;
  8876. }
  8877. break;
  8878. default:
  8879. {
  8880. RETURN (CRYPT_FAILED, NTE_BAD_TYPE);
  8881. }
  8882. }
  8883. RETURN (CRYPT_SUCCEED, 0);
  8884. }
  8885. /*
  8886. - CPSetKeyParam
  8887. -
  8888. * Purpose:
  8889. * Allows applications to customize various aspects of the
  8890. * operations of a key
  8891. *
  8892. * Parameters:
  8893. * IN hProv - Handle to a CSP
  8894. * IN hKey - Handle to a key
  8895. * IN dwParam - Parameter number
  8896. * IN pbData - Pointer to data
  8897. * IN dwFlags - Flags values
  8898. *
  8899. * Returns:
  8900. */
  8901. BOOL WINAPI MyCPSetKeyParam(IN HCRYPTPROV hProv,
  8902. IN HCRYPTKEY hKey,
  8903. IN DWORD dwParam,
  8904. IN CONST BYTE *pbData,
  8905. IN DWORD dwFlags
  8906. )
  8907. {
  8908. BOOL bNew;
  8909. BOOL WriteCert;
  8910. BOOL CryptResp;
  8911. BYTE hCert;
  8912. BYTE KeyType;
  8913. BYTE hPrivKey;
  8914. BYTE *pbLabel;
  8915. BYTE *pbBuff1 = 0, *pbBuff2 = 0;
  8916. WORD wLabelLen, i;
  8917. DWORD lRet,
  8918. dwBuff1Len,
  8919. dwBuff2Len,
  8920. SlotNb;
  8921. GPK_OBJ TmpCert, TmpPrivKey;
  8922. // + NK 07.02.2001
  8923. PINCACHE_PINS Pins;
  8924. DWORD dwPinLength;
  8925. // -NK
  8926. if (!Context_exist(hProv))
  8927. {
  8928. RETURN (CRYPT_FAILED, NTE_BAD_UID);
  8929. }
  8930. SlotNb = ProvCont[hProv].Slot;
  8931. /* Resident Key */
  8932. if (hKey == 0)
  8933. {
  8934. RETURN (CRYPT_FAILED, NTE_BAD_KEY);
  8935. }
  8936. else if (hKey <= MAX_GPK_OBJ)
  8937. {
  8938. if (ProvCont[hProv].Flags & CRYPT_VERIFYCONTEXT)
  8939. {
  8940. RETURN (CRYPT_FAILED, NTE_PERM);
  8941. }
  8942. if ((!Slot[SlotNb].GpkObject[hKey].IsCreated) ||
  8943. ( Slot[SlotNb].GpkObject[hKey].FileId == 0))
  8944. {
  8945. RETURN (CRYPT_FAILED, NTE_BAD_KEY);
  8946. }
  8947. switch (dwParam)
  8948. {
  8949. case KP_ADMIN_PIN:
  8950. RETURN(CRYPT_FAILED, E_NOTIMPL);
  8951. break;
  8952. case KP_KEYEXCHANGE_PIN:
  8953. case KP_SIGNATURE_PIN:
  8954. // Slot[SlotNb].ClearPin();
  8955. // Slot[SlotNb].SetPin( (char*)pbData );
  8956. PopulatePins( &Pins, (BYTE *)pbData, strlen( (char*)pbData ), NULL, 0 );
  8957. CallbackData sCallbackData;
  8958. sCallbackData.hProv = hProv;
  8959. sCallbackData.IsCoherent = TRUE;
  8960. if ( (lRet = Add_MSPinCache( &(Slot[SlotNb].hPinCacheHandle),
  8961. &Pins,
  8962. Callback_VerifyChangePin,
  8963. (void*)&sCallbackData )) != ERROR_SUCCESS )
  8964. {
  8965. RETURN (CRYPT_FAILED, lRet);
  8966. }
  8967. break;
  8968. case KP_CERTIFICATE:
  8969. if (!Read_Priv_Obj(hProv))
  8970. return CRYPT_FAILED;
  8971. // + NK 06.02.2001
  8972. // if ((ProvCont[hProv].Flags & CRYPT_SILENT) && (IsNullStr(Slot[SlotNb].GetPin())))
  8973. lRet = Query_MSPinCache( Slot[SlotNb].hPinCacheHandle,
  8974. NULL,
  8975. &dwPinLength );
  8976. if ( (lRet != ERROR_SUCCESS) && (lRet != ERROR_EMPTY) )
  8977. RETURN (CRYPT_FAILED, lRet);
  8978. if ((ProvCont[hProv].Flags & CRYPT_SILENT) && (lRet == ERROR_EMPTY))
  8979. // - NK
  8980. {
  8981. RETURN (CRYPT_FAILED, NTE_SILENT_CONTEXT);
  8982. }
  8983. // Supports only X509 certificats
  8984. if ((IsNull(pbData)) || (pbData[0] != 0x30) ||(pbData[1] != 0x82))
  8985. {
  8986. RETURN (CRYPT_FAILED, NTE_BAD_DATA);
  8987. }
  8988. /* Store Certificate value */
  8989. /* Try to found existing certificate */
  8990. KeyType = Slot[SlotNb].GpkObject[hKey].Field[POS_KEY_TYPE].pValue[0];
  8991. hCert = find_gpk_obj_tag_type(hProv,
  8992. TAG_CERTIFICATE,
  8993. KeyType,
  8994. 0x00,
  8995. FALSE,
  8996. FALSE);
  8997. /* If not found create new object */
  8998. bNew = FALSE;
  8999. if (hCert == 0)
  9000. {
  9001. if (Slot[SlotNb].NbGpkObject >= MAX_GPK_OBJ)
  9002. {
  9003. RETURN (CRYPT_FAILED, NTE_NO_MEMORY);
  9004. }
  9005. Slot[SlotNb].NbGpkObject++;
  9006. hCert = Slot[SlotNb].NbGpkObject;
  9007. bNew = TRUE;
  9008. }
  9009. else
  9010. {
  9011. DialogBox(g_hInstRes, TEXT("CONTDIALOG"), GetAppWindow(), ContDlgProc);
  9012. if (ContainerStatus == ABORT_OPERATION)
  9013. {
  9014. RETURN (CRYPT_FAILED, SCARD_W_CANCELLED_BY_USER);
  9015. }
  9016. }
  9017. /* Search associated private RSA key part */
  9018. if (KeyType == AT_KEYEXCHANGE)
  9019. {
  9020. hPrivKey = find_gpk_obj_tag_type(hProv,
  9021. TAG_RSA_PRIVATE,
  9022. KeyType,
  9023. 0x00,
  9024. TRUE, // Exchange key
  9025. TRUE
  9026. );
  9027. }
  9028. else
  9029. {
  9030. hPrivKey = find_gpk_obj_tag_type(hProv,
  9031. TAG_RSA_PRIVATE,
  9032. KeyType,
  9033. 0x00,
  9034. FALSE, // Signature key
  9035. TRUE
  9036. );
  9037. }
  9038. TmpCert = Slot[SlotNb].GpkObject[hCert];
  9039. for (i = 0; i < MAX_FIELD; i++)
  9040. {
  9041. Slot[SlotNb].GpkObject[hCert].Field[i].bReal = TRUE;
  9042. }
  9043. Slot[SlotNb].GpkObject[hCert].Tag = TAG_CERTIFICATE;
  9044. Slot[SlotNb].GpkObject[hCert].Flags = FLAG_VALUE | FLAG_KEY_TYPE | FLAG_LABEL |
  9045. FLAG_SUBJECT | FLAG_SERIAL_NUMBER |
  9046. FLAG_ISSUER | FLAG_ID | FLAG_MODIFIABLE;
  9047. if (bNew)
  9048. {
  9049. Slot[SlotNb].GpkObject[hCert].ObjId = Slot[SlotNb].NbGpkObject-1;
  9050. }
  9051. Slot[SlotNb].GpkObject[hCert].FileId = Slot[SlotNb].GpkObject[hKey].FileId;
  9052. Slot[SlotNb].GpkObject[hCert].PubKey = Slot[SlotNb].GpkObject[hKey].PubKey;
  9053. Slot[SlotNb].GpkObject[hCert].IsCreated = TRUE;
  9054. Slot[SlotNb].GpkObject[hCert].IsPrivate = FALSE;
  9055. Slot[SlotNb].GpkObject[hCert].Field[POS_VALUE].Len = (pbData[2] * 256) + pbData[3] + 4;
  9056. // TT 12/08/99: Keyset ID
  9057. if (!ProvCont[hProv].bLegacyKeyset)
  9058. {
  9059. Slot[SlotNb].GpkObject[hCert].Flags |= FLAG_KEYSET;
  9060. Slot[SlotNb].GpkObject[hCert].Field[POS_KEYSET].Len = 1;
  9061. Slot[SlotNb].GpkObject[hCert].Field[POS_KEYSET].pValue = (BYTE*)GMEM_Alloc(1);
  9062. if(IsNull(Slot[SlotNb].GpkObject[hCert].Field[POS_KEYSET].pValue))
  9063. {
  9064. RETURN (CRYPT_FAILED, NTE_NO_MEMORY);
  9065. }
  9066. Slot[SlotNb].GpkObject[hCert].Field[POS_KEYSET].pValue[0] = ProvCont[hProv].keysetID;
  9067. Slot[SlotNb].GpkObject[hCert].Field[POS_KEYSET].bReal = TRUE;
  9068. }
  9069. // TT: END
  9070. // if (IsNotNull(GpkObject[hCert].Field[POS_VALUE].pValue))
  9071. // {
  9072. // This will be free later with TmpCert
  9073. // }
  9074. Slot[SlotNb].GpkObject[hCert].Field[POS_VALUE].pValue =
  9075. (BYTE*)GMEM_Alloc(Slot[SlotNb].GpkObject[hCert].Field[POS_VALUE].Len);
  9076. if (IsNull(Slot[SlotNb].GpkObject[hCert].Field[POS_VALUE].pValue))
  9077. {
  9078. Slot[SlotNb].GpkObject[hCert] = TmpCert;
  9079. --Slot[SlotNb].NbGpkObject; // Bug #1675/1676
  9080. RETURN (CRYPT_FAILED, NTE_NO_MEMORY);
  9081. }
  9082. memcpy(Slot[SlotNb].GpkObject[hCert].Field[POS_VALUE].pValue,
  9083. pbData,
  9084. Slot[SlotNb].GpkObject[hCert].Field[POS_VALUE].Len
  9085. );
  9086. Slot[SlotNb].GpkObject[hCert].Field[POS_VALUE].bReal = TRUE;
  9087. /* Type = Type of associated key */
  9088. Slot[SlotNb].GpkObject[hCert].Field[POS_KEY_TYPE].Len =
  9089. Slot[SlotNb].GpkObject[hKey].Field[POS_KEY_TYPE].Len;
  9090. // if (IsNotNull(GpkObject[hCert].Field[POS_KEY_TYPE].pValue))
  9091. // {
  9092. // This will be free later with TmpCert
  9093. // }
  9094. Slot[SlotNb].GpkObject[hCert].Field[POS_KEY_TYPE].pValue =
  9095. (BYTE*)GMEM_Alloc(Slot[SlotNb].GpkObject[hCert].Field[POS_KEY_TYPE].Len);
  9096. if (IsNull(Slot[SlotNb].GpkObject[hCert].Field[POS_KEY_TYPE].pValue))
  9097. {
  9098. GMEM_Free(Slot[SlotNb].GpkObject[hCert].Field[POS_VALUE].pValue);
  9099. Slot[SlotNb].GpkObject[hCert] = TmpCert;
  9100. --Slot[SlotNb].NbGpkObject; // Bug #1675/1676
  9101. RETURN (CRYPT_FAILED, NTE_NO_MEMORY);
  9102. }
  9103. memcpy(Slot[SlotNb].GpkObject[hCert].Field[POS_KEY_TYPE].pValue,
  9104. Slot[SlotNb].GpkObject[hKey].Field[POS_KEY_TYPE].pValue,
  9105. Slot[SlotNb].GpkObject[hKey].Field[POS_KEY_TYPE].Len
  9106. );
  9107. Slot[SlotNb].GpkObject[hCert].Field[POS_KEY_TYPE].bReal = TRUE;
  9108. /* Derive Label from certificate value for PKCS#11 compatibility */
  9109. if (MakeLabel( Slot[SlotNb].GpkObject[hCert].Field[POS_VALUE].pValue,
  9110. Slot[SlotNb].GpkObject[hCert].Field[POS_VALUE].Len,
  9111. 0, &wLabelLen ) == RV_SUCCESS)
  9112. {
  9113. pbLabel = (BYTE*)GMEM_Alloc(wLabelLen);
  9114. if (IsNull(pbLabel))
  9115. {
  9116. GMEM_Free(Slot[SlotNb].GpkObject[hCert].Field[POS_KEY_TYPE].pValue);
  9117. GMEM_Free(Slot[SlotNb].GpkObject[hCert].Field[POS_VALUE].pValue);
  9118. Slot[SlotNb].GpkObject[hCert] = TmpCert;
  9119. --Slot[SlotNb].NbGpkObject; // Bug #1675/1676
  9120. RETURN (CRYPT_FAILED, NTE_NO_MEMORY);
  9121. }
  9122. MakeLabel(Slot[SlotNb].GpkObject[hCert].Field[POS_VALUE].pValue,
  9123. Slot[SlotNb].GpkObject[hCert].Field[POS_VALUE].Len,
  9124. pbLabel,
  9125. &wLabelLen
  9126. );
  9127. }
  9128. else
  9129. {
  9130. wLabelLen = 17;
  9131. pbLabel = (BYTE*)GMEM_Alloc(wLabelLen);
  9132. if (IsNull(pbLabel))
  9133. {
  9134. GMEM_Free(Slot[SlotNb].GpkObject[hCert].Field[POS_KEY_TYPE].pValue);
  9135. GMEM_Free(Slot[SlotNb].GpkObject[hCert].Field[POS_VALUE].pValue);
  9136. Slot[SlotNb].GpkObject[hCert] = TmpCert;
  9137. --Slot[SlotNb].NbGpkObject; // Bug #1675/1676
  9138. RETURN (CRYPT_FAILED, NTE_NO_MEMORY);
  9139. }
  9140. memcpy(pbLabel, "User's Digital ID", 17);
  9141. }
  9142. Slot[SlotNb].GpkObject[hCert].Field[POS_LABEL].Len = wLabelLen;
  9143. // if (IsNotNull(GpkObject[hCert].Field[POS_LABEL].pValue))
  9144. // {
  9145. // This will be free later with TmpCert
  9146. // }
  9147. Slot[SlotNb].GpkObject[hCert].Field[POS_LABEL].pValue = (BYTE*)GMEM_Alloc(wLabelLen);
  9148. if (IsNull(Slot[SlotNb].GpkObject[hCert].Field[POS_LABEL].pValue))
  9149. {
  9150. GMEM_Free(pbLabel);
  9151. GMEM_Free(Slot[SlotNb].GpkObject[hCert].Field[POS_KEY_TYPE].pValue);
  9152. GMEM_Free(Slot[SlotNb].GpkObject[hCert].Field[POS_VALUE].pValue);
  9153. Slot[SlotNb].GpkObject[hCert] = TmpCert;
  9154. --Slot[SlotNb].NbGpkObject; // Bug #1675/1676
  9155. RETURN (CRYPT_FAILED, NTE_NO_MEMORY);
  9156. }
  9157. memcpy(Slot[SlotNb].GpkObject[hCert].Field[POS_LABEL].pValue,
  9158. pbLabel,
  9159. wLabelLen
  9160. );
  9161. Slot[SlotNb].GpkObject[hCert].Field[POS_LABEL].bReal = TRUE;
  9162. TmpPrivKey = Slot[SlotNb].GpkObject[hPrivKey];
  9163. Slot[SlotNb].GpkObject[hPrivKey].Flags = Slot[SlotNb].GpkObject[hPrivKey].Flags | FLAG_LABEL;
  9164. Slot[SlotNb].GpkObject[hPrivKey].Field[POS_LABEL].Len = wLabelLen;
  9165. // if (IsNotNull(GpkObject[hPrivKey].Field[POS_LABEL].pValue))
  9166. // {
  9167. // This will be free later with TmpPrivKey
  9168. // }
  9169. Slot[SlotNb].GpkObject[hPrivKey].Field[POS_LABEL].pValue = (BYTE*)GMEM_Alloc(wLabelLen);
  9170. if (IsNull(Slot[SlotNb].GpkObject[hPrivKey].Field[POS_LABEL].pValue))
  9171. {
  9172. GMEM_Free(Slot[SlotNb].GpkObject[hCert].Field[POS_LABEL].pValue);
  9173. GMEM_Free(pbLabel);
  9174. GMEM_Free(Slot[SlotNb].GpkObject[hCert].Field[POS_KEY_TYPE].pValue);
  9175. GMEM_Free(Slot[SlotNb].GpkObject[hCert].Field[POS_VALUE].pValue);
  9176. Slot[SlotNb].GpkObject[hPrivKey] = TmpPrivKey;
  9177. Slot[SlotNb].GpkObject[hCert] = TmpCert;
  9178. --Slot[SlotNb].NbGpkObject; // Bug #1675/1676
  9179. RETURN (CRYPT_FAILED, NTE_NO_MEMORY);
  9180. }
  9181. memcpy(Slot[SlotNb].GpkObject[hPrivKey].Field[POS_LABEL].pValue,
  9182. pbLabel,
  9183. wLabelLen
  9184. );
  9185. Slot[SlotNb].GpkObject[hPrivKey].Field[POS_LABEL].bReal = TRUE;
  9186. GMEM_Free(pbLabel);
  9187. /* Set automatic fields for PKCS#11 compatibility */
  9188. Slot[SlotNb].GpkObject[hCert].Field[POS_ID].Len = 0;
  9189. Slot[SlotNb].GpkObject[hCert].Field[POS_ID].bReal = FALSE;
  9190. Slot[SlotNb].GpkObject[hCert].Field[POS_SUBJECT].Len = 0;
  9191. Slot[SlotNb].GpkObject[hCert].Field[POS_SUBJECT].bReal = FALSE;
  9192. Slot[SlotNb].GpkObject[hCert].Field[POS_ISSUER].Len = 0;
  9193. Slot[SlotNb].GpkObject[hCert].Field[POS_ISSUER].bReal = FALSE;
  9194. Slot[SlotNb].GpkObject[hCert].Field[POS_SERIAL_NUMBER].Len = 0;
  9195. Slot[SlotNb].GpkObject[hCert].Field[POS_SERIAL_NUMBER].bReal = FALSE;
  9196. /* Set automatic fields of assocoiated key for PKCS#11 */
  9197. Slot[SlotNb].GpkObject[hPrivKey].Flags = Slot[SlotNb].GpkObject[hPrivKey].Flags | FLAG_SUBJECT;
  9198. Slot[SlotNb].GpkObject[hPrivKey].Field[POS_SUBJECT].Len = 0;
  9199. Slot[SlotNb].GpkObject[hPrivKey].Field[POS_SUBJECT].bReal = FALSE;
  9200. CspFlags = ProvCont[hProv].Flags;
  9201. WriteCert = TRUE;
  9202. pbBuff1 = (BYTE*)GMEM_Alloc (MAX_GPK_PUBLIC);
  9203. if (IsNull(pbBuff1))
  9204. {
  9205. WriteCert = FALSE;
  9206. }
  9207. dwBuff1Len = MAX_GPK_PUBLIC;
  9208. if (WriteCert && (!prepare_write_gpk_objects (hProv, pbBuff1, &dwBuff1Len, FALSE)))
  9209. {
  9210. WriteCert = FALSE;
  9211. GMEM_Free (pbBuff1);
  9212. }
  9213. if (WriteCert)
  9214. {
  9215. pbBuff2 = (BYTE*)GMEM_Alloc (MAX_GPK_PRIVATE);
  9216. if (IsNull(pbBuff2))
  9217. {
  9218. WriteCert = FALSE;
  9219. GMEM_Free (pbBuff1);
  9220. }
  9221. }
  9222. dwBuff2Len = MAX_GPK_PRIVATE;
  9223. if (WriteCert && (!prepare_write_gpk_objects (hProv, pbBuff2, &dwBuff2Len, TRUE)))
  9224. {
  9225. WriteCert = FALSE;
  9226. GMEM_Free (pbBuff1);
  9227. GMEM_Free (pbBuff2);
  9228. }
  9229. if (!WriteCert)
  9230. {
  9231. // restore the info. the new certificate is too large
  9232. GMEM_Free(Slot[SlotNb].GpkObject[hCert].Field[POS_VALUE].pValue);
  9233. GMEM_Free(Slot[SlotNb].GpkObject[hCert].Field[POS_KEY_TYPE].pValue);
  9234. GMEM_Free(Slot[SlotNb].GpkObject[hCert].Field[POS_LABEL].pValue);
  9235. GMEM_Free(Slot[SlotNb].GpkObject[hPrivKey].Field[POS_LABEL].pValue);
  9236. Slot[SlotNb].GpkObject[hCert] = TmpCert;
  9237. Slot[SlotNb].GpkObject[hPrivKey] = TmpPrivKey;
  9238. --Slot[SlotNb].NbGpkObject; // Bug #1675/1676
  9239. RETURN (CRYPT_FAILED, SCARD_E_WRITE_TOO_MANY);
  9240. }
  9241. if (IsNotNull(TmpCert.Field[POS_VALUE].pValue))
  9242. {
  9243. GMEM_Free(TmpCert.Field[POS_VALUE].pValue);
  9244. }
  9245. if (IsNotNull(TmpCert.Field[POS_KEY_TYPE].pValue))
  9246. {
  9247. GMEM_Free(TmpCert.Field[POS_KEY_TYPE].pValue);
  9248. }
  9249. if (IsNotNull(TmpCert.Field[POS_LABEL].pValue))
  9250. {
  9251. GMEM_Free(TmpCert.Field[POS_LABEL].pValue);
  9252. }
  9253. if (IsNotNull(TmpPrivKey.Field[POS_LABEL].pValue))
  9254. {
  9255. GMEM_Free(TmpPrivKey.Field[POS_LABEL].pValue);
  9256. }
  9257. if (!write_gpk_objects(hProv, pbBuff1, dwBuff1Len, FALSE, FALSE))
  9258. {
  9259. lRet = GetLastError();
  9260. GMEM_Free (pbBuff1);
  9261. GMEM_Free (pbBuff2);
  9262. --Slot[SlotNb].NbGpkObject; // Bug #1675/1676
  9263. RETURN (CRYPT_FAILED, lRet);
  9264. }
  9265. if (!write_gpk_objects(hProv, pbBuff2, dwBuff2Len, FALSE, TRUE))
  9266. {
  9267. lRet = GetLastError();
  9268. Select_MF(hProv);
  9269. GMEM_Free (pbBuff1);
  9270. GMEM_Free (pbBuff2);
  9271. --Slot[SlotNb].NbGpkObject; // Bug #1675/1676
  9272. RETURN (CRYPT_FAILED, lRet);
  9273. }
  9274. GMEM_Free (pbBuff1);
  9275. GMEM_Free (pbBuff2);
  9276. break;
  9277. default:
  9278. RETURN (CRYPT_FAILED, NTE_BAD_TYPE);
  9279. }
  9280. }
  9281. /* Session Key */
  9282. else if (key_exist(hKey-MAX_GPK_OBJ, hProv))
  9283. {
  9284. /* Set Key Parameter in Microsoft RSA Base Module */
  9285. CryptResp = CryptSetKeyParam(TmpObject[hKey-MAX_GPK_OBJ].hKeyBase,
  9286. dwParam,
  9287. pbData,
  9288. dwFlags
  9289. );
  9290. if (!CryptResp)
  9291. return CRYPT_FAILED;
  9292. }
  9293. /* Bad Key */
  9294. else
  9295. {
  9296. RETURN (CRYPT_FAILED, NTE_BAD_KEY);
  9297. }
  9298. RETURN (CRYPT_SUCCEED, 0);
  9299. }
  9300. /*******************************************************************************
  9301. Data Encryption Functions
  9302. *******************************************************************************/
  9303. /*
  9304. - CPDecrypt
  9305. -
  9306. * Purpose:
  9307. * Decrypt data
  9308. *
  9309. *
  9310. * Parameters:
  9311. * IN hProv - Handle to the CSP user
  9312. * IN hKey - Handle to the key
  9313. * IN hHash - Optional handle to a hash
  9314. * IN Final - Boolean indicating if this is the final
  9315. * block of ciphertext
  9316. * IN dwFlags - Flags values
  9317. * IN OUT pbData - Data to be decrypted
  9318. * IN OUT pdwDataLen - Pointer to the length of the data to be
  9319. * decrypted
  9320. *
  9321. * Returns:
  9322. */
  9323. BOOL WINAPI MyCPDecrypt(IN HCRYPTPROV hProv,
  9324. IN HCRYPTKEY hKey,
  9325. IN HCRYPTHASH hHash,
  9326. IN BOOL Final,
  9327. IN DWORD dwFlags,
  9328. IN OUT BYTE *pbData,
  9329. IN OUT DWORD *pdwDataLen
  9330. )
  9331. {
  9332. BOOL CryptResp;
  9333. HCRYPTKEY hDecKey;
  9334. if (!Context_exist(hProv))
  9335. {
  9336. RETURN (CRYPT_FAILED, NTE_BAD_UID);
  9337. }
  9338. if ((hKey <= MAX_GPK_OBJ) || (!key_exist(hKey-MAX_GPK_OBJ, hProv)))
  9339. {
  9340. RETURN (CRYPT_FAILED, NTE_BAD_KEY);
  9341. }
  9342. else
  9343. {
  9344. hDecKey = TmpObject[hKey-MAX_GPK_OBJ].hKeyBase;
  9345. }
  9346. if (!hash_exist(hHash, hProv))
  9347. {
  9348. RETURN (CRYPT_FAILED, NTE_BAD_HASH);
  9349. }
  9350. CryptResp = CryptDecrypt(hDecKey,
  9351. hHashGpk[hHash].hHashBase,
  9352. Final,
  9353. dwFlags,
  9354. pbData,
  9355. pdwDataLen
  9356. );
  9357. if (!CryptResp)
  9358. return CRYPT_FAILED;
  9359. RETURN (CRYPT_SUCCEED, 0);
  9360. }
  9361. /*
  9362. - CPEncrypt
  9363. -
  9364. * Purpose:
  9365. * Encrypt data
  9366. *
  9367. *
  9368. * Parameters:
  9369. * IN hProv - Handle to the CSP user
  9370. * IN hKey - Handle to the key
  9371. * IN hHash - Optional handle to a hash
  9372. * IN Final - Boolean indicating if this is the final
  9373. * block of plaintext
  9374. * IN dwFlags - Flags values
  9375. * IN OUT pbData - Data to be encrypted
  9376. * IN OUT pdwDataLen - Pointer to the length of the data to be
  9377. * encrypted
  9378. * IN dwBufLen - Size of Data buffer
  9379. *
  9380. * Returns:
  9381. */
  9382. BOOL WINAPI MyCPEncrypt(IN HCRYPTPROV hProv,
  9383. IN HCRYPTKEY hKey,
  9384. IN HCRYPTHASH hHash,
  9385. IN BOOL Final,
  9386. IN DWORD dwFlags,
  9387. IN OUT BYTE *pbData,
  9388. IN OUT DWORD *pdwDataLen,
  9389. IN DWORD dwBufLen
  9390. )
  9391. {
  9392. BOOL CryptResp;
  9393. HCRYPTKEY hEncKey;
  9394. if (!Context_exist(hProv))
  9395. {
  9396. RETURN (CRYPT_FAILED, NTE_BAD_UID);
  9397. }
  9398. if ((hKey <= MAX_GPK_OBJ) || (!key_exist(hKey-MAX_GPK_OBJ, hProv)))
  9399. {
  9400. RETURN (CRYPT_FAILED, NTE_BAD_KEY);
  9401. }
  9402. else
  9403. {
  9404. hEncKey = TmpObject[hKey-MAX_GPK_OBJ].hKeyBase;
  9405. }
  9406. if (!hash_exist(hHash, hProv))
  9407. {
  9408. RETURN (CRYPT_FAILED, NTE_BAD_HASH);
  9409. }
  9410. CryptResp = CryptEncrypt(hEncKey,
  9411. hHashGpk[hHash].hHashBase,
  9412. Final,
  9413. dwFlags,
  9414. pbData,
  9415. pdwDataLen,
  9416. dwBufLen
  9417. );
  9418. if (!CryptResp)
  9419. return CRYPT_FAILED;
  9420. RETURN (CRYPT_SUCCEED, 0);
  9421. }
  9422. /*******************************************************************************
  9423. Hashing and Digital Signature Functions
  9424. *******************************************************************************/
  9425. /*
  9426. - MyCPCreateHash
  9427. -
  9428. * Purpose:
  9429. * initate the hashing of a stream of data
  9430. *
  9431. *
  9432. * Parameters:
  9433. * IN hUID - Handle to the user identifcation
  9434. * IN Algid - Algorithm identifier of the hash algorithm
  9435. * to be used
  9436. * IN hKey - Optional key for MAC algorithms
  9437. * IN dwFlags - Flags values
  9438. * OUT pHash - Handle to hash object
  9439. *
  9440. * Returns:
  9441. */
  9442. BOOL WINAPI MyCPCreateHash(IN HCRYPTPROV hProv,
  9443. IN ALG_ID Algid,
  9444. IN HCRYPTKEY hKey,
  9445. IN DWORD dwFlags,
  9446. OUT HCRYPTHASH *phHash
  9447. )
  9448. {
  9449. BOOL CryptResp;
  9450. HCRYPTKEY hKeyMac;
  9451. if (!Context_exist(hProv))
  9452. {
  9453. RETURN (CRYPT_FAILED, NTE_BAD_UID);
  9454. }
  9455. *phHash = find_hash_free();
  9456. if ((*phHash) == 0)
  9457. {
  9458. RETURN (CRYPT_FAILED, NTE_NO_MEMORY);
  9459. }
  9460. hKeyMac = 0;
  9461. if ((Algid == CALG_MAC) || (Algid == CALG_HMAC) )
  9462. {
  9463. if ((hKey <= MAX_GPK_OBJ) || (!key_exist(hKey - MAX_GPK_OBJ, hProv)))
  9464. {
  9465. *phHash = 0;
  9466. RETURN (CRYPT_FAILED, NTE_BAD_KEY);
  9467. }
  9468. else
  9469. {
  9470. hKeyMac = TmpObject[hKey-MAX_GPK_OBJ].hKeyBase;
  9471. }
  9472. }
  9473. CryptResp = CryptCreateHash(hProvBase,
  9474. Algid,
  9475. hKeyMac,
  9476. dwFlags,
  9477. &(hHashGpk[*phHash].hHashBase)
  9478. );
  9479. if (!CryptResp)
  9480. {
  9481. *phHash = 0;
  9482. return CRYPT_FAILED;
  9483. }
  9484. hHashGpk[*phHash].hProv = hProv;
  9485. RETURN (CRYPT_SUCCEED, 0);
  9486. }
  9487. /*
  9488. - MyCPDestroyHash
  9489. -
  9490. * Purpose:
  9491. * Destroy the hash object
  9492. *
  9493. *
  9494. * Parameters:
  9495. * IN hProv - Handle to the user identifcation
  9496. * IN hHash - Handle to hash object
  9497. *
  9498. * Returns:
  9499. */
  9500. BOOL WINAPI MyCPDestroyHash(IN HCRYPTPROV hProv,
  9501. IN HCRYPTHASH hHash
  9502. )
  9503. {
  9504. BOOL CryptResp;
  9505. if (!Context_exist(hProv))
  9506. {
  9507. RETURN (CRYPT_FAILED, NTE_BAD_UID);
  9508. }
  9509. if (!hash_exist(hHash, hProv))
  9510. {
  9511. RETURN (CRYPT_FAILED, NTE_BAD_HASH);
  9512. }
  9513. /* Destroy Microsoft RSA Base Hash */
  9514. CryptResp = CryptDestroyHash(hHashGpk[hHash].hHashBase);
  9515. if (!CryptResp)
  9516. return CRYPT_FAILED;
  9517. hHashGpk[hHash].hHashBase = 0;
  9518. hHashGpk[hHash].hProv = 0;
  9519. RETURN (CRYPT_SUCCEED, 0);
  9520. }
  9521. /*
  9522. - MyCPGetHashParam
  9523. -
  9524. * Purpose:
  9525. * Allows applications to get various aspects of the
  9526. * operations of a hash
  9527. *
  9528. * Parameters:
  9529. * IN hProv - Handle to a CSP
  9530. * IN hHash - Handle to a hash
  9531. * IN dwParam - Parameter number
  9532. * IN pbData - Pointer to data
  9533. * IN pdwDataLen - Length of parameter data
  9534. * IN dwFlags - Flags values
  9535. *
  9536. * Returns:
  9537. */
  9538. BOOL WINAPI MyCPGetHashParam(IN HCRYPTPROV hProv,
  9539. IN HCRYPTHASH hHash,
  9540. IN DWORD dwParam,
  9541. IN BYTE *pbData,
  9542. IN DWORD *pdwDataLen,
  9543. IN DWORD dwFlags
  9544. )
  9545. {
  9546. BOOL CryptResp;
  9547. if (!Context_exist(hProv))
  9548. {
  9549. RETURN (CRYPT_FAILED, NTE_BAD_UID);
  9550. }
  9551. if (!hash_exist(hHash, hProv))
  9552. {
  9553. RETURN (CRYPT_FAILED, NTE_BAD_HASH);
  9554. }
  9555. CryptResp = CryptGetHashParam(hHashGpk[hHash].hHashBase,
  9556. dwParam,
  9557. pbData,
  9558. pdwDataLen,
  9559. dwFlags
  9560. );
  9561. if (!CryptResp)
  9562. return CRYPT_FAILED;
  9563. RETURN (CRYPT_SUCCEED, 0);
  9564. }
  9565. /*
  9566. - MyCPHashData
  9567. -
  9568. * Purpose:
  9569. * Compute the cryptograghic hash on a stream of data
  9570. *
  9571. *
  9572. * Parameters:
  9573. * IN hProv - Handle to the user identifcation
  9574. * IN hHash - Handle to hash object
  9575. * IN pbData - Pointer to data to be hashed
  9576. * IN dwDataLen - Length of the data to be hashed
  9577. * IN dwFlags - Flags values
  9578. * IN pdwMaxLen - Maximum length of the data stream the CSP
  9579. * module may handle
  9580. *
  9581. * Returns:
  9582. */
  9583. BOOL WINAPI MyCPHashData(IN HCRYPTPROV hProv,
  9584. IN HCRYPTHASH hHash,
  9585. IN CONST BYTE *pbData,
  9586. IN DWORD dwDataLen,
  9587. IN DWORD dwFlags
  9588. )
  9589. {
  9590. BOOL CryptResp;
  9591. if (!Context_exist(hProv))
  9592. {
  9593. RETURN (CRYPT_FAILED, NTE_BAD_UID);
  9594. }
  9595. if (!hash_exist(hHash, hProv))
  9596. {
  9597. RETURN (CRYPT_FAILED, NTE_BAD_HASH);
  9598. }
  9599. /* Hash Data with Microsoft RSA Base */
  9600. CryptResp = CryptHashData(hHashGpk[hHash].hHashBase,
  9601. pbData,
  9602. dwDataLen,
  9603. dwFlags);
  9604. if (!CryptResp)
  9605. return CRYPT_FAILED;
  9606. RETURN (CRYPT_SUCCEED, 0);
  9607. }
  9608. /*
  9609. - CPHashSessionKey
  9610. -
  9611. * Purpose:
  9612. * Compute the cryptograghic hash on a key object.
  9613. *
  9614. *
  9615. * Parameters:
  9616. * IN hProv - Handle to the user identifcation
  9617. * IN hHash - Handle to hash object
  9618. * IN hKey - Handle to a key object
  9619. * IN dwFlags - Flags values
  9620. *
  9621. * Returns:
  9622. * CRYPT_FAILED
  9623. * CRYPT_SUCCEED
  9624. */
  9625. BOOL WINAPI MyCPHashSessionKey(IN HCRYPTPROV hProv,
  9626. IN HCRYPTHASH hHash,
  9627. IN HCRYPTKEY hKey,
  9628. IN DWORD dwFlags
  9629. )
  9630. {
  9631. BOOL CryptResp;
  9632. HCRYPTKEY hTmpKey;
  9633. if (!Context_exist(hProv))
  9634. {
  9635. RETURN (CRYPT_FAILED, NTE_BAD_UID);
  9636. }
  9637. if (!hash_exist(hHash, hProv))
  9638. {
  9639. RETURN (CRYPT_FAILED, NTE_BAD_HASH);
  9640. }
  9641. if (hKey <= MAX_GPK_OBJ)
  9642. {
  9643. RETURN (CRYPT_FAILED, NTE_BAD_KEY);
  9644. }
  9645. hTmpKey = hKey - MAX_GPK_OBJ;
  9646. if (!key_exist(hTmpKey, hProv))
  9647. {
  9648. RETURN (CRYPT_FAILED, NTE_BAD_KEY);
  9649. }
  9650. /* Hash Data with Microsoft RSA Base */
  9651. CryptResp = CryptHashSessionKey(hHashGpk[hHash].hHashBase,
  9652. TmpObject[hTmpKey].hKeyBase,
  9653. dwFlags
  9654. );
  9655. if (!CryptResp)
  9656. return CRYPT_FAILED;
  9657. RETURN (CRYPT_SUCCEED, 0);
  9658. }
  9659. /*
  9660. - MyCPSetHashParam
  9661. -
  9662. * Purpose:
  9663. * Allows applications to customize various aspects of the
  9664. * operations of a hash
  9665. *
  9666. * Parameters:
  9667. * IN hProv - Handle to a CSP
  9668. * IN hHash - Handle to a hash
  9669. * IN dwParam - Parameter number
  9670. * IN pbData - Pointer to data
  9671. * IN dwFlags - Flags values
  9672. *
  9673. * Returns:
  9674. */
  9675. BOOL WINAPI MyCPSetHashParam(IN HCRYPTPROV hProv,
  9676. IN HCRYPTHASH hHash,
  9677. IN DWORD dwParam,
  9678. IN CONST BYTE *pbData,
  9679. IN DWORD dwFlags
  9680. )
  9681. {
  9682. BOOL CryptResp;
  9683. if (!Context_exist(hProv))
  9684. {
  9685. RETURN (CRYPT_FAILED, NTE_BAD_UID);
  9686. }
  9687. if (!hash_exist(hHash, hProv))
  9688. {
  9689. RETURN (CRYPT_FAILED, NTE_BAD_HASH);
  9690. }
  9691. /* Set Hash parameter with Microsoft RSA Base */
  9692. CryptResp = CryptSetHashParam(hHashGpk[hHash].hHashBase,
  9693. dwParam,
  9694. pbData,
  9695. dwFlags
  9696. );
  9697. if (!CryptResp)
  9698. return CRYPT_FAILED;
  9699. RETURN (CRYPT_SUCCEED, 0);
  9700. }
  9701. /*
  9702. - MyCPSignHash
  9703. -
  9704. * Purpose:
  9705. * Create a digital signature from a hash
  9706. *
  9707. *
  9708. * Parameters:
  9709. * IN hProv - Handle to the user identifcation
  9710. * IN hHash - Handle to hash object
  9711. * IN Algid - Algorithm identifier of the signature
  9712. * algorithm to be used
  9713. * IN sDescription - Description of data to be signed
  9714. * IN dwFlags - Flags values
  9715. * OUT pbSignture - Pointer to signature data
  9716. * OUT dwHashLen - Pointer to the len of the signature data
  9717. *
  9718. * Returns:
  9719. */
  9720. BOOL WINAPI MyCPSignHash(IN HCRYPTPROV hProv,
  9721. IN HCRYPTHASH hHash,
  9722. IN DWORD dwKeySpec,
  9723. IN LPCWSTR sDescription,
  9724. IN DWORD dwFlags,
  9725. OUT BYTE *pbSignature,
  9726. OUT DWORD *pdwSigLen
  9727. )
  9728. {
  9729. DWORD lRet;
  9730. DWORD SlotNb;
  9731. BOOL CryptResp;
  9732. DWORD dwLen;
  9733. BYTE GpkKeySize;
  9734. BYTE HashMode;
  9735. HCRYPTKEY hKey;
  9736. BYTE TmpHashValue[64];
  9737. // + NK 07.02.2001
  9738. DWORD dwPinLength;
  9739. // -NK
  9740. if (!Context_exist(hProv))
  9741. {
  9742. RETURN (CRYPT_FAILED, NTE_BAD_UID);
  9743. }
  9744. SlotNb = ProvCont[hProv].Slot;
  9745. if (dwFlags != 0)
  9746. {
  9747. RETURN (CRYPT_FAILED, NTE_BAD_FLAGS);
  9748. }
  9749. // returns same value as aux csp
  9750. if (dwKeySpec != AT_KEYEXCHANGE && dwKeySpec != AT_SIGNATURE)
  9751. {
  9752. RETURN (CRYPT_FAILED, NTE_BAD_ALGID);
  9753. }
  9754. /* sDescription is not supported */
  9755. if (IsNotNullStr(sDescription))
  9756. {
  9757. RETURN(CRYPT_FAILED, ERROR_INVALID_PARAMETER);
  9758. }
  9759. if (!hash_exist(hHash, hProv))
  9760. {
  9761. RETURN (CRYPT_FAILED, NTE_BAD_HASH);
  9762. }
  9763. HashMode = GPKHashMode (hHash);
  9764. if (HashMode == 0x00)
  9765. {
  9766. RETURN (CRYPT_FAILED, NTE_BAD_HASH);
  9767. }
  9768. /* Select Key */
  9769. CryptResp = MyCPGetUserKey(hProv, dwKeySpec, &hKey);
  9770. if (!CryptResp)
  9771. return CRYPT_FAILED;
  9772. if (!(Slot[SlotNb].GpkObject[hKey].Flags & FLAG_SIGN))
  9773. {
  9774. *pdwSigLen = 0;
  9775. RETURN(CRYPT_FAILED, NTE_BAD_KEY);
  9776. }
  9777. GpkKeySize = Slot[SlotNb].GpkPubKeys[Slot[SlotNb].GpkObject[hKey].FileId - GPK_FIRST_KEY].KeySize;
  9778. if (GpkKeySize == 0)
  9779. {
  9780. RETURN (CRYPT_FAILED, NTE_BAD_KEY);
  9781. }
  9782. if (IsNull(pbSignature) || (0 == *pdwSigLen))
  9783. {
  9784. *pdwSigLen = GpkKeySize;
  9785. RETURN (CRYPT_SUCCEED, 0 );
  9786. }
  9787. if (GpkKeySize > *pdwSigLen)
  9788. {
  9789. *pdwSigLen = GpkKeySize;
  9790. RETURN (CRYPT_FAILED, ERROR_MORE_DATA);
  9791. }
  9792. // + NK 06.02.2001
  9793. // if ((ProvCont[hProv].Flags & CRYPT_SILENT) && (IsNullStr(Slot[SlotNb].GetPin())))
  9794. lRet = Query_MSPinCache( Slot[SlotNb].hPinCacheHandle,
  9795. NULL,
  9796. &dwPinLength );
  9797. if ( (lRet != ERROR_SUCCESS) && (lRet != ERROR_EMPTY) )
  9798. RETURN (CRYPT_FAILED, lRet);
  9799. if ((ProvCont[hProv].Flags & CRYPT_SILENT) && (lRet == ERROR_EMPTY))
  9800. // - NK
  9801. {
  9802. RETURN (CRYPT_FAILED, NTE_SILENT_CONTEXT);
  9803. }
  9804. // Verify the PINs
  9805. if (!PIN_Validation(hProv)) {
  9806. return CRYPT_FAILED;
  9807. }
  9808. if (!VerifyDivPIN(hProv, TRUE))
  9809. return CRYPT_FAILED;
  9810. /* Card Select Context for RSA with specified Hash type */
  9811. bSendBuffer[0] = 0x80; //CLA
  9812. bSendBuffer[1] = 0xA6; //INS
  9813. bSendBuffer[2] = Slot[SlotNb].GpkObject[hKey].FileId; //P1
  9814. bSendBuffer[3] = HashMode; //P2
  9815. cbSendLength = 4;
  9816. cbRecvLength = sizeof(bRecvBuffer);
  9817. lRet = SCardTransmit( ProvCont[hProv].hCard, SCARD_PCI_T0, bSendBuffer,
  9818. cbSendLength, 0, bRecvBuffer, &cbRecvLength );
  9819. if (SCARDPROBLEM(lRet,0x9000,0x00))
  9820. {
  9821. RETURN (CRYPT_FAILED, NTE_BAD_KEY_STATE);
  9822. }
  9823. /* Force Calculation of Hash Value */
  9824. dwLen = sizeof(TmpHashValue);
  9825. CryptResp = CryptGetHashParam(hHashGpk[hHash].hHashBase,
  9826. HP_HASHVAL,
  9827. TmpHashValue,
  9828. &dwLen,
  9829. 0);
  9830. if (!CryptResp)
  9831. return CRYPT_FAILED;
  9832. r_memcpy(&bSendBuffer[5], TmpHashValue, dwLen);
  9833. /* Send hash Data with only one command */
  9834. bSendBuffer[0] = 0x80; //CLA
  9835. bSendBuffer[1] = 0xEA; //INS
  9836. bSendBuffer[2] = 0x00; //P1
  9837. bSendBuffer[3] = 0x00; //P2
  9838. bSendBuffer[4] = (BYTE)dwLen; //Li
  9839. cbSendLength = dwLen + 5;
  9840. cbRecvLength = sizeof(bRecvBuffer);
  9841. lRet = SCardTransmit( ProvCont[hProv].hCard, SCARD_PCI_T0, bSendBuffer,
  9842. cbSendLength, 0, bRecvBuffer, &cbRecvLength );
  9843. if (SCARDPROBLEM(lRet,0x9000,0x00))
  9844. {
  9845. RETURN (CRYPT_FAILED, NTE_BAD_SIGNATURE);
  9846. }
  9847. /* Get signature */
  9848. bSendBuffer[0] = 0x80; //CLA
  9849. bSendBuffer[1] = 0x86; //INS
  9850. bSendBuffer[2] = 0x00; //P1
  9851. bSendBuffer[3] = 0x00; //P2
  9852. bSendBuffer[4] = GpkKeySize; //Lo
  9853. cbSendLength = 5;
  9854. cbRecvLength = sizeof(bRecvBuffer);
  9855. lRet = SCardTransmit( ProvCont[hProv].hCard, SCARD_PCI_T0, bSendBuffer,
  9856. cbSendLength, 0, bRecvBuffer, &cbRecvLength );
  9857. if (SCARDPROBLEM(lRet,0x9000,bSendBuffer[4]))
  9858. {
  9859. RETURN (CRYPT_FAILED, NTE_BAD_SIGNATURE);
  9860. }
  9861. cbRecvLength = cbRecvLength - 2;
  9862. *pdwSigLen = cbRecvLength;
  9863. memcpy(pbSignature, bRecvBuffer, cbRecvLength);
  9864. RETURN (CRYPT_SUCCEED, 0);
  9865. }
  9866. /*
  9867. - MyCPVerifySignature
  9868. -
  9869. * Purpose:
  9870. * Used to verify a signature against a hash object
  9871. *
  9872. *
  9873. * Parameters:
  9874. * IN hProv - Handle to the user identifcation
  9875. * IN hHash - Handle to hash object
  9876. * IN pbSignture - Pointer to signature data
  9877. * IN dwSigLen - Length of the signature data
  9878. * IN hPubKey - Handle to the public key for verifying
  9879. * the signature
  9880. * IN Algid - Algorithm identifier of the signature
  9881. * algorithm to be used
  9882. * IN sDescription - Description of data to be signed
  9883. * IN dwFlags - Flags values
  9884. *
  9885. * Returns:
  9886. */
  9887. BOOL WINAPI MyCPVerifySignature(IN HCRYPTPROV hProv,
  9888. IN HCRYPTHASH hHash,
  9889. IN CONST BYTE *pbSignature,
  9890. IN DWORD dwSigLen,
  9891. IN HCRYPTKEY hPubKey,
  9892. IN LPCWSTR sDescription,
  9893. IN DWORD dwFlags
  9894. )
  9895. {
  9896. DWORD SlotNb;
  9897. BOOL CryptResp;
  9898. HCRYPTKEY hTmpKey;
  9899. if (!Context_exist(hProv))
  9900. {
  9901. RETURN (CRYPT_FAILED, NTE_BAD_UID);
  9902. }
  9903. SlotNb = ProvCont[hProv].Slot;
  9904. if (!hash_exist(hHash, hProv))
  9905. {
  9906. RETURN (CRYPT_FAILED, NTE_BAD_HASH);
  9907. }
  9908. if (hPubKey <= MAX_GPK_OBJ)
  9909. {
  9910. if ((ProvCont[hProv].Flags & CRYPT_VERIFYCONTEXT) &&
  9911. (ProvCont[hProv].isContNameNullBlank))
  9912. {
  9913. RETURN (CRYPT_FAILED, NTE_PERM);
  9914. }
  9915. if (( !Slot[SlotNb].GpkObject[hPubKey].IsCreated) ||
  9916. ( (Slot[SlotNb].GpkObject[hPubKey].Tag != TAG_RSA_PUBLIC ) &&
  9917. (Slot[SlotNb].GpkObject[hPubKey].Tag != TAG_RSA_PRIVATE) )
  9918. )
  9919. {
  9920. RETURN (CRYPT_FAILED, NTE_BAD_KEY);
  9921. }
  9922. HCRYPTKEY hVerKey;
  9923. if ((Slot[SlotNb].GpkObject[hPubKey].Field[POS_KEY_TYPE].Len == 0) ||
  9924. ((Slot[SlotNb].GpkObject[hPubKey].Field[POS_KEY_TYPE].pValue[0] != AT_KEYEXCHANGE) &&
  9925. (Slot[SlotNb].GpkObject[hPubKey].Field[POS_KEY_TYPE].pValue[0] != AT_SIGNATURE)))
  9926. {
  9927. RETURN(CRYPT_FAILED, NTE_BAD_KEY);
  9928. }
  9929. if (Slot[SlotNb].GpkObject[hPubKey].Field[POS_KEY_TYPE].pValue[0] == AT_KEYEXCHANGE)
  9930. {
  9931. hVerKey = ProvCont[hProv].hRSAKEK;
  9932. }
  9933. else
  9934. {
  9935. hVerKey = ProvCont[hProv].hRSASign;
  9936. }
  9937. CryptResp = CryptVerifySignature(hHashGpk[hHash].hHashBase,
  9938. pbSignature,
  9939. dwSigLen,
  9940. hVerKey, //Slot[SlotNb].GpkObject[hPubKey].hKeyBase,
  9941. (LPCTSTR)sDescription,
  9942. dwFlags);
  9943. if (!CryptResp)
  9944. return CRYPT_FAILED;
  9945. }
  9946. else
  9947. {
  9948. hTmpKey = hPubKey - MAX_GPK_OBJ;
  9949. if (!key_exist(hTmpKey, hProv))
  9950. {
  9951. RETURN (CRYPT_FAILED, NTE_BAD_KEY);
  9952. }
  9953. /* Verify Signature with Microsoft RSA Base Module */
  9954. CryptResp = CryptVerifySignature(hHashGpk[hHash].hHashBase,
  9955. pbSignature,
  9956. dwSigLen,
  9957. TmpObject[hTmpKey].hKeyBase,
  9958. (LPCTSTR)sDescription,
  9959. dwFlags);
  9960. if (!CryptResp)
  9961. return CRYPT_FAILED;
  9962. }
  9963. RETURN (CRYPT_SUCCEED, 0);
  9964. }