hunca_mToken_core.js 41 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405
  1. /**
  2. * @name mTokenPlugin集成代码
  3. * @author Akay
  4. * @version 0.7.10
  5. * @date 2020.04.04
  6. *
  7. * @description
  8. * ver 0.7.10 2020.04.04
  9. * 1. 新增获取设备序号
  10. * 2. 支持多Key
  11. *
  12. * ver 0.7.9 2020.01.08
  13. * 1. 支持SJK1137型号
  14. *
  15. * ver 0.7.8 2019.10.23
  16. * 1. 新增UKey适配
  17. *
  18. * ver 0.7.4 2019.09.18
  19. * 1. 新增证书生效,失效时间
  20. *
  21. * ver 0.7.3 2019.08.19
  22. * 1. 获取证书使用者信息
  23. *
  24. * ver 0.7.2 2019.08.08
  25. * 1. 新增远程解锁接口
  26. *
  27. * ver 0.7.1 2019.07.17
  28. * TODO: 未安装组件时,判断组件是否安装(暂定,未解决)
  29. *
  30. * ver 0.7.0 2019.07.04
  31. * 1. 更新核心文件,解决多Key插入问题
  32. * 2. Ukey目前仅支持国密证书
  33. *
  34. * ver 0.6.3 2019.06.24
  35. * 1. 修复部分Bug
  36. *
  37. * ver 0.6.1 2019.06.24
  38. * 1. 支持数字信封数据解密接口
  39. * 2. 修复加密接口错误部分。
  40. *
  41. * ver 0.6.0 2019.06.20
  42. * 1. 支持数字信封数据加密接口
  43. * 2. 暂不支持多Ukey
  44. *
  45. * ver 0.5.1 2019.06.19
  46. * 1. 修正新Ukey引入导致的Bug
  47. *
  48. * ver 0.5 2019.06.18
  49. * 1. 适配SJK1137型号Ukey
  50. *
  51. * ver 0.4 2019.03.16
  52. * 1. 新增方法 枚举Ukey获取证书“G项信息”列表
  53. * 2. 新增方法 将“证书G项信息”转化为“证书名称”方法
  54. *
  55. * ver 0.3 2018.12.10
  56. * 1. 新增修改Ukey密码的方法
  57. *
  58. * ver 0.2 2018.09.26
  59. * 1. 新增获取签名证书SN号的方法
  60. * 2. 修正部分Bug
  61. *
  62. * ver 0.1 2018.09.21
  63. * 1. 搭建初步框架
  64. * 2. 完成签名功能
  65. *
  66. */
  67. function hunca_mToken_core() {
  68. var token = new mToken("mTokenPlugin");
  69. var certInfoList = null;
  70. var singleKey = 0;
  71. var libraryNameList = Array("GM3000");
  72. /**
  73. * 错误信息
  74. */
  75. var LAST_ERRORSTRING = "";
  76. /**
  77. * 证书用途
  78. */
  79. var KEY_SPEC_TYPE_ENCRYPT = 0;
  80. var KEY_SPEC_TYPE_SIGN = 1;
  81. /**
  82. * 摘要算法
  83. */
  84. var SGD_SM3 = 1;
  85. var SGD_SHA1 = 2;
  86. /**
  87. * 加密算法
  88. */
  89. //分组加密算法标识
  90. var SGD_SM1_ECB = 0x00000101;
  91. var SGD_SM1_CBC = 0x00000102;
  92. var SGD_SM1_CFB = 0x00000104;
  93. var SGD_SM1_OFB = 0x00000108;
  94. var SGD_SM1_MAC = 0x00000110;
  95. var SGD_SM4_ECB = 0x00000401;
  96. var SGD_SM4_CBC = 0x00000402;
  97. var SGD_SM4_CFB = 0x00000404;
  98. var SGD_SM4_OFB = 0x00000408;
  99. var SGD_SM4_MAC = 0x00000410;
  100. /**
  101. * 用户ID(固定)
  102. */
  103. var USER_ID = "1234567812345678";
  104. /**
  105. * 错误信息提示列表
  106. */
  107. var ERROR_MESSAGE_NOT_LOADLIBRARY = "控件加载失败,错误码:";
  108. var ERROR_MESSAGE_NOT_FIND_UKEY = "未找到UKey!\n1.请确认是否安装最新驱动!\n2.计算机是否插入CA UKey!";
  109. var ERROR_MSSSAGE_FIND_MORE_UKEY = "计算机插入多个UKey,请拔除多余“CA UKey”!";
  110. var ERROR_MESSAGE_NOT_INSTANCE_DEVICE = "USBKey实例化失败,请确认此UKey是否插入计算机!\n点击‘刷新’按钮,更新设备列表。\n错误码:";
  111. var ERROR_MESSAGE_USERPIN_LENGTH = "Ukey密码必须为4~16位!";
  112. var ERROR_MESSAGE_USERPIN_IS_ERROR = "UKey密码错误";
  113. var ERROR_MESSAGE_USERPIN_CHANGE_ERROR = "UKey密码修改失败";
  114. var ERROR_MESSAGE_KEY_NOT_EXIT = "UKey不存在,请确认此UKey是否插入计算机,并点击'刷新'按钮,更新设备列表!";
  115. var ERROR_MESSAGE_USERNAME_IS_NULL = "请点击‘刷新’按钮,更新设备列表并选择相应设备!";
  116. var ERROR_MESSAGE_KEY_EXPORT_CERT = "证书获取失败,请加检测Key中是否存在证书!";
  117. var ERROR_MESSAGE_SET_DIGEST_METHOD_ERROR = "设置摘要算法失败,请重新刷新浏览器!";
  118. var ERROR_MESSAGE_SET_USERID_ERROR = "设置用户ID失败,请重新刷新浏览器";
  119. var ERROR_MESSAGE_SIGN_ORIGINALDATA_IS_NULL = "签名失败,待签名原文不能为空";
  120. var ERROR_MESSAGE_SIGN_ERROR = "签名失败,返回错误码:";
  121. var ERROR_MESSAGE_USERNAMEGN_IS_NULL = "请点击‘刷新’按钮,更新设备列表并选择相应设备!";
  122. var ERROR_MESSAGE_USERNAMEGN_TO_USERNAME_ERROR = "证书G项信息转化证书名称失败,请点击“刷新”按钮!";
  123. var ERROR_MESSAGE_KEY_LIBRAY = "加载国密库失败!";
  124. var ERROR_MESSAGE_ENCRYPT_DATA_IS_NULL = "加密失败:待加密原文不能为空!";
  125. var ERROR_MESSAGE_DECRYPT_DATA_IS_NULL = "解密失败:待解密密文不能为空!";
  126. var ERROR_MESSAGE_DECRYPT_DATA_IS_ERROR = "解密失败:请确认密文是否完整!\n解密所采用的Ukey是否为加密时的Ukey!";
  127. var ERROR_MESSAGE_GET_REMOTEUNLOCKREQUEST_FAIL = "申请解锁请求失败!";
  128. var ERROR_MESSAGE_GET_REMOTEUNLOCKREQUEST_NOT_SUPPORT = "此型号Ukey不支持解锁!";
  129. var ERROR_MESSAGE_REMOTE_UNLOCK_FAIL = "Ukey解锁失败!";
  130. /**
  131. * 私有变量
  132. */
  133. var tokenInfoList = null;
  134. /**
  135. * 私有变量
  136. */
  137. var signResultSignData = null;
  138. var signResultCert = null;
  139. /**
  140. * 证书信息
  141. */
  142. var certSn = null; //证书Sn
  143. var cert_subject_GN = null; //证书Gn
  144. var cert_subject = null; //证书使用者
  145. var cert_validTime = null; //证书失效时间
  146. var cert_notbeforetime = null; //证书生效时间
  147. /**
  148. * 返回错误信息
  149. */
  150. this.Hunca_GetLastError = function () {
  151. return LAST_ERRORSTRING;
  152. }
  153. /**
  154. * 获取证书列表
  155. */
  156. this.Hunca_GetUserList = function () {
  157. var deviceArray = null;
  158. var containerName = null;
  159. var userName = null;
  160. var tmpInfo = null;
  161. signResultCert = null;
  162. signResultSignData = null;
  163. tokenInfoList = new Array(); //清空信息
  164. for (var index = 0; index < libraryNameList.length; index++) {
  165. libraryName = libraryNameList[index];
  166. if (!SOF_LoadLibrary(libraryName)) {
  167. continue;
  168. }
  169. deviceArray = SOF_EnumDevice();
  170. if (null == deviceArray) {
  171. continue;
  172. }
  173. for (var i = 0; i < deviceArray.length; i++) {
  174. var tokenInfo = new Object();
  175. //实例化设备失败
  176. if (!SOF_GetDeviceInstance(deviceArray[i])) {
  177. break;
  178. }
  179. //获取设备信息
  180. tmpInfo = SOF_GetUserList();
  181. if (null != tmpInfo || tmpInfo.length != 0) {
  182. containerName = tmpInfo[0][1];
  183. userName = tmpInfo[0][0];
  184. tokenInfo.libraryName = libraryName; //Ukey型号
  185. tokenInfo.serial = deviceArray[i]; //设备序列号
  186. tokenInfo.userName = userName; //证书名称
  187. tokenInfo.containerName = containerName; //应用名称
  188. tokenInfoList.push(tokenInfo);
  189. } else {
  190. continue;
  191. }
  192. SOF_LogOut();
  193. }
  194. }
  195. //返回证书信息
  196. var userNameList = new Array();
  197. for (var i = 0; i < tokenInfoList.length; i++) {
  198. userNameList[i] = tokenInfoList[i].userName;
  199. }
  200. if (userNameList.length == 0) {
  201. LAST_ERRORSTRING = ERROR_MESSAGE_NOT_FIND_UKEY;
  202. return "";
  203. }
  204. return userNameList;
  205. }
  206. /**
  207. * 获取证书G项信息列表
  208. */
  209. this.Hunca_GetUserListGN = function () {
  210. var deviceArray = null;
  211. var containerName = null;
  212. var userName = null;
  213. var tmpInfo = null;
  214. var certB64 = null;
  215. var deviceSerial = "";
  216. signResultCert = null;
  217. signResultSignData = null;
  218. tokenInfoList = new Array(); //清空信息
  219. LAST_ERRORSTRING = "";
  220. for (var index = 0; index < libraryNameList.length; index++) {
  221. libraryName = libraryNameList[index];
  222. //加载控件
  223. if (!SOF_LoadLibrary(libraryName)) {
  224. continue;
  225. }
  226. deviceArray = SOF_EnumDevice();
  227. if (null == deviceArray) {
  228. continue;
  229. }
  230. for (var i = 0; i < deviceArray.length; i++) {
  231. cert_subject_GN = null;
  232. certSn = null;
  233. deviceSerial = deviceArray[i];
  234. var tokenInfo = new Object();
  235. //实例化设备失败
  236. if (!SOF_GetDeviceInstance(deviceSerial)) {
  237. break;
  238. }
  239. //获取设备信息
  240. tmpInfo = SOF_GetUserList();
  241. if (null != tmpInfo || tmpInfo.length != 0) {
  242. containerName = tmpInfo[0][1];
  243. userName = tmpInfo[0][0];
  244. tokenInfo.libraryName = libraryName;
  245. tokenInfo.serial = deviceArray[i]; //设备序列号
  246. tokenInfo.userName = userName; //证书名称
  247. tokenInfo.containerName = containerName;
  248. } else {
  249. continue;
  250. }
  251. //获取证书G项信息
  252. certB64 = SOF_ExportUserCert(tokenInfo.containerName, KEY_SPEC_TYPE_SIGN);
  253. if (SOF_GetCertInfo(certB64)) {
  254. tokenInfo.subjectGN = cert_subject_GN; //设备证书G项目;
  255. } else {
  256. continue;
  257. }
  258. tokenInfoList.push(tokenInfo);
  259. SOF_LogOut();
  260. }
  261. }
  262. //返回证书G项信息
  263. var userNameGNList = new Array();
  264. for (var i = 0; i < tokenInfoList.length; i++) {
  265. userNameGNList[i] = tokenInfoList[i].subjectGN;
  266. }
  267. if (userNameGNList.length == 0) {
  268. LAST_ERRORSTRING = ERROR_MESSAGE_NOT_FIND_UKEY;
  269. return "";
  270. }
  271. /*****
  272. if (userNameGNList.length > 1){
  273. LAST_ERRORSTRING = ERROR_MSSSAGE_FIND_MORE_UKEY;
  274. return "";
  275. }
  276. ****/
  277. return userNameGNList;
  278. }
  279. /**
  280. * 将证书G项信息转化为证书名称
  281. */
  282. this.Hunca_userNameGNToUserName = function (userNameGN) {
  283. var userName = null;
  284. LAST_ERRORSTRING = "";
  285. if (null == userNameGN || userNameGN.length == 0) {
  286. LAST_ERRORSTRING = ERROR_MESSAGE_USERNAMEGN_IS_NULL;
  287. }
  288. for (var i = 0; i < tokenInfoList.length; i++) {
  289. if (userNameGN == tokenInfoList[i].subjectGN) {
  290. userName = tokenInfoList[i].userName;
  291. break;
  292. }
  293. }
  294. if (null == userName || userName.length == 0) {
  295. LAST_ERRORSTRING = ERROR_MESSAGE_USERNAMEGN_TO_USERNAME_ERROR;
  296. return null;
  297. }
  298. return userName;
  299. }
  300. this.Hunca_GenRemoteUnblockRequest = function (userName) {
  301. var tokenInfo = null; //Ukey设备信息
  302. var tempTokenInfo = null; //临时设备信息,循环遍历用
  303. var request = "";
  304. LAST_ERRORSTRING = "";
  305. //设备名称为空
  306. if (null == userName || userName.length == null) {
  307. LAST_ERRORSTRING = ERROR_MESSAGE_USERNAME_IS_NULL;
  308. return false;
  309. }
  310. //查找匹配的设备序列号
  311. if (null == tokenInfoList || tokenInfoList.length == 0) {
  312. LAST_ERRORSTRING = ERROR_MESSAGE_NOT_FIND_UKEY;
  313. return false;
  314. }
  315. //索引设备编号
  316. for (var i = 0; i < tokenInfoList.length; i++) {
  317. tempTokenInfo = tokenInfoList[i];
  318. if (tempTokenInfo.userName == userName) {
  319. tokenInfo = tempTokenInfo;
  320. break;
  321. }
  322. }
  323. //如果所选择的设备不存在
  324. if (null == tokenInfo) {
  325. LAST_ERRORSTRING = ERROR_MESSAGE_KEY_NOT_EXIT;
  326. return false;
  327. }
  328. //判断设备是否支持远程解锁
  329. if (tokenInfo.libraryName != "GM3000") {
  330. LAST_ERRORSTRING = ERROR_MESSAGE_GET_REMOTEUNLOCKREQUEST_NOT_SUPPORT;
  331. return false;
  332. }
  333. //加载库文件
  334. if (!SOF_LoadLibrary(tokenInfo.libraryName)) {
  335. LAST_ERRORSTRING = ERROR_MESSAGE_KEY_LIBRAY;
  336. return false;
  337. }
  338. //实例化设备
  339. if (!SOF_GetDeviceInstance(tokenInfo.serial)) {
  340. return false;
  341. }
  342. //枚举容器,并选择第一个容器
  343. if (SOF_GetUserList() == null) {
  344. return false;
  345. }
  346. //远程解锁
  347. request = SOF_GenRemoteUnblockRequest()
  348. return request;
  349. }
  350. this.HUnca_GetDeviceNumber = function(userName){
  351. var m_devNumber = null;
  352. //设备名称为空
  353. if (null == userName || userName.length == null) {
  354. LAST_ERRORSTRING = ERROR_MESSAGE_USERNAME_IS_NULL;
  355. return false;
  356. }
  357. //查找匹配的设备序列号
  358. if (null == tokenInfoList || tokenInfoList.length == 0) {
  359. LAST_ERRORSTRING = ERROR_MESSAGE_NOT_FIND_UKEY;
  360. return false;
  361. }
  362. //索引设备编号
  363. for (var i = 0; i < tokenInfoList.length; i++) {
  364. tempTokenInfo = tokenInfoList[i];
  365. if (tempTokenInfo.userName == userName) {
  366. tokenInfo = tempTokenInfo;
  367. break;
  368. }
  369. }
  370. //如果所选择的设备不存在
  371. if (null == tokenInfo) {
  372. LAST_ERRORSTRING = ERROR_MESSAGE_KEY_NOT_EXIT;
  373. return false;
  374. }
  375. //加载库文件
  376. if (!SOF_LoadLibrary(tokenInfo.libraryName)) {
  377. LAST_ERRORSTRING = ERROR_MESSAGE_KEY_LIBRAY;
  378. return false;
  379. }
  380. //实例化设备
  381. if (!SOF_GetDeviceInstance(tokenInfo.serial)) {
  382. return false;
  383. }
  384. m_devNumber =SOF_GetDeviceNumber();
  385. return m_devNumber + "";
  386. }
  387. this.Hunca_RemoteUnlockPIN = function (userName, response) {
  388. var tokenInfo = null; //Ukey设备信息
  389. var tempTokenInfo = null; //临时设备信息,循环遍历用
  390. var result = false;
  391. LAST_ERRORSTRING = "";
  392. //设备名称为空
  393. if (null == userName || userName.length == null) {
  394. LAST_ERRORSTRING = ERROR_MESSAGE_USERNAME_IS_NULL;
  395. return false;
  396. }
  397. //查找匹配的设备序列号
  398. if (null == tokenInfoList || tokenInfoList.length == 0) {
  399. LAST_ERRORSTRING = ERROR_MESSAGE_NOT_FIND_UKEY;
  400. return false;
  401. }
  402. //索引设备编号
  403. for (var i = 0; i < tokenInfoList.length; i++) {
  404. tempTokenInfo = tokenInfoList[i];
  405. if (tempTokenInfo.userName == userName) {
  406. tokenInfo = tempTokenInfo;
  407. break;
  408. }
  409. }
  410. //如果所选择的设备不存在
  411. if (null == tokenInfo) {
  412. LAST_ERRORSTRING = ERROR_MESSAGE_KEY_NOT_EXIT;
  413. return false;
  414. }
  415. //判断设备是否支持远程解锁
  416. if (tokenInfo.libraryName != "GM3000") {
  417. LAST_ERRORSTRING = ERROR_MESSAGE_GET_REMOTEUNLOCKREQUEST_NOT_SUPPORT;
  418. return false;
  419. }
  420. //加载库文件
  421. if (!SOF_LoadLibrary(tokenInfo.libraryName)) {
  422. LAST_ERRORSTRING = ERROR_MESSAGE_KEY_LIBRAY;
  423. return false;
  424. }
  425. //实例化设备
  426. if (!SOF_GetDeviceInstance(tokenInfo.serial)) {
  427. return false;
  428. }
  429. //枚举容器,并选择第一个容器
  430. if (SOF_GetUserList() == null) {
  431. return false;
  432. }
  433. //远程解锁
  434. result = SOF_RemoteUnlockPIN(response)
  435. return result;
  436. }
  437. /**
  438. * 修改Ukey密码
  439. */
  440. this.Hunca_ChangeUserPin = function (userName, oldUserPin, newUserPin) {
  441. var tokenInfo = null; //Ukey设备信息
  442. var tempTokenInfo = null; //临时设备信息,循环遍历用
  443. LAST_ERRORSTRING = "";
  444. //设备名称为空
  445. if (null == userName || userName.length == null) {
  446. LAST_ERRORSTRING = ERROR_MESSAGE_USERNAME_IS_NULL;
  447. return false;
  448. }
  449. //查找匹配的设备序列号
  450. if (null == tokenInfoList || tokenInfoList.length == 0) {
  451. LAST_ERRORSTRING = ERROR_MESSAGE_NOT_FIND_UKEY;
  452. return false;
  453. }
  454. //索引设备编号
  455. for (var i = 0; i < tokenInfoList.length; i++) {
  456. tempTokenInfo = tokenInfoList[i];
  457. if (tempTokenInfo.userName == userName) {
  458. tokenInfo = tempTokenInfo;
  459. break;
  460. }
  461. }
  462. //如果所选择的设备不存在
  463. if (null == tokenInfo) {
  464. LAST_ERRORSTRING = ERROR_MESSAGE_KEY_NOT_EXIT;
  465. return false;
  466. }
  467. //加载库文件
  468. if (!SOF_LoadLibrary(tokenInfo.libraryName)) {
  469. LAST_ERRORSTRING = ERROR_MESSAGE_KEY_LIBRAY;
  470. }
  471. //实例化设备
  472. if (!SOF_GetDeviceInstance(tokenInfo.serial)) {
  473. return false;
  474. }
  475. //修改密码
  476. if (!SOF_ChangeUserPin(oldUserPin, newUserPin)) {
  477. return false;
  478. }
  479. SOF_LogOut();
  480. return true;
  481. }
  482. /**
  483. * 对数据进行签名,并返回签名是否成功
  484. * @param {string} originalData 待签名原文
  485. * @param {string} userName Ukey用户名称
  486. * @param {string} userPin Ukey密码
  487. */
  488. this.Hunca_PKCS1 = function (originalData, userName, userPin) {
  489. var libraryName = null;
  490. var tokenInfo = null; //Ukey设备信息
  491. var tempTokenInfo = null; //临时设备信息,循环遍历用
  492. var certBase64 = null; //签名证书值
  493. LAST_ERRORSTRING = "";
  494. signResultInfo = null;
  495. certInfo = new Object();
  496. //设备名称为空
  497. if (null == userName || userName.length == null) {
  498. LAST_ERRORSTRING = ERROR_MESSAGE_USERNAME_IS_NULL;
  499. return false;
  500. }
  501. //查找匹配的设备序列号
  502. if (null == tokenInfoList || tokenInfoList.length == 0) {
  503. LAST_ERRORSTRING = ERROR_MESSAGE_NOT_FIND_UKEY;
  504. return false;
  505. }
  506. //索引设备编号
  507. for (var i = 0; i < tokenInfoList.length; i++) {
  508. tempTokenInfo = tokenInfoList[i];
  509. if (tempTokenInfo.userName == userName) {
  510. tokenInfo = tempTokenInfo;
  511. break;
  512. }
  513. }
  514. //如果所选择的设备不存在
  515. if (null == tokenInfo) {
  516. LAST_ERRORSTRING = ERROR_MESSAGE_KEY_NOT_EXIT;
  517. return false;
  518. }
  519. //加载库文件
  520. if (!SOF_LoadLibrary(tokenInfo.libraryName)) {
  521. LAST_ERRORSTRING = ERROR_MESSAGE_KEY_LIBRAY;
  522. }
  523. //实例化设备
  524. if (!SOF_GetDeviceInstance(tokenInfo.serial)) {
  525. return false;
  526. }
  527. //登陆应用
  528. if (!SOF_Login(userPin)) {
  529. return false;
  530. }
  531. //获取签名证书Base64
  532. certBase64 = SOF_ExportUserCert(tokenInfo.containerName, KEY_SPEC_TYPE_SIGN);
  533. if (null == certBase64) {
  534. return false;
  535. }
  536. //设置摘要算法
  537. if (!SOF_SetDigestMethod(SGD_SM3)) {
  538. return false;
  539. }
  540. if (!SOF_SetUserID()) {
  541. return false;
  542. }
  543. //进行签名
  544. if (!SOF_SignData(tokenInfo.containerName, SGD_SM3, originalData, certBase64)) {
  545. return false;
  546. }
  547. //获取证书信息
  548. if (!SOF_GetCertInfo(certBase64)) {
  549. return false;
  550. }
  551. SOF_LogOut();
  552. return true;
  553. }
  554. /**
  555. * 获取签名结果
  556. */
  557. this.Hunca_GetSignData = function () {
  558. return signResultSignData;
  559. }
  560. /**
  561. * 获取签名证书
  562. */
  563. this.Hunca_GetSignCert = function () {
  564. return signResultCert;
  565. }
  566. this.Hunca_GetSignCertSn = function () {
  567. return certSn
  568. }
  569. this.Hunca_GetSignCertSubject = function (){
  570. return cert_subject;
  571. }
  572. this.Hunca_GetValidTime = function(){
  573. return cert_validTime;
  574. }
  575. this.HUnca_GetNotBeforeTime = function(){
  576. return cert_notbeforetime;
  577. }
  578. /**
  579. * 处理设备中签名证书信息
  580. * @param {*} userName
  581. */
  582. this.Hunca_DealCertInfo = function (userName) {
  583. var tokenInfo = null; //Ukey设备信息
  584. var tempTokenInfo = null; //临时设备信息,循环遍历用
  585. var certBase64 = null; //签名证书值
  586. LAST_ERRORSTRING = "";
  587. signResultInfo = null;
  588. certInfo = new Object();
  589. //设备名称为空
  590. if (null == userName || userName.length == null) {
  591. LAST_ERRORSTRING = ERROR_MESSAGE_USERNAME_IS_NULL;
  592. return false;
  593. }
  594. //查找匹配的设备序列号
  595. if (null == tokenInfoList || tokenInfoList.length == 0) {
  596. LAST_ERRORSTRING = ERROR_MESSAGE_NOT_FIND_UKEY;
  597. return false;
  598. }
  599. //索引设备编号
  600. for (var i = 0; i < tokenInfoList.length; i++) {
  601. tempTokenInfo = tokenInfoList[i];
  602. if (tempTokenInfo.userName == userName) {
  603. tokenInfo = tempTokenInfo;
  604. break;
  605. }
  606. }
  607. //如果所选择的设备不存在
  608. if (null == tokenInfo) {
  609. LAST_ERRORSTRING = ERROR_MESSAGE_KEY_NOT_EXIT;
  610. return false;
  611. }
  612. if (!SOF_LoadLibrary(tokenInfo.libraryName)) {
  613. LAST_ERRORSTRING = ERROR_MESSAGE_KEY_LIBRAY;
  614. return false;
  615. }
  616. //实例化设备
  617. if (!SOF_GetDeviceInstance(tokenInfo.serial)) {
  618. return false;
  619. }
  620. //导出证书
  621. certBase64 = SOF_ExportUserCert(tokenInfo.containerName, KEY_SPEC_TYPE_SIGN);
  622. if (null == certBase64 || certBase64.length == 0) {
  623. return false;
  624. }
  625. SOF_GetCertInfo(certBase64);
  626. SOF_LogOut();
  627. return true;
  628. }
  629. /**
  630. * 对数据进行数字信封加密
  631. * @param {string} inData 待加密原文
  632. * @param {string} userName Ukey用户名称
  633. * @param {string} EncryptMethod 对称加密方式
  634. * @param {string} EncryptIV 加密IV值
  635. * @returns {string} "",加密失败;非空,加密成功
  636. */
  637. this.Hunca_EncryptDataPKCS7 = function (inData, userName, EncryptMethod, EncryptIV) {
  638. var tokenInfo = null; //Ukey设备信息
  639. var tempTokenInfo = null; //临时设备信息,循环遍历用
  640. var certBase64 = null; //签名证书值
  641. var m_EncryptMethod = "",
  642. m_EncryptIV = "";
  643. LAST_ERRORSTRING = "";
  644. signResultInfo = null;
  645. certInfo = new Object();
  646. //设备名称为空
  647. if (null == userName || userName.length == null) {
  648. LAST_ERRORSTRING = ERROR_MESSAGE_USERNAME_IS_NULL;
  649. return "";
  650. }
  651. //查找匹配的设备序列号
  652. if (null == tokenInfoList || tokenInfoList.length == 0) {
  653. LAST_ERRORSTRING = ERROR_MESSAGE_NOT_FIND_UKEY;
  654. return "";
  655. }
  656. //索引设备编号
  657. for (var i = 0; i < tokenInfoList.length; i++) {
  658. tempTokenInfo = tokenInfoList[i];
  659. if (tempTokenInfo.userName == userName) {
  660. tokenInfo = tempTokenInfo;
  661. break;
  662. }
  663. }
  664. //如果所选择的设备不存在
  665. if (null == tokenInfo) {
  666. LAST_ERRORSTRING = ERROR_MESSAGE_KEY_NOT_EXIT;
  667. return "";
  668. }
  669. //加载链接库
  670. if (!SOF_LoadLibrary(tokenInfo.libraryName)) {
  671. LAST_ERRORSTRING = ERROR_MESSAGE_KEY_LIBRAY;
  672. return "";
  673. }
  674. //实例化设备
  675. if (!SOF_GetDeviceInstance(tokenInfo.serial)) {
  676. return "";
  677. }
  678. //导出加密证书
  679. certBase64 = SOF_ExportUserCert(tokenInfo.containerName, KEY_SPEC_TYPE_ENCRYPT);
  680. if (null == certBase64 || certBase64.length == 0) {
  681. return "";
  682. }
  683. //设置加密方式
  684. m_EncryptMethod = EncryptMethod + "";
  685. m_EncryptIV = EncryptIV + "";
  686. if (m_EncryptMethod == null || m_EncryptMethod.length == 0) {
  687. m_EncryptMethod = SGD_SM4_ECB;
  688. m_EncryptIV = "";
  689. }
  690. if (!SOF_SetEncryptMethodAndIV(m_EncryptMethod, m_EncryptIV)) {
  691. return "";
  692. }
  693. //对数据进行加密
  694. encryptData = SOF_EncryptDataPKCS7(certBase64, inData);
  695. SOF_LogOut();
  696. return encryptData;
  697. }
  698. /**
  699. * 对密文进行数字信封解密操作
  700. * @param {string} encryptData 待解密密文
  701. * @param {string} userName Ukey用户名称
  702. * @param {string} userPin Ukey用户PIN码
  703. * @param {string} EncryptMethod 对称加密方式
  704. * @param {string} EncryptIV 加密IV值
  705. * @returns {string} "",加密失败;非空,加密成功
  706. */
  707. this.Hunca_DecryptDataPKCS7 = function (encryptData, userName, userPin, EncryptMethod, EncryptIV) {
  708. var tokenInfo = null; //Ukey设备信息
  709. var tempTokenInfo = null; //临时设备信息,循环遍历用
  710. var m_EncryptMethod = "",
  711. m_EncryptIV = "";
  712. var m_EncryptData = "";
  713. var m_DecryptData = "";
  714. var resData = "";
  715. LAST_ERRORSTRING = "";
  716. signResultInfo = null;
  717. certInfo = new Object();
  718. m_EncryptData = "" + encryptData;
  719. //设备名称为空
  720. if (null == userName || userName.length == null) {
  721. LAST_ERRORSTRING = ERROR_MESSAGE_USERNAME_IS_NULL;
  722. return "";
  723. }
  724. //查找匹配的设备序列号
  725. if (null == tokenInfoList || tokenInfoList.length == 0) {
  726. LAST_ERRORSTRING = ERROR_MESSAGE_NOT_FIND_UKEY;
  727. return "";
  728. }
  729. //索引设备编号
  730. for (var i = 0; i < tokenInfoList.length; i++) {
  731. tempTokenInfo = tokenInfoList[i];
  732. if (tempTokenInfo.userName == userName) {
  733. tokenInfo = tempTokenInfo;
  734. break;
  735. }
  736. }
  737. //如果所选择的设备不存在
  738. if (null == tokenInfo) {
  739. LAST_ERRORSTRING = ERROR_MESSAGE_KEY_NOT_EXIT;
  740. return "";
  741. }
  742. //加载链接库
  743. if (!SOF_LoadLibrary(tokenInfo.libraryName)) {
  744. LAST_ERRORSTRING = ERROR_MESSAGE_KEY_LIBRAY;
  745. return "";
  746. }
  747. //实例化设备
  748. if (!SOF_GetDeviceInstance(tokenInfo.serial)) {
  749. return "";
  750. }
  751. //登陆应用
  752. if (!SOF_Login(userPin)) {
  753. return "";
  754. }
  755. //设置加密方式
  756. m_EncryptMethod = EncryptMethod + "";
  757. m_EncryptIV = EncryptIV + "";
  758. if (m_EncryptMethod == null || m_EncryptMethod.length == 0) {
  759. m_EncryptMethod = SGD_SM4_ECB;
  760. m_EncryptIV = "";
  761. }
  762. if (!SOF_SetEncryptMethodAndIV(m_EncryptMethod, m_EncryptIV)) {
  763. return "";
  764. }
  765. m_DecryptData = SOF_DecryptDataPKCS7(tokenInfo.containerName, KEY_SPEC_TYPE_ENCRYPT, m_EncryptData);
  766. if (m_DecryptData.length == 0) {
  767. return "";
  768. }
  769. try {
  770. resData = _Base64decode(m_DecryptData);
  771. } catch (e) {
  772. resData = m_DecryptData;
  773. LAST_ERRORSTRING = "解密失败:Base64解码失败";
  774. }
  775. return resData;
  776. }
  777. /**
  778. * 加载底层文件
  779. * @returns {boolean} true,加载成功;false加载失败;
  780. */
  781. function SOF_LoadLibrary(libraryName) {
  782. var resultCode = 0;
  783. if (libraryName == "GM3000") {
  784. resultCode = token.SOF_LoadLibrary(token.GM3000);
  785. } else if (libraryName == "GM3000_HUNCA"){
  786. resultCode = token.SOF_LoadLibrary(token.GM3000_HUNCA);
  787. }
  788. else if (libraryName == "HT"){
  789. resultCode = token.SOF_LoadLibrary(token.HT);
  790. }
  791. else if (libraryName == "SJK1137") {
  792. resultCode = token.SOF_LoadLibrary(token.SJK1137);
  793. }
  794. if (resultCode != 0) {
  795. LAST_ERRORSTRING = ERROR_MESSAGE_NOT_LOADLIBRARY + token.SOF_GetLastError();
  796. return false;
  797. }
  798. return true;
  799. }
  800. /**
  801. * 枚举设备
  802. */
  803. function SOF_EnumDevice() {
  804. var deviceNameList = "";
  805. deviceNameList = token.SOF_EnumDevice();
  806. //检测是否插入USBKey
  807. if (null == deviceNameList || deviceNameList.length == 0) {
  808. LAST_ERRORSTRING = ERROR_MESSAGE_NOT_FIND_UKEY;
  809. return null;
  810. }
  811. return deviceNameList;
  812. }
  813. /**
  814. * 实例化设备,为后续一系列操作准备
  815. * @param {string} deviceName 设备名称
  816. */
  817. function SOF_GetDeviceInstance(deviceName) {
  818. var resultCode = 0;
  819. resultCode = token.SOF_GetDeviceInstance(deviceName, "");
  820. //设备未正常实例化
  821. if (resultCode != 0) {
  822. LAST_ERRORSTRING = ERROR_MESSAGE_NOT_INSTANCE_DEVICE + token.SOF_GetLastError();
  823. return false;
  824. }
  825. return true;
  826. }
  827. /**
  828. * 枚举应用中的容器
  829. */
  830. function SOF_GetUserList() {
  831. var userList = "";
  832. userList = token.SOF_GetUserList();
  833. if (null == userList || userList.length == 0) {
  834. LAST_ERRORSTRING = "USBkey中未找到证书!";
  835. return null;
  836. }
  837. return userList;
  838. }
  839. /**
  840. * 登陆应用,验证密码是否正确
  841. * @param {string} userPin
  842. */
  843. function SOF_Login(userPin) {
  844. var resultCode = 0;
  845. var m_userPin = "" + userPin;
  846. var RetryCount = 0;
  847. if (null == m_userPin || m_userPin.length == 0) {
  848. LAST_ERRORSTRING = ERROR_MESSAGE_USERPIN_LENGTH;
  849. return false;
  850. }
  851. if (m_userPin.length < 4 || m_userPin.length > 16) {
  852. LAST_ERRORSTRING = ERROR_MESSAGE_USERPIN_LENGTH;
  853. return false;
  854. }
  855. resultCode = token.SOF_Login(m_userPin);
  856. if (resultCode != 0) {
  857. RetryCount = SOF_GetPinRetryCount();
  858. if (RetryCount > 0) {
  859. LAST_ERRORSTRING = ERROR_MESSAGE_USERPIN_IS_ERROR + ",还剩 " + RetryCount + " 次重试机会!";
  860. } else {
  861. LAST_ERRORSTRING = "UKey已经锁死,请联系管理员进行解锁!"
  862. }
  863. return false;
  864. }
  865. return true
  866. }
  867. /**
  868. * 修改UKey密码
  869. * @param {*} oldUserPin
  870. * @param {*} newUserPin
  871. */
  872. function SOF_ChangeUserPin(oldUserPin, newUserPin) {
  873. var resultCode = 0;
  874. var m_oldUserPin = "" + oldUserPin;
  875. var m_newUserPin = "" + newUserPin;
  876. var RetryCount = 0;
  877. if (null == m_oldUserPin || m_oldUserPin.length == 0) {
  878. LAST_ERRORSTRING = ERROR_MESSAGE_USERPIN_LENGTH;
  879. return false;
  880. }
  881. if (null == m_newUserPin || m_newUserPin.length == 0) {
  882. LAST_ERRORSTRING = ERROR_MESSAGE_USERPIN_LENGTH;
  883. return false;
  884. }
  885. if (m_oldUserPin.length < 4 || m_oldUserPin.length > 16) {
  886. LAST_ERRORSTRING = ERROR_MESSAGE_USERPIN_LENGTH;
  887. return false;
  888. }
  889. if (m_newUserPin.length < 4 || m_newUserPin.length > 16) {
  890. LAST_ERRORSTRING = ERROR_MESSAGE_USERPIN_LENGTH;
  891. return false;
  892. }
  893. resultCode = token.SOF_ChangePassWd(m_oldUserPin, m_newUserPin);
  894. if (resultCode != 0) {
  895. RetryCount = SOF_GetPinRetryCount();
  896. if (RetryCount > 0) {
  897. LAST_ERRORSTRING = ERROR_MESSAGE_USERPIN_CHANGE_ERROR + ",还剩 " + RetryCount + " 次重试机会!";
  898. } else {
  899. LAST_ERRORSTRING = "UKey已经锁死,请联系管理员进行解锁!"
  900. }
  901. return false;
  902. }
  903. return true;
  904. }
  905. /**
  906. * 返回重试次数
  907. */
  908. function SOF_GetPinRetryCount() {
  909. var retryCount = 0;
  910. retryCount = token.SOF_GetPinRetryCount();
  911. return retryCount;
  912. }
  913. function SOF_GetDeviceNumber(){
  914. var deviceNumber = null;
  915. deviceNumber = token.SOF_GetDeviceInfo(token.SGD_DEVICE_SERIAL_NUMBER);
  916. return deviceNumber;
  917. }
  918. /**
  919. * 导出证书值
  920. * @param {string} containerName 容器名称
  921. * @param {int} keySec 证书用途
  922. */
  923. function SOF_ExportUserCert(containerName, keySec) {
  924. var certBase64;
  925. certBase64 = token.SOF_ExportUserCert(containerName, keySec);
  926. if (null == certBase64 || certBase64.length == 0) {
  927. LAST_ERRORSTRING = ERROR_MESSAGE_KEY_EXPORT_CERT;
  928. return null;
  929. }
  930. return certBase64;
  931. }
  932. /**
  933. * 设置加密算法
  934. * @param {*} EncryptMethod 设置加密算法
  935. * @param {*} EncryptIV 设置IV值
  936. */
  937. function SOF_SetEncryptMethodAndIV(EncryptMethod, EncryptIV) {
  938. var resCode = 1;
  939. if (EncryptMethod == undefined || EncryptMethod == null) {
  940. LAST_ERRORSTRING = "请设置加密方式!";
  941. return false;
  942. }
  943. resCode = token.SOF_SetEncryptMethodAndIV(EncryptMethod, _Base64encode(EncryptIV));
  944. if (resCode != 0) {
  945. LAST_ERRORSTRING = token.SOF_GetLastError();
  946. return false;
  947. }
  948. return true;
  949. }
  950. /**
  951. * 设置签名算法
  952. * @param {}} digestMethod
  953. */
  954. function SOF_SetDigestMethod(digestMethod) {
  955. var resultCode = 0;
  956. resultCode = token.SOF_SetDigestMethod(digestMethod);
  957. if (resultCode != 0) {
  958. LAST_ERRORSTRING = ERROR_MESSAGE_SET_DIGEST_METHOD_ERROR;
  959. return false;
  960. }
  961. return true;
  962. }
  963. /**
  964. * 设置默认USERID
  965. */
  966. function SOF_SetUserID() {
  967. var resultCode = 0;
  968. resultCode = token.SOF_SetUserID(USER_ID);
  969. if (resultCode != 0) {
  970. LAST_ERRORSTRING = ERROR_MESSAGE_SET_USERID_ERROR;
  971. return false;
  972. }
  973. return true;
  974. }
  975. /**
  976. * 数字信封加密
  977. * @param {String} Base64EncodeCert 加密证书值
  978. * @param {String} inData 待加密原文
  979. * @returns {*} "",表示加密失败;非空,加密成功
  980. */
  981. function SOF_EncryptDataPKCS7(Base64EncodeCert, inData) {
  982. var encryptData = "";
  983. var inDataBase64 = "";
  984. var m_inData = "";
  985. m_inData = "" + inData;
  986. if (m_inData.length == 0) {
  987. LAST_ERRORSTRING = ERROR_MESSAGE_ENCRYPT_DATA_IS_NULL;
  988. return "";
  989. }
  990. inDataBase64 = _Base64encode(m_inData)
  991. encryptData = token.SOF_EncryptDataPKCS7(Base64EncodeCert, inDataBase64, inData.length);
  992. if (encryptData == null || encryptData.length == 0) {
  993. LAST_ERRORSTRING = "加密失败," + token.SOF_GetLastError();
  994. return "";
  995. }
  996. return encryptData;
  997. }
  998. /**
  999. * 数字信封解密
  1000. * @param {*} containerName 应用名称
  1001. * @param {int} cerType
  1002. * @param {*} encrypedData
  1003. */
  1004. function SOF_DecryptDataPKCS7(containerName, cerType, encrypedData) {
  1005. var m_EncrypedData = "",
  1006. m_DecryptData = "";
  1007. m_EncrypedData = "" + encrypedData;
  1008. if (containerName == null || containerName.length == 0) {
  1009. LAST_ERRORSTRING = "应用名称不能为空!";
  1010. return "";
  1011. }
  1012. if (m_EncrypedData.length == 0) {
  1013. LAST_ERRORSTRING = ERROR_MESSAGE_DECRYPT_DATA_IS_NULL;
  1014. return "";
  1015. }
  1016. try {
  1017. m_DecryptData = token.SOF_DecryptDataPKCS7(containerName, cerType, m_EncrypedData);
  1018. } catch (e) {
  1019. m_DecryptData = "";
  1020. }
  1021. if (undefined == m_DecryptData || m_DecryptData == null || m_DecryptData == "") {
  1022. LAST_ERRORSTRING = ERROR_MESSAGE_DECRYPT_DATA_IS_ERROR;
  1023. return "";
  1024. }
  1025. return m_DecryptData;
  1026. }
  1027. /**
  1028. * 数据签名
  1029. * @param {*} containerName
  1030. * @param {*} ulKeySpec
  1031. * @param {*} data
  1032. * @param {*} certBase64
  1033. */
  1034. function SOF_SignData(containerName, ulKeySpec, data, certBase64) {
  1035. var signData = null;
  1036. var b64Data = null;
  1037. var m_data = "" + data;
  1038. if (null == m_data || m_data.length == 0) {
  1039. LAST_ERRORSTRING = ERROR_MESSAGE_SIGN_ORIGINALDATA_IS_NULL;
  1040. return false;
  1041. }
  1042. b64Data = _Base64encode(m_data);
  1043. signData = token.SOF_SignData(containerName, ulKeySpec, _Base64encode(b64Data), b64Data.length)
  1044. if (null == signData || signData.length == 0) {
  1045. LAST_ERRORSTRING = ERROR_MESSAGE_SIGN_ERROR + SOF_GetLastError();
  1046. return false;
  1047. }
  1048. signResultCert = certBase64;
  1049. signResultSignData = signData;
  1050. return true;
  1051. }
  1052. /**
  1053. * 导出证书
  1054. * @param {*} certBase64
  1055. */
  1056. function SOF_GetCertInfo(certBase64) {
  1057. var str = null;
  1058. var subject = null;
  1059. var tmpList = null;
  1060. var validTime = null;
  1061. var notBeforetime = null;
  1062. var key, value;
  1063. if (null == certBase64 || certBase64.length == 0) {
  1064. return false;
  1065. }
  1066. cert_subject_GN = "";
  1067. certSn = "";
  1068. cert_subject = "";
  1069. str = token.SOF_GetCertInfo(certBase64, token.SGD_CERT_SERIAL);
  1070. certSn = hexToDec(str);
  1071. subject = token.SOF_GetCertInfo(certBase64, token.SGD_CERT_SUBJECT);
  1072. cert_subject = subject;
  1073. validTime = token.SOF_GetCertInfo(certBase64,token.SGD_CERT_VALID_TIME);
  1074. cert_validTime = validTime;
  1075. notBeforetime = token.SOF_GetCertInfo(certBase64,token.SGD_CERT_NOT_BEFORE);
  1076. cert_notbeforetime = notBeforetime;
  1077. tmpList = subject.split(',');
  1078. for (var i = 0; i < tmpList.length; i++) {
  1079. if (tmpList[i].indexOf("=") == -1) {
  1080. continue;
  1081. }
  1082. key = tmpList[i].split('=')[0];
  1083. value = tmpList[i].split('=')[1];
  1084. if (key == 'GN') {
  1085. cert_subject_GN = value;
  1086. break;
  1087. }
  1088. }
  1089. return true;
  1090. }
  1091. /**
  1092. * 登出UKey
  1093. */
  1094. function SOF_LogOut() {
  1095. token.SOF_LogOut();
  1096. }
  1097. /**
  1098. * 生成解锁请求
  1099. */
  1100. function SOF_GenRemoteUnblockRequest() {
  1101. var request = token.SOF_GenRemoteUnblockRequest();
  1102. if (request == null || request == "") {
  1103. LAST_ERRORSTRING = ERROR_MESSAGE_GET_REMOTEUNLOCKREQUEST_FAIL;
  1104. return "";
  1105. }
  1106. return request;
  1107. }
  1108. function SOF_RemoteUnlockPIN(response) {
  1109. var result = false;
  1110. if (null == response || response.length == 0) {
  1111. LAST_ERRORSTRING = "解锁失败解:响应不能为空!";
  1112. return false;
  1113. }
  1114. result = token.SOF_RemoteUnblockPIN(response);
  1115. if (result != 0) {
  1116. LAST_ERRORSTRING = ERROR_MESSAGE_REMOTE_UNLOCK_FAIL;
  1117. return false;
  1118. } else {
  1119. return true;
  1120. }
  1121. }
  1122. function add(x, y, base) {
  1123. var z = [];
  1124. var n = Math.max(x.length, y.length);
  1125. var carry = 0;
  1126. var i = 0;
  1127. while (i < n || carry) {
  1128. var xi = i < x.length ? x[i] : 0;
  1129. var yi = i < y.length ? y[i] : 0;
  1130. var zi = carry + xi + yi;
  1131. z.push(zi % base);
  1132. carry = Math.floor(zi / base);
  1133. i++;
  1134. }
  1135. return z;
  1136. }
  1137. function multiplyByNumber(num, x, base) {
  1138. if (num < 0) return null;
  1139. if (num == 0) return [];
  1140. var result = [];
  1141. var power = x;
  1142. while (true) {
  1143. if (num & 1) {
  1144. result = add(result, power, base);
  1145. }
  1146. num = num >> 1;
  1147. if (num === 0) break;
  1148. power = add(power, power, base);
  1149. }
  1150. return result;
  1151. }
  1152. function parseToDigitsArray(str, base) {
  1153. var digits = str.split('');
  1154. var ary = [];
  1155. for (var i = digits.length - 1; i >= 0; i--) {
  1156. var n = parseInt(digits[i], base);
  1157. if (isNaN(n)) return null;
  1158. ary.push(n);
  1159. }
  1160. return ary;
  1161. }
  1162. function convertBase(str, fromBase, toBase) {
  1163. var digits = parseToDigitsArray(str, fromBase);
  1164. if (digits === null) return null;
  1165. var outArray = [];
  1166. var power = [1];
  1167. for (var i = 0; i < digits.length; i++) {
  1168. // invariant: at this point, fromBase^i = power
  1169. if (digits[i]) {
  1170. outArray = add(outArray, multiplyByNumber(digits[i], power, toBase), toBase);
  1171. }
  1172. power = multiplyByNumber(fromBase, power, toBase);
  1173. }
  1174. var out = '';
  1175. for (var i = outArray.length - 1; i >= 0; i--) {
  1176. out += outArray[i].toString(toBase);
  1177. }
  1178. return out;
  1179. }
  1180. function decToHex(decStr) {
  1181. var hex = convertBase(decStr, 10, 16);
  1182. return hex ? '0x' + hex : null;
  1183. }
  1184. function hexToDec(hexStr) {
  1185. if (hexStr.substring(0, 2) === '0x') hexStr = hexStr.substring(2);
  1186. hexStr = hexStr.toLowerCase();
  1187. return convertBase(hexStr, 16, 10);
  1188. }
  1189. }