diff --git a/ukey-tool/pom.xml b/ukey-tool/pom.xml
new file mode 100644
index 0000000..a1c296b
--- /dev/null
+++ b/ukey-tool/pom.xml
@@ -0,0 +1,66 @@
+
+
+ 4.0.0
+
+
+ org.springframework.boot
+ spring-boot-starter-parent
+ 3.5.11
+
+
+ com.cisd
+ ukey-tool
+ 1.0-SNAPSHOT
+
+
+ 17
+ 17
+ UTF-8
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+
+
+
+ net.java.dev.jna
+ jna
+ 5.14.0
+
+
+
+ org.bouncycastle
+ bcprov-jdk18on
+ 1.81
+
+
+
+ org.projectlombok
+ lombok
+ provided
+
+
+
+ org.springframework.boot
+ spring-boot-starter-test
+ test
+
+
+
+
+
+
+ cisd-ukey-tool
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+
+
+
+
+
diff --git a/ukey-tool/skflib/HidAPI.dll b/ukey-tool/skflib/HidAPI.dll
new file mode 100644
index 0000000..d036094
Binary files /dev/null and b/ukey-tool/skflib/HidAPI.dll differ
diff --git a/ukey-tool/skflib/MscAPI.dll b/ukey-tool/skflib/MscAPI.dll
new file mode 100644
index 0000000..8a1cb93
Binary files /dev/null and b/ukey-tool/skflib/MscAPI.dll differ
diff --git a/ukey-tool/skflib/SKF.dll b/ukey-tool/skflib/SKF.dll
new file mode 100644
index 0000000..b43154e
Binary files /dev/null and b/ukey-tool/skflib/SKF.dll differ
diff --git a/ukey-tool/src/main/java/com/cisd/ukey/UkeyToolApplication.java b/ukey-tool/src/main/java/com/cisd/ukey/UkeyToolApplication.java
new file mode 100644
index 0000000..848cab7
--- /dev/null
+++ b/ukey-tool/src/main/java/com/cisd/ukey/UkeyToolApplication.java
@@ -0,0 +1,15 @@
+package com.cisd.ukey;
+
+import com.cisd.ukey.config.SkfProperties;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.boot.context.properties.EnableConfigurationProperties;
+
+@SpringBootApplication
+@EnableConfigurationProperties(SkfProperties.class)
+public class UkeyToolApplication {
+
+ public static void main(String[] args) {
+ SpringApplication.run(UkeyToolApplication.class, args);
+ }
+}
diff --git a/ukey-tool/src/main/java/com/cisd/ukey/config/SkfProperties.java b/ukey-tool/src/main/java/com/cisd/ukey/config/SkfProperties.java
new file mode 100644
index 0000000..ff6983b
--- /dev/null
+++ b/ukey-tool/src/main/java/com/cisd/ukey/config/SkfProperties.java
@@ -0,0 +1,22 @@
+package com.cisd.ukey.config;
+
+import lombok.Data;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+
+@Data
+@ConfigurationProperties(prefix = "ukey.skf")
+public class SkfProperties {
+
+ private String vendorLibName = "SKF.dll";
+ private String libDir = "skflib";
+ private String applicationName = "cisd_app";
+ private String containerName = "cisd_container";
+ private String initAdminPin = "12345678";
+ private String initUserPin = "12345678";
+ private int adminPinRetryCount = 10;
+ private int userPinRetryCount = 10;
+ private int createFileRights = 0x000000FF;
+ private int signKeyAlgId = 0x00020100;
+ private String deviceAuthKey = "1234567812345678";
+
+}
diff --git a/ukey-tool/src/main/java/com/cisd/ukey/controller/ApiResponse.java b/ukey-tool/src/main/java/com/cisd/ukey/controller/ApiResponse.java
new file mode 100644
index 0000000..5b4210f
--- /dev/null
+++ b/ukey-tool/src/main/java/com/cisd/ukey/controller/ApiResponse.java
@@ -0,0 +1,50 @@
+package com.cisd.ukey.controller;
+
+public class ApiResponse {
+
+ private int code;
+ private T data;
+ private String msg;
+
+ public ApiResponse() {
+ }
+
+ public ApiResponse(int code, T data, String msg) {
+ this.code = code;
+ this.data = data;
+ this.msg = msg;
+ }
+
+ public static ApiResponse success(T data) {
+ return new ApiResponse<>(0, data, "success");
+ }
+
+ public static ApiResponse fail(int code, String msg) {
+ int actualCode = code == 0 ? -1 : code;
+ return new ApiResponse<>(actualCode, null, msg);
+ }
+
+ public int getCode() {
+ return code;
+ }
+
+ public void setCode(int code) {
+ this.code = code;
+ }
+
+ public T getData() {
+ return data;
+ }
+
+ public void setData(T data) {
+ this.data = data;
+ }
+
+ public String getMsg() {
+ return msg;
+ }
+
+ public void setMsg(String msg) {
+ this.msg = msg;
+ }
+}
diff --git a/ukey-tool/src/main/java/com/cisd/ukey/controller/ApiResponseAdvice.java b/ukey-tool/src/main/java/com/cisd/ukey/controller/ApiResponseAdvice.java
new file mode 100644
index 0000000..734287b
--- /dev/null
+++ b/ukey-tool/src/main/java/com/cisd/ukey/controller/ApiResponseAdvice.java
@@ -0,0 +1,28 @@
+package com.cisd.ukey.controller;
+
+import org.springframework.core.MethodParameter;
+import org.springframework.http.MediaType;
+import org.springframework.http.converter.HttpMessageConverter;
+import org.springframework.http.server.ServerHttpRequest;
+import org.springframework.http.server.ServerHttpResponse;
+import org.springframework.web.bind.annotation.RestControllerAdvice;
+import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice;
+
+@RestControllerAdvice
+public class ApiResponseAdvice implements ResponseBodyAdvice