libushang 2 kuukautta sitten
vanhempi
commit
c0be68db02

+ 3 - 1
index.html

@@ -8,7 +8,9 @@
       content="width=device-width,initial-scale=1.0,user-scalable=no"
     />
     <link rel="icon" href="/favicon.ico" />
-      <script src="/h5player.min.js"></script>
+    <script src="/h5player.min.js"></script>
+    <script src="/static/szca_crypto.js"></script>
+    <script src="/static/szca_base64.js"></script>
     <title>应急工作台移动端</title>
   </head>
   <body>

+ 90 - 0
public/static/szca_base64.js

@@ -0,0 +1,90 @@
+var szca_base64 = {
+	_keyStr: "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",
+	encode: function(e) {
+		var t = "";
+		var n, r, i, s, o, u, a;
+		var f = 0;
+		e = szca_base64._utf8_encode(e);
+		while (f < e.length) {
+			n = e.charCodeAt(f++);
+			r = e.charCodeAt(f++);
+			i = e.charCodeAt(f++);
+			s = n >> 2;
+			o = (n & 3) << 4 | r >> 4;
+			u = (r & 15) << 2 | i >> 6;
+			a = i & 63;
+			if (isNaN(r)) {
+				u = a = 64
+			} else if (isNaN(i)) {
+				a = 64
+			}
+			t = t + this._keyStr.charAt(s) + this._keyStr.charAt(o) + this._keyStr.charAt(u) + this._keyStr.charAt(a)
+		}
+		return t
+	},
+	decode: function(e) {
+		var t = "";
+		var n, r, i;
+		var s, o, u, a;
+		var f = 0;
+		e = e.replace(/[^A-Za-z0-9+/=]/g, "");
+		while (f < e.length) {
+			s = this._keyStr.indexOf(e.charAt(f++));
+			o = this._keyStr.indexOf(e.charAt(f++));
+			u = this._keyStr.indexOf(e.charAt(f++));
+			a = this._keyStr.indexOf(e.charAt(f++));
+			n = s << 2 | o >> 4;
+			r = (o & 15) << 4 | u >> 2;
+			i = (u & 3) << 6 | a;
+			t = t + String.fromCharCode(n);
+			if (u != 64) {
+				t = t + String.fromCharCode(r)
+			}
+			if (a != 64) {
+				t = t + String.fromCharCode(i)
+			}
+		}
+		t = szca_base64._utf8_decode(t);
+		return t
+	},
+	_utf8_encode: function(e) {
+		e = e.replace(/rn/g, "n");
+		var t = "";
+		for (var n = 0; n < e.length; n++) {
+			var r = e.charCodeAt(n);
+			if (r < 128) {
+				t += String.fromCharCode(r)
+			} else if (r > 127 && r < 2048) {
+				t += String.fromCharCode(r >> 6 | 192);
+				t += String.fromCharCode(r & 63 | 128)
+			} else {
+				t += String.fromCharCode(r >> 12 | 224);
+				t += String.fromCharCode(r >> 6 & 63 | 128);
+				t += String.fromCharCode(r & 63 | 128)
+			}
+		}
+		return t
+	},
+	_utf8_decode: function(e) {
+		var t = "";
+		var n = 0;
+		var r = c1 = c2 = 0;
+		while (n < e.length) {
+			r = e.charCodeAt(n);
+			if (r < 128) {
+				t += String.fromCharCode(r);
+				n++
+			} else if (r > 191 && r < 224) {
+				c2 = e.charCodeAt(n + 1);
+				t += String.fromCharCode((r & 31) << 6 | c2 & 63);
+				n += 2
+			} else {
+				c2 = e.charCodeAt(n + 1);
+				c3 = e.charCodeAt(n + 2);
+				t += String.fromCharCode((r & 15) << 12 | (c2 & 63) << 6 | c3 & 63);
+				n += 3
+			}
+		}
+		return t
+	}
+}

+ 1542 - 0
public/static/szca_crypto.js

@@ -0,0 +1,1542 @@
+// var url = "ws://192.168.100.170:8080";
+let d = new Date();
+let url = "wss://127.0.0.1:23939";
+let socket;
+let arr =[];
+let SzcaPki = function() {};
+function initWebSocket() {
+//判断当前浏览器是否支持WebSocket
+    if("WebSocket" in window) {  
+        socket = new WebSocket(url);  
+    }else if("MozWebSocket" in window) {  
+        socket = new MozWebSocket(url);
+    }else { 
+        alert("当前浏览器不支持WebSocket !");
+    }
+    //连接成功建立的回调方法
+    socket.onopen = function() {
+        // Web Socket 已连接上,使用 send() 方法发送数据
+        // socket.send('123');
+        // alert("服务已连接...");
+    };
+    //接收到消息的回调方法
+    socket.onmessage = function(event) {
+        let data = event.data;
+        // alert("数据已接收..." + data);
+    };  
+    //连接关闭的回调方法  
+    socket.onclose = function(event) {
+
+    };  
+    //连接发生错误的回调方法  
+    socket.onerror = function(){ 
+
+    }; 
+} 
+initWebSocket();
+
+// 初始化应用
+SzcaPki.prototype.getApplyId = function (callback) {    //data为空
+    // return new Promise((resolve, reject) => {
+    //     try {
+    //         let params = {
+    //             fun: 'createApply',
+    //             arguments: {
+    //                 requestID: 'getApplyId'
+    //             }
+    //         }
+    //         socket.send(JSON.stringify(params))
+    //         socket.onmessage = function(event) {
+    //             let res = JSON.parse(event.data)
+    //             if (res.requestID == 'getApplyId') {
+    //                 if (res.code == 0) {
+    //                     resolve(res.data)
+    //                 }
+    //             }
+    //         };
+    //     } catch (err) {
+    //         reject(err);
+    //     }
+    // })
+    let requestID = 'getApplyId-' + d.getTime();
+    let params = {
+        fun: 'createApply',
+        arguments: {
+            requestID: requestID,
+            clientVer: '1.0'
+        }
+    }
+    arr.push({
+        requestID: requestID,
+        callback: callback
+    })
+    socket.send(JSON.stringify(params));
+    getMessage();
+    // getMessage(requestID,function(data) {
+    //     callback(data)
+    // })
+}
+
+// 关闭应用
+SzcaPki.prototype.closeApplyId = function(id,callback){
+    let requestID = 'closeApplyId-' + d.getTime();
+    let params = {
+        fun: 'destroyApply',
+        arguments: {
+            requestID: requestID,
+            applyID:id
+        }
+    }
+    arr.push({
+        requestID: requestID,
+        callback: callback
+    })
+    socket.send(JSON.stringify(params))
+    getMessage();
+    // getMessage(requestID,function(data) {
+    //     callback(data)
+    // })
+}
+
+// 枚举密钥设备/获取keyID
+SzcaPki.prototype.keyDevice = function (id,callback){
+    let requestID = 'keyDevice-' + d.getTime();
+    let params = {
+        fun: 'enumKey',
+        arguments: {
+            requestID: requestID,
+            applyID:id
+        }
+    }
+    arr.push({
+        requestID: requestID,
+        callback: callback
+    })
+    socket.send(JSON.stringify(params))
+    getMessage();
+    // getMessage(requestID,function(data) {
+    //     callback(data)
+    // })
+}
+
+// // 获取密钥设备标识
+// function getKeyDeviceObj(id,index){ //index为设备索引
+//     let params = {
+//         applyID:id,
+//         equipmentIndex:index
+//     }
+//     socket.send(JSON.stringify(params))
+//     return socket.onmessage = function(event) {
+//         return event.data;
+//     };
+// }
+
+// 设备监听
+SzcaPki.prototype.equipmentMonitor = function (id,flag,callback){   //flag为布尔值
+    let requestID = 'equipmentMonitor-' + d.getTime();
+    let params = {
+        fun: 'registListener',
+        arguments: {
+            requestID: requestID,
+            applyID:id,
+            enabled: flag
+        }
+    }
+    arr.push({
+        requestID: requestID,
+        callback: callback
+    })
+    socket.send(JSON.stringify(params))
+    getMessage();
+    // getMessage(requestID,function(data) {
+    //     callback(data)
+    // })
+}
+
+// OCSP
+function getOCSP(id){
+    let params = {
+        applyID:id
+    }
+    socket.send(JSON.stringify(params))
+    return socket.onmessage = function(event) {
+        return event.data;
+    };
+}
+
+// CRL
+function getCRL(id){
+    let params = {
+        applyID:id
+    }
+    socket.send(JSON.stringify(params))
+    return socket.onmessage = function(event) {
+        return event.data;
+    };
+}
+
+// 时间戳
+function getTimestamp(id,timeAddress,account,password){
+    let params = {
+        applyID:id,
+        timeAddress: timeAddress,
+        account: account,
+        password: password
+    }
+    socket.send(JSON.stringify(params))
+    return socket.onmessage = function(event) {
+        return event.data;
+    };
+}
+
+// 获取设备名称
+SzcaPki.prototype.getEquipmentName = function (deviceIdentification,callback){  //deviceIdentification设备标识
+    let requestID = 'getEquipmentName-' + d.getTime();
+    let params = {
+        fun: 'getKeyName',
+        arguments: {
+            requestID: requestID,
+            keyID: deviceIdentification
+        }
+    }
+    arr.push({
+        requestID: requestID,
+        callback: callback
+    });
+    socket.send(JSON.stringify(params))
+    getMessage();
+    // getMessage(requestID,function(data) {
+    //     callback(data)
+    // })
+}
+
+// 获取设备硬件序列号
+SzcaPki.prototype.getEquipmentNumber = function (deviceIdentification,callback){  //deviceIdentification设备标识
+    let requestID = 'getEquipmentNumber-' + d.getTime();
+    let params = {
+        fun: 'getKeySerialNumber',
+        arguments: {
+            requestID: requestID,
+            keyID: deviceIdentification
+        }
+    }
+    arr.push({
+        requestID: requestID,
+        callback: callback
+    });
+    socket.send(JSON.stringify(params))
+    getMessage();
+    // getMessage(requestID,function(data) {
+    //     callback(data)
+    // })
+}
+
+// 设备初始化
+SzcaPki.prototype.initEquipment = function (obj,callback){  //deviceIdentification设备标识
+    let requestID = 'initEquipment-' + d.getTime();
+    let params = {
+        fun: 'initToken',
+        arguments: {
+            requestID: requestID,
+            keyID: obj.deviceIdentification,
+            tokenName: obj.tokenName,
+            soPIN: obj.soPIN,
+            userPIN: obj.userPIN,
+        }
+    }
+    arr.push({
+        requestID: requestID,
+        callback: callback
+    })
+    socket.send(JSON.stringify(params))
+    getMessage();
+}
+
+// 枚举证书个数
+SzcaPki.prototype.getCertificateNumber = function (deviceIdentification,callback){  //data为空
+    let requestID = 'getCertificateNumber-' + d.getTime();
+    let params = {
+        fun: 'getCertList',
+        arguments: {
+            requestID: requestID,
+            keyID: deviceIdentification
+        }
+    }
+    arr.push({
+        requestID: requestID,
+        callback: callback
+    });
+    socket.send(JSON.stringify(params));
+    getMessage();
+}
+
+// // 读取公钥证书
+// function getPublickeyCertificate(deviceIdentification,index){  // 设备标识、证书索引
+//     let params = {
+//         deviceIdentification: deviceIdentification,
+//         certificateIndex:index
+//     }
+//     socket.send(JSON.stringify(params))
+//     return socket.onmessage = function(event) {
+//         return event.data;
+//     }; 
+// }
+
+// 获取当前算法
+SzcaPki.prototype.getCurrentAlgorithm = function (deviceIdentification,callback) {  // 设备标识
+    let requestID = 'getCurrentAlgorithm-' + d.getTime();
+    let params = {
+        fun: 'getCurrentAlgorithm',
+        arguments: {
+            requestID: requestID,
+            keyID: deviceIdentification
+        }
+    }
+    arr.push({
+        requestID: requestID,
+        callback: callback
+    });
+    socket.send(JSON.stringify(params));
+    getMessage();
+}
+
+// 选定算法
+SzcaPki.prototype.setCurrentAlgorithm = function (deviceIdentification,algorithmType,callback) {  // 设备标识、算法类型
+    let requestID = 'setCurrentAlgorithm-' + d.getTime();
+    let params = {
+        fun: 'setCurrentAlgorithm',
+        arguments: {
+            requestID: requestID,
+            keyID: deviceIdentification,
+            algoType: Number(algorithmType)
+        }
+    }
+    arr.push({
+        requestID: requestID,
+        callback: callback
+    });
+    socket.send(JSON.stringify(params));
+    getMessage();
+}
+
+// 选定证书
+SzcaPki.prototype.selectedCertificate = function (deviceIdentification,index,callback) {  // 设备标识、证书索引/序列号
+    let requestID = 'setCurrentCert-' + d.getTime();
+    let params = {
+        fun: 'setCurrentCert',
+        arguments: /^\d+$/.test(index) ? {
+            requestID: requestID,
+            keyID: deviceIdentification,
+            certIndex: Number(index)
+        } : {
+            requestID: requestID,
+            keyID: deviceIdentification,
+            certSN: index
+        }
+    }
+    arr.push({
+        requestID: requestID,
+        callback: callback
+    });
+    socket.send(JSON.stringify(params));
+    getMessage();
+}
+
+// 枚举的文件
+SzcaPki.prototype.enumerationFile = function (deviceIdentification,callback){  // 设备标识
+    let requestID = 'enumerationFile-' + d.getTime();
+    let params = {
+        fun: 'getFileList',
+        arguments: {
+            requestID: requestID,
+            keyID: deviceIdentification,
+        }
+    }
+    arr.push({
+        requestID: requestID,
+        callback: callback
+    });
+    socket.send(JSON.stringify(params));
+    getMessage();
+}
+
+// 读取文件数据
+SzcaPki.prototype.getFileData = function (deviceIdentification,fileName,callback) { // 设备标识、文件名称
+    let requestID = 'readFile-' + d.getTime();
+    let params = {
+        fun: 'readFile',
+        arguments: {
+            requestID: requestID,
+            keyID: deviceIdentification,
+            fileName: fileName
+        }
+    }
+    arr.push({
+        requestID: requestID,
+        callback: callback
+    });
+    socket.send(JSON.stringify(params));
+    getMessage();
+}
+
+// 写入文件数据
+SzcaPki.prototype.writeFileData = function (deviceIdentification,fileName,fileData,callback) {  //设备标识 文件名称、文件数据
+    let requestID = 'writeFileData-' + d.getTime();
+    let params = {
+        fun: 'writeFile',
+        arguments: {
+            requestID: requestID,
+            keyID: deviceIdentification,
+            fileName: fileName,
+            fileContent: fileData,
+            force: true,
+            fileSize: 666
+        }
+    }
+    arr.push({
+        requestID: requestID,
+        callback: callback
+    });
+    socket.send(JSON.stringify(params));
+    getMessage();
+}
+
+// 删除文件数据
+SzcaPki.prototype.deleteFileData = function (deviceIdentification,fileName,callback) {  // 设备标识 文件名称
+    let requestID = 'deleteFileData-' + d.getTime();
+    let params = {
+        fun: 'deleteFile',
+        arguments: {
+            requestID: requestID,
+            keyID: deviceIdentification,
+            fileName: fileName,
+        }
+    }
+    arr.push({
+        requestID: requestID,
+        callback: callback
+    });
+    socket.send(JSON.stringify(params));
+    getMessage();
+}
+
+// 数据发送
+SzcaPki.prototype.sendData = function (deviceIdentification,fileName,fileData) { // 设备标识、文件名称,文件数据
+    let params = {
+        fun: 'sendData',
+        arguments: {
+            dataID: '8004AFFF',
+            // rangFrom: 0,
+            // rangTo: 2047,
+            packetIndex: 0,
+            dataContent: fileData,
+            abort: false
+        }
+    }
+    socket.send(JSON.stringify(params))
+    return socket.onmessage = function(event) {
+        return event.data;
+    };
+}
+
+// 数据接收
+SzcaPki.prototype.recvData = function (deviceIdentification,fileName,fileData) { // 设备标识、文件名称,文件数据
+    let params = {
+        fun: 'recvData',
+        arguments: {
+            recvDataID: "8004AFFF",
+            // rangFrom: 0,
+            // rangTo: 2048,
+            packetIndex: 0,
+            dataContent: fileData
+        }
+    }
+    socket.send(JSON.stringify(params))
+    return socket.onmessage = function(event) {
+        return event.data;
+    };
+}
+
+// 登录
+SzcaPki.prototype.login = function (deviceIdentification,pin,callback) {  // 设备标识、PIN码
+    let requestID = 'login-' + d.getTime();
+    let params = {
+        fun: 'loginKey',
+        arguments: {
+            requestID: requestID,
+            keyID: deviceIdentification,
+            PIN: pin
+        }
+    }
+    arr.push({
+        requestID: requestID,
+        callback: callback
+    });
+    socket.send(JSON.stringify(params));
+    getMessage();
+}
+
+// 登出
+SzcaPki.prototype.out = function (deviceIdentification,callback) {
+    let requestID = 'out-' + d.getTime();
+    let params = {
+        fun: 'logoutKey',
+        arguments: {
+            requestID: requestID,
+            keyID: deviceIdentification,
+        }
+    }
+    arr.push({
+        requestID: requestID,
+        callback: callback
+    });
+    socket.send(JSON.stringify(params));
+    getMessage();
+}
+
+// 查询登录状态
+SzcaPki.prototype.queryLoginStatus = function (deviceIdentification,callback) {
+    let requestID = 'queryLoginStatus-' + d.getTime();
+    let params = {
+        fun: 'loginState',
+        arguments: {
+            requestID: requestID,
+            keyID: deviceIdentification,
+        }
+    }
+    arr.push({
+        requestID: requestID,
+        callback: callback
+    });
+    socket.send(JSON.stringify(params));
+    getMessage();
+}
+
+// 数据解密
+SzcaPki.prototype.dataDecryption = function (deviceIdentification,cipherArray,callback) {  //cipherArray为密文数组或者文件
+    let requestID = 'dataDecryption-' + d.getTime();
+    let params = {
+        fun: 'dataDecrypt',
+        arguments: {
+            requestID: requestID,
+            keyID: deviceIdentification,
+            // ciphertextFile: 'd:\\test.txt',
+            // targetFilePath: 'd:\\out.txt',
+            ciphertextData: cipherArray,
+            ciphertextSize: 666
+        }
+    }
+    arr.push({
+        requestID: requestID,
+        callback: callback
+    });
+    socket.send(JSON.stringify(params));
+    getMessage();
+}
+
+// 文件数据解密
+SzcaPki.prototype.dataDecryption1 = function (deviceIdentification,ciphertextFile,targetFilePath,callback) {  //cipherArray为密文数组或者文件
+    let requestID = 'dataDecryption1-' + d.getTime();
+    let params = {
+        fun: 'dataDecrypt',
+        arguments: {
+            requestID: requestID,
+            keyID: deviceIdentification,
+            ciphertextFile: ciphertextFile,
+            targetFilePath: targetFilePath,
+            // ciphertextData: cipherArray,
+            ciphertextSize: 666
+        }
+    }
+    arr.push({
+        requestID: requestID,
+        callback: callback
+    });
+    socket.send(JSON.stringify(params));
+    getMessage();
+}
+
+// 数字信封解密
+SzcaPki.prototype.digitalEnvelopeDecryption = function (deviceIdentification,digitalEnvelope,cipherData,callback) {  //设备标识 digitalEnvelope为数字信封,cipherData密文数据
+    let requestID = 'digitalEnvelopeDecryption-' + d.getTime();
+    let params = {
+        fun: 'dataDecEnvelop',
+        arguments: {
+            requestID: requestID,
+            keyID: deviceIdentification,
+            // filePathEnvelop: 'd:\\test.txt',
+            // filePathEncrypt: 'd:\\test2.txt',
+            // targetFilePath: 'd:\\out.txt',
+            contentEnvelop: digitalEnvelope,
+            contentEncrypt: cipherData,
+            encDataSize: 666
+        }
+    }
+    arr.push({
+        requestID: requestID,
+        callback: callback
+    });
+    socket.send(JSON.stringify(params));
+    getMessage();
+}
+
+// 文件数字信封解密
+SzcaPki.prototype.digitalEnvelopeDecryption1 = function (deviceIdentification,filePathEnvelop,filePathEncrypt,targetFilePath,callback) {  //设备标识 digitalEnvelope为数字信封,cipherData密文数据
+    let requestID = 'digitalEnvelopeDecryption1-' + d.getTime();
+    let params = {
+        fun: 'dataDecEnvelop',
+        arguments: {
+            requestID: requestID,
+            keyID: deviceIdentification,
+            filePathEnvelop: filePathEnvelop, // 'd:\\test.txt',
+            filePathEncrypt: filePathEncrypt,//'d:\\test2.txt',
+            targetFilePath: targetFilePath,//'d:\\out.txt',
+            // contentEnvelop: digitalEnvelope,
+            // contentEncrypt: cipherData,
+            encDataSize: 666
+        }
+    }
+    arr.push({
+        requestID: requestID,
+        callback: callback
+    });
+    socket.send(JSON.stringify(params));
+    getMessage();
+}
+
+// 数据签名P1
+SzcaPki.prototype.getP1 = function (deviceIdentification,signData,callback) {      // 设备标识 signData是待签名数据
+    let requestID = 'getP1-' + d.getTime();
+    let params = {
+        fun: 'signP1',
+        arguments: {
+            requestID: requestID,
+            keyID: deviceIdentification,
+            plaintextData: signData,
+            plaintextSize: 666
+        }
+    }
+    arr.push({
+        requestID: requestID,
+        callback: callback
+    });
+    socket.send(JSON.stringify(params));
+    getMessage();
+}
+
+// 文件数据签名P1
+SzcaPki.prototype.getP11 = function (deviceIdentification,plaintextFile,callback) {      // 设备标识 signData是待签名数据
+    let requestID = 'getP11-' + d.getTime();
+    let params = {
+        fun: 'signP1',
+        arguments: {
+            requestID: requestID,
+            keyID: deviceIdentification,
+            plaintextFile: plaintextFile,
+            plaintextSize: 666
+        }
+    }
+    arr.push({
+        requestID: requestID,
+        callback: callback
+    });
+    socket.send(JSON.stringify(params));
+    getMessage();
+}
+
+// 数据签名P7
+SzcaPki.prototype.getP7 = function (deviceIdentification,signData,detached,callback) {      // 设备标识 signData是待签名数据
+    let requestID = 'getP7-' + d.getTime();
+    let params = {
+        fun: 'signP7',
+        arguments: {
+            requestID: requestID,
+            keyID: deviceIdentification,
+            // plaintextFile: 'd:\\test.txt',
+            // targetFilePath: 'd:\\out.txt',
+            plaintextData: signData,
+            plaintextSize: 666,
+            detached: detached  //true 不附原文
+        }
+    }
+    arr.push({
+        requestID: requestID,
+        callback: callback
+    });
+    socket.send(JSON.stringify(params));
+    getMessage();
+}
+
+// 数据签名P7
+SzcaPki.prototype.getP71 = function (deviceIdentification,plaintextFile,targetFilePath,detached,callback) {      // 设备标识 signData是待签名数据
+    let requestID = 'getP71-' + d.getTime();
+    let params = {
+        fun: 'signP7',
+        arguments: {
+            requestID: requestID,
+            keyID: deviceIdentification,
+            plaintextFile: plaintextFile,//'d:\\test.txt',
+            targetFilePath: targetFilePath,//'d:\\out.txt',
+            // plaintextData: signData,
+            plaintextSize: 666,
+            detached: detached  //true 不附原文
+        }
+    }
+    arr.push({
+        requestID: requestID,
+        callback: callback
+    });
+    socket.send(JSON.stringify(params));
+    getMessage();
+}
+
+// 生成对称密钥
+// encryptType加密类型
+// ET_AES_CBC = 0,
+// ET_AES_ECB,
+// ET_DES_CBC = 10,
+// ET_DES_ECB,
+// ET_DES_ECB3,
+// ET_SM4_CBC = 20,
+// ET_SM4_ECB
+SzcaPki.prototype.generateSymmetricKey = function (deviceIdentification,encryptType,callback) { // 设备标识、对称加密类型
+    let requestID = 'generateSymmetricKey-' + d.getTime();
+    let params = {
+        fun: 'generateSymmKey',
+        arguments: {
+            requestID: requestID,
+            keyID: deviceIdentification,
+            symmKeyType: Number(encryptType)
+        }
+    }
+    arr.push({
+        requestID: requestID,
+        callback: callback
+    });
+    socket.send(JSON.stringify(params));
+    getMessage();
+}
+
+// 生成对称密钥(软证书)
+SzcaPki.prototype.generateSymmetricKey2 = function (encryptType,callback) { // 对称加密类型
+    let requestID = 'generateSymmetricKey2-' + d.getTime();
+    let params = {
+        fun: 'generateSymmKey2',
+        arguments: {
+            requestID: requestID,
+            symmKeyType: Number(encryptType)
+        }
+    }
+    arr.push({
+        requestID: requestID,
+        callback: callback
+    });
+    socket.send(JSON.stringify(params));
+    getMessage();
+}
+
+// 数据求哈希接口
+SzcaPki.prototype.getHex = function (algorithmType,originalData,callback) {  //algorithmType算法类型,originalData原始数据
+    let requestID = 'getHex-' + d.getTime();
+    let params = {
+        fun: 'Digest',
+        arguments: {
+            requestID: requestID,
+            hashID: Number(algorithmType),
+            // filePath: "d:\\test.txt",
+            dataContent: originalData,
+            dataSize: 666
+        }
+    }
+    arr.push({
+        requestID: requestID,
+        callback: callback
+    });
+    socket.send(JSON.stringify(params));
+    getMessage();
+}
+
+// 对称加密
+SzcaPki.prototype.symmetricalEncryption = function (symmetricalEncryptionType,clearData,secretKey,callback) { //symmetricalEncryptionType对称加密类型,clearData明文数据
+    let requestID = 'symmetricalEncryption-' + d.getTime();
+    let params = {
+        fun: 'symmEncrypt',
+        arguments: {
+            requestID: requestID,
+            encType: Number(symmetricalEncryptionType),
+            // filePath: "d:\\input.txt",
+            // targetFilePath: "d:\\out.txt",
+            dataContent: clearData,
+            dataSize: 666,
+            encrypt: true,
+            symmKey: secretKey
+        }
+    }
+    arr.push({
+        requestID: requestID,
+        callback: callback
+    });
+    socket.send(JSON.stringify(params));
+    getMessage();
+}
+
+// 文件对称加密
+SzcaPki.prototype.symmetricalEncryption1 = function (symmetricalEncryptionType,filePath,targetFilePath,secretKey,callback) { //symmetricalEncryptionType对称加密类型,clearData明文数据
+    let requestID = 'symmetricalEncryption1-' + d.getTime();
+    let params = {
+        fun: 'symmEncrypt',
+        arguments: {
+            requestID: requestID,
+            encType: Number(symmetricalEncryptionType),
+            filePath: filePath,
+            targetFilePath: targetFilePath,
+            // dataContent: clearData,
+            dataSize: 666,
+            encrypt: true,
+            symmKey: secretKey
+        }
+    }
+    arr.push({
+        requestID: requestID,
+        callback: callback
+    });
+    socket.send(JSON.stringify(params));
+    getMessage();
+}
+
+// 对称解密
+SzcaPki.prototype.symmetricDecryption = function (symmetricalEncryptionType,cipherData,secretKey,callback) {  //cipherData密文数据
+    let requestID = 'symmetricDecryption-' + d.getTime();
+    let params = {
+        fun: 'symmEncrypt',
+        arguments: {
+            requestID: requestID,
+            encType: Number(symmetricalEncryptionType),
+            // filePath: "d:\\input.txt",
+            // targetFilePath: "d:\\out.txt",
+            dataContent: cipherData,
+            dataSize: 666,
+            encrypt: false,
+            symmKey: secretKey,
+        }
+    }
+    arr.push({
+        requestID: requestID,
+        callback: callback
+    });
+    socket.send(JSON.stringify(params));
+    getMessage();
+}
+
+// 文件对称解密
+SzcaPki.prototype.symmetricDecryption1 = function (symmetricalEncryptionType,filePath,targetFilePath,secretKey,callback) {  //cipherData密文数据
+    let requestID = 'symmetricDecryption1-' + d.getTime();
+    let params = {
+        fun: 'symmEncrypt',
+        arguments: {
+            requestID: requestID,
+            encType: Number(symmetricalEncryptionType),
+            filePath: filePath,
+            targetFilePath: targetFilePath,
+            // dataContent: cipherData,
+            dataSize: 666,
+            encrypt: false,
+            symmKey: secretKey,
+        }
+    }
+    arr.push({
+        requestID: requestID,
+        callback: callback
+    });
+    socket.send(JSON.stringify(params));
+    getMessage();
+}
+
+// 非对称加密
+SzcaPki.prototype.asymmetricDecryption = function (encryptionCertificate,clearData,callback) {  //encryptionCertificate加密证书 明文数据
+    let requestID = 'asymmetricDecryption-' + d.getTime();
+    let params = {
+        fun: 'dataEncrypt',
+        arguments: {
+            requestID: requestID,
+            certData: encryptionCertificate,
+            // plaintextFile: "d:\\test.txt",
+		    // targetFilePath: "d:\\out.txt",
+            plaintextData: clearData,
+            plaintextSize: 666
+        }
+    }
+    arr.push({
+        requestID: requestID,
+        callback: callback
+    });
+    socket.send(JSON.stringify(params));
+    getMessage();
+}
+
+// 非对称加密(公钥)
+SzcaPki.prototype.dataEncryptOfECKey = function (encryptionCertificate,clearData,callback) {  //encryptionCertificate加密证书 明文数据
+    let requestID = 'dataEncryptOfECKey-' + d.getTime();
+    let params = {
+        fun: 'dataEncryptOfECKey',
+        arguments: {
+            requestID: requestID,
+            ECKeyData: encryptionCertificate,
+            // plaintextFile: "d:\\test.txt",
+		    // targetFilePath: "d:\\out.txt",
+            plaintextData: clearData,
+            plaintextSize: 666
+        }
+    }
+    arr.push({
+        requestID: requestID,
+        callback: callback
+    });
+    socket.send(JSON.stringify(params));
+    getMessage();
+}
+
+// 文件非对称加密
+SzcaPki.prototype.asymmetricDecryption1 = function (encryptionCertificate,plaintextFile,targetFilePath,callback) {  //encryptionCertificate加密证书 明文数据
+    let requestID = 'asymmetricDecryption1-' + d.getTime();
+    let params = {
+        fun: 'dataEncrypt',
+        arguments: {
+            requestID: requestID,
+            certData: encryptionCertificate,
+            plaintextFile: plaintextFile, // 输入文件路径
+		    targetFilePath: targetFilePath, // 输出文件路径
+            plaintextSize: 666
+        }
+    }
+    arr.push({
+        requestID: requestID,
+        callback: callback
+    });
+    socket.send(JSON.stringify(params));
+    getMessage();
+}
+
+// 数字信封加密
+SzcaPki.prototype.digitalEnvelopeEncryption = function (encryptionCertificate,clearData,split,callback) {  // 加密证书、明文数据(或文件)
+    let requestID = 'digitalEnvelopeEncryption-' + d.getTime();
+    let params = {
+        fun: 'dataEnvelope',
+        arguments: {
+            requestID: requestID,
+            certData: encryptionCertificate,
+            // plaintextFile: "d:\\test.txt",
+		    // targetFilePath: "d:\\out.txt",
+            // targetFilePathEncrypt: "d:\\encrypt.txt",
+            plaintextData: clearData,
+            plaintextSize: 666,
+            split: split
+        }
+    }
+    arr.push({
+        requestID: requestID,
+        callback: callback
+    });
+    socket.send(JSON.stringify(params));
+    getMessage();
+}
+
+// 数字信封文件加密
+SzcaPki.prototype.digitalEnvelopeEncryption1 = function (encryptionCertificate,plaintextFile,targetFilePath,targetFilePathEncrypt,split,callback) {  // 加密证书、明文数据(或文件)
+    let requestID = 'digitalEnvelopeEncryption1-' + d.getTime();
+    let params = {
+        fun: 'dataEnvelope',
+        arguments: {
+            requestID: requestID,
+            certData: encryptionCertificate,
+            plaintextFile: plaintextFile, // 输入文件路径
+		    targetFilePath: targetFilePath, // 输出文件路径
+            targetFilePathEncrypt: targetFilePathEncrypt, 
+            // plaintextData: clearData,
+            plaintextSize: 666,
+            split: split
+        }
+    }
+    arr.push({
+        requestID: requestID,
+        callback: callback
+    });
+    socket.send(JSON.stringify(params));
+    getMessage();
+}
+
+// 签名验证P1
+SzcaPki.prototype.signatureVerifyP1 = function (signatureCertificate,signatureData,signature,callback) { //签名证书、签名原文数据(或文件)、签名值
+    let requestID = 'signatureVerifyP1-' + d.getTime();
+    let params = {
+        fun: 'signedVerifyP1',
+        arguments: {
+            requestID: requestID,
+            certData: signatureCertificate,
+            signature: signature,
+            // plaintextFile: "d:\\test.txt",
+            plaintextData: signatureData,
+            plaintextSize: 666
+        }
+    }
+    arr.push({
+        requestID: requestID,
+        callback: callback
+    });
+    socket.send(JSON.stringify(params));
+    getMessage();
+}
+
+// 文件签名验证P1
+SzcaPki.prototype.signatureVerifyP11 = function (signatureCertificate,plaintextFile,signature,callback) { //签名证书、签名原文数据(或文件)、签名值
+    let requestID = 'signatureVerifyP11-' + d.getTime();
+    let params = {
+        fun: 'signedVerifyP1',
+        arguments: {
+            requestID: requestID,
+            certData: signatureCertificate,
+            signature: signature,
+            plaintextFile: plaintextFile,
+            // plaintextData: signatureData,
+            plaintextSize: 666
+        }
+    }
+    arr.push({
+        requestID: requestID,
+        callback: callback
+    });
+    socket.send(JSON.stringify(params));
+    getMessage();
+}
+
+// 签名验证P7
+SzcaPki.prototype.signatureVerifyP7 = function (signatureData,signature,callback) { //signatureData原文
+    let requestID = 'signatureVerifyP7-' + d.getTime();
+    let params = {
+        fun: 'signedVerifyP7',
+        arguments: {
+            requestID: requestID,
+            // signatureFile: "d:\\signed.txt",
+            // plaintextFile: "d:\\test.txt",
+            signatureData: signature,
+            plaintextData: signatureData,
+            plaintextSize: 666
+        }
+    }
+    arr.push({
+        requestID: requestID,
+        callback: callback
+    });
+    socket.send(JSON.stringify(params));
+    getMessage();
+}
+
+// 文件签名验证P7
+SzcaPki.prototype.signatureVerifyP71 = function (signatureFile,plaintextFile,callback) { //signatureData原文
+    let requestID = 'signatureVerifyP71-' + d.getTime();
+    let params = {
+        fun: 'signedVerifyP7',
+        arguments: {
+            requestID: requestID,
+            signatureFile: signatureFile,
+            plaintextFile: plaintextFile,
+            // signatureData: signature,
+            // plaintextData: signatureData,
+            plaintextSize: 666
+        }
+    }
+    arr.push({
+        requestID: requestID,
+        callback: callback
+    });
+    socket.send(JSON.stringify(params));
+    getMessage();
+}
+
+// 验证P7签名值(附原文)
+SzcaPki.prototype.serifyP7Signature = function (signatureData,callback) {
+    let requestID = 'serifyP7Signature-' + d.getTime();
+    let params = {
+        fun: 'signatureVerify',
+        arguments: {
+            requestID: requestID,
+            // signatureFile: "d:\\signed.txt",
+            signatureData: signatureData,
+            signatureSize: 666
+        }
+    }
+    arr.push({
+        requestID: requestID,
+        callback: callback
+    });
+    socket.send(JSON.stringify(params));
+    getMessage();
+}
+
+// 文件验证P7签名值(附原文)
+SzcaPki.prototype.serifyP7Signature1 = function (signatureFile,callback) {
+    let requestID = 'serifyP7Signature1-' + d.getTime();
+    let params = {
+        fun: 'signatureVerify',
+        arguments: {
+            requestID: requestID,
+            signatureFile: signatureFile,
+            // signatureData: signatureData,
+            signatureSize: 666
+        }
+    }
+    arr.push({
+        requestID: requestID,
+        callback: callback
+    });
+    socket.send(JSON.stringify(params));
+    getMessage();
+}
+
+// 时间戳签名请求
+SzcaPki.prototype.getTimeSignature = function (hash,signatureData,timeHost,account,password,callback) { //摘要算法、待签名数据、时间戳服务器地址、账号、密码
+    let requestID = 'getTimeSignature-' + d.getTime();
+    let params = {
+        fun: 'timestampSign',
+        arguments: {
+            requestID: requestID,
+            hashID: Number(hash),
+            // filePath: "d:\\test.txt",
+            dataContent: signatureData,
+            dataSize: 666,
+            timestampUrl: timeHost,
+            timestampUser: account,
+            timestampPassword: password
+        }
+    }
+    arr.push({
+        requestID: requestID,
+        callback: callback
+    });
+    socket.send(JSON.stringify(params));
+    getMessage();
+}
+
+// // 证书有效性验证
+// function certVerify(signatureData,timeHost,account,password) { //待签名数据、时间戳服务器地址、账号、密码
+//     let params = {
+//         fun: 'certVerify',
+//         arguments: {
+//             requestID: 'certVerify',
+//             certData: "公钥证书的BASE64",
+//             verifyWith: 1,
+//             rootCert: "根证书的BASE64",
+//             clrData: "证书吊销列表BASE64",
+//             ocsp: "http:\\xxxx"
+//         }
+//     }
+//     socket.send(JSON.stringify(params))
+//     return socket.onmessage = function(event) {
+//         return event.data;
+//     };
+// }
+
+// 用根证书验证证书
+SzcaPki.prototype.verifyRootCertificate = function (certificate,rootCertificate,callback) {  //待验证的证书、跟证书
+    let requestID = 'verifyRootCertificate-' + d.getTime();
+    let params = {
+        fun: 'certVerify',
+        arguments: {
+            requestID: requestID,
+            certData: certificate,
+            rootCert: rootCertificate,
+        }
+    }
+    arr.push({
+        requestID: requestID,
+        callback: callback
+    });
+    socket.send(JSON.stringify(params));
+    getMessage();
+}
+
+// 用CRL验证证书
+SzcaPki.prototype.verifyCertificateCRL = function (certificate,crl,callback) {  //待验证的证书、crl文件(或链接)
+    let requestID = 'verifyRootCertificate-' + d.getTime();
+    let params = {
+        fun: 'certVerify',
+        arguments: {
+            requestID: requestID,
+            certData: certificate,
+            clrData: crl,
+        }
+    }
+    arr.push({
+        requestID: requestID,
+        callback: callback
+    });
+    socket.send(JSON.stringify(params));
+    getMessage();
+}
+
+// 用OCSP验证证书
+SzcaPki.prototype.verifyCertificateOCSP = function (certificate,ocsp,rootCertificate,callback) {  //待验证的证书、ocsp地址
+    let requestID = 'verifyCertificateOCSP-' + d.getTime();
+    let params = {
+        fun: 'certVerify',
+        arguments: {
+            requestID: requestID,
+            certData: certificate,
+            ocsp: ocsp,
+            rootCert: rootCertificate,
+        }
+    }
+    arr.push({
+        requestID: requestID,
+        callback: callback
+    });
+    socket.send(JSON.stringify(params));
+    getMessage();
+}
+
+// 加载证书并解析
+SzcaPki.prototype.analyticalCertificate = function (publicKeyCertificateDER,oid,callback) {  //公钥证书DER或公钥证书路径
+    let requestID = 'verifyCertificateOCSP-' + d.getTime();
+    let params = {
+        fun: 'analyseCert',
+        arguments: {
+            requestID: requestID,
+            certData: publicKeyCertificateDER,
+            extends: oid,
+        }
+    }
+    arr.push({
+        requestID: requestID,
+        callback: callback
+    });
+    socket.send(JSON.stringify(params));
+    getMessage();
+}
+
+// 基础属性
+SzcaPki.prototype.getBasicAttribute = function (certificateId) {    //证书ID
+    let params = {
+        certificateId: certificateId
+    }
+    socket.send(JSON.stringify(params))
+    return socket.onmessage = function(event) {
+        return event.data;
+    };
+}
+
+// 扩展属性
+SzcaPki.prototype.getExtendedAttributes = function (certificateId,extendedAttributesOid) {  //证书ID、扩展属性oid 
+    let params = {
+        certificateId: certificateId,
+        extendedAttributesOid: extendedAttributesOid
+    }
+    socket.send(JSON.stringify(params))
+    return socket.onmessage = function(event) {
+        return event.data;
+    };
+}
+
+// 生成随机数
+SzcaPki.prototype.generateRandom = function (deviceIdentification,len,callback) {  // 设备标识 随机数长度
+    let requestID = 'generateRandom-' + d.getTime();
+    let params = {
+        fun: 'generateRandom',
+        arguments: {
+            requestID: requestID,
+            keyID: deviceIdentification,
+            len: Number(len),
+        }
+    }
+    arr.push({
+        requestID: requestID,
+        callback: callback
+    });
+    socket.send(JSON.stringify(params));
+    getMessage();
+}
+
+
+// 介质初始化
+SzcaPki.prototype.initMedium = function (deviceIdentification,fileName,adminPin,userPin,callback) {  //设备标识、名称、管理员PIN、用户PIN
+    let requestID = 'initMedium-' + d.getTime();
+    let params = {
+        fun: 'initMedium',
+        arguments: {
+            requestID: requestID,
+            keyID: deviceIdentification,
+            tokenName: fileName,
+            soPIN: adminPin,
+            userPIN: userPin
+        }
+    }
+    arr.push({
+        requestID: requestID,
+        callback: callback
+    });
+    socket.send(JSON.stringify(params));
+    getMessage();
+}
+
+// 介质解锁
+SzcaPki.prototype.mediumUnlock = function (deviceIdentification,adminPin,newUserPin) { // 设备标识、管理员PIN、新的用户PIN
+    let params = {
+        deviceIdentification: deviceIdentification,
+        adminPin: adminPin,
+        newUserPin: newUserPin
+    }
+    socket.send(JSON.stringify(params))
+    return socket.onmessage = function(event) {
+        return event.data;
+    };
+}
+
+// 修改管理员PIN
+SzcaPki.prototype.modificationAdminPin = function (deviceIdentification,oldAdminPin,newAdminPin,callback) {  // 设备标识、旧管理员PIN、新的管理员PIN
+    let requestID = 'modificationAdminPin-' + d.getTime();
+    let params = {
+        fun: 'modifyOSPIN',
+        arguments: {
+            requestID: requestID,
+            keyID: deviceIdentification,
+            soPIN: oldAdminPin,
+            newSOPIN: newAdminPin
+        }
+    }
+    arr.push({
+        requestID: requestID,
+        callback: callback
+    });
+    socket.send(JSON.stringify(params));
+    getMessage();
+}
+
+// 修改用户PIN
+SzcaPki.prototype.modificationUserPin = function (deviceIdentification,oldUserPin,newUserPin,callback) {  // 设备标识、旧用户PIN、新的用户PIN
+    let requestID = 'modificationUserPin-' + d.getTime();
+    let params = {
+        fun: 'modifyUserPIN',
+        arguments: {
+            requestID: requestID,
+            keyID: deviceIdentification,
+            userPIN: oldUserPin,
+            newUserPIN: newUserPin
+        }
+    }
+    arr.push({
+        requestID: requestID,
+        callback: callback
+    });
+    socket.send(JSON.stringify(params));
+    getMessage();
+}
+
+// 重置用户PIN
+SzcaPki.prototype.resetUserPIN = function (deviceIdentification,adminPin,userPin,callback) {  // 设备标识、管理员PIN、用户PIN
+    let requestID = 'modificationUserPin-' + d.getTime();
+    let params = {
+        fun: 'resetUserPIN',
+        arguments: {
+            requestID: requestID,
+            keyID: deviceIdentification,
+            soPIN: adminPin,
+            userPIN: userPin
+        }
+    }
+    arr.push({
+        requestID: requestID,
+        callback: callback
+    });
+    socket.send(JSON.stringify(params));
+    getMessage();
+}
+
+// 修改用户PIN
+SzcaPki.prototype.modifyUserPin = function (deviceIdentification, adminPin, userPin, callback) {  // 设备标识、管理员PIN、用户PIN
+    let requestID = 'modifyUserPin-' + d.getTime();
+    let params = {
+        fun: 'modifyUserPin',
+        arguments: {
+            requestID: requestID,
+            keyID: deviceIdentification,
+            oldPIN: adminPin,
+            newPIN: userPin
+        }
+    }
+    arr.push({
+        requestID: requestID,
+        callback: callback
+    });
+    socket.send(JSON.stringify(params));
+    getMessage();
+}
+
+// 生成P10
+SzcaPki.prototype.getP10 = function (obj,callback) {  // 设备标识、管理员PIN、用户PIN
+    let requestID = 'generatePkcs10-' + d.getTime();
+    let params = {
+        fun: 'generatePkcs10',
+        arguments: {
+            requestID: requestID,
+            keyID: obj.keyID,
+            containername: obj.contentName,
+            subject:  obj.subject,
+            algoType:  Number(obj.algoType),
+            keyType:  Number(obj.keyType),
+            keyLength:  Number(obj.keyLength),
+        }
+    }
+    arr.push({
+        requestID: requestID,
+        callback: callback
+    });
+    socket.send(JSON.stringify(params));
+    getMessage();
+}
+
+// 安装证书
+SzcaPki.prototype.installCertificate = function (obj,callback) {  // 设备标识、管理员PIN、用户PIN
+    let requestID = 'installCerts-' + d.getTime();
+    let params = {
+        fun: 'installCerts',
+        arguments: {
+            requestID: requestID,
+            keyID: obj.keyID,
+            containername: obj.contentName,
+            subject: obj.subject,
+            algoType: Number(obj.algoType),
+            signP7b: obj.signP7b,
+            signSN: obj.signSN,
+            encP7b: obj.encP7b,
+            encSN: obj.encSN,
+            encSessKey: obj.encSessKey,
+            encPriKey: obj.encPriKey,
+            symmAlgoType: Number(obj.symmAlgoType),
+        }
+    }
+    arr.push({
+        requestID: requestID,
+        callback: callback
+    });
+    socket.send(JSON.stringify(params));
+    getMessage();
+}
+
+// 删除证书所有
+SzcaPki.prototype.deleteCerts = function (deviceIdentification,callback) {  // 设备标识、管理员PIN、用户PIN
+    let requestID = 'deleteCerts-' + d.getTime();
+    let params = {
+        fun: 'deleteCerts',
+        arguments: {
+            requestID: requestID,
+            keyID: deviceIdentification,
+        }
+    }
+    arr.push({
+        requestID: requestID,
+        callback: callback
+    });
+    socket.send(JSON.stringify(params));
+    getMessage();
+}
+
+// 删除证书单个
+SzcaPki.prototype.deleteCert = function (deviceIdentification,certNumber,callback) {  // 设备标识、管理员PIN、用户PIN
+    let requestID = 'deleteCert-' + d.getTime();
+    let params = {
+        fun: 'deleteCert',
+        arguments: {
+            requestID: requestID,
+            keyID: deviceIdentification,
+            certsn: certNumber,
+        }
+    }
+    arr.push({
+        requestID: requestID,
+        callback: callback
+    });
+    socket.send(JSON.stringify(params));
+    getMessage();
+}
+
+// 删除空容器
+SzcaPki.prototype.DeleteEmptyContainers = function (deviceIdentification,callback) {  // 设备标识、管理员PIN、用户PIN
+    let requestID = 'deleteContainer-' + d.getTime();
+    let params = {
+        fun: 'deleteContainer',
+        arguments: {
+            requestID: requestID,
+            keyID: deviceIdentification,
+        }
+    }
+    arr.push({
+        requestID: requestID,
+        callback: callback
+    });
+    socket.send(JSON.stringify(params));
+    getMessage();
+}
+
+// 获取Ukey印章
+SzcaPki.prototype.readSeals = function (deviceIdentification, callback) {  // 设备标识、管理员PIN、用户PIN
+    let requestID = 'readSeals-' + d.getTime();
+    let params = {
+        fun: 'readSeals',
+        arguments: {
+            requestID: requestID,
+            keyID: deviceIdentification,
+        }
+    }
+    arr.push({
+        requestID: requestID,
+        callback: callback
+    });
+    socket.send(JSON.stringify(params));
+    getMessage();
+}
+
+// 处理onmessage接收信息
+function getMessage() {
+    socket.onmessage = function(event) {
+        if (event) {
+            let res = JSON.parse(event.data)
+            if (res.fun == 'tokenEvent') {
+                console.log(res);
+                // 在html页面显示ukey监听信息
+                if (document.getElementById('showMessage')) {
+                    document.getElementById('showMessage').textContent = JSON.stringify(res);
+	    document.getElementById('text2').value = JSON.stringify(res);
+                    return
+                }
+            };
+            if (res.code == 0) {
+                arr.map( function(e) {
+                    if (e.requestID == res.requestID) {
+                        e.callback(res);
+                        removeArray(arr,e);
+                    }
+                });
+            } else {
+                // alert(res.msg);
+                arr.map( function(e) {
+                    if (e.requestID == res.requestID) {
+                        e.callback(res);
+                        removeArray(arr,e);
+                    }
+                });
+            }
+        }
+    };
+}
+getMessage();
+
+//根据数组的下标,删除该下标的元素对象
+function removeArray(_arr, _obj) {
+    var length = _arr.length;
+    for (var i = 0; i < length; i++) {
+        if (_arr[i] == _obj) {
+            _arr.splice(i, 1); //删除下标为i的元素
+            return _arr;
+        }
+    }
+}
+

+ 14 - 0
src/api/login.ts

@@ -88,3 +88,17 @@ export function callback(data): AxiosPromise<any> {
     data: LoginData
   });
 }
+
+// USBKEY登录
+export function loginWithUsbkey(data) {
+  return request({
+    url: '/api/auth/login_with_usbkey',
+    headers: {
+      isToken: false,
+      isEncrypt: true,
+      repeatSubmit: false
+    },
+    method: 'post',
+    data: data
+  });
+}

+ 10 - 3
src/permission.ts

@@ -10,14 +10,14 @@ import setPageTitle from "@/utils/set-page-title";
 import usePermissionStore from '@/store/modules/permission';
 
 NProgress.configure({ showSpinner: false });
-const whiteList = ['/login', '/yzy/callback'];
+const whiteList = ['/login', '/yzy/callback', '/mplogin'];
 
 router.beforeEach(async (to, from, next) => {
   NProgress.start();
   if (getToken()) {
     to.meta.title && setPageTitle(to.meta.title);
     /* has token*/
-    if (to.path === '/login') {
+    if ((to.path === '/login') || (to.path === '/mplogin')) {
       next({ path: '/' });
       NProgress.done();
     } else if (whiteList.indexOf(to.path as string) !== -1) {
@@ -61,7 +61,14 @@ router.beforeEach(async (to, from, next) => {
       // 在免登录白名单,直接进入
       next();
     } else {
-      if (/(wxworklocal)/i.test(navigator.userAgent)) {
+      console.log('navigator.userAgent:', navigator.userAgent);
+      // 密信浏览器
+      if (/(MeSignBrowser)/i.test(navigator.userAgent)) {
+        const redirect = encodeURIComponent(to.fullPath || '/');
+        next(`/mplogin?redirect=${redirect}`); // 否则全部重定向到登录页
+        NProgress.done();
+      }
+      else if (/(wxworklocal)/i.test(navigator.userAgent)) {
         let state_json = {
           "redirect_url": to.fullPath || '/',
           "rnd": Math.floor(Math.random() * 1000000)

+ 9 - 0
src/router/routes.ts

@@ -19,6 +19,15 @@ export const constantRoutes: Array<RouteRecordRaw> = [
       noCache: true
     }
   },
+  {
+    path: "/mplogin",
+    name: "MPLogin",
+    component: () => import("@/views/mplogin.vue"),
+    meta: {
+      title: "USBKEY登录",
+      noCache: true
+    }
+  },
   {
     path: "/yzy/callback",
     name: "YzyCallback",

+ 19 - 2
src/store/modules/user.ts

@@ -1,6 +1,6 @@
 import { to } from 'await-to-js';
 import { getToken, removeToken, setToken } from '@/utils/auth';
-import { login as loginApi, logout as logoutApi, getInfo as getUserInfo } from '@/api/login';
+import { login as loginApi, logout as logoutApi, getInfo as getUserInfo, loginWithUsbkey as loginWithUsbkeyApi } from '@/api/login';
 import defAva from '@/assets/images/profile.jpg';
 import {store} from '@/store/index';
 import {defineStore} from "pinia";
@@ -81,6 +81,22 @@ export const useUserStore = defineStore('user', () => {
     localStorage.setItem('role', role);
   }
 
+  /**
+   * USBKEY登录
+   * @param userInfo
+   * @returns
+   */
+  const loginWithUsbkey = async (userInfo: any): Promise<void> => {
+    const [err, res] = await to(loginWithUsbkeyApi(userInfo));
+    if (res) {
+      const data = res.data;
+      setToken(data.access_token);
+      token.value = data.access_token;
+      return Promise.resolve();
+    }
+    return Promise.reject(err);
+  };
+
   return {
     userId,
     token,
@@ -92,7 +108,8 @@ export const useUserStore = defineStore('user', () => {
     getInfo,
     logout,
     setAvatar,
-    setRoles
+    setRoles,
+    loginWithUsbkey
   };
 });
 

+ 207 - 0
src/views/mplogin.vue

@@ -0,0 +1,207 @@
+<!-- 密评环境下的登录,和中屏功能相同 -->
+<template>
+    <div class="common-form-container">
+    <van-form label-width="50" label-align="left" colon @submit="handleCALogin">
+      <div class="form-item">
+        <div class="form-header">
+          <div class="form-header-left">
+            <div class="form-title">欢迎登录智慧应急工作台</div>
+          </div>
+        </div>
+        <div class="common-form-content">
+          <div class="common-form-item">
+            <van-field
+                label-width="10vw"
+                v-model="form.ca_username"
+                class="common-field"
+                label="账号"
+                placeholder="请输入账号"
+                :rules="rules.ca_username"
+            />
+            <select style="display: none;" id="certList"> </select>
+          </div>
+        </div>
+      </div>
+      <div class="form-footer">
+        <van-button class="btn primary-btn" :loading="loading" type="primary" native-type="submit">USBKEY登录</van-button>
+        </div>
+    </van-form>
+  </div>
+
+</template>
+
+<script setup lang="ts">
+import { getCodeImg } from '@/api/login';
+import { useUserStore } from '@/store/modules/user';
+import { to } from 'await-to-js';
+
+const userStore = useUserStore();
+const router = useRouter();
+// 表单校验规则
+const rules = reactive({
+    ca_username: [{  required: true, message: "请输入您的账号"  }],
+});
+
+// 表单数据
+const form = ref({
+    ca_username: '',
+    uuid: '',
+    tenantId: "000000",
+    rememberMe: "",
+    clientId: ""
+});
+
+const codeUrl = ref('');
+const loading = ref(false);
+// 验证码开关
+const captchaEnabled = ref(true);
+const redirect = ref(undefined);
+const ca_username = ref('');
+const szcaPki = ref(null);
+
+watch(
+() => router.currentRoute.value,
+(newRoute: any) => {
+    redirect.value = newRoute.query && newRoute.query.redirect;
+},
+{ immediate: true }
+);
+
+//从枚举密钥设备/获取keyID
+const getCertInfo = (keyID,callback) => {
+  szcaPki.value.getCertificateNumber(keyID,function(data) {
+    if(data.code == 0){
+      szcaPki.value.analyticalCertificate(data.data.certs[0],"",function(cerdata) {
+        var dn = cerdata.data.subject.toString();
+        dn = dn.substring(3,dn.indexOf(","));
+        console.log("keyID:"+keyID);
+        var result = [];
+        result.push(dn);
+        result.push(keyID);
+        callback(result);
+      })
+    }
+  })
+}
+
+const usbkey_login = () => {
+  var index = 0;
+  var obj = document.getElementById('certList');
+  var keyID = obj.options[index].value;
+  if(keyID == "")
+  {
+    ElMessage.error("获取证书列表失败!");
+    return false;
+  }
+
+  var username = form.value.ca_username;
+  var p7SignData = username;
+  console.log('p7SignData:', p7SignData);
+  szcaPki.value.getP7(keyID, szca_base64.encode(p7SignData), false, function(data) {
+    if(data.code == 0 && data.data != null){
+      var p7SignValue = data.data.signature;
+      console.log('p7SignValue:', p7SignValue);
+      var param = {
+          keyID: keyID,
+          username: username,
+          p7SignData: p7SignData,
+          p7SignValue: p7SignValue
+      };
+      
+      userStore.loginWithUsbkey(param).then((res)=>{
+        const redirectUrl = redirect.value || '/';
+        router.push(redirectUrl);
+        loading.value = false;
+      }).catch((err)=>{
+        loading.value = false;
+      })
+    }
+  })
+  return false;
+}
+
+const handleCALogin = () => {
+  szcaPki.value = new SzcaPki();
+  console.log("正在USBKEY初始化应用...");
+  //初始化应用,获取应用Id
+  szcaPki.value.getApplyId(function(applydata){
+    if(applydata.code == 0){
+      console.log("初始化应用成功");
+      szcaPki.value.keyDevice(applydata.data.applyID, function(data) {
+        console.log("正在获取keyID...", data);
+        if(data.code == 0){
+          if(data.data.keys != null){
+              console.log("keyID:"+data.data.keys);
+              var keys = data.data.keys;
+              var certList = document.getElementById('certList');
+              certList.options.length = 0;
+              var dn = [];
+              for (var i = 0; i < keys.length; i++){
+                  var val = keys;
+                  var dn = getCertInfo(keys[i],function(e){
+                      console.log("e:"+e);
+                      certList.add(new Option(e[0], e[1]));
+                      setTimeout(function() {
+                        usbkey_login();
+                      }, 100);
+                  });
+              }
+          }
+          else {
+            ElMessage.error('请检查USBKEY是否已插入电脑');
+          }
+        }
+      })	
+    }
+  })
+  return false;
+};
+</script>
+
+<style lang="scss" scoped>
+    .login-code {
+    width: 100px;
+    float: right;
+
+    img {
+        cursor: pointer;
+        vertical-align: middle;
+    }
+    }
+
+    .login-code-img {
+        height: 30px;
+        padding-left: 12px;
+    }
+
+    .form-footer {
+        width: 100%;
+        height: 70px;
+        background: #FFFFFF;
+        display: flex;
+        justify-content: center;
+        align-items: center;
+        .btn {
+            width: 90px;
+            height: 36px;
+            border: 1px solid #D1D1D1;
+            background: #FFFFFF;
+            border-radius: 2px;
+            font-size: 16px;
+            color: #B3B3B3;
+            margin-left: 24px;
+            &:first-child {
+            margin-left: 0;
+            }
+        }
+        .primary-btn {
+            width: 50vw;
+            height: 36px;
+            border: 1px solid #2C81FF;
+            background: #2C81FF;
+            border-radius: 2px;
+            font-size: 16px;
+            color: #ffffff;
+        }
+    }
+</style>