(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 HEX(48 字节) */ 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 )