pkcs11testmodule.cpp 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659
  1. /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
  2. /* This Source Code Form is subject to the terms of the Mozilla Public
  3. * License, v. 2.0. If a copy of the MPL was not distributed with this
  4. * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
  5. // This is a testing PKCS #11 module that simulates a token being inserted and
  6. // removed from a slot every 50ms. This is achieved mainly in
  7. // Test_C_WaitForSlotEvent. If the application that loaded this module calls
  8. // C_WaitForSlotEvent, this module waits for 50ms and returns, having changed
  9. // its internal state to report that the token has either been inserted or
  10. // removed, as appropriate.
  11. // This module also provides an alternate token that is always present for tests
  12. // that don't want the cyclic behavior described above.
  13. #include <assert.h>
  14. #include <string.h>
  15. #ifdef _WIN32
  16. # include <windows.h> // for Sleep
  17. #else
  18. # include <unistd.h> // for usleep
  19. #endif
  20. #include "pkcs11t.h"
  21. #undef CK_DECLARE_FUNCTION
  22. #ifdef _WIN32
  23. #define CK_DECLARE_FUNCTION(rtype, func) extern rtype __declspec(dllexport) func
  24. #else
  25. #define CK_DECLARE_FUNCTION(rtype, func) extern rtype func
  26. #endif
  27. #include "pkcs11.h"
  28. #if __cplusplus < 201103L
  29. # include <prtypes.h>
  30. # define static_assert(condition, message) PR_STATIC_ASSERT(condition)
  31. #endif
  32. CK_RV Test_C_Initialize(CK_VOID_PTR) { return CKR_OK; }
  33. CK_RV Test_C_Finalize(CK_VOID_PTR) { return CKR_OK; }
  34. static const CK_VERSION CryptokiVersion = {2, 2};
  35. static const CK_VERSION TestLibraryVersion = {0, 0};
  36. static const char TestLibraryDescription[] = "Test PKCS11 Library";
  37. static const char TestManufacturerID[] = "Test PKCS11 Manufacturer ID";
  38. /* The dest buffer is one in the CK_INFO or CK_TOKEN_INFO structs.
  39. * Those buffers are padded with spaces. DestSize corresponds to the declared
  40. * size for those buffers (e.g. 32 for `char foo[32]`).
  41. * The src buffer is a string literal. SrcSize includes the string
  42. * termination character (e.g. 4 for `const char foo[] = "foo"` */
  43. template <size_t DestSize, size_t SrcSize>
  44. void CopyString(unsigned char (&dest)[DestSize], const char (&src)[SrcSize]) {
  45. static_assert(DestSize >= SrcSize - 1, "DestSize >= SrcSize - 1");
  46. memcpy(dest, src, SrcSize - 1);
  47. memset(dest + SrcSize - 1, ' ', DestSize - SrcSize + 1);
  48. }
  49. CK_RV Test_C_GetInfo(CK_INFO_PTR pInfo) {
  50. if (!pInfo) {
  51. return CKR_ARGUMENTS_BAD;
  52. }
  53. pInfo->cryptokiVersion = CryptokiVersion;
  54. CopyString(pInfo->manufacturerID, TestManufacturerID);
  55. pInfo->flags = 0; // must be 0
  56. CopyString(pInfo->libraryDescription, TestLibraryDescription);
  57. pInfo->libraryVersion = TestLibraryVersion;
  58. return CKR_OK;
  59. }
  60. CK_RV Test_C_GetFunctionList(CK_FUNCTION_LIST_PTR_PTR) { return CKR_OK; }
  61. static int tokenPresent = 0;
  62. // The token in slot 4 has 2 objects. Both of them are profile object
  63. // and identified by object ID 1 or 2.
  64. static bool readingProfile = false;
  65. static const CK_PROFILE_ID profiles[] = {CKP_PUBLIC_CERTIFICATES_TOKEN,
  66. CKP_BASELINE_PROVIDER};
  67. static int profileIndex = 0;
  68. CK_RV Test_C_GetSlotList(CK_BBOOL limitToTokensPresent,
  69. CK_SLOT_ID_PTR pSlotList, CK_ULONG_PTR pulCount) {
  70. if (!pulCount) {
  71. return CKR_ARGUMENTS_BAD;
  72. }
  73. CK_SLOT_ID slots[4];
  74. CK_ULONG slotCount = 0;
  75. // We always return slot 2 and 4.
  76. slots[slotCount++] = 2;
  77. slots[slotCount++] = 4;
  78. // Slot 1 is a removable slot where a token is present if
  79. // tokenPresent = CK_TRUE.
  80. if (tokenPresent || !limitToTokensPresent) {
  81. slots[slotCount++] = 1;
  82. }
  83. // Slot 3 is a removable slot which never has a token.
  84. if (!limitToTokensPresent) {
  85. slots[slotCount++] = 3;
  86. }
  87. if (pSlotList) {
  88. if (*pulCount < slotCount) {
  89. return CKR_BUFFER_TOO_SMALL;
  90. }
  91. memcpy(pSlotList, slots, sizeof(CK_SLOT_ID) * slotCount);
  92. }
  93. *pulCount = slotCount;
  94. return CKR_OK;
  95. }
  96. static const char TestSlotDescription[] = "Test PKCS11 Slot";
  97. static const char TestSlot2Description[] = "Test PKCS11 Slot 二";
  98. static const char TestSlot3Description[] = "Empty PKCS11 Slot";
  99. static const char TestSlot4Description[] = "Test PKCS11 Public Certs Slot";
  100. CK_RV Test_C_GetSlotInfo(CK_SLOT_ID slotID, CK_SLOT_INFO_PTR pInfo) {
  101. if (!pInfo) {
  102. return CKR_ARGUMENTS_BAD;
  103. }
  104. switch (slotID) {
  105. case 1:
  106. CopyString(pInfo->slotDescription, TestSlotDescription);
  107. pInfo->flags =
  108. (tokenPresent ? CKF_TOKEN_PRESENT : 0) | CKF_REMOVABLE_DEVICE;
  109. break;
  110. case 2:
  111. CopyString(pInfo->slotDescription, TestSlot2Description);
  112. pInfo->flags = CKF_TOKEN_PRESENT | CKF_REMOVABLE_DEVICE;
  113. break;
  114. case 3:
  115. CopyString(pInfo->slotDescription, TestSlot3Description);
  116. pInfo->flags = CKF_REMOVABLE_DEVICE;
  117. break;
  118. case 4:
  119. CopyString(pInfo->slotDescription, TestSlot4Description);
  120. pInfo->flags = CKF_TOKEN_PRESENT | CKF_REMOVABLE_DEVICE;
  121. break;
  122. default:
  123. return CKR_ARGUMENTS_BAD;
  124. }
  125. CopyString(pInfo->manufacturerID, TestManufacturerID);
  126. pInfo->hardwareVersion = TestLibraryVersion;
  127. pInfo->firmwareVersion = TestLibraryVersion;
  128. return CKR_OK;
  129. }
  130. // Deliberately include énye to ensure we're handling encoding correctly.
  131. // The PKCS #11 base specification v2.20 specifies that strings be encoded
  132. // as UTF-8.
  133. static const char TestTokenLabel[] = "Test PKCS11 Tokeñ Label";
  134. static const char TestToken2Label[] = "Test PKCS11 Tokeñ 2 Label";
  135. static const char TestToken4Label[] = "Test PKCS11 Public Certs Token";
  136. static const char TestTokenModel[] = "Test Model";
  137. CK_RV Test_C_GetTokenInfo(CK_SLOT_ID slotID, CK_TOKEN_INFO_PTR pInfo) {
  138. if (!pInfo) {
  139. return CKR_ARGUMENTS_BAD;
  140. }
  141. switch (slotID) {
  142. case 1:
  143. CopyString(pInfo->label, TestTokenLabel);
  144. break;
  145. case 2:
  146. CopyString(pInfo->label, TestToken2Label);
  147. break;
  148. case 4:
  149. CopyString(pInfo->label, TestToken4Label);
  150. break;
  151. default:
  152. return CKR_ARGUMENTS_BAD;
  153. }
  154. CopyString(pInfo->manufacturerID, TestManufacturerID);
  155. CopyString(pInfo->model, TestTokenModel);
  156. memset(pInfo->serialNumber, 0, sizeof(pInfo->serialNumber));
  157. pInfo->flags = CKF_TOKEN_INITIALIZED;
  158. pInfo->ulMaxSessionCount = 1;
  159. pInfo->ulSessionCount = 0;
  160. pInfo->ulMaxRwSessionCount = 1;
  161. pInfo->ulRwSessionCount = 0;
  162. pInfo->ulMaxPinLen = 4;
  163. pInfo->ulMinPinLen = 4;
  164. pInfo->ulTotalPublicMemory = 1024;
  165. pInfo->ulFreePublicMemory = 1024;
  166. pInfo->ulTotalPrivateMemory = 1024;
  167. pInfo->ulFreePrivateMemory = 1024;
  168. pInfo->hardwareVersion = TestLibraryVersion;
  169. pInfo->firmwareVersion = TestLibraryVersion;
  170. memset(pInfo->utcTime, 0, sizeof(pInfo->utcTime));
  171. return CKR_OK;
  172. }
  173. CK_RV Test_C_GetMechanismList(CK_SLOT_ID, CK_MECHANISM_TYPE_PTR,
  174. CK_ULONG_PTR pulCount) {
  175. if (!pulCount) {
  176. return CKR_ARGUMENTS_BAD;
  177. }
  178. *pulCount = 0;
  179. return CKR_OK;
  180. }
  181. CK_RV Test_C_GetMechanismInfo(CK_SLOT_ID, CK_MECHANISM_TYPE,
  182. CK_MECHANISM_INFO_PTR) {
  183. return CKR_OK;
  184. }
  185. CK_RV Test_C_InitToken(CK_SLOT_ID, CK_UTF8CHAR_PTR, CK_ULONG, CK_UTF8CHAR_PTR) {
  186. return CKR_OK;
  187. }
  188. CK_RV Test_C_InitPIN(CK_SESSION_HANDLE, CK_UTF8CHAR_PTR, CK_ULONG) {
  189. return CKR_FUNCTION_NOT_SUPPORTED;
  190. }
  191. CK_RV Test_C_SetPIN(CK_SESSION_HANDLE, CK_UTF8CHAR_PTR, CK_ULONG,
  192. CK_UTF8CHAR_PTR, CK_ULONG) {
  193. return CKR_FUNCTION_NOT_SUPPORTED;
  194. }
  195. CK_RV Test_C_OpenSession(CK_SLOT_ID slotID, CK_FLAGS, CK_VOID_PTR, CK_NOTIFY,
  196. CK_SESSION_HANDLE_PTR phSession) {
  197. switch (slotID) {
  198. case 1:
  199. *phSession = 1;
  200. break;
  201. case 2:
  202. *phSession = 2;
  203. break;
  204. case 4:
  205. *phSession = 4;
  206. break;
  207. default:
  208. return CKR_ARGUMENTS_BAD;
  209. }
  210. return CKR_OK;
  211. }
  212. CK_RV Test_C_CloseSession(CK_SESSION_HANDLE) { return CKR_OK; }
  213. CK_RV Test_C_CloseAllSessions(CK_SLOT_ID) { return CKR_OK; }
  214. CK_RV Test_C_GetSessionInfo(CK_SESSION_HANDLE hSession,
  215. CK_SESSION_INFO_PTR pInfo) {
  216. if (!pInfo) {
  217. return CKR_ARGUMENTS_BAD;
  218. }
  219. switch (hSession) {
  220. case 1:
  221. pInfo->slotID = 1;
  222. break;
  223. case 2:
  224. pInfo->slotID = 2;
  225. break;
  226. case 4:
  227. pInfo->slotID = 4;
  228. break;
  229. default:
  230. return CKR_ARGUMENTS_BAD;
  231. }
  232. pInfo->state = CKS_RO_PUBLIC_SESSION;
  233. pInfo->flags = CKF_SERIAL_SESSION;
  234. return CKR_OK;
  235. }
  236. CK_RV Test_C_GetOperationState(CK_SESSION_HANDLE, CK_BYTE_PTR, CK_ULONG_PTR) {
  237. return CKR_FUNCTION_NOT_SUPPORTED;
  238. }
  239. CK_RV Test_C_SetOperationState(CK_SESSION_HANDLE, CK_BYTE_PTR, CK_ULONG,
  240. CK_OBJECT_HANDLE, CK_OBJECT_HANDLE) {
  241. return CKR_FUNCTION_NOT_SUPPORTED;
  242. }
  243. CK_RV Test_C_Login(CK_SESSION_HANDLE, CK_USER_TYPE, CK_UTF8CHAR_PTR, CK_ULONG) {
  244. return CKR_FUNCTION_NOT_SUPPORTED;
  245. }
  246. CK_RV Test_C_Logout(CK_SESSION_HANDLE) { return CKR_FUNCTION_NOT_SUPPORTED; }
  247. CK_RV Test_C_CreateObject(CK_SESSION_HANDLE, CK_ATTRIBUTE_PTR, CK_ULONG,
  248. CK_OBJECT_HANDLE_PTR) {
  249. return CKR_FUNCTION_NOT_SUPPORTED;
  250. }
  251. CK_RV Test_C_CopyObject(CK_SESSION_HANDLE, CK_OBJECT_HANDLE, CK_ATTRIBUTE_PTR,
  252. CK_ULONG, CK_OBJECT_HANDLE_PTR) {
  253. return CKR_FUNCTION_NOT_SUPPORTED;
  254. }
  255. CK_RV Test_C_DestroyObject(CK_SESSION_HANDLE, CK_OBJECT_HANDLE) {
  256. return CKR_FUNCTION_NOT_SUPPORTED;
  257. }
  258. CK_RV Test_C_GetObjectSize(CK_SESSION_HANDLE, CK_OBJECT_HANDLE, CK_ULONG_PTR) {
  259. return CKR_FUNCTION_NOT_SUPPORTED;
  260. }
  261. CK_RV Test_C_GetAttributeValue(CK_SESSION_HANDLE hSession,
  262. CK_OBJECT_HANDLE hObject,
  263. CK_ATTRIBUTE_PTR pTemplate, CK_ULONG ulCount) {
  264. if (hSession == 4) {
  265. assert(hObject >= 1 &&
  266. hObject - 1 < sizeof(profiles) / sizeof(profiles[0]));
  267. for (CK_ULONG count = 0; count < ulCount; count++) {
  268. if (pTemplate[count].type == CKA_PROFILE_ID) {
  269. if (pTemplate[count].pValue) {
  270. assert(pTemplate[count].ulValueLen == sizeof(CK_ULONG));
  271. CK_ULONG value = profiles[hObject - 1];
  272. memcpy(pTemplate[count].pValue, &value, sizeof(value));
  273. } else {
  274. pTemplate[count].ulValueLen = sizeof(CK_ULONG);
  275. }
  276. } else {
  277. pTemplate[count].ulValueLen = (CK_ULONG)-1;
  278. }
  279. }
  280. return CKR_OK;
  281. }
  282. return CKR_FUNCTION_NOT_SUPPORTED;
  283. }
  284. CK_RV Test_C_SetAttributeValue(CK_SESSION_HANDLE, CK_OBJECT_HANDLE,
  285. CK_ATTRIBUTE_PTR, CK_ULONG) {
  286. return CKR_FUNCTION_NOT_SUPPORTED;
  287. }
  288. CK_RV Test_C_FindObjectsInit(CK_SESSION_HANDLE hSession,
  289. CK_ATTRIBUTE_PTR pTemplate, CK_ULONG ulCount) {
  290. // Slot 4
  291. if (hSession == 4) {
  292. for (CK_ULONG count = 0; count < ulCount; count++) {
  293. CK_ATTRIBUTE attribute = pTemplate[count];
  294. if (attribute.type == CKA_CLASS) {
  295. assert(attribute.ulValueLen == sizeof(CK_ULONG));
  296. CK_ULONG value;
  297. memcpy(&value, attribute.pValue, attribute.ulValueLen);
  298. if (value == CKO_PROFILE) {
  299. readingProfile = true;
  300. profileIndex = 0;
  301. break;
  302. }
  303. }
  304. }
  305. }
  306. return CKR_OK;
  307. }
  308. CK_RV Test_C_FindObjects(CK_SESSION_HANDLE hSession,
  309. CK_OBJECT_HANDLE_PTR phObject,
  310. CK_ULONG ulMaxObjectCount,
  311. CK_ULONG_PTR pulObjectCount) {
  312. if (readingProfile) {
  313. assert(hSession == 4);
  314. CK_ULONG count = ulMaxObjectCount;
  315. size_t remaining = sizeof(profiles) / sizeof(profiles[0]) - profileIndex;
  316. if (count > remaining) {
  317. count = remaining;
  318. }
  319. for (CK_ULONG i = 0; i < count; i++) {
  320. phObject[i] = i + 1;
  321. }
  322. profileIndex += count;
  323. *pulObjectCount = count;
  324. } else {
  325. *pulObjectCount = 0;
  326. }
  327. return CKR_OK;
  328. }
  329. CK_RV Test_C_FindObjectsFinal(CK_SESSION_HANDLE hSession) {
  330. readingProfile = false;
  331. return CKR_OK;
  332. }
  333. CK_RV Test_C_EncryptInit(CK_SESSION_HANDLE, CK_MECHANISM_PTR,
  334. CK_OBJECT_HANDLE) {
  335. return CKR_FUNCTION_NOT_SUPPORTED;
  336. }
  337. CK_RV Test_C_Encrypt(CK_SESSION_HANDLE, CK_BYTE_PTR, CK_ULONG, CK_BYTE_PTR,
  338. CK_ULONG_PTR) {
  339. return CKR_FUNCTION_NOT_SUPPORTED;
  340. }
  341. CK_RV Test_C_EncryptUpdate(CK_SESSION_HANDLE, CK_BYTE_PTR, CK_ULONG,
  342. CK_BYTE_PTR, CK_ULONG_PTR) {
  343. return CKR_FUNCTION_NOT_SUPPORTED;
  344. }
  345. CK_RV Test_C_EncryptFinal(CK_SESSION_HANDLE, CK_BYTE_PTR, CK_ULONG_PTR) {
  346. return CKR_FUNCTION_NOT_SUPPORTED;
  347. }
  348. CK_RV Test_C_DecryptInit(CK_SESSION_HANDLE, CK_MECHANISM_PTR,
  349. CK_OBJECT_HANDLE) {
  350. return CKR_FUNCTION_NOT_SUPPORTED;
  351. }
  352. CK_RV Test_C_Decrypt(CK_SESSION_HANDLE, CK_BYTE_PTR, CK_ULONG, CK_BYTE_PTR,
  353. CK_ULONG_PTR) {
  354. return CKR_FUNCTION_NOT_SUPPORTED;
  355. }
  356. CK_RV Test_C_DecryptUpdate(CK_SESSION_HANDLE, CK_BYTE_PTR, CK_ULONG,
  357. CK_BYTE_PTR, CK_ULONG_PTR) {
  358. return CKR_FUNCTION_NOT_SUPPORTED;
  359. }
  360. CK_RV Test_C_DecryptFinal(CK_SESSION_HANDLE, CK_BYTE_PTR, CK_ULONG_PTR) {
  361. return CKR_FUNCTION_NOT_SUPPORTED;
  362. }
  363. CK_RV Test_C_DigestInit(CK_SESSION_HANDLE, CK_MECHANISM_PTR) {
  364. return CKR_FUNCTION_NOT_SUPPORTED;
  365. }
  366. CK_RV Test_C_Digest(CK_SESSION_HANDLE, CK_BYTE_PTR, CK_ULONG, CK_BYTE_PTR,
  367. CK_ULONG_PTR) {
  368. return CKR_FUNCTION_NOT_SUPPORTED;
  369. }
  370. CK_RV Test_C_DigestUpdate(CK_SESSION_HANDLE, CK_BYTE_PTR, CK_ULONG) {
  371. return CKR_FUNCTION_NOT_SUPPORTED;
  372. }
  373. CK_RV Test_C_DigestKey(CK_SESSION_HANDLE, CK_OBJECT_HANDLE) {
  374. return CKR_FUNCTION_NOT_SUPPORTED;
  375. }
  376. CK_RV Test_C_DigestFinal(CK_SESSION_HANDLE, CK_BYTE_PTR, CK_ULONG_PTR) {
  377. return CKR_FUNCTION_NOT_SUPPORTED;
  378. }
  379. CK_RV Test_C_SignInit(CK_SESSION_HANDLE, CK_MECHANISM_PTR, CK_OBJECT_HANDLE) {
  380. return CKR_FUNCTION_NOT_SUPPORTED;
  381. }
  382. CK_RV Test_C_Sign(CK_SESSION_HANDLE, CK_BYTE_PTR, CK_ULONG, CK_BYTE_PTR,
  383. CK_ULONG_PTR) {
  384. return CKR_FUNCTION_NOT_SUPPORTED;
  385. }
  386. CK_RV Test_C_SignUpdate(CK_SESSION_HANDLE, CK_BYTE_PTR, CK_ULONG) {
  387. return CKR_FUNCTION_NOT_SUPPORTED;
  388. }
  389. CK_RV Test_C_SignFinal(CK_SESSION_HANDLE, CK_BYTE_PTR, CK_ULONG_PTR) {
  390. return CKR_FUNCTION_NOT_SUPPORTED;
  391. }
  392. CK_RV Test_C_SignRecoverInit(CK_SESSION_HANDLE, CK_MECHANISM_PTR,
  393. CK_OBJECT_HANDLE) {
  394. return CKR_FUNCTION_NOT_SUPPORTED;
  395. }
  396. CK_RV Test_C_SignRecover(CK_SESSION_HANDLE, CK_BYTE_PTR, CK_ULONG, CK_BYTE_PTR,
  397. CK_ULONG_PTR) {
  398. return CKR_FUNCTION_NOT_SUPPORTED;
  399. }
  400. CK_RV Test_C_VerifyInit(CK_SESSION_HANDLE, CK_MECHANISM_PTR, CK_OBJECT_HANDLE) {
  401. return CKR_FUNCTION_NOT_SUPPORTED;
  402. }
  403. CK_RV Test_C_Verify(CK_SESSION_HANDLE, CK_BYTE_PTR, CK_ULONG, CK_BYTE_PTR,
  404. CK_ULONG) {
  405. return CKR_FUNCTION_NOT_SUPPORTED;
  406. }
  407. CK_RV Test_C_VerifyUpdate(CK_SESSION_HANDLE, CK_BYTE_PTR, CK_ULONG) {
  408. return CKR_FUNCTION_NOT_SUPPORTED;
  409. }
  410. CK_RV Test_C_VerifyFinal(CK_SESSION_HANDLE, CK_BYTE_PTR, CK_ULONG) {
  411. return CKR_FUNCTION_NOT_SUPPORTED;
  412. }
  413. CK_RV Test_C_VerifyRecoverInit(CK_SESSION_HANDLE, CK_MECHANISM_PTR,
  414. CK_OBJECT_HANDLE) {
  415. return CKR_FUNCTION_NOT_SUPPORTED;
  416. }
  417. CK_RV Test_C_VerifyRecover(CK_SESSION_HANDLE, CK_BYTE_PTR, CK_ULONG,
  418. CK_BYTE_PTR, CK_ULONG_PTR) {
  419. return CKR_FUNCTION_NOT_SUPPORTED;
  420. }
  421. CK_RV Test_C_DigestEncryptUpdate(CK_SESSION_HANDLE, CK_BYTE_PTR, CK_ULONG,
  422. CK_BYTE_PTR, CK_ULONG_PTR) {
  423. return CKR_FUNCTION_NOT_SUPPORTED;
  424. }
  425. CK_RV Test_C_DecryptDigestUpdate(CK_SESSION_HANDLE, CK_BYTE_PTR, CK_ULONG,
  426. CK_BYTE_PTR, CK_ULONG_PTR) {
  427. return CKR_FUNCTION_NOT_SUPPORTED;
  428. }
  429. CK_RV Test_C_SignEncryptUpdate(CK_SESSION_HANDLE, CK_BYTE_PTR, CK_ULONG,
  430. CK_BYTE_PTR, CK_ULONG_PTR) {
  431. return CKR_FUNCTION_NOT_SUPPORTED;
  432. }
  433. CK_RV Test_C_DecryptVerifyUpdate(CK_SESSION_HANDLE, CK_BYTE_PTR, CK_ULONG,
  434. CK_BYTE_PTR, CK_ULONG_PTR) {
  435. return CKR_FUNCTION_NOT_SUPPORTED;
  436. }
  437. CK_RV Test_C_GenerateKey(CK_SESSION_HANDLE, CK_MECHANISM_PTR, CK_ATTRIBUTE_PTR,
  438. CK_ULONG, CK_OBJECT_HANDLE_PTR) {
  439. return CKR_FUNCTION_NOT_SUPPORTED;
  440. }
  441. CK_RV Test_C_GenerateKeyPair(CK_SESSION_HANDLE, CK_MECHANISM_PTR,
  442. CK_ATTRIBUTE_PTR, CK_ULONG, CK_ATTRIBUTE_PTR,
  443. CK_ULONG, CK_OBJECT_HANDLE_PTR,
  444. CK_OBJECT_HANDLE_PTR) {
  445. return CKR_FUNCTION_NOT_SUPPORTED;
  446. }
  447. CK_RV Test_C_WrapKey(CK_SESSION_HANDLE, CK_MECHANISM_PTR, CK_OBJECT_HANDLE,
  448. CK_OBJECT_HANDLE, CK_BYTE_PTR, CK_ULONG_PTR) {
  449. return CKR_FUNCTION_NOT_SUPPORTED;
  450. }
  451. CK_RV Test_C_UnwrapKey(CK_SESSION_HANDLE, CK_MECHANISM_PTR, CK_OBJECT_HANDLE,
  452. CK_BYTE_PTR, CK_ULONG, CK_ATTRIBUTE_PTR, CK_ULONG,
  453. CK_OBJECT_HANDLE_PTR) {
  454. return CKR_FUNCTION_NOT_SUPPORTED;
  455. }
  456. CK_RV Test_C_DeriveKey(CK_SESSION_HANDLE, CK_MECHANISM_PTR, CK_OBJECT_HANDLE,
  457. CK_ATTRIBUTE_PTR, CK_ULONG, CK_OBJECT_HANDLE_PTR) {
  458. return CKR_FUNCTION_NOT_SUPPORTED;
  459. }
  460. CK_RV Test_C_SeedRandom(CK_SESSION_HANDLE, CK_BYTE_PTR, CK_ULONG) {
  461. return CKR_FUNCTION_NOT_SUPPORTED;
  462. }
  463. CK_RV Test_C_GenerateRandom(CK_SESSION_HANDLE, CK_BYTE_PTR, CK_ULONG) {
  464. return CKR_FUNCTION_NOT_SUPPORTED;
  465. }
  466. CK_RV Test_C_GetFunctionStatus(CK_SESSION_HANDLE) {
  467. return CKR_FUNCTION_NOT_SUPPORTED;
  468. }
  469. CK_RV Test_C_CancelFunction(CK_SESSION_HANDLE) {
  470. return CKR_FUNCTION_NOT_SUPPORTED;
  471. }
  472. CK_RV Test_C_WaitForSlotEvent(CK_FLAGS, CK_SLOT_ID_PTR pSlot, CK_VOID_PTR) {
  473. #ifdef _WIN32
  474. Sleep(50); // Sleep takes the duration argument as milliseconds
  475. #else
  476. usleep(50000); // usleep takes the duration argument as microseconds
  477. #endif
  478. *pSlot = 1;
  479. tokenPresent = !tokenPresent;
  480. return CKR_OK;
  481. }
  482. static CK_FUNCTION_LIST FunctionList = {{2, 2},
  483. Test_C_Initialize,
  484. Test_C_Finalize,
  485. Test_C_GetInfo,
  486. Test_C_GetFunctionList,
  487. Test_C_GetSlotList,
  488. Test_C_GetSlotInfo,
  489. Test_C_GetTokenInfo,
  490. Test_C_GetMechanismList,
  491. Test_C_GetMechanismInfo,
  492. Test_C_InitToken,
  493. Test_C_InitPIN,
  494. Test_C_SetPIN,
  495. Test_C_OpenSession,
  496. Test_C_CloseSession,
  497. Test_C_CloseAllSessions,
  498. Test_C_GetSessionInfo,
  499. Test_C_GetOperationState,
  500. Test_C_SetOperationState,
  501. Test_C_Login,
  502. Test_C_Logout,
  503. Test_C_CreateObject,
  504. Test_C_CopyObject,
  505. Test_C_DestroyObject,
  506. Test_C_GetObjectSize,
  507. Test_C_GetAttributeValue,
  508. Test_C_SetAttributeValue,
  509. Test_C_FindObjectsInit,
  510. Test_C_FindObjects,
  511. Test_C_FindObjectsFinal,
  512. Test_C_EncryptInit,
  513. Test_C_Encrypt,
  514. Test_C_EncryptUpdate,
  515. Test_C_EncryptFinal,
  516. Test_C_DecryptInit,
  517. Test_C_Decrypt,
  518. Test_C_DecryptUpdate,
  519. Test_C_DecryptFinal,
  520. Test_C_DigestInit,
  521. Test_C_Digest,
  522. Test_C_DigestUpdate,
  523. Test_C_DigestKey,
  524. Test_C_DigestFinal,
  525. Test_C_SignInit,
  526. Test_C_Sign,
  527. Test_C_SignUpdate,
  528. Test_C_SignFinal,
  529. Test_C_SignRecoverInit,
  530. Test_C_SignRecover,
  531. Test_C_VerifyInit,
  532. Test_C_Verify,
  533. Test_C_VerifyUpdate,
  534. Test_C_VerifyFinal,
  535. Test_C_VerifyRecoverInit,
  536. Test_C_VerifyRecover,
  537. Test_C_DigestEncryptUpdate,
  538. Test_C_DecryptDigestUpdate,
  539. Test_C_SignEncryptUpdate,
  540. Test_C_DecryptVerifyUpdate,
  541. Test_C_GenerateKey,
  542. Test_C_GenerateKeyPair,
  543. Test_C_WrapKey,
  544. Test_C_UnwrapKey,
  545. Test_C_DeriveKey,
  546. Test_C_SeedRandom,
  547. Test_C_GenerateRandom,
  548. Test_C_GetFunctionStatus,
  549. Test_C_CancelFunction,
  550. Test_C_WaitForSlotEvent};
  551. #ifdef _WIN32
  552. __declspec(dllexport)
  553. #endif
  554. CK_RV C_GetFunctionList(CK_FUNCTION_LIST_PTR_PTR ppFunctionList) {
  555. *ppFunctionList = &FunctionList;
  556. return CKR_OK;
  557. }