fullstack.web/swa/u/ukey.js
2023-01-10 10:20:52 +08:00

312 lines
7.7 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

(function( root ){
var DIR = "\\root\\mana"
var FISECKEY = root.FISECKEY;
var hDevice = undefined;
var fileSize = 4096;
if ( ! FISECKEY ) {
console.error("缺少 FISECKEY 支持 !!!")
}
function stringToHex(str){
var val = "";
for (var i = 0; i < str.length; i++) {
var v = str.charCodeAt(i).toString(16);
if ( v.length < 2 ) {
v = "0" + v;
}
val += v;
}
return val
}
function hexToString(hex){
var arr = hex.split("")
var out = ""
for (var i = 0; i < arr.length / 2; i++) {
var tmp = "0x" + arr[i * 2] + arr[i * 2 + 1]
var charValue = String.fromCharCode(tmp);
out += charValue
}
return out
}
function admin( dev, pin ){
if ( ! hDevice ) {
hDevice = FISECKEY.OpenBySerial(dev, "4");
}
if ( ! hDevice ) {
throw new Error("设备打开失败")
}
FISECKEY.ADMIN_Login(hDevice, pin);
return hDevice;
}
function login( dev, pin ){
hDevice = FISECKEY.OpenBySerial(dev, "4");
if ( ! hDevice ) {
throw new Error("设备打开失败")
}
FISECKEY.USER_Login(hDevice, pin);
return hDevice;
}
function logout(){
FISECKEY.USER_Logout(hDevice, 0);
FISECKEY.CloseDevice(hDevice);
hDevice = undefined
}
function sumHash(data){
var sum = 0;
for (var i =0 ; i < data.length; i++) {
sum += data.charCodeAt(i)
}
sum += "";
return sum.substr( sum.length -4 );
}
function release( info ){
if ( ! hDevice ) {
throw new Error("设备未登录")
}
FISECKEY.FILE_Init(hDevice);
FISECKEY.FILE_CreateDir(hDevice, DIR, 0);
FISECKEY.FILE_CreateFile(hDevice, DIR, "name", fileSize, 0);
var data = JSON.stringify(info)
writeFile(DIR, "name", data)
readFile(DIR, "name")
}
function deleteFile(dir, file){
if ( ! hDevice ) {
throw new Error("设备未登录")
}
FISECKEY.FILE_DeleteFile(hDevice, dir, file);
}
function readFile(dir, file) {
if ( ! hDevice ) {
throw new Error("设备未登录")
}
var len = FISECKEY.FILE_ReadFile(hDevice, dir, file, 0, 2);
len = parseInt( len, 10 );
var data = FISECKEY.FILE_ReadFile(hDevice, dir, file, 2, len);
var sum = sumHash(data);
var hash = FISECKEY.FILE_ReadFile(hDevice, dir, file, 2 + len, 2);
if ( sum === hash ) {
var str = hexToString(data);
console.log( "read", data )
return JSON.parse(str);
}
throw new Error("文件读取失败")
}
function writeData(hDevice, dir, file, idx, len, data){
if ( len <= 400 ) {
FISECKEY.FILE_WriteFile(hDevice, dir, file, idx, len, data);
} else {
// 先写入 400
FISECKEY.FILE_WriteFile(hDevice, dir, file, idx, 400, data.substr(0, 800 ));
writeData( hDevice, dir, file, idx + 400, len - 400, data.substr(800) )
}
}
function writeFile(dir, file, data){
if ( ! hDevice ) {
throw new Error("设备未登录")
}
try {
FISECKEY.FILE_DeleteFile(hDevice, dir, file);
}catch (e) {
}
FISECKEY.FILE_CreateFile(hDevice, dir, file, fileSize, 0);
console.log( "write", data )
console.log( "data.length" , data.length )
data = stringToHex( data ).toUpperCase()
var len = data.length / 2
len = "0000" + len;
len = len.substr( len.length -4 );
FISECKEY.FILE_WriteFile(hDevice, dir, file, 0, 2, len);
writeData(hDevice, dir, file, 2, data.length/2, data)
// console.log( "writeFile=" + len )
// console.log( "writeFile=" + data )
// console.log( "writeFile=" + data.length )
console.log("w2")
var hash = sumHash(data);
// console.log( "writeFile hash=" + hash )
FISECKEY.FILE_WriteFile(hDevice, dir, file, 2 + (data.length/2), 2, hash);
}
// 枚举序列号与名称
function enumDevByArray() {
return FISECKEY.EnumByArray();
}
function enumDir( path ){
if ( ! hDevice ) {
throw new Error("设备未登录")
}
var folders = FISECKEY.FILE_EnmuDir(hDevice, path);
var fos = folders.split("|")
folders = []
for ( var i = 0 ; i < fos.length ; i++ ) {
if ( fos[i] ) {
folders.push( path + "\\" + fos[i] );
}
}
var files = FISECKEY.FILE_EnmuFile(hDevice, path);
var fs = files.split("|")
files = []
for ( var i = 0 ; i < fs.length ; i++ ) {
if ( fs[i] ) {
files.push( path + "\\" + fs[i] );
}
}
return {
folders : folders,
files : files
}
}
function loadLMK(){
return readFile(DIR, "lmk")
}
/**
*
* @param no 1/2/3
* @param mkey HEX48 字节)
*/
function saveLMK(no, lmk, pk, sk) {
if ( ! hDevice ) {
throw new Error("设备未登录")
}
var info = {
pk : pk , sk : sk
}
switch ( no ) {
case 1: {
info = Object.assign( info, {
no : no,
lmk1 : lmk.substr(0, 32),
lmk2 : lmk.substr(32, 64)
})
break;
}
case 2: {
// 0 16 32 48
// 0 32 64 96
info = Object.assign( info, {
no : no,
lmk2 : lmk.substr(32, 64),
lmk3 : lmk.substr(64, 96)
})
break;
}
case 3: {
info = Object.assign( info, {
no : no,
lmk3 : lmk.substr(64, 96),
lmk1 : lmk.substr(0, 32)
})
break;
}
default :
throw new Error("不支持的分量")
}
var data = JSON.stringify(info)
FISECKEY.FILE_DeleteFile(hDevice, DIR, "lmk");
FISECKEY.FILE_CreateFile(hDevice, DIR, "lmk", fileSize, 0);
writeFile( DIR, "lmk" , data);
var auth = {
uid : no,
rid : no
}
FISECKEY.FILE_DeleteFile(hDevice, DIR, "auth");
FISECKEY.FILE_CreateFile(hDevice, DIR, "auth", fileSize, 0);
writeFile( DIR, "auth" , auth);
}
function saveAuth(uid, rid){
var auth = {
uid : no,
rid : no
}
FISECKEY.FILE_DeleteFile(hDevice, DIR, "auth");
FISECKEY.FILE_CreateFile(hDevice, DIR, "auth", fileSize, 0);
writeFile( DIR, "auth" , auth);
}
function loadAuth(){
return readFile(DIR, "auth")
}
function catRelease(){
return readFile(DIR, "name")
}
/**
* 修改口令
*/
function updatePin(oldpin, newpin){
FISECKEY.USER_ChangePin(hDevice, 1, oldpin, newpin);
}
root.UKey = {
release: release,
catRelease : catRelease,
readFile: readFile,
writeFile : writeFile,
deleteFile : deleteFile,
login : login,
logout : logout,
updatePin : updatePin,
admin : admin,
enumDevByArray : enumDevByArray,
enumDir: enumDir,
saveLMK : saveLMK,
loadLMK : loadLMK,
saveAuth : saveAuth,
loadAuth : loadAuth
}
})( window )