libushang hai 1 mes
pai
achega
a0d76a4a12
Modificáronse 6 ficheiros con 1816 adicións e 51 borrados
  1. 2 0
      index.html
  2. 90 0
      public/szca_base64.js
  3. 1542 0
      public/szca_crypto.js
  4. 14 0
      src/api/login.ts
  5. 19 2
      src/store/modules/user.ts
  6. 149 49
      src/views/login.vue

+ 2 - 0
index.html

@@ -7,6 +7,8 @@
     <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no" />
     <link rel="icon" type="image/svg+xml" href="/vite.svg" />
     <script src="/h5player.min.js"></script>
+    <script src="/szca_crypto.js"></script>
+    <script src="/szca_base64.js"></script>
     <title>智慧应急工作台</title>
     <!--[if lt IE 11
       ]><script>

+ 90 - 0
public/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/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

@@ -119,3 +119,17 @@ export function yzyLogin(code) {
     }
   });
 }
+
+// USBKEY登录
+export function loginWithUsbkey(data) {
+  return request({
+    url: '/api/auth/login_with_usbkey',
+    headers: {
+      isToken: false,
+      isEncrypt: true,
+      repeatSubmit: false
+    },
+    method: 'post',
+    data: data
+  });
+}

+ 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, yzyLogin as yzyLoginApi } from '@/api/login';
+import { login as loginApi, logout as logoutApi, getInfo as getUserInfo, yzyLogin as yzyLoginApi, loginWithUsbkey as loginWithUsbkeyApi } from '@/api/login';
 import { LoginData } from '@/api/types';
 import defAva from '@/assets/images/profile.jpg';
 import store from '@/store';
@@ -85,6 +85,22 @@ export const useUserStore = defineStore('user', () => {
     avatar.value = value;
   };
 
+  /**
+   * 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,
     tenantId,
@@ -97,7 +113,8 @@ export const useUserStore = defineStore('user', () => {
     yzyLogin,
     getInfo,
     logout,
-    setAvatar
+    setAvatar,
+    loginWithUsbkey
   };
 });
 

+ 149 - 49
src/views/login.vue

@@ -7,53 +7,49 @@
         <div class="login-tabs">
           <div v-for="(item, index) in tabs" :key="index" :class="tabActive === index ? 'login-tab tab-active' : 'login-tab'" @click="handleTab(index)">{{ item }}</div>
         </div>
-        <el-form-item prop="username">
-          <el-input v-model="loginForm.username" type="text" size="large" auto-complete="off" placeholder="账号">
-            <template #prefix><i class="icon-user" /></template>
-          </el-input>
-        </el-form-item>
-        <el-form-item prop="password">
-          <el-input v-model="loginForm.password" type="password" size="large" auto-complete="off" placeholder="密码" @keyup.enter="handleLogin">
-            <template #prefix><i class="icon-password" /></template>
-          </el-input>
-        </el-form-item>
-        <el-form-item v-if="captchaEnabled" prop="code">
-          <el-input v-model="loginForm.code" size="large" auto-complete="off" placeholder="验证码" style="width: 63%" @keyup.enter="handleLogin">
-            <template #prefix><i class="icon-verify" /></template>
-          </el-input>
-          <div class="login-code">
-            <img :src="codeUrl" class="login-code-img" @click="getCode" />
-          </div>
-        </el-form-item>
-<!--        <el-checkbox v-model="loginForm.rememberMe" style="margin: 0 0 25px 0">记住密码</el-checkbox>-->
-        <!--
-        <el-form-item style="float: right">
-          <el-button circle title="微信登录" @click="doSocialLogin('wechat')">
-            <svg-icon icon-class="wechat" />
-          </el-button>
-          <el-button circle title="MaxKey登录" @click="doSocialLogin('maxkey')">
-            <svg-icon icon-class="maxkey" />
-          </el-button>
-          <el-button circle title="TopIam登录" @click="doSocialLogin('topiam')">
-            <svg-icon icon-class="topiam" />
-          </el-button>
-          <el-button circle title="Gitee登录" @click="doSocialLogin('gitee')">
-            <svg-icon icon-class="gitee" />
-          </el-button>
-          <el-button circle title="Github登录" @click="doSocialLogin('github')">
-            <svg-icon icon-class="github" />
-          </el-button>
-        </el-form-item>
-        -->
-        <el-form-item style="width: 100%">
-          <el-button :loading="loading" size="large" type="primary" style="width: 100%" @click.prevent="handleLogin">
-            <span v-if="!loading">登 录</span>
-            <span v-else>登 录 中...</span>
-          </el-button>
-          <div v-if="register" style="float: right">
-            <router-link class="link-type" :to="'/register'">立即注册</router-link>
-          </div>
-        </el-form-item>
+        <div v-show="tabActive==0">
+          <el-form-item prop="username">
+            <el-input v-model="loginForm.username" type="text" size="large" auto-complete="off" placeholder="账号">
+              <template #prefix><i class="icon-user" /></template>
+            </el-input>
+          </el-form-item>
+          <el-form-item prop="password">
+            <el-input v-model="loginForm.password" type="password" size="large" auto-complete="off" placeholder="密码" @keyup.enter="handleLogin">
+              <template #prefix><i class="icon-password" /></template>
+            </el-input>
+          </el-form-item>
+          <el-form-item v-if="captchaEnabled" prop="code">
+            <el-input v-model="loginForm.code" size="large" auto-complete="off" placeholder="验证码" style="width: 63%" @keyup.enter="handleLogin">
+              <template #prefix><i class="icon-verify" /></template>
+            </el-input>
+            <div class="login-code">
+              <img :src="codeUrl" class="login-code-img" @click="getCode" />
+            </div>
+          </el-form-item>
+          <el-form-item style="width: 100%">
+            <el-button :loading="loading" size="large" type="primary" style="width: 100%" @click.prevent="handleLogin">
+              <span v-if="!loading">登 录</span>
+              <span v-else>登 录 中...</span>
+            </el-button>
+            <div v-if="register" style="float: right">
+              <router-link class="link-type" :to="'/register'">立即注册</router-link>
+            </div>
+          </el-form-item>
+        </div>
+        <div v-show="tabActive==2">
+          <el-form-item>
+            <el-input v-model="ca_username" type="text" size="large" auto-complete="off" placeholder="账号">
+              <template #prefix><i class="icon-user" /></template>
+            </el-input>
+          </el-form-item>
+          <el-form-item style="width: 100%">
+            <select style="display: none;" id="certList"> </select>
+            <el-button :loading="loading" size="large" type="primary" style="width: 100%" @click.prevent="handleCALogin">
+              <span v-if="!loading">USBKEY登录</span>
+              <span v-else>登 录 中...</span>
+            </el-button>
+          </el-form-item>
+        </div>
       </div>
     </el-form>
     <!--  底部  -->
@@ -74,8 +70,11 @@ import { HttpStatus } from '@/enums/RespEnum';
 const userStore = useUserStore();
 const router = useRouter();
 const tabActive = ref(0);
+const ca_username = ref('');
+const szcaPki = ref(null);
+
 // '粤政易扫码登录',
-const tabs = reactive(['账号密码登录', '粤政易登录']);
+const tabs = reactive(['账号密码登录', '粤政易登录', 'CA证书登录']);
 const loginForm = ref<LoginData>({
   tenantId: '000000',
   username: '',
@@ -114,6 +113,99 @@ watch(
   { 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 = ca_username.value;
+  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 = () => {
+  if(ca_username.value === '') {
+    ElMessage.error('请输入账号');return false;
+  }
+  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;
+};
+
 const handleLogin = () => {
   loginRef.value?.validate(async (valid: boolean, fields: any) => {
     if (valid) {
@@ -206,13 +298,20 @@ const doSocialLogin = (type: string) => {
 };
 
 const handleTab = (tab) => {
-  if(tab == 1) {
+  if(tab == 0) {
+    tabActive.value = tab;
+  }
+  else if(tab == 1) {
+    
     // const redirect_uri = encodeURIComponent(import.meta.env.YZY_REDIRECT_URI);
     // const tyrz_url = import.meta.env.YZY_TYRZ_URL + redirect_uri;
     const redirect_uri = encodeURIComponent("http://19.155.220.206:8086/tyrz/login?src=yjzp&redirect="+redirect.value);
     const tyrz_url = "https://xtbg.digitalgd.com.cn/zwrz/rz/sso/oauth/authorize?response_type=code&scope=all&client_id=zwrz_mmzhyj&redirect_uri="+redirect_uri;
     window.location.href = tyrz_url;
   }
+  else if(tab == 2) {
+    tabActive.value = tab;
+  }
 }
 
 onMounted(() => {
@@ -312,6 +411,7 @@ onMounted(() => {
   line-height: 40px;
   border-bottom: 1px solid #eeeeee;
   margin-bottom: 15px;
+  cursor: pointer;
   .login-tab {
     padding: 0 10px;
   }