USBKeyAPI.cpp 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146
  1. #include "USBKeyAPI.h"
  2. DeviceBaseClass *pDevcieBase = NULL;
  3. unsigned int g_DeviceType = NO_USBKEY;
  4. USBKEY_INFO g_KeyInfo = {0};
  5. DLL_EXPORT_API DWORD FindUsbKey(USBKEY_INFO* pKeyInfo, unsigned int* pCount)
  6. {
  7. if (NULL == pKeyInfo
  8. || NULL == pCount)
  9. {
  10. return USBKEY_INVALID_PARAMETER;
  11. }
  12. pDevcieBase = new RocArmTime();
  13. DWORD dwRet = pDevcieBase->FindUsbKey(pKeyInfo, pCount);
  14. if((DONGLE_SUCCESS != dwRet) || (*pCount == 0))
  15. {
  16. g_DeviceType = NO_USBKEY;
  17. delete pDevcieBase;
  18. pDevcieBase = NULL;
  19. }
  20. else
  21. {
  22. g_DeviceType = ROCEYARM_TIME_FEITAIN;
  23. pKeyInfo->m_USBKeyType = ROCEYARM_TIME_FEITAIN;
  24. printf("UKey Type:Feitian Rockey Arm Time\n");
  25. memcpy(&g_KeyInfo, pKeyInfo, sizeof(USBKEY_INFO));
  26. return USBKEY_SUCCESS;
  27. }
  28. if (NO_USBKEY == g_DeviceType)
  29. {
  30. pDevcieBase = new S4Time();
  31. dwRet = pDevcieBase->FindUsbKey(pKeyInfo, pCount);
  32. if((S4_SUCCESS != dwRet) || (*pCount == 0))
  33. {
  34. g_DeviceType = NO_USBKEY;
  35. delete pDevcieBase;
  36. pDevcieBase = NULL;
  37. }
  38. else
  39. {
  40. g_DeviceType = S4_TIME_SENSI;
  41. pKeyInfo->m_USBKeyType = S4_TIME_SENSI;
  42. memcpy(&g_KeyInfo, pKeyInfo, sizeof(USBKEY_INFO));
  43. printf("UKey Type:Sensi S4 Time\n");
  44. return USBKEY_SUCCESS;
  45. }
  46. }
  47. if (NO_USBKEY == g_DeviceType)
  48. {
  49. pDevcieBase = new GM3000();
  50. dwRet = pDevcieBase->FindUsbKey(pKeyInfo, pCount);
  51. if((S4_SUCCESS != dwRet) || (*pCount == 0))
  52. {
  53. g_DeviceType = NO_USBKEY;
  54. delete pDevcieBase;
  55. pDevcieBase = NULL;
  56. }
  57. else
  58. {
  59. g_DeviceType = GM3000_LONGMAI;
  60. pKeyInfo->m_USBKeyType = GM3000_LONGMAI;
  61. memcpy(&g_KeyInfo, pKeyInfo, sizeof(USBKEY_INFO));
  62. printf("UKey Type:Longmai GM3000\n");
  63. //g_log->LOGERROR("UKey Type:Longmai GM3000");
  64. return USBKEY_SUCCESS;
  65. }
  66. }
  67. //没有找到,则继续找其他厂商
  68. //此处可以添加处理新的设备
  69. if (NO_USBKEY == g_DeviceType)
  70. {
  71. return USBKEY_NOT_FOUND;
  72. }
  73. return USBKEY_SUCCESS;
  74. }
  75. DLL_EXPORT_API DWORD OpenUsbKey(USBKEY_HANDLE *pHandle,unsigned int Item)
  76. {
  77. if (NULL == pHandle || NULL == pDevcieBase)
  78. {
  79. return USBKEY_INVALID_PARAMETER;
  80. }
  81. return pDevcieBase->OpenUsbKey(pHandle, Item);
  82. }
  83. DLL_EXPORT_API DWORD CloseUsbKey(USBKEY_HANDLE hHandle)
  84. {
  85. if (NULL == hHandle || NULL == pDevcieBase)
  86. {
  87. return USBKEY_INVALID_PARAMETER;
  88. }
  89. return pDevcieBase->CloseUsbKey(hHandle);
  90. }
  91. DLL_EXPORT_API DWORD VerifyAdminPIN(USBKEY_HANDLE hHandle, char* pPIN)
  92. {
  93. if (NULL == hHandle || NULL == pDevcieBase)
  94. {
  95. return USBKEY_INVALID_PARAMETER;
  96. }
  97. if (MAX_PIN_LEN != strlen(pPIN))
  98. {
  99. return USBKEY_INCORRECT_PIN_LEN;
  100. }
  101. return pDevcieBase->VerifyAdminPIN(hHandle, pPIN);
  102. }
  103. DLL_EXPORT_API DWORD ChangeAdminPIN(USBKEY_HANDLE hHandle,char* pOldPin, char* pNewPin)
  104. {
  105. if ((MAX_PIN_LEN != strlen(pOldPin)) || (MAX_PIN_LEN != strlen(pNewPin)))
  106. {
  107. return USBKEY_INCORRECT_PIN_LEN;
  108. }
  109. return pDevcieBase->ChangeAdminPIN(hHandle, pOldPin, pNewPin);
  110. }
  111. DLL_EXPORT_API DWORD GenUniqueKey(USBKEY_HANDLE hHandle,char* pAdminPin, char* pUserPin)
  112. {
  113. if (NULL == hHandle
  114. || NULL == pDevcieBase
  115. || NULL == pAdminPin
  116. || NULL == pUserPin)
  117. {
  118. return USBKEY_INVALID_PARAMETER;
  119. }
  120. return pDevcieBase->GenUniqueKey(hHandle, pAdminPin, pUserPin);
  121. }
  122. DWORD CreatePrivateKey(USBKEY_HANDLE hHandle, int nFileLen)
  123. {
  124. return pDevcieBase->CreatePrivateKey(hHandle,nFileLen);
  125. }
  126. DLL_EXPORT_API DWORD WritePrivateKey(USBKEY_HANDLE hHandle, BYTE * pInData, int nDataLen)
  127. {
  128. if (NULL == hHandle || NULL == pInData || nDataLen <= 0)
  129. {
  130. return USBKEY_INVALID_PARAMETER;
  131. }
  132. DWORD dwRet = CreatePrivateKey(hHandle, nDataLen);
  133. if (DONGLE_FILE_EXIST == dwRet
  134. || S4_FILE_EXIST == dwRet
  135. || SAR_FILE_ALREADY_EXIST == dwRet)
  136. {
  137. dwRet = DeletePrivateKey(hHandle);
  138. if (USBKEY_SUCCESS != dwRet)
  139. {
  140. return dwRet;
  141. }
  142. dwRet = CreatePrivateKey(hHandle, nDataLen);
  143. if (USBKEY_SUCCESS != dwRet)
  144. {
  145. return dwRet;
  146. }
  147. return pDevcieBase->WritePrivateKey(hHandle, pInData, nDataLen);
  148. }
  149. else if (USBKEY_SUCCESS == dwRet)
  150. {
  151. return pDevcieBase->WritePrivateKey(hHandle, pInData, nDataLen);
  152. }
  153. else
  154. {
  155. return dwRet;
  156. }
  157. }
  158. DLL_EXPORT_API DWORD DeletePrivateKey(USBKEY_HANDLE hHandle)
  159. {
  160. return pDevcieBase->DeletePrivateKey(hHandle);
  161. }
  162. DLL_EXPORT_API DWORD WriteUserCertificate(USBKEY_HANDLE hHandle, BYTE* pInData, int nDataLen)
  163. {
  164. if (NULL == hHandle || NULL == pInData || nDataLen <= 0)
  165. {
  166. return USBKEY_INVALID_PARAMETER;
  167. }
  168. return pDevcieBase->WriteDataFile(hHandle, USER_CERT_ID, 0, pInData, nDataLen, MAX_CERT_SIZE);
  169. }
  170. DLL_EXPORT_API DWORD ReadUserCertificate(USBKEY_HANDLE hHandle, BYTE* pOutData, int nDataLen)
  171. {
  172. if (NULL == hHandle || NULL == pOutData || nDataLen <= 0)
  173. {
  174. return USBKEY_INVALID_PARAMETER;
  175. }
  176. return pDevcieBase->ReadDataFile(hHandle, USER_CERT_ID, 0, pOutData, nDataLen);
  177. }
  178. DLL_EXPORT_API DWORD GetUserCertificateLength(USBKEY_HANDLE hHandle, int* pFileLen)
  179. {
  180. if (NULL == hHandle || NULL == pFileLen)
  181. {
  182. return USBKEY_INVALID_PARAMETER;
  183. }
  184. return pDevcieBase->GetFileLen(hHandle, USER_CERT_ID, (unsigned int*)pFileLen);
  185. }
  186. DLL_EXPORT_API DWORD DeleteUserCertificate(USBKEY_HANDLE hHandle)
  187. {
  188. if (NULL == hHandle)
  189. {
  190. return INPUT_NULL_ERR;
  191. }
  192. return pDevcieBase->DeleteDataFile(hHandle, USER_CERT_ID);
  193. }
  194. DLL_EXPORT_API DWORD WriteRootCaCertificate(USBKEY_HANDLE hHandle, BYTE* pInData, int nDataLen)
  195. {
  196. if (NULL == hHandle || NULL == pInData || nDataLen <= 0)
  197. {
  198. return USBKEY_INVALID_PARAMETER;
  199. }
  200. return pDevcieBase->WriteDataFile(hHandle, ROOT_CA_CERT_ID, 0, pInData, nDataLen, MAX_CERT_SIZE);
  201. }
  202. DLL_EXPORT_API DWORD ReadRootCaCertificate(USBKEY_HANDLE hHandle, BYTE* pOutData, int nDataLen)
  203. {
  204. if (NULL == hHandle || NULL == pOutData || nDataLen <= 0)
  205. {
  206. return USBKEY_INVALID_PARAMETER;
  207. }
  208. return pDevcieBase->ReadDataFile(hHandle, ROOT_CA_CERT_ID, 0, pOutData, nDataLen);
  209. }
  210. DLL_EXPORT_API DWORD GetRootCaCertificateLength(USBKEY_HANDLE hHandle, int* pFileLen)
  211. {
  212. if (NULL == hHandle || NULL == pFileLen)
  213. {
  214. return USBKEY_INVALID_PARAMETER;
  215. }
  216. return pDevcieBase->GetFileLen(hHandle, ROOT_CA_CERT_ID, (unsigned int*)pFileLen);
  217. }
  218. DLL_EXPORT_API DWORD DeleteRootCaCertificate(USBKEY_HANDLE hHandle)
  219. {
  220. if (NULL == hHandle)
  221. {
  222. return INPUT_NULL_ERR;
  223. }
  224. return pDevcieBase->DeleteDataFile(hHandle, ROOT_CA_CERT_ID);
  225. }
  226. DLL_EXPORT_API DWORD WriteSubCaCertificate(USBKEY_HANDLE hHandle, BYTE * pInData, int nDataLen)
  227. {
  228. if (NULL == hHandle || NULL == pInData || nDataLen <= 0)
  229. {
  230. return USBKEY_INVALID_PARAMETER;
  231. }
  232. return pDevcieBase->WriteDataFile(hHandle, SUB_CA_CERT_ID, 0, pInData, nDataLen, MAX_CERT_SIZE);
  233. }
  234. DLL_EXPORT_API DWORD ReadSubCaCertificate(USBKEY_HANDLE hHandle, BYTE* pOutData, int nDataLen)
  235. {
  236. if (NULL == hHandle || NULL == pOutData || nDataLen <= 0)
  237. {
  238. return USBKEY_INVALID_PARAMETER;
  239. }
  240. return pDevcieBase->ReadDataFile(hHandle, SUB_CA_CERT_ID, 0, pOutData, nDataLen);
  241. }
  242. DLL_EXPORT_API DWORD GetSubCaCertificateLength(USBKEY_HANDLE hHandle, int* pFileLen)
  243. {
  244. if (NULL == hHandle || NULL == pFileLen)
  245. {
  246. return USBKEY_INVALID_PARAMETER;
  247. }
  248. return pDevcieBase->GetFileLen(hHandle, SUB_CA_CERT_ID, (unsigned int*)pFileLen);
  249. }
  250. DLL_EXPORT_API DWORD DeleteSubCaCertificate(USBKEY_HANDLE hHandle)
  251. {
  252. if (NULL == hHandle)
  253. {
  254. return INPUT_NULL_ERR;
  255. }
  256. return pDevcieBase->DeleteDataFile(hHandle, SUB_CA_CERT_ID);
  257. }
  258. DLL_EXPORT_API DWORD SetAuthorizedDevices(USBKEY_HANDLE hHandle, char* pDeviceIDList)
  259. {
  260. if ((NULL == hHandle) || (NULL == pDeviceIDList))
  261. {
  262. return INPUT_NULL_ERR;
  263. }
  264. string strInDevices = pDeviceIDList;
  265. //删除旧的授权设备列表
  266. DWORD dwRet = pDevcieBase->DeleteDataFile(hHandle, DEVICE_ID_LIST);
  267. if (DONGLE_FILE_NOT_FOUND == dwRet
  268. || S4_FILE_NOT_FOUND == dwRet
  269. || SAR_FILE_NOT_EXIST == dwRet)
  270. {
  271. //不存在时,直接下一步
  272. }
  273. else if (USBKEY_SUCCESS != dwRet)
  274. {
  275. return dwRet;
  276. }
  277. //写入新授权设备列表
  278. dwRet = pDevcieBase->WriteDataFile(hHandle, DEVICE_ID_LIST, 0, (BYTE*)strInDevices.c_str(), strInDevices.length(), MAX_AUTHOR_SIZE);
  279. if (USBKEY_SUCCESS != dwRet)
  280. {
  281. return dwRet;
  282. }
  283. return USBKEY_SUCCESS;
  284. }
  285. DLL_EXPORT_API DWORD SetAuthorizedDevicesAppend(USBKEY_HANDLE hHandle, char* pDeviceIDList)
  286. {
  287. return DONGLE_SUCCESS;
  288. }
  289. DLL_EXPORT_API DWORD GetAuthorizedDevices(USBKEY_HANDLE hHandle, char* pDeviceIDList)
  290. {
  291. if ((NULL == hHandle) || (NULL == pDeviceIDList))
  292. {
  293. return INPUT_NULL_ERR;
  294. }
  295. unsigned int nFileLen = 0;
  296. DWORD dwRet = pDevcieBase->GetFileLen(hHandle, DEVICE_ID_LIST, &nFileLen);
  297. if (dwRet != USBKEY_SUCCESS)
  298. {
  299. return dwRet;
  300. }
  301. return pDevcieBase->ReadDataFile(hHandle, DEVICE_ID_LIST, 0, (BYTE*)pDeviceIDList, nFileLen);
  302. }
  303. int FindSubStrPos(const char* source, const char* target)
  304. {
  305. unsigned int i,j;
  306. if (strlen(source) < strlen(target))
  307. {
  308. return -1;
  309. }
  310. for (i = 0;i<=strlen(source)-strlen(target);i++)
  311. {
  312. if (source[i]==target[0])
  313. {
  314. for (j = 1;j<=strlen(target);j++)
  315. {
  316. if (source[i+j]!=target[j])
  317. break;
  318. }
  319. if ((j == strlen(target))
  320. || (j == strlen(target)+1))//结束符匹配到则加1
  321. {
  322. return i;
  323. }
  324. j = 0;
  325. }
  326. }
  327. return -1;
  328. }
  329. //获取任务中包含字段的个数
  330. int GetTaskSubCnt(const char* pTask)
  331. {
  332. int nSubCnt = 0;
  333. string strTask = pTask;
  334. int nPos = strTask.find_first_of("@");
  335. string firstTask = strTask.substr(0, nPos+1);
  336. int nfirstSubEndPos = firstTask.find_first_of(",");
  337. while (-1 != nfirstSubEndPos)
  338. {
  339. nSubCnt++;
  340. firstTask = firstTask.substr(nfirstSubEndPos+1, firstTask.length()-nfirstSubEndPos-1);
  341. nfirstSubEndPos = firstTask.find_first_of(",");
  342. }
  343. return nSubCnt;
  344. }
  345. //DLL_EXPORT_API DWORD ReduceAuthorizedDevice(USBKEY_HANDLE hHandle, char * pDeviceIDList)
  346. //{
  347. // if ((NULL == hHandle) || (NULL == pDeviceIDList))
  348. // {
  349. // return INPUT_NULL_ERR;
  350. // }
  351. //
  352. // unsigned int nInLen = strlen(pDeviceIDList);
  353. // /*if (DEVICES_ID_LEN > nInLen)
  354. // {
  355. // return INPUT_DEVICES_LIST_LEN_ERR;
  356. // }*/
  357. //
  358. // //读出锁内设备列表
  359. // char data[MAX_DATAFILE_SIZE] = {0};
  360. // DWORD dwRet = GetAuthorizedDevices(hHandle, data);
  361. // if (DONGLE_FILE_NOT_FOUND == dwRet
  362. // || S4_FILE_NOT_FOUND == dwRet
  363. // || SAR_FILE_NOT_EXIST == dwRet)
  364. // {
  365. // return USBKEY_SUCCESS;
  366. // }
  367. // else if (USBKEY_SUCCESS != dwRet)
  368. // {
  369. // return dwRet;
  370. // }
  371. //
  372. // //根据输入的设备列表,更新锁内设备列表
  373. // //更新逻辑:输入的设备列表中每个设备准入记录(ID+起始时间+结束时间),如果锁内设备列表中有找到相同的设备准入记录,则删除锁内设备列表中的该设备准入记录。
  374. // string strOldDevices = (char*)data;
  375. // string strInDevices = pDeviceIDList;
  376. //
  377. // int nLastPos = strOldDevices.find_last_of("@");
  378. // if (-1 == nLastPos)
  379. // {
  380. // return USBKEY_SUCCESS;
  381. // }
  382. //
  383. // string strNewDevices = strOldDevices.substr(0, nLastPos+1);
  384. //
  385. // while(nInLen > 0)
  386. // {
  387. // int nPos = strInDevices.find_first_of("@");
  388. // if (-1 == nPos)
  389. // {
  390. // break;
  391. // }
  392. //
  393. // string strId = strInDevices.substr(0, nPos+1);
  394. // int nIdPos = FindSubStrPos(strNewDevices.c_str(), strId.c_str());
  395. // if (-1 != nIdPos)
  396. // {
  397. // string strContent = strNewDevices;
  398. // int nContentLen = strContent.length();
  399. //
  400. // string beforeRec = strContent.substr(0,nIdPos);
  401. // string afterRec = strContent.substr(nIdPos + strId.length(), nContentLen -strId.length() - nIdPos);
  402. // strNewDevices = beforeRec;
  403. // strNewDevices += afterRec;
  404. // }
  405. //
  406. // strInDevices = strInDevices.substr(nPos+1, nInLen - nPos -1);
  407. // nInLen -= strId.length();
  408. // }
  409. //
  410. // dwRet = pDevcieBase->DeleteDataFile(hHandle, DEVICE_ID_LIST);
  411. // if (USBKEY_SUCCESS != dwRet)
  412. // {
  413. // return dwRet;
  414. // }
  415. //
  416. // if (ROCEYARM_TIME_FEITAIN ==g_DeviceType)
  417. // {
  418. // if (0 == strNewDevices.length())
  419. // {
  420. // //如果全部授权设备记录被删除,则直接返回,不重新写入
  421. // return USBKEY_SUCCESS;
  422. // }
  423. // }
  424. //
  425. // dwRet = SetAuthorizedDevices(hHandle, (char*)strNewDevices.c_str());
  426. // if (USBKEY_SUCCESS != dwRet)
  427. // {
  428. // return dwRet;
  429. // }
  430. //
  431. // return USBKEY_SUCCESS;
  432. //}
  433. DLL_EXPORT_API DWORD ReduceAuthorizedDevice(USBKEY_HANDLE hHandle, char * pDeviceIDList)
  434. {
  435. if ((NULL == hHandle) || (NULL == pDeviceIDList))
  436. {
  437. return INPUT_NULL_ERR;
  438. }
  439. unsigned int nInLen = strlen(pDeviceIDList);
  440. /*if (DEVICES_ID_LEN > nInLen)
  441. {
  442. return INPUT_DEVICES_LIST_LEN_ERR;
  443. }*/
  444. //读出锁内设备列表
  445. char data[MAX_DATAFILE_SIZE] = {0};
  446. DWORD dwRet = GetAuthorizedDevices(hHandle, data);
  447. if (DONGLE_FILE_NOT_FOUND == dwRet
  448. || S4_FILE_NOT_FOUND == dwRet
  449. || SAR_FILE_NOT_EXIST == dwRet)
  450. {
  451. return USBKEY_SUCCESS;
  452. }
  453. else if (USBKEY_SUCCESS != dwRet)
  454. {
  455. return dwRet;
  456. }
  457. //根据输入的设备列表,更新锁内设备列表
  458. //更新逻辑:输入的设备列表中每个设备准入记录(ID+起始时间+结束时间),如果锁内设备列表中有找到相同的设备准入记录,则删除锁内设备列表中的该设备准入记录。
  459. string strOldDevices = (char*)data;
  460. string strInDevices = pDeviceIDList;
  461. int nLastPos = strOldDevices.find_last_of("@");
  462. if (-1 == nLastPos)
  463. {
  464. return USBKEY_SUCCESS;
  465. }
  466. string strNewDevices = strOldDevices.substr(0, nLastPos+1);
  467. //判断电子钥匙中的任务和输入参数中的任务是否带任务ID,3个字段标识包含任务ID
  468. int nSubCntInKey = GetTaskSubCnt(strNewDevices.c_str());
  469. int nSubCntInput = GetTaskSubCnt(strInDevices.c_str());
  470. while(nInLen > 0)
  471. {
  472. int nPos = strInDevices.find_first_of("@");
  473. if (-1 == nPos)
  474. {
  475. break;
  476. }
  477. //兼容带任务ID和不带任务ID两种情况
  478. string strId;
  479. int nfirstSubEndPos = 0;
  480. switch (nSubCntInput)
  481. {
  482. case 3://任务包含TaskID
  483. if (2 == nSubCntInKey)
  484. {
  485. strId = strInDevices.substr(0, nPos+1);
  486. nfirstSubEndPos = strId.find_first_of(",");
  487. strId = strId.substr(nfirstSubEndPos+1, strId.length()-nfirstSubEndPos-1);
  488. }
  489. else
  490. {
  491. strId = strInDevices.substr(0, nPos+1);
  492. }
  493. break;
  494. case 2://任务不包含TaskID
  495. strId = strInDevices.substr(0, nPos+1);
  496. break;
  497. default://异常
  498. break;
  499. }
  500. int nIdPos = FindSubStrPos(strNewDevices.c_str(), strId.c_str());
  501. if (-1 != nIdPos)
  502. {
  503. string strContent = strNewDevices;
  504. int nContentLen = strContent.length();
  505. string beforeRec = strContent.substr(0,nIdPos);
  506. string afterRec = strContent.substr(nIdPos + strId.length(), nContentLen -strId.length() - nIdPos);
  507. strNewDevices = beforeRec;
  508. strNewDevices += afterRec;
  509. }
  510. strInDevices = strInDevices.substr(nPos+1, nInLen - nPos -1);
  511. nInLen -= strId.length();
  512. }
  513. dwRet = pDevcieBase->DeleteDataFile(hHandle, DEVICE_ID_LIST);
  514. if (USBKEY_SUCCESS != dwRet)
  515. {
  516. return dwRet;
  517. }
  518. if (ROCEYARM_TIME_FEITAIN ==g_DeviceType)
  519. {
  520. if (0 == strNewDevices.length())
  521. {
  522. //如果全部授权设备记录被删除,则直接返回,不重新写入
  523. return USBKEY_SUCCESS;
  524. }
  525. }
  526. dwRet = SetAuthorizedDevices(hHandle, (char*)strNewDevices.c_str());
  527. if (USBKEY_SUCCESS != dwRet)
  528. {
  529. return dwRet;
  530. }
  531. return USBKEY_SUCCESS;
  532. }
  533. DLL_EXPORT_API DWORD WriteLogFile(USBKEY_HANDLE hHandle, BYTE* pInData, int nDataLen)
  534. {
  535. if ((NULL == hHandle) || (NULL == pInData))
  536. {
  537. return INPUT_NULL_ERR;
  538. }
  539. return pDevcieBase->WriteLogFile(hHandle, pInData, nDataLen);
  540. }
  541. DLL_EXPORT_API DWORD ReadLogFile(USBKEY_HANDLE hHandle, BYTE* pOutData, int nDataLen)
  542. {
  543. if ((NULL == hHandle) || (NULL == pOutData))
  544. {
  545. return INPUT_NULL_ERR;
  546. }
  547. return pDevcieBase->ReadLogFile(hHandle, pOutData, nDataLen);
  548. }
  549. DLL_EXPORT_API DWORD UpdateLogRecord(USBKEY_HANDLE hHandle, BYTE * pNewRecord, int nNewRecordLen)
  550. {
  551. string strNewRecord = (char*)pNewRecord;
  552. int nRecLen = strNewRecord.length();
  553. int nPos = strNewRecord.find_first_of("@");
  554. string strNew = strNewRecord.substr(nPos + 1, nRecLen - nPos - 1);
  555. nPos = strNew.find_first_of("@");
  556. string strWarningID = strNew.substr(0,nPos);
  557. int nLogFileLen = 0;
  558. DWORD dwRet = GetLogFileLength(hHandle, &nLogFileLen);
  559. if (DONGLE_FILE_NOT_FOUND == dwRet
  560. || S4_FILE_NOT_FOUND == dwRet
  561. || SAR_FILE_NOT_EXIST == dwRet)
  562. {
  563. //没有找到日志文件,这创建日志文件,并写入当前记录
  564. return WriteLogFile(hHandle, pNewRecord, nNewRecordLen);
  565. }
  566. else if (USBKEY_SUCCESS != dwRet)
  567. {
  568. return dwRet;
  569. }
  570. BYTE* logContent = new BYTE[nLogFileLen+1];
  571. memset(logContent, 0, nLogFileLen+1);
  572. dwRet = ReadLogFile(hHandle, logContent, nLogFileLen);
  573. if (USBKEY_SUCCESS != dwRet)
  574. {
  575. return dwRet;
  576. }
  577. //查找WarningID匹配的记录
  578. string strLogContent = (char*)logContent;
  579. nPos = strLogContent.find_first_of(strWarningID);
  580. if (nPos < 0)
  581. {
  582. //没有找到匹配记录,则当新记录写入
  583. dwRet = WriteLogFile(hHandle, pNewRecord, nNewRecordLen);
  584. if (USBKEY_SUCCESS != dwRet)
  585. {
  586. return dwRet;
  587. }
  588. return USBKEY_SUCCESS;
  589. }
  590. string str = strLogContent;
  591. int len = str.length();
  592. //替换匹配记录
  593. while (len > 0)
  594. {
  595. int newLen = str.length();
  596. if (newLen <= 0)
  597. {
  598. break;
  599. }
  600. nPos = str.find_first_of(";");
  601. if (nPos < 0)
  602. {
  603. break;
  604. }
  605. string strRecord = str.substr(0, nPos+1);
  606. int nRecordLen = strRecord.length();
  607. int nTerminalNoPos = strRecord.find_first_of("@");
  608. string strNewRec = strRecord.substr(nTerminalNoPos+1, nRecordLen - nTerminalNoPos -1);
  609. int nWariningIdPos = strNewRec.find_first_of("@");
  610. string WarningId = strNewRec.substr(0, nWariningIdPos);
  611. if (0 == strcmp(WarningId.c_str(), strWarningID.c_str()))
  612. {
  613. string strContent = strLogContent;
  614. int logContentLen = strContent.length();
  615. int recPos = FindSubStrPos(strContent.c_str(),strRecord.c_str());
  616. string beforeRec = strContent.substr(0,recPos);
  617. string afterRec = strContent.substr(recPos + nRecordLen, logContentLen - nRecordLen - recPos);
  618. string newLogContent = beforeRec;
  619. newLogContent += strNewRecord;
  620. newLogContent += afterRec;
  621. dwRet = DeleteLogFile(hHandle);
  622. if (USBKEY_SUCCESS != dwRet)
  623. {
  624. return dwRet;
  625. }
  626. dwRet = WriteLogFile(hHandle, (BYTE*)newLogContent.c_str(), newLogContent.length());
  627. if (USBKEY_SUCCESS != dwRet)
  628. {
  629. return dwRet;
  630. }
  631. break;
  632. }
  633. str = str.substr(nPos+1, newLen - nPos -1);
  634. len = len - nPos - 1;
  635. }
  636. return USBKEY_SUCCESS;
  637. }
  638. DLL_EXPORT_API DWORD DeleteLogFile(USBKEY_HANDLE hHandle)
  639. {
  640. if (NULL == hHandle)
  641. {
  642. return INPUT_NULL_ERR;
  643. }
  644. DWORD dwRet = pDevcieBase->DeleteLogFile(hHandle);
  645. if (USBKEY_SUCCESS != dwRet)
  646. {
  647. printf("DeleteLogFile failed! <error code = 0x%08x>\n", dwRet);
  648. return dwRet;
  649. }
  650. //S4只能通过删除文件目录实现文件删除,但删除目录会把同目录下的Exe文件删除,故清空目录后必须重新下载该目录下的Exe文件
  651. if (S4_TIME_SENSI == g_DeviceType)
  652. {
  653. //重新下载exe
  654. FILE* fp = NULL;
  655. int nFileLen = 0;
  656. BYTE* pReadDataBuf = NULL;
  657. errno_t tErrno = fopen_s(&fp, READ_LOG_EXE_PATH, "rb");
  658. if(NULL == fp)
  659. {
  660. printf("fopen_s C:\\RVC\\UKey\\S4_readLogFile.bin failed! <error code = 0x%08x>\n", tErrno);
  661. return OPEN_EXE_FILE_ERR;
  662. }
  663. fseek(fp, 0, SEEK_END);
  664. nFileLen = ftell(fp);
  665. pReadDataBuf = new BYTE[nFileLen];
  666. if (NULL == pReadDataBuf)
  667. {
  668. return NEW_MEM_ERR;
  669. }
  670. memset(pReadDataBuf, 0, nFileLen);
  671. fseek(fp, 0, SEEK_SET);
  672. fread(pReadDataBuf,1,nFileLen,fp);
  673. fclose(fp);
  674. dwRet = pDevcieBase->WriteExeFile(hHandle, READ_LOG_FILE_EXE_ID, pReadDataBuf, nFileLen, nFileLen);
  675. if (S4_SUCCESS != dwRet)
  676. {
  677. delete pReadDataBuf;
  678. pReadDataBuf = NULL;
  679. printf("WriteExeFile 0014 failed! <error code = 0x%08x>\n", dwRet);
  680. return dwRet;
  681. }
  682. delete pReadDataBuf;
  683. pReadDataBuf = NULL;
  684. }
  685. return USBKEY_SUCCESS;
  686. }
  687. DLL_EXPORT_API DWORD GetLogFileLength(USBKEY_HANDLE hHandle, int* pFileLen)
  688. {
  689. if ((NULL == hHandle) || (NULL == pFileLen))
  690. {
  691. return INPUT_NULL_ERR;
  692. }
  693. return pDevcieBase->GetLogFileLength(hHandle, pFileLen);
  694. }
  695. DLL_EXPORT_API DWORD DownLoadExeFile(USBKEY_HANDLE hHandle, const char* pFolderPath)
  696. {
  697. if ((NULL == hHandle) || (NULL == pFolderPath))
  698. {
  699. return INPUT_NULL_ERR;
  700. }
  701. FILE* fp = NULL;
  702. int nFileLen = 0;
  703. BYTE* pReadDataBuf = NULL;
  704. //写数据文件Exe
  705. string strReadDataFilePath(pFolderPath);
  706. string strWriteDataFilePath(pFolderPath);
  707. string strWriteTDESKeytPath(pFolderPath);
  708. string strReadLogFilePath(pFolderPath);
  709. switch (g_DeviceType)
  710. {
  711. case ROCEYARM_TIME_FEITAIN:
  712. strReadDataFilePath += ROCARM_READ_DATAFILE_EXE;
  713. strWriteDataFilePath += ROCARM_WRITE_DATAFILE_EXE;
  714. strWriteTDESKeytPath += ROCARM_WRITE_TDESKEY_EXE;
  715. //return USBKEY_SUCCESS;
  716. break;
  717. case S4_TIME_SENSI:
  718. strReadDataFilePath += S4_READ_DATAFILE_EXE;
  719. strReadLogFilePath += S4_READ_LOGFILE_EXE;
  720. break;
  721. case GM3000_LONGMAI:
  722. return USBKEY_SUCCESS;
  723. break;
  724. default:
  725. return USB_KEY_TYPE_ERR;
  726. break;
  727. }
  728. errno_t tErrno = fopen_s(&fp, strReadDataFilePath.c_str(), "rb");
  729. if(NULL == fp)
  730. {
  731. return OPEN_EXE_FILE_ERR;
  732. }
  733. fseek(fp, 0, SEEK_END);
  734. nFileLen = ftell(fp);
  735. pReadDataBuf = new BYTE[nFileLen];
  736. if (NULL == pReadDataBuf)
  737. {
  738. return NEW_MEM_ERR;
  739. }
  740. memset(pReadDataBuf, 0, nFileLen);
  741. fseek(fp, 0, SEEK_SET);
  742. fread(pReadDataBuf,1,nFileLen,fp);
  743. fclose(fp);
  744. DWORD dwRet = pDevcieBase->WriteExeFile(hHandle, READ_DATA_FILE_EXE_ID, pReadDataBuf, nFileLen, nFileLen);
  745. if (USBKEY_SUCCESS != dwRet)
  746. {
  747. delete pReadDataBuf;
  748. pReadDataBuf = NULL;
  749. return dwRet;
  750. }
  751. delete pReadDataBuf;
  752. pReadDataBuf = NULL;
  753. //S4还需要下载读Log文件可执行程序
  754. if (S4_TIME_SENSI == g_DeviceType)
  755. {
  756. errno_t tErrno = fopen_s(&fp, strReadLogFilePath.c_str(), "rb");
  757. if(NULL == fp)
  758. {
  759. return OPEN_EXE_FILE_ERR;
  760. }
  761. fseek(fp, 0, SEEK_END);
  762. nFileLen = ftell(fp);
  763. pReadDataBuf = new BYTE[nFileLen];
  764. if (NULL == pReadDataBuf)
  765. {
  766. return NEW_MEM_ERR;
  767. }
  768. memset(pReadDataBuf, 0, nFileLen);
  769. fseek(fp, 0, SEEK_SET);
  770. fread(pReadDataBuf,1,nFileLen,fp);
  771. fclose(fp);
  772. DWORD dwRet = pDevcieBase->WriteExeFile(hHandle, READ_LOG_FILE_EXE_ID, pReadDataBuf, nFileLen, nFileLen);
  773. if (USBKEY_SUCCESS != dwRet)
  774. {
  775. delete pReadDataBuf;
  776. pReadDataBuf = NULL;
  777. return dwRet;
  778. }
  779. delete pReadDataBuf;
  780. pReadDataBuf = NULL;
  781. }
  782. return USBKEY_SUCCESS;
  783. }
  784. DLL_EXPORT_API DWORD DeleteAllFile(USBKEY_HANDLE hHandle)
  785. {
  786. if (NULL == hHandle)
  787. {
  788. return INPUT_NULL_ERR;
  789. }
  790. return pDevcieBase->DeleteAllFile(hHandle);
  791. }
  792. void itoh(UINT64 n,char *s)
  793. {
  794. char base[16] = {'0','1','2','3',
  795. '4','5','6','7',
  796. '8','9','A','B',
  797. 'C','D','E','F'};
  798. UINT64 a = n;
  799. int i = 0;
  800. while(a != 0)
  801. {
  802. i++;
  803. s[16-i] = base[a%16];
  804. a/=16;
  805. }
  806. if (0 == a && 16 != i)
  807. {
  808. while (i<16)
  809. {
  810. i++;
  811. s[16-i] = '0';
  812. }
  813. }
  814. }
  815. DLL_EXPORT_API DWORD EncPin(BYTE * pPin, BYTE * pEncPin)
  816. {
  817. //与HID做异或
  818. if ((NULL == pPin) ||
  819. (NULL == pEncPin))
  820. {
  821. return INPUT_NULL_ERR;
  822. }
  823. //获取锁的PID,并转换成16进制数
  824. /*USBKEY_INFO UkeyInfo;
  825. DWORD dwRet = 0;
  826. unsigned int count = 0;
  827. dwRet = FindUsbKey(&UkeyInfo, &count);
  828. if (DONGLE_SUCCESS != dwRet)
  829. {
  830. return dwRet;
  831. }*/
  832. //UINT64 lPID = 0x0806220716210A13;
  833. UINT64 lPID = 0;
  834. int nAscall = 0;
  835. string strPID = "";
  836. char cAscall[3] = {0};
  837. for (int i = 0; i < 8; i++)
  838. {
  839. nAscall = g_KeyInfo.m_HID[i];
  840. memset(cAscall, 0, 3);
  841. _itoa_s(nAscall, cAscall, 16);
  842. if (1 == strlen(cAscall))
  843. {
  844. string zero = "0";
  845. zero += cAscall;
  846. strPID += zero;
  847. }
  848. else
  849. {
  850. strPID += cAscall;
  851. }
  852. }
  853. //字符转64位16进制数
  854. sscanf_s(strPID.c_str() , "%I64x" , &lPID);
  855. char cPin[17] = {0};
  856. memcpy(cPin, pPin, 8);
  857. UINT64 nPinLen = strlen((const char*)pPin);
  858. if (PIN_LEN != nPinLen)
  859. {
  860. //PIN长度必须为8
  861. return DONGLE_INCORRECT_PIN;
  862. }
  863. //拼接8个F,组成实际PIN码
  864. memcpy(cPin+8, "FFFFFFFF", 8);
  865. //转16进制整数
  866. UINT64 lPin = 0;
  867. sscanf_s(cPin , "%I64x" , &lPin);
  868. UINT64 lEncPin = lPin ^ lPID;
  869. itoh(lEncPin, (char*)pEncPin);
  870. return DONGLE_SUCCESS;
  871. }
  872. DLL_EXPORT_API DWORD DecPin(BYTE * pEncPin, BYTE * pPin)
  873. {
  874. //与HID做异或
  875. if ((NULL == pPin) ||
  876. (NULL == pEncPin))
  877. {
  878. return INPUT_NULL_ERR;
  879. }
  880. string strPIN = (char*)pEncPin;
  881. UINT64 nPinLen = strlen((const char*)pEncPin);
  882. if (16 != nPinLen)
  883. {
  884. //加密后的PIN长度必须为16
  885. return DONGLE_INCORRECT_PIN;
  886. }
  887. //获取锁的PID,并转换成16进制数
  888. /*USBKEY_INFO UkeyInfo;
  889. DWORD dwRet = 0;
  890. unsigned int count = 0;
  891. dwRet = FindUsbKey(&UkeyInfo, &count);
  892. if (DONGLE_SUCCESS != dwRet)
  893. {
  894. return dwRet;
  895. }*/
  896. //UINT64 lPID = 0x0806220716210A13;
  897. UINT64 lPID = 0;
  898. int nAscall = 0;
  899. string strPID = "";
  900. char cAscall[3] = {0};
  901. for (int i = 0; i < 8; i++)
  902. {
  903. nAscall = g_KeyInfo.m_HID[i];
  904. memset(cAscall, 0, 3);
  905. _itoa_s(nAscall, cAscall, 16);
  906. if (1 == strlen(cAscall))
  907. {
  908. string zero = "0";
  909. zero += cAscall;
  910. strPID += zero;
  911. }
  912. else
  913. {
  914. strPID += cAscall;
  915. }
  916. }
  917. sscanf_s(strPID.c_str() , "%I64x" , &lPID);
  918. //转16进制整数
  919. UINT64 lEncPin = 0;
  920. sscanf_s((const char*)pEncPin , "%I64x" , &lEncPin );
  921. UINT64 lPin = lEncPin ^ lPID;
  922. BYTE pDecPin[17] = {0};
  923. itoh(lPin, (char*)pDecPin);
  924. memcpy(pPin, pDecPin, 8);
  925. return DONGLE_SUCCESS;
  926. }
  927. DLL_EXPORT_API DWORD GenSignedInfo(USBKEY_HANDLE hHandle, const char* pcInData, char* pcOutData)
  928. {
  929. if (NULL == hHandle || NULL == pcInData)
  930. {
  931. return INPUT_NULL_ERR;
  932. }
  933. DWORD dwRet = 0;
  934. int nInDataLen = 0;
  935. int nOutDataLen = 0;
  936. BYTE inBuf[128] = {0};
  937. BYTE outBuf[128] = {0};
  938. nInDataLen = strlen(pcInData);
  939. if (nInDataLen > 117)
  940. {
  941. //加密数据长度不能大于私钥长度/8 - 11
  942. return -1;
  943. }
  944. memcpy(inBuf, pcInData, nInDataLen);
  945. //RSA私钥加密
  946. nOutDataLen = 128;
  947. dwRet = Dongle_RsaPri(hHandle, PRIVATE_KEY_ID, FLAG_ENCODE, inBuf, nInDataLen, outBuf, &nOutDataLen);
  948. if (DONGLE_SUCCESS != dwRet)
  949. {
  950. return dwRet;
  951. printf("RSA private key encode. Return: 0x%08X\n", dwRet);
  952. }
  953. memcpy(pcOutData, outBuf, nOutDataLen);
  954. return DONGLE_SUCCESS;
  955. }
  956. DLL_EXPORT_API DWORD ProtocolSwitch(USBKEY_HANDLE hHandle, int nFlag)
  957. {
  958. if (NULL == hHandle)
  959. {
  960. return INPUT_NULL_ERR;
  961. }
  962. return pDevcieBase->ProtocolSwitch(hHandle, nFlag);
  963. }
  964. DLL_EXPORT_API DWORD GetHIDFromUKey(char *strHID)
  965. {
  966. if (NULL == strHID)
  967. {
  968. return INPUT_NULL_ERR;
  969. }
  970. return pDevcieBase->GetHIDFromUKey(strHID);
  971. }