yc-ui2 0.1.2-beta18 → 0.1.2-beta20

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