diff --git a/Readme.md b/Readme.md index 093f8e9..b96e21c 100644 --- a/Readme.md +++ b/Readme.md @@ -5,6 +5,11 @@ 3. 暂时无法实现 UKEY 复制, 只能从初始化时就使用 Fake UKEY。 +## 版本 +- 0.1 + 打包为一个文件 + + ## API 请求: Content-Type: application/x-www-form-urlencoded; charset=UTF-8 @@ -78,6 +83,7 @@ alg : 1 } +### 重置口令 diff --git a/backend/src/FakeUKey.js b/backend/src/FakeUKey.js index 1ab0188..857dee1 100644 --- a/backend/src/FakeUKey.js +++ b/backend/src/FakeUKey.js @@ -5,8 +5,7 @@ const path = require("path"); function listFakeUKeys(){ let ukeyDir = config.getFakeUKeyDir(); - const files = fs.readdirSync(ukeyDir); - return files; + return fs.readdirSync(ukeyDir); } function checkFakeUKey(name){ @@ -29,6 +28,7 @@ module.exports = { return { "EnumDeviceNameList": nameList.join("|"), + "fakeList" : nameList } }, @@ -66,7 +66,7 @@ module.exports = { "01000032" : function (params) { let ukey = params.hdevice let dir = params.dir - let acc = params.acc + // let acc = params.acc if ( dir.startsWith("\\root\\") ) { dir = dir.substring(6); @@ -82,15 +82,18 @@ module.exports = { let ukey = params.hdevice let dir = params.dir let file = params.file - let size = params.size - let acc = params.acc + // let size = params.size + // let acc = params.acc if ( dir.startsWith("\\root\\") ) { dir = dir.substring(6); - if ( fs.existsSync(path.resolve(config.getFakeUKeyDir(), ukey, "root", dir)) ) { + if ( fs.existsSync(path.resolve(config.getFakeUKeyDir(), ukey, "root", dir, file)) ) { // throw "文件已存在" return {} } + + // 文件无需创建,直接写入即可。 + } else { throw "目录不合法" } @@ -123,14 +126,14 @@ module.exports = { let ukey = params.hdevice let dir = params.dir let file = params.file - let size = params.size + // let size = params.size let offset = parseInt(params.offset, 10) let input = params.input if ( dir.startsWith("\\root\\") ) { dir = dir.substring(6); let f = path.resolve(config.getFakeUKeyDir(), ukey, "root\\", dir, file) - let buffer = undefined; + let buffer = null; if ( offset === 0 ) { buffer = Buffer.from(input, 'hex'); } else { @@ -189,7 +192,9 @@ module.exports = { files.push( fname ) } } - + return { + data : files.join("|") + } }, // 枚举文件 @@ -211,6 +216,9 @@ module.exports = { files.push( fname ) } } + return { + data : files.join("|") + } }, // 生成密钥对 @@ -220,6 +228,8 @@ module.exports = { let keyNum = params.keyNum let keyLen = params.keyLen + console.log("genKeypair", alg, keyLen) + const sm2 = require('sm-crypto').sm2 let keypair = sm2.generateKeyPairHex() diff --git a/backend/src/Proxy.js b/backend/src/Proxy.js new file mode 100644 index 0000000..9c515f6 --- /dev/null +++ b/backend/src/Proxy.js @@ -0,0 +1,47 @@ +const http = require('http'); +const querystring = require('querystring'); + + + +const base = { + hostname: '127.0.0.1', + port: 8090, + path: '/do', + method: 'POST' +}; + + +async function call(form){ + const postData = querystring.stringify(form); + + const options = Object.assign(base, { + headers: { + 'Content-Type': 'application/x-www-form-urlencoded', + 'Content-Length': Buffer.byteLength(postData) + } + }) + + return new Promise((cbok, cberr)=>{ + const req = http.request(options, (res) => { + let data = ''; + res.on('error', (e)=>{ + cberr(e) + }) + res.on('data', (chunk) => { + data += chunk; + }); + res.on('end', () => { + console.log(data); + cbok(data) + }); + }); + req.write(postData); + req.end(); + }) +} + + +export default { + call +} + diff --git a/backend/src/Version.js b/backend/src/Version.js new file mode 100644 index 0000000..c239cdd --- /dev/null +++ b/backend/src/Version.js @@ -0,0 +1 @@ +export const version = "0.1" \ No newline at end of file diff --git a/backend/src/main.js b/backend/src/main.js index b45f94c..7422d42 100644 --- a/backend/src/main.js +++ b/backend/src/main.js @@ -2,24 +2,60 @@ const express = require('express'); const bodyParser = require('body-parser'); const ukey = require("./FakeUKey") const cors = require('cors'); -const { killPortProcess } = require('kill-port-process'); +const Proxy = require("./Proxy") +const Config = require("./Config") +const Version = require("./Version") const app = express(); // const port = 3000; -const port = 8090; +const port = 18090; // 使用body-parser中间件来解析urlencoded格式的请求体 app.use(bodyParser.urlencoded({ extended: true })); app.use(cors()); -app.get("/", (req, res) => { +app.all("/", (req, res) => { res.json({ server : "Fake UKey", - version : "1.0" + version : Version.version, + "rev": 0 + }) +}) + +/** + * 新建 FakeUKey + */ +app.post("/fakeUkey/add", (req, res) => { + + Config.newFakeUKey(); + + res.json({ + "rev": 0 + }) +}) + + +/** + * 删除 FakeUKey + */ +app.post("/fakeUkey/del", (req, res) => { + + Config.delFakeUKey(req.body.name); + + res.json({ + "rev": 0 }) }) app.post('/do', (req, res) => { + // 先尝试代理 + let pd = null + try { + pd = Proxy.call(req.body) + }catch (e) { + console.error("proxy error", pd) + } + // 获取请求体中的数据 let requestData = { "rev": -1 @@ -28,7 +64,7 @@ app.post('/do', (req, res) => { let func = ukey[ req.body.order ] if ( func ){ try { - let ret = func(req.body) + let ret = func(req.body, pd) requestData = Object.assign(ret, { "rev": 0 }) @@ -49,7 +85,7 @@ app.post('/do', (req, res) => { // long running process running on a given port(s), e.g. a http-server // takes a number, number[], string or string[] // single port - await killPortProcess(8090); + // await killPortProcess(8090); app.listen(port, "127.0.0.1", () => { console.log(`Server is running on port ${port}`); diff --git a/build.cmd b/build.cmd new file mode 100644 index 0000000..528d3fb --- /dev/null +++ b/build.cmd @@ -0,0 +1,7 @@ +cd backend +bun build --compile --target=bun-windows-x64 --outfile=PFakeUKey.exe-x86_64-pc-windows-msvc.exe ./src/main.js +cd .. + + + +npm run tauri build \ No newline at end of file diff --git a/view/public/add.png b/view/public/add.png new file mode 100644 index 0000000..4419eda Binary files /dev/null and b/view/public/add.png differ diff --git a/view/public/ukey.png b/view/public/ukey.png new file mode 100644 index 0000000..268d25e Binary files /dev/null and b/view/public/ukey.png differ diff --git a/view/src/api.js b/view/src/api.js new file mode 100644 index 0000000..03e0105 --- /dev/null +++ b/view/src/api.js @@ -0,0 +1,72 @@ +import axios from 'axios'; +import qs from 'qs'; + +const apiClient = axios.create({ + baseURL: 'http://localhost:18090', // Replace with your API base URL + headers: { + 'Content-Type': 'application/x-www-form-urlencoded', + }, +}); + +export const postData = async (data) => { + try { + const response = await apiClient.post('/do', qs.stringify(data)); + return response.data; + } catch (error) { + console.error('Error posting data:', error); + throw error; + } +}; + + +export const getVersion = async () => { + const data = { + }; + try { + const response = await apiClient.post('/', qs.stringify(data)); + return response.data; + } catch (error) { + console.error('Error posting data:', error); + throw error; + } +} + + +export const getList = async () => { + const data = { + order: '01000005' + }; + return postData(data); +} + + +export const addFakeUkey = async (name) => { + const data = { + name + }; + + try { + const response = await apiClient.post('/fakeUkey/add', qs.stringify(data)); + return response.data; + } catch (error) { + console.error('Error posting data:', error); + throw error; + } +} + + +export const delFakeUkey = async (name) => { + const data = { + name + }; + + try { + const response = await apiClient.post('/fakeUkey/del', qs.stringify(data)); + return response.data; + } catch (error) { + console.error('Error posting data:', error); + throw error; + } +} + + diff --git a/view/test/bun-node17.js b/view/test/bun-node17.js new file mode 100644 index 0000000..f9ac1f5 --- /dev/null +++ b/view/test/bun-node17.js @@ -0,0 +1,2 @@ + +console.log(structuredClone) \ No newline at end of file