first commit
This commit is contained in:
commit
a877436fcc
9
.gitattributes
vendored
Normal file
9
.gitattributes
vendored
Normal file
@ -0,0 +1,9 @@
|
||||
# auto generated by UGit
|
||||
translog filter=lfs diff=lfs merge=binary -text
|
||||
*.zip filter=lfs diff=lfs merge=binary -text
|
||||
*.pdf filter=lfs diff=lfs merge=binary -text
|
||||
*.so filter=lfs diff=lfs merge=binary -text
|
||||
*.jar filter=lfs diff=lfs merge=binary -text
|
||||
*.o filter=lfs diff=lfs merge=binary -text
|
||||
*.dll filter=lfs diff=lfs merge=binary -text
|
||||
*.doc filter=lfs diff=lfs merge=binary -text
|
40
.gitignore
vendored
Normal file
40
.gitignore
vendored
Normal file
@ -0,0 +1,40 @@
|
||||
target/
|
||||
!.mvn/wrapper/maven-wrapper.jar
|
||||
!**/src/main/**/target/
|
||||
!**/src/test/**/target/
|
||||
|
||||
### IntelliJ IDEA ###
|
||||
.idea/modules.xml
|
||||
.idea/jarRepositories.xml
|
||||
.idea/compiler.xml
|
||||
.idea/libraries/
|
||||
*.iws
|
||||
*.iml
|
||||
*.ipr
|
||||
|
||||
### Eclipse ###
|
||||
.apt_generated
|
||||
.classpath
|
||||
.factorypath
|
||||
.project
|
||||
.settings
|
||||
.springBeans
|
||||
.sts4-cache
|
||||
|
||||
### NetBeans ###
|
||||
/nbproject/private/
|
||||
/nbbuild/
|
||||
/dist/
|
||||
/nbdist/
|
||||
/.nb-gradle/
|
||||
build/
|
||||
!**/src/main/**/build/
|
||||
!**/src/test/**/build/
|
||||
|
||||
### VS Code ###
|
||||
.vscode/
|
||||
|
||||
### Mac OS ###
|
||||
.DS_Store
|
||||
SydLog
|
||||
.idea
|
10
README.md
Normal file
10
README.md
Normal file
@ -0,0 +1,10 @@
|
||||
# sdf1102
|
||||
|
||||
java 对接 三合一版本加密机 SDF 接口封装
|
||||
|
||||
|
||||
## 注意
|
||||
git 自动转换回车会导致动态库错误。执行命令关闭自动转换。
|
||||
```
|
||||
git config --global core.autocrlf false
|
||||
```
|
122
dependency-reduced-pom.xml
Normal file
122
dependency-reduced-pom.xml
Normal file
@ -0,0 +1,122 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<groupId>com.sunyard</groupId>
|
||||
<artifactId>sdf1102</artifactId>
|
||||
<version>1.0-SNAPSHOT</version>
|
||||
<build>
|
||||
<plugins>
|
||||
<plugin>
|
||||
<artifactId>maven-shade-plugin</artifactId>
|
||||
<version>2.4.3</version>
|
||||
<executions>
|
||||
<execution>
|
||||
<phase>package</phase>
|
||||
<goals>
|
||||
<goal>shade</goal>
|
||||
</goals>
|
||||
<configuration>
|
||||
<filters>
|
||||
<filter>
|
||||
<artifact>*:*</artifact>
|
||||
<excludes>
|
||||
<exclude>META-INF/*.SF</exclude>
|
||||
<exclude>META-INF/*.DSA</exclude>
|
||||
<exclude>META-INF/*.RSA</exclude>
|
||||
</excludes>
|
||||
</filter>
|
||||
</filters>
|
||||
<finalName>${project.artifactId}-${project.version}</finalName>
|
||||
<transformers>
|
||||
<transformer>
|
||||
<mainClass>com.sunyard.security.Main</mainClass>
|
||||
</transformer>
|
||||
<transformer>
|
||||
<resource>META-INF/spring.handlers</resource>
|
||||
</transformer>
|
||||
<transformer>
|
||||
<resource>META-INF/spring.schemas</resource>
|
||||
</transformer>
|
||||
<transformer>
|
||||
<resource>META-INF/spring.tooling</resource>
|
||||
</transformer>
|
||||
<transformer>
|
||||
<projectName>Apache CXF</projectName>
|
||||
</transformer>
|
||||
<transformer>
|
||||
<resource>META-INF/cxf/cxf.extension</resource>
|
||||
</transformer>
|
||||
<transformer>
|
||||
<resource>META-INF/extensions.xml</resource>
|
||||
</transformer>
|
||||
<transformer>
|
||||
<resource>META-INF/cxf/extensions.xml</resource>
|
||||
</transformer>
|
||||
<transformer>
|
||||
<resource>META-INF/cxf/bus-extensions.txt</resource>
|
||||
</transformer>
|
||||
<transformer>
|
||||
<resource>META-INF/cxf/bus-extensions.xml</resource>
|
||||
</transformer>
|
||||
<transformer>
|
||||
<resource>META-INF/wsdl.plugin.xml</resource>
|
||||
</transformer>
|
||||
<transformer>
|
||||
<resource>META-INF/cxf/java2wsbeans.xml</resource>
|
||||
</transformer>
|
||||
<transformer>
|
||||
<resource>META-INF/spring.handlers</resource>
|
||||
</transformer>
|
||||
<transformer>
|
||||
<resource>META-INF/spring.schemas</resource>
|
||||
</transformer>
|
||||
<transformer />
|
||||
<transformer />
|
||||
<transformer />
|
||||
</transformers>
|
||||
</configuration>
|
||||
</execution>
|
||||
</executions>
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>com.github.edwgiz</groupId>
|
||||
<artifactId>maven-shade-plugin.log4j2-cachefile-transformer</artifactId>
|
||||
<version>2.6.1</version>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
</plugin>
|
||||
</plugins>
|
||||
</build>
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>junit</groupId>
|
||||
<artifactId>junit</artifactId>
|
||||
<version>4.12</version>
|
||||
<scope>test</scope>
|
||||
<exclusions>
|
||||
<exclusion>
|
||||
<artifactId>hamcrest-core</artifactId>
|
||||
<groupId>org.hamcrest</groupId>
|
||||
</exclusion>
|
||||
</exclusions>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
<distributionManagement>
|
||||
<repository>
|
||||
<id>nexus-own</id>
|
||||
<name>repo-release</name>
|
||||
<url>${ReleaseRepository}</url>
|
||||
</repository>
|
||||
<snapshotRepository>
|
||||
<id>nexus-own</id>
|
||||
<name>repo-snapshot</name>
|
||||
<url>${SnapshotRepository}</url>
|
||||
</snapshotRepository>
|
||||
</distributionManagement>
|
||||
<properties>
|
||||
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||
<maven.compiler.source>8</maven.compiler.source>
|
||||
<maven.compiler.target>8</maven.compiler.target>
|
||||
</properties>
|
||||
</project>
|
||||
|
162
pom.xml
Normal file
162
pom.xml
Normal file
@ -0,0 +1,162 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
|
||||
<groupId>com.sunyard</groupId>
|
||||
<artifactId>sdf1102</artifactId>
|
||||
<version>1.0-SNAPSHOT</version>
|
||||
|
||||
<properties>
|
||||
<maven.compiler.source>8</maven.compiler.source>
|
||||
<maven.compiler.target>8</maven.compiler.target>
|
||||
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||
</properties>
|
||||
|
||||
<distributionManagement>
|
||||
<snapshotRepository>
|
||||
<id>nexus-own</id>
|
||||
<name>repo-snapshot</name>
|
||||
<url>${SnapshotRepository}</url>
|
||||
</snapshotRepository>
|
||||
<repository>
|
||||
<id>nexus-own</id>
|
||||
<name>repo-release</name>
|
||||
<url>${ReleaseRepository}</url>
|
||||
</repository>
|
||||
</distributionManagement>
|
||||
|
||||
<dependencies>
|
||||
|
||||
<!--动态库调用依赖-->
|
||||
<dependency>
|
||||
<groupId>net.java.dev.jna</groupId>
|
||||
<artifactId>jna</artifactId>
|
||||
<version>5.5.0</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>org.projectlombok</groupId>
|
||||
<artifactId>lombok</artifactId>
|
||||
<version>1.18.28</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>com.sunyard</groupId>
|
||||
<artifactId>loadbalancing</artifactId>
|
||||
<version>1.2.201905230000</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>junit</groupId>
|
||||
<artifactId>junit</artifactId>
|
||||
<version>4.12</version>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
|
||||
<build>
|
||||
<plugins>
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-shade-plugin</artifactId>
|
||||
<version>2.4.3</version>
|
||||
<executions>
|
||||
<execution>
|
||||
<phase>package</phase>
|
||||
<goals>
|
||||
<goal>shade</goal>
|
||||
</goals>
|
||||
<configuration>
|
||||
<filters>
|
||||
<filter>
|
||||
<artifact>*:*</artifact>
|
||||
<excludes>
|
||||
<exclude>META-INF/*.SF</exclude>
|
||||
<exclude>META-INF/*.DSA</exclude>
|
||||
<exclude>META-INF/*.RSA</exclude>
|
||||
</excludes>
|
||||
</filter>
|
||||
</filters>
|
||||
<finalName>${project.artifactId}-${project.version}</finalName>
|
||||
<transformers>
|
||||
<transformer
|
||||
implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
|
||||
<mainClass>com.sunyard.security.Main</mainClass>
|
||||
<!-- <mainClass>com.sunyard.test.PCIApiTest</mainClass>-->
|
||||
</transformer>
|
||||
<transformer
|
||||
implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
|
||||
<resource>META-INF/spring.handlers</resource>
|
||||
</transformer>
|
||||
<transformer
|
||||
implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
|
||||
<resource>META-INF/spring.schemas</resource>
|
||||
</transformer>
|
||||
<transformer
|
||||
implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
|
||||
<resource>META-INF/spring.tooling</resource>
|
||||
</transformer>
|
||||
<transformer
|
||||
implementation="org.apache.maven.plugins.shade.resource.ApacheNoticeResourceTransformer">
|
||||
<projectName>Apache CXF</projectName>
|
||||
</transformer>
|
||||
<transformer
|
||||
implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
|
||||
<resource>META-INF/cxf/cxf.extension</resource>
|
||||
</transformer>
|
||||
<transformer
|
||||
implementation="org.apache.maven.plugins.shade.resource.XmlAppendingTransformer">
|
||||
<resource>META-INF/extensions.xml</resource>
|
||||
</transformer>
|
||||
<transformer
|
||||
implementation="org.apache.maven.plugins.shade.resource.XmlAppendingTransformer">
|
||||
<resource>META-INF/cxf/extensions.xml</resource>
|
||||
</transformer>
|
||||
<transformer
|
||||
implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
|
||||
<resource>META-INF/cxf/bus-extensions.txt</resource>
|
||||
</transformer>
|
||||
<transformer
|
||||
implementation="org.apache.maven.plugins.shade.resource.XmlAppendingTransformer">
|
||||
<resource>META-INF/cxf/bus-extensions.xml</resource>
|
||||
</transformer>
|
||||
<transformer
|
||||
implementation="org.apache.maven.plugins.shade.resource.XmlAppendingTransformer">
|
||||
<resource>META-INF/wsdl.plugin.xml</resource>
|
||||
</transformer>
|
||||
<transformer
|
||||
implementation="org.apache.maven.plugins.shade.resource.XmlAppendingTransformer">
|
||||
<resource>META-INF/cxf/java2wsbeans.xml</resource>
|
||||
</transformer>
|
||||
<transformer
|
||||
implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
|
||||
<resource>META-INF/spring.handlers</resource>
|
||||
</transformer>
|
||||
<transformer
|
||||
implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
|
||||
<resource>META-INF/spring.schemas</resource>
|
||||
</transformer>
|
||||
<transformer
|
||||
implementation="org.apache.maven.plugins.shade.resource.ComponentsXmlResourceTransformer"/>
|
||||
<transformer
|
||||
implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer"/>
|
||||
<transformer
|
||||
implementation="com.github.edwgiz.mavenShadePlugin.log4j2CacheTransformer.PluginsCacheFileTransformer"/>
|
||||
</transformers>
|
||||
</configuration>
|
||||
</execution>
|
||||
</executions>
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>com.github.edwgiz</groupId>
|
||||
<artifactId>maven-shade-plugin.log4j2-cachefile-transformer</artifactId>
|
||||
<version>2.6.1</version>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
</plugin>
|
||||
</plugins>
|
||||
</build>
|
||||
|
||||
</project>
|
69
src/main/java/com/sunyard/security/Main.java
Normal file
69
src/main/java/com/sunyard/security/Main.java
Normal file
@ -0,0 +1,69 @@
|
||||
package com.sunyard.security;
|
||||
|
||||
import com.sun.jna.Pointer;
|
||||
import com.sun.jna.ptr.PointerByReference;
|
||||
import com.sunyard.security.sdf.SDFJna;
|
||||
import com.sunyard.security.util.ByteUtil;
|
||||
|
||||
public class Main {
|
||||
private static PointerByReference phDeviceHandle = new PointerByReference();
|
||||
private static PointerByReference phSessionHandle = new PointerByReference();;
|
||||
private static final byte[] data = new byte[16];
|
||||
private static final byte[] symKey = new byte[]{9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9};
|
||||
private static final String ip = "172.16.17.245";
|
||||
|
||||
|
||||
public static void random(){
|
||||
|
||||
int oneSize = 16;
|
||||
byte[] oneRadom = new byte[16]; // 注意这里初始化大小应为 oneSize
|
||||
int ret = SDFJna.INSTANCE.SDF_GenerateRandom( phSessionHandle.getValue(), oneSize, oneRadom );
|
||||
|
||||
if (ret != 0) {
|
||||
throw new RuntimeException(String.format("0x%02X", ret));
|
||||
} else {
|
||||
System.out.println("调用成功");
|
||||
}
|
||||
System.out.println( ByteUtil.bytes2HexString( oneRadom ) );
|
||||
}
|
||||
|
||||
|
||||
public static void main(String[] args) {
|
||||
|
||||
// 打开设备
|
||||
int ret = SDFJna.INSTANCE.SDF_OpenDevice(
|
||||
phDeviceHandle,
|
||||
ByteUtil.safeStringBytes(ip),
|
||||
8889,
|
||||
3000,
|
||||
3000,
|
||||
0);
|
||||
|
||||
if (ret != 0) {
|
||||
System.err.println("打开设备失败 错误码:" + String.format("0x%02X", ret));
|
||||
throw new RuntimeException(String.format("0x%02X", ret));
|
||||
}
|
||||
Pointer hDeviceHandle = phDeviceHandle.getValue();
|
||||
// 打开会话
|
||||
ret = SDFJna.INSTANCE.SDF_OpenSession(hDeviceHandle, phSessionHandle);
|
||||
if (ret != 0) {
|
||||
System.err.println("打开设备失败 错误码:" + String.format("0x%02X", ret));
|
||||
throw new RuntimeException(String.format("0x%02X", ret));
|
||||
}
|
||||
|
||||
|
||||
try {
|
||||
random();
|
||||
|
||||
} finally {
|
||||
if ( null != phSessionHandle.getValue() ) {
|
||||
SDFJna.INSTANCE.SDF_CloseSession( phSessionHandle.getValue() );
|
||||
}
|
||||
if ( null != phDeviceHandle.getValue() ) {
|
||||
SDFJna.INSTANCE.SDF_CloseDevice(phDeviceHandle.getValue());
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
15
src/main/java/com/sunyard/security/enum/RdEnum.java
Normal file
15
src/main/java/com/sunyard/security/enum/RdEnum.java
Normal file
@ -0,0 +1,15 @@
|
||||
package com.sunyard.security;
|
||||
|
||||
public enum RdEnum {
|
||||
RD_PATH("./lib/rd"),
|
||||
RD_DATA_FILE_PATH("./data/data.bin"),
|
||||
RD_DATA_PATH("./data/"),
|
||||
RD_REPORT_PATH("./report/report.csv");
|
||||
private String value;
|
||||
public String getValue() {
|
||||
return value;
|
||||
}
|
||||
RdEnum(String value){
|
||||
this.value=value;
|
||||
}
|
||||
}
|
49
src/main/java/com/sunyard/security/sdf/AlgorithmEnum.java
Normal file
49
src/main/java/com/sunyard/security/sdf/AlgorithmEnum.java
Normal file
@ -0,0 +1,49 @@
|
||||
package com.sunyard.security.sdf;
|
||||
|
||||
/**
|
||||
* @author 梁俊杰
|
||||
* @date 2024/05/22
|
||||
*/
|
||||
public enum AlgorithmEnum {
|
||||
/**
|
||||
* sm4 ecb 算法标识
|
||||
*/
|
||||
SGD_SM4_ECB(0x00000401),
|
||||
|
||||
/**
|
||||
* sm4 ecb 算法标识
|
||||
*/
|
||||
SGD_SM4_CBC(0x00000402),
|
||||
|
||||
/**
|
||||
* sm2 算法标识
|
||||
*/
|
||||
SGD_SM2(0x00020100),
|
||||
|
||||
/**
|
||||
* sm3 算法标识
|
||||
*/
|
||||
SGD_SM3(0x00000001),
|
||||
|
||||
/**
|
||||
* 密码设备存储私钥的索引值
|
||||
*/
|
||||
SM2_INDEX(0x02),
|
||||
|
||||
SGD_SM4_MAC(0x00000410),
|
||||
;
|
||||
|
||||
|
||||
AlgorithmEnum(int value){
|
||||
this.value = value;
|
||||
}
|
||||
|
||||
public int getValue() {
|
||||
return value;
|
||||
}
|
||||
|
||||
/**
|
||||
* 算法标识
|
||||
*/
|
||||
private final int value;
|
||||
}
|
27
src/main/java/com/sunyard/security/sdf/LibEnum.java
Normal file
27
src/main/java/com/sunyard/security/sdf/LibEnum.java
Normal file
@ -0,0 +1,27 @@
|
||||
package com.sunyard.security.sdf;
|
||||
|
||||
/**
|
||||
* 动态库枚举类
|
||||
* @author admin
|
||||
*/
|
||||
public enum LibEnum {
|
||||
|
||||
/**
|
||||
* 动态库路径
|
||||
*/
|
||||
LIB_PATH("./lib"),
|
||||
LIB_NAME("sdf");
|
||||
|
||||
/**
|
||||
* 值
|
||||
*/
|
||||
private final String value;
|
||||
|
||||
LibEnum(String value) {
|
||||
this.value = value;
|
||||
}
|
||||
|
||||
public String getValue() {
|
||||
return value;
|
||||
}
|
||||
}
|
401
src/main/java/com/sunyard/security/sdf/SDFJna.java
Normal file
401
src/main/java/com/sunyard/security/sdf/SDFJna.java
Normal file
@ -0,0 +1,401 @@
|
||||
package com.sunyard.security.sdf;
|
||||
|
||||
import com.sun.jna.Library;
|
||||
import com.sun.jna.Native;
|
||||
import com.sun.jna.Pointer;
|
||||
import com.sun.jna.ptr.IntByReference;
|
||||
import com.sun.jna.ptr.PointerByReference;
|
||||
|
||||
/**
|
||||
* @author sunyard
|
||||
*/
|
||||
public interface SDFJna extends Library {
|
||||
|
||||
/**
|
||||
* 加载动态库
|
||||
*/
|
||||
SDFJna INSTANCE = Native.load(LibEnum.LIB_NAME.getValue(), SDFJna.class);
|
||||
|
||||
|
||||
/**
|
||||
* 打开设备
|
||||
* @param phDeviceHandle 设备句柄
|
||||
* @return int 响应码
|
||||
*/
|
||||
int SDF_OpenDevice(PointerByReference phDeviceHandle, byte[] ip, int port, int connTimeout, int dealTimeout, int ipMode);
|
||||
|
||||
/**
|
||||
* 关闭设备
|
||||
* @param hDeviceHandle 设备句柄
|
||||
* @return int 响应码
|
||||
*/
|
||||
int SDF_CloseDevice(Pointer hDeviceHandle);
|
||||
|
||||
/**
|
||||
* 打开会话
|
||||
* @param hDeviceHandle 设备句柄
|
||||
* @param phSessionHandle 会话句柄
|
||||
* @return int 响应码
|
||||
*/
|
||||
int SDF_OpenSession(Pointer hDeviceHandle, PointerByReference phSessionHandle);
|
||||
|
||||
/**
|
||||
* 关闭会话
|
||||
* @param hSessionHandle 会话句柄
|
||||
* @return int 响应码
|
||||
*/
|
||||
int SDF_CloseSession(Pointer hSessionHandle);
|
||||
|
||||
/**
|
||||
* 生成随机数
|
||||
* @param hSessionHandle 会话句柄
|
||||
* @param uiLength 生成随机数长度
|
||||
* @param pucRandom 存放随机数容器
|
||||
* @return int 响应码
|
||||
*/
|
||||
int SDF_GenerateRandom(Pointer hSessionHandle, int uiLength, byte[] pucRandom);
|
||||
|
||||
|
||||
int SDF_ImportKey(Pointer hSessionHandle, byte[] pucKey, int uiKeyLen, PointerByReference phKeyhandle);
|
||||
/**
|
||||
* 导出签名公钥
|
||||
* @param phSessionHandle
|
||||
* @param uiKeyIndex
|
||||
* @param pucPublicKey
|
||||
* @return
|
||||
*/
|
||||
int SDF_ExportSignPublicKey_ECC(Pointer phSessionHandle,
|
||||
int uiKeyIndex,
|
||||
byte[] pucPublicKey);
|
||||
|
||||
/**
|
||||
* 导出加密公钥
|
||||
* @param phSessionHandle
|
||||
* @param uiKeyIndex
|
||||
* @param pucPublicKey
|
||||
* @return
|
||||
*/
|
||||
int SDF_ExportEncPublicKey_ECC(Pointer phSessionHandle,
|
||||
int uiKeyIndex,
|
||||
byte[] pucPublicKey);
|
||||
|
||||
/**
|
||||
* 生成会话密钥并用内部 ECC公钥加密输出,输出密钥句柄
|
||||
* @param phSessionHandle
|
||||
* @param uiIPKIndex
|
||||
* @param uiKeyBits
|
||||
* @param puckey
|
||||
* @param phKeyhandle
|
||||
* @return
|
||||
*/
|
||||
int SDF_GenerateKeyWithIPK_ECC(Pointer phSessionHandle,
|
||||
int uiIPKIndex,
|
||||
int uiKeyBits ,
|
||||
byte[] puckey,
|
||||
PointerByReference phKeyhandle);
|
||||
|
||||
/**
|
||||
* 生成会话密钥并用外部ECC公钥加密输出,输出密钥句柄
|
||||
* @param hSessionHandle 会话句柄
|
||||
* @param uiKeyBits 密钥长度
|
||||
* @param uiAlgID 算法标识
|
||||
* @param pucPublicKey ECC公钥结构
|
||||
* @param pucKey 密钥密文
|
||||
* @param phKeyHandle 密钥句柄
|
||||
* @return int 响应码
|
||||
*/
|
||||
int SDF_GenerateKeyWithEPK_ECC(
|
||||
Pointer hSessionHandle,
|
||||
int uiKeyBits,
|
||||
int uiAlgID,
|
||||
byte[] pucPublicKey,
|
||||
byte[] pucKey,
|
||||
PointerByReference phKeyHandle
|
||||
);
|
||||
|
||||
/**
|
||||
* 导入会话密钥并用内部ECC私钥解密
|
||||
* @param phSessionHandle
|
||||
* @param uiISKIndex
|
||||
* @param puckey
|
||||
* @param phKeyhandle
|
||||
* @return
|
||||
*/
|
||||
int SDF_ImportKeyWithISK_ECC(Pointer phSessionHandle,
|
||||
int uiISKIndex,
|
||||
byte[] puckey,
|
||||
PointerByReference phKeyhandle);
|
||||
|
||||
|
||||
/**
|
||||
* 销毁会话密钥
|
||||
* @param phSessionHandle
|
||||
* @param phKeyhandle
|
||||
* @return
|
||||
*/
|
||||
int SDF_DestroyKey(Pointer phSessionHandle, PointerByReference phKeyhandle);
|
||||
|
||||
|
||||
/**
|
||||
* 生成ECC密钥对
|
||||
* @param phSessionHandle 会话句柄
|
||||
* @param uiAlgID 算法标识
|
||||
* @param uiKeyBits 密钥长度
|
||||
* @param pucPublicKey 输出的ECC公钥结构
|
||||
* @param pucPrivateKey 输出的ECC私钥结构
|
||||
* @return int 响应码
|
||||
*/
|
||||
int SDF_GenerateKeyPair_ECC(
|
||||
Pointer phSessionHandle,
|
||||
int uiAlgID,
|
||||
int uiKeyBits,
|
||||
byte[] pucPublicKey,
|
||||
byte[] pucPrivateKey
|
||||
);
|
||||
|
||||
|
||||
/**
|
||||
* 对称加密
|
||||
* @param phSessionHandle 会话句柄
|
||||
* @param hKeyHandle 密钥句柄
|
||||
* @param uiAlgID 算法标识
|
||||
* @param pucIV IV数据
|
||||
* @param pucData 待加密数据
|
||||
* @param pucDataLength 待加密数据长度
|
||||
* @param pucEncData 存放密文容器
|
||||
* @param pucEncDataLength 密文长度
|
||||
* @return int 响应码
|
||||
*/
|
||||
int SDF_Encrypt(
|
||||
Pointer phSessionHandle,
|
||||
Pointer hKeyHandle,
|
||||
int uiAlgID,
|
||||
byte[] pucIV,
|
||||
byte[] pucData,
|
||||
int pucDataLength,
|
||||
byte[] pucEncData,
|
||||
IntByReference pucEncDataLength
|
||||
);
|
||||
|
||||
/**
|
||||
* 对称解密
|
||||
* @param phSessionHandle 会话句柄
|
||||
* @param hKeyHandle 密钥句柄
|
||||
* @param uiAlgID 算法标识
|
||||
* @param pucIV IV数据
|
||||
* @param purEncData 指向密文数据的指针
|
||||
* @param encDataLength 密文数据长度
|
||||
* @param pucData 输出明文数据
|
||||
* @param pucDataLength 输出明文数据长度
|
||||
* @return int 响应码
|
||||
*/
|
||||
int SDF_Decrypt(
|
||||
Pointer phSessionHandle,
|
||||
Pointer hKeyHandle,
|
||||
int uiAlgID,
|
||||
byte[] pucIV,
|
||||
byte[] purEncData,
|
||||
int encDataLength,
|
||||
byte[] pucData,
|
||||
IntByReference pucDataLength
|
||||
);
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* 杂凑运算初始化
|
||||
* @param phSessionHandle 会话句柄
|
||||
* @param uiAlgID 算法标识
|
||||
* @param pucPublicKey ECC公钥结构
|
||||
* @param pucID 签名者的ID值
|
||||
* @param pucIDlength 签名者ID的长度
|
||||
* @return int 响应码
|
||||
*/
|
||||
int SDF_HashInit(Pointer phSessionHandle, int uiAlgID, byte[] pucPublicKey, String pucID, int pucIDlength);
|
||||
|
||||
/**
|
||||
* 多包杂凑运算
|
||||
* @param phSessionHandle 会话句柄
|
||||
* @param pucData 输入的数据明文
|
||||
* @param uiDataLength 输入的数据明文长度
|
||||
* @return int 响应码
|
||||
*/
|
||||
int SDF_HashUpdate(
|
||||
Pointer phSessionHandle, // 使用IntByReference,因为SessionHandle可能是引用类型的
|
||||
byte[] pucData, // 输入的明文数据作为字节数组
|
||||
int uiDataLength // 明文数据长度
|
||||
);
|
||||
|
||||
/**
|
||||
* 杂凑运算结束
|
||||
* @param phSessionHandle 会话句柄
|
||||
* @param pucHash 杂凑结果
|
||||
* @param pucHashLength 杂凑结果长度
|
||||
* @return int 响应码
|
||||
*/
|
||||
int SDF_HashFinal(Pointer phSessionHandle, byte[] pucHash, IntByReference pucHashLength);
|
||||
|
||||
|
||||
int SDF_CalculateMAC(Pointer phSessionHandle,
|
||||
Pointer hKeyHadnle,
|
||||
int uiAlgID,
|
||||
byte[] pucIV,
|
||||
byte[] purData,
|
||||
int pucDatalength,
|
||||
byte[] pucMAC,
|
||||
IntByReference pucMACLength);
|
||||
|
||||
/**
|
||||
* 外部ECC签名
|
||||
* @param phSessionHandle 会话句柄
|
||||
* @param uiAlgID 算法标识
|
||||
* @param pucPublicKey ECC公钥结构
|
||||
* @param pucData 输入的数据明文
|
||||
* @param pucDataLength 输入的数据明文长度
|
||||
* @param pucECCSignature 输出的签名值数据
|
||||
* @return int 响应码
|
||||
*/
|
||||
int SDF_ExternalSign_ECC(
|
||||
Pointer phSessionHandle,
|
||||
int uiAlgID,
|
||||
byte[] pucPublicKey,
|
||||
byte[] pucData,
|
||||
int pucDataLength,
|
||||
byte[] pucECCSignature
|
||||
);
|
||||
|
||||
/**
|
||||
* 外部ECC验签
|
||||
* @param phSessionHandle 会话句柄
|
||||
* @param uiAlgID 算法标识
|
||||
* @param pucPublicKey ECC公钥结构
|
||||
* @param pucData 输入的数据明文
|
||||
* @param pucDataLength 输入的数据明文长度
|
||||
* @param pucECCSignature 输入的签名值数据
|
||||
* @return int 响应码
|
||||
*/
|
||||
int SDF_ExternalVerify_ECC(Pointer phSessionHandle, int uiAlgID, byte[] pucPublicKey, byte[] pucData, int pucDataLength, byte[] pucECCSignature);
|
||||
|
||||
/**
|
||||
* 内部密钥ECC签名
|
||||
* @param phSessionHandle
|
||||
* @param uiAlgID
|
||||
* @param uiISKIndex
|
||||
* @param pucData
|
||||
* @param pucDatalength
|
||||
* @param pucECCSignature
|
||||
* @return
|
||||
*/
|
||||
int SDF_InternalSign_ECC(Pointer phSessionHandle,
|
||||
int uiISKIndex,
|
||||
byte[] pucData,
|
||||
int pucDatalength,
|
||||
byte[] pucECCSignature);
|
||||
|
||||
|
||||
/**
|
||||
* 内部密钥ECC签名
|
||||
* @param phSessionHandle
|
||||
* @param uiISKIndex
|
||||
* @param pucData
|
||||
* @param pucDatalength
|
||||
* @param pucECCSignature
|
||||
* @return
|
||||
*/
|
||||
int SDF_InternalVerify_ECC(Pointer phSessionHandle,
|
||||
int uiISKIndex,
|
||||
byte[] pucData,
|
||||
int pucDatalength,
|
||||
byte[] pucECCSignature);
|
||||
|
||||
/**
|
||||
* 密钥加密
|
||||
* @param phSessionHandle 会话句柄
|
||||
* @param uiAlgID 算法标识
|
||||
* @param pucPublicKey ECC公钥结构
|
||||
* @param pucData 输入的数据明文
|
||||
* @param pucDatalength 输入的数据明文长度
|
||||
* @param pucEncData 输出的密文数据
|
||||
* @return int 响应码
|
||||
*/
|
||||
int SDF_ExternalEncrypt_ECC(Pointer phSessionHandle, int uiAlgID, byte[] pucPublicKey, byte[] pucData, int pucDatalength, byte[] pucEncData);
|
||||
|
||||
/**
|
||||
* 密钥解密
|
||||
* @param phSessionHandle 会话句柄
|
||||
* @param uiAlgID 算法标识
|
||||
* @param pucPrivateKey ECC私钥结构
|
||||
* @param pucEncData 输入的密文数据
|
||||
* @param pucDataOut 输出的数据明文
|
||||
* @param pucDatalength 输出的数据明文长度
|
||||
* @return int 响应码
|
||||
*/
|
||||
int SDF_ExternalDecrypt_ECC(Pointer phSessionHandle, int uiAlgID, byte[] pucPrivateKey, byte[] pucEncData, byte[] pucDataOut, IntByReference pucDatalength);
|
||||
|
||||
/**
|
||||
* 生成密钥协商数据
|
||||
* @param phSessionHandle 会话句柄
|
||||
* @param uiISKIndex 密码设备存储私钥的索引值
|
||||
* @param uiKeyBits 要求协商的密钥长度
|
||||
* @param pucSponsorID 参与密钥协商的发起方ID值
|
||||
* @param uiSponsorIDLength 发起方ID长度
|
||||
* @param pucSponsorPublicKey 返回的发起方ECC公钥结构
|
||||
* @param pucSponsorTmpPublicKey 返回的发起方临时ECC公钥结构
|
||||
* @param phAgreementHandle 返回的协商对象,用于计算协商密钥
|
||||
* @return int 响应码
|
||||
*/
|
||||
int SDF_GenerateAgreementDataWithECC(Pointer phSessionHandle, int uiISKIndex, int uiKeyBits,
|
||||
String pucSponsorID, int uiSponsorIDLength,
|
||||
byte[] pucSponsorPublicKey, byte[] pucSponsorTmpPublicKey,
|
||||
PointerByReference phAgreementHandle);
|
||||
|
||||
/**
|
||||
* 生成密钥协商数据并计算密钥
|
||||
* @param phSessionHandle 会话句柄
|
||||
* @param uiISKIndex 密码设备存储私钥的索引值
|
||||
* @param uiKeyBits 要求协商的密钥长度
|
||||
* @param pucResponseID 参与密钥协商的响应方ID值
|
||||
* @param uiResponseIDLength 响应方ID长度
|
||||
* @param pucSponsorID 参与密钥协商的发起方ID值
|
||||
* @param uiSponsorIDLength 发起方ID长度
|
||||
* @param pucSponsorPublicKey 发起方ECC公钥结构
|
||||
* @param pucSponsorTmpPublicKey 发起方临时ECC公钥结构
|
||||
* @param pucResponsePublicKey 响应方ECC公钥结构
|
||||
* @param pucResponseTmpPublicKey 响应方临时ECC公钥结构
|
||||
* @param phKeyhandle 返回的密钥句柄
|
||||
* @return
|
||||
*/
|
||||
int SDF_GenerateAgreementDataAndKeyWithECC(
|
||||
Pointer phSessionHandle,
|
||||
int uiISKIndex,
|
||||
int uiKeyBits,
|
||||
String pucResponseID,
|
||||
int uiResponseIDLength,
|
||||
String pucSponsorID,
|
||||
int uiSponsorIDLength,
|
||||
byte[] pucSponsorPublicKey,
|
||||
byte[] pucSponsorTmpPublicKey,
|
||||
byte[] pucResponsePublicKey,
|
||||
byte[] pucResponseTmpPublicKey,
|
||||
PointerByReference phKeyhandle
|
||||
);
|
||||
|
||||
/**
|
||||
* 获取私钥访问权
|
||||
* @param phSessionHandle 会话句柄
|
||||
* @param uiKeyIndex 密码设备存储私钥的索引值
|
||||
* @param pucPassword 使用私钥权限的标识码
|
||||
* @param uiPwdLength 私钥访问控制码长度,不少于8字节
|
||||
* @return int 响应码
|
||||
*/
|
||||
int SDF_GetPrivateKeyAccessRight(Pointer phSessionHandle, int uiKeyIndex, String pucPassword, int uiPwdLength);
|
||||
|
||||
/**
|
||||
* 释放私钥访问权
|
||||
* @param phSessionHandle 会话句柄
|
||||
* @param uiKeyIndex 密码设备存储私钥的索引值
|
||||
* @return int 响应码
|
||||
*/
|
||||
int SDF_ReleasePrivateKeyAccessRight(Pointer phSessionHandle, int uiKeyIndex);
|
||||
|
||||
}
|
114
src/main/java/com/sunyard/security/util/ByteUtil.java
Normal file
114
src/main/java/com/sunyard/security/util/ByteUtil.java
Normal file
@ -0,0 +1,114 @@
|
||||
package com.sunyard.security.util;
|
||||
|
||||
import java.util.Arrays;
|
||||
|
||||
public class ByteUtil {
|
||||
/**
|
||||
* PKCS5/PKCS7 标准填充数据
|
||||
* @param data
|
||||
* @return
|
||||
*/
|
||||
public static byte[] pkcsFullPadding(byte[] data) {
|
||||
int remainder = data.length % 16;
|
||||
remainder = 16 - remainder;
|
||||
|
||||
byte[] buff = new byte[ data.length + remainder ];
|
||||
System.arraycopy( data, 0, buff, 0, data.length );
|
||||
Arrays.fill( buff, data.length, buff.length, (byte)( 0xFF & remainder ));
|
||||
return buff;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* PKCS5/PKCS7 标准去除填充数据
|
||||
* @param data
|
||||
* @param len 有效数据长度
|
||||
* @return
|
||||
*/
|
||||
public static byte[] pkcsRemovePadding(byte[] data, int len) {
|
||||
if ( data.length < len ) {
|
||||
throw new IllegalArgumentException();
|
||||
}
|
||||
int remainder = data[ len - 1 ];
|
||||
if ( remainder < 0 || remainder > 16 || remainder > len ) {
|
||||
throw new IllegalArgumentException();
|
||||
}
|
||||
len -= remainder;
|
||||
byte[] buff = new byte[ len ];
|
||||
System.arraycopy( data, 0, buff, 0, len );
|
||||
return buff;
|
||||
}
|
||||
|
||||
public static byte[] pkcsRemovePadding(byte[] data){
|
||||
return pkcsRemovePadding( data, data.length );
|
||||
}
|
||||
|
||||
|
||||
public static String bytes2HexString(byte[] b) {
|
||||
StringBuilder bs = new StringBuilder();
|
||||
|
||||
for (int i = 0; i < b.length; ++i) {
|
||||
String hex = Integer.toHexString(b[i] & 255);
|
||||
if (hex.length() == 1) {
|
||||
hex = '0' + hex;
|
||||
}
|
||||
|
||||
bs.append(hex.toUpperCase());
|
||||
}
|
||||
|
||||
return bs.toString();
|
||||
}
|
||||
|
||||
public static String bytes2HexString(byte[] b, int len) {
|
||||
StringBuilder bs = new StringBuilder();
|
||||
|
||||
for (int i = 0; i < len; ++i) {
|
||||
String hex = Integer.toHexString(b[i] & 255);
|
||||
if (hex.length() == 1) {
|
||||
hex = '0' + hex;
|
||||
}
|
||||
|
||||
bs.append(hex.toUpperCase());
|
||||
}
|
||||
|
||||
return bs.toString();
|
||||
}
|
||||
|
||||
private static byte charToByte(char c) {
|
||||
return (byte) "0123456789ABCDEF".indexOf(c);
|
||||
}
|
||||
|
||||
public static byte[] hexString2Bytes(String hex) {
|
||||
if (hex != null && !hex.equals("")) {
|
||||
if (hex.length() % 2 != 0) {
|
||||
return new byte[0];
|
||||
} else {
|
||||
hex = hex.toUpperCase();
|
||||
int len = hex.length() / 2;
|
||||
byte[] b = new byte[len];
|
||||
char[] hc = hex.toCharArray();
|
||||
|
||||
for (int i = 0; i < len; ++i) {
|
||||
int p = 2 * i;
|
||||
b[i] = (byte) (charToByte(hc[p]) << 4 | charToByte(hc[p + 1]) & 0xff );
|
||||
}
|
||||
|
||||
return b;
|
||||
}
|
||||
} else {
|
||||
return new byte[0];
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public static byte[] safeStringBytes(String str){
|
||||
if ( null == str || str.isEmpty()) {
|
||||
return new byte[] { 0x30 };
|
||||
}
|
||||
int len = str.getBytes().length;
|
||||
byte[] ret = new byte[len + 1];
|
||||
System.arraycopy(str.getBytes(), 0, ret, 0, len);
|
||||
return ret;
|
||||
}
|
||||
}
|
BIN
src/main/resources/linux-aarch64/libsdf.so
(Stored with Git LFS)
Normal file
BIN
src/main/resources/linux-aarch64/libsdf.so
(Stored with Git LFS)
Normal file
Binary file not shown.
BIN
src/main/resources/linux-x86-64/libsdf.so
(Stored with Git LFS)
Normal file
BIN
src/main/resources/linux-x86-64/libsdf.so
(Stored with Git LFS)
Normal file
Binary file not shown.
BIN
src/main/resources/win32-x86-64/sdf.dll
(Stored with Git LFS)
Normal file
BIN
src/main/resources/win32-x86-64/sdf.dll
(Stored with Git LFS)
Normal file
Binary file not shown.
117
src/test/java/MutiThreads.java
Normal file
117
src/test/java/MutiThreads.java
Normal file
@ -0,0 +1,117 @@
|
||||
import com.sun.jna.Pointer;
|
||||
import com.sun.jna.ptr.IntByReference;
|
||||
import com.sun.jna.ptr.PointerByReference;
|
||||
import com.sunyard.security.sdf.AlgorithmEnum;
|
||||
import com.sunyard.security.sdf.SDFJna;
|
||||
import com.sunyard.security.util.ByteUtil;
|
||||
import org.junit.After;
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
|
||||
public class MutiThreads {
|
||||
|
||||
private PointerByReference phDeviceHandle = new PointerByReference();
|
||||
|
||||
private static final byte[] data = new byte[16];
|
||||
private static final byte[] symKey = new byte[]{9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9};
|
||||
private static final String ip = "172.16.17.245";
|
||||
|
||||
private static final int thread_max = 16;
|
||||
private static final int func_maxcall = 10000;
|
||||
|
||||
@Before
|
||||
public void before(){
|
||||
// 打开设备
|
||||
int ret = SDFJna.INSTANCE.SDF_OpenDevice(
|
||||
phDeviceHandle,
|
||||
ByteUtil.safeStringBytes(ip),
|
||||
8889,
|
||||
3000,
|
||||
3000,
|
||||
0);
|
||||
|
||||
if (ret != 0) {
|
||||
System.err.println("打开设备失败 错误码:" + String.format("0x%02X", ret));
|
||||
throw new RuntimeException(String.format("0x%02X", ret));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@After
|
||||
public void after(){
|
||||
if ( null != phDeviceHandle.getValue() ) {
|
||||
SDFJna.INSTANCE.SDF_CloseDevice(phDeviceHandle.getValue());
|
||||
}
|
||||
}
|
||||
|
||||
private void genSessionKey(PointerByReference phSessionHandle, PointerByReference phkeyHandle){
|
||||
|
||||
int ret = SDFJna.INSTANCE.SDF_ImportKey(phSessionHandle.getValue(), symKey, symKey.length ,phkeyHandle);
|
||||
if (ret != 0) {
|
||||
throw new RuntimeException("genSessionKey " + String.format("0x%02X", ret));
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 多线程加解密
|
||||
*/
|
||||
@Test
|
||||
public void sm4_en(){
|
||||
System.out.println(" sm4 en 测试开始");
|
||||
|
||||
Thread[] threads = new Thread[thread_max];
|
||||
for ( int i = 0; i < thread_max; i++ ) {
|
||||
threads[i] = new Thread(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
|
||||
PointerByReference phSessionHandle = new PointerByReference();
|
||||
try {
|
||||
Pointer hDeviceHandle = phDeviceHandle.getValue();
|
||||
// 打开会话
|
||||
int ret = SDFJna.INSTANCE.SDF_OpenSession(hDeviceHandle, phSessionHandle);
|
||||
if (ret != 0) {
|
||||
System.err.println("打开设备失败 错误码:" + String.format("0x%02X", ret));
|
||||
throw new RuntimeException(String.format("0x%02X", ret));
|
||||
}
|
||||
|
||||
PointerByReference phkeyHandle = new PointerByReference();
|
||||
genSessionKey(phSessionHandle, phkeyHandle);
|
||||
|
||||
for (int c= 0; c < func_maxcall; c++ ) {
|
||||
byte[] enData = new byte[32];
|
||||
IntByReference intByReference = new IntByReference();
|
||||
ret = SDFJna.INSTANCE.SDF_Encrypt(phSessionHandle.getValue(), phkeyHandle.getValue(), AlgorithmEnum.SGD_SM4_ECB.getValue(), null, data, data.length, enData, intByReference);
|
||||
if (ret != 0) {
|
||||
throw new RuntimeException("加密失败 " + String.format("0x%02X", ret));
|
||||
}
|
||||
}
|
||||
} finally {
|
||||
if ( null != phSessionHandle.getValue() ) {
|
||||
SDFJna.INSTANCE.SDF_CloseSession( phSessionHandle.getValue() );
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
long start = System.currentTimeMillis();
|
||||
for (Thread thread : threads) {
|
||||
thread.start();
|
||||
}
|
||||
|
||||
for (Thread thread : threads) {
|
||||
try {
|
||||
thread.join();
|
||||
} catch (InterruptedException e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
}
|
||||
|
||||
long end = System.currentTimeMillis();
|
||||
long delta = end - start;
|
||||
double p = (double) thread_max * func_maxcall * 1000.0 / delta;
|
||||
System.out.println( " sm4 en " + p + "TPS");
|
||||
}
|
||||
|
||||
}
|
259
src/test/java/SDFTest.java
Normal file
259
src/test/java/SDFTest.java
Normal file
@ -0,0 +1,259 @@
|
||||
import com.sun.jna.Pointer;
|
||||
import com.sun.jna.ptr.IntByReference;
|
||||
import com.sun.jna.ptr.PointerByReference;
|
||||
import com.sunyard.security.sdf.AlgorithmEnum;
|
||||
import com.sunyard.security.sdf.SDFJna;
|
||||
import com.sunyard.security.util.ByteUtil;
|
||||
import org.junit.After;
|
||||
import org.junit.Assert;
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
|
||||
public class SDFTest {
|
||||
|
||||
private PointerByReference phDeviceHandle = new PointerByReference();
|
||||
private PointerByReference phSessionHandle = new PointerByReference();;
|
||||
private static final byte[] data = new byte[16];
|
||||
private static final byte[] symKey = new byte[]{9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9};
|
||||
private static final String ip = "172.16.17.245";
|
||||
|
||||
|
||||
@Before
|
||||
public void before(){
|
||||
// 打开设备
|
||||
int ret = SDFJna.INSTANCE.SDF_OpenDevice(
|
||||
phDeviceHandle,
|
||||
ByteUtil.safeStringBytes(ip),
|
||||
8889,
|
||||
3000,
|
||||
3000,
|
||||
0);
|
||||
|
||||
if (ret != 0) {
|
||||
System.err.println("打开设备失败 错误码:" + String.format("0x%02X", ret));
|
||||
throw new RuntimeException(String.format("0x%02X", ret));
|
||||
}
|
||||
Pointer hDeviceHandle = phDeviceHandle.getValue();
|
||||
// 打开会话
|
||||
ret = SDFJna.INSTANCE.SDF_OpenSession(hDeviceHandle, phSessionHandle);
|
||||
if (ret != 0) {
|
||||
System.err.println("打开设备失败 错误码:" + String.format("0x%02X", ret));
|
||||
throw new RuntimeException(String.format("0x%02X", ret));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@After
|
||||
public void after(){
|
||||
if ( null != phSessionHandle.getValue() ) {
|
||||
SDFJna.INSTANCE.SDF_CloseSession( phSessionHandle.getValue() );
|
||||
}
|
||||
if ( null != phDeviceHandle.getValue() ) {
|
||||
SDFJna.INSTANCE.SDF_CloseDevice(phDeviceHandle.getValue());
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public void random(){
|
||||
|
||||
int oneSize = 16;
|
||||
byte[] oneRadom = new byte[16]; // 注意这里初始化大小应为 oneSize
|
||||
int ret = SDFJna.INSTANCE.SDF_GenerateRandom( phSessionHandle.getValue(), oneSize, oneRadom );
|
||||
|
||||
if (ret != 0) {
|
||||
throw new RuntimeException(String.format("0x%02X", ret));
|
||||
} else {
|
||||
System.out.println("调用成功");
|
||||
}
|
||||
Assert.assertEquals( ret, 0 );
|
||||
System.out.println( ByteUtil.bytes2HexString( oneRadom ) );
|
||||
}
|
||||
|
||||
|
||||
private void genSessionKey(PointerByReference phkeyHandle){
|
||||
|
||||
int ret = SDFJna.INSTANCE.SDF_ImportKey(phSessionHandle.getValue(), symKey, symKey.length ,phkeyHandle);
|
||||
if (ret != 0) {
|
||||
throw new RuntimeException("genSessionKey " + String.format("0x%02X", ret));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* SDF 接口内没有填充
|
||||
* 输入数据必须 16 的整倍数
|
||||
*/
|
||||
@Test
|
||||
public void sym_ecb(){
|
||||
int ret = 0;
|
||||
PointerByReference phkeyHandle = new PointerByReference();
|
||||
genSessionKey(phkeyHandle);
|
||||
|
||||
|
||||
System.out.println( "data=" + ByteUtil.bytes2HexString( data ));
|
||||
byte[] enData = new byte[32];
|
||||
IntByReference intByReference = new IntByReference();
|
||||
ret = SDFJna.INSTANCE.SDF_Encrypt(phSessionHandle.getValue(), phkeyHandle.getValue(), AlgorithmEnum.SGD_SM4_ECB.getValue(), null, data, data.length, enData, intByReference);
|
||||
if (ret != 0) {
|
||||
throw new RuntimeException("加密失败 " + String.format("0x%02X", ret));
|
||||
}
|
||||
System.out.println( intByReference.getValue() );
|
||||
System.out.println( "enData=" + ByteUtil.bytes2HexString( enData ));
|
||||
byte[] rawData = new byte[32];
|
||||
ret = SDFJna.INSTANCE.SDF_Decrypt(phSessionHandle.getValue(), phkeyHandle.getValue(), AlgorithmEnum.SGD_SM4_ECB.getValue(), null, enData, intByReference.getValue(), rawData, intByReference);
|
||||
if (ret != 0) {
|
||||
throw new RuntimeException("解密失败 " + String.format("0x%02X", ret));
|
||||
}
|
||||
System.out.println("长度" + intByReference.getValue());
|
||||
System.out.println( "rawData=" + ByteUtil.bytes2HexString( rawData , intByReference.getValue()));
|
||||
}
|
||||
|
||||
|
||||
@Test
|
||||
public void sym_cbc(){
|
||||
int ret = 0;
|
||||
PointerByReference phkeyHandle = new PointerByReference();
|
||||
genSessionKey(phkeyHandle);
|
||||
|
||||
byte[] iv = new byte[16];
|
||||
|
||||
System.out.println( "data=" + ByteUtil.bytes2HexString( data ));
|
||||
byte[] enData = new byte[32];
|
||||
IntByReference intByReference = new IntByReference();
|
||||
ret = SDFJna.INSTANCE.SDF_Encrypt(phSessionHandle.getValue(), phkeyHandle.getValue(), AlgorithmEnum.SGD_SM4_CBC.getValue(), iv, data, data.length, enData, intByReference);
|
||||
if (ret != 0) {
|
||||
throw new RuntimeException("加密失败 " + String.format("0x%02X", ret));
|
||||
}
|
||||
System.out.println( intByReference.getValue() );
|
||||
System.out.println( "enData=" + ByteUtil.bytes2HexString( enData ));
|
||||
byte[] rawData = new byte[32];
|
||||
iv = new byte[16];
|
||||
ret = SDFJna.INSTANCE.SDF_Decrypt(phSessionHandle.getValue(), phkeyHandle.getValue(), AlgorithmEnum.SGD_SM4_CBC.getValue(), iv, enData, intByReference.getValue(), rawData, intByReference);
|
||||
if (ret != 0) {
|
||||
throw new RuntimeException("解密失败 " + String.format("0x%02X", ret));
|
||||
}
|
||||
System.out.println( "rawData=" + ByteUtil.bytes2HexString( rawData , intByReference.getValue()));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void mac(){
|
||||
int ret = 0;
|
||||
PointerByReference phkeyHandle = new PointerByReference();
|
||||
genSessionKey(phkeyHandle);
|
||||
|
||||
byte[] mac = new byte[32];
|
||||
IntByReference macLen = new IntByReference();
|
||||
ret = SDFJna.INSTANCE.SDF_CalculateMAC(phSessionHandle.getValue(),
|
||||
phkeyHandle.getValue(),
|
||||
AlgorithmEnum.SGD_SM4_MAC.getValue(),
|
||||
new byte[16],
|
||||
data,
|
||||
data.length,
|
||||
mac,
|
||||
macLen
|
||||
);
|
||||
if (ret != 0) {
|
||||
throw new RuntimeException("CalculateMAC " + String.format("0x%02X", ret));
|
||||
}
|
||||
System.out.println( ByteUtil.bytes2HexString( mac , macLen.getValue()) );
|
||||
}
|
||||
|
||||
|
||||
@Test
|
||||
public void hash(){
|
||||
int ret = 0;
|
||||
byte[] mac = new byte[32];
|
||||
IntByReference macLen = new IntByReference();
|
||||
|
||||
ret = SDFJna.INSTANCE.SDF_HashInit( phSessionHandle.getValue(), AlgorithmEnum.SGD_SM3.getValue(), null, null, 0 );
|
||||
if (ret != 0) {
|
||||
throw new RuntimeException("HashInit " + String.format("0x%02X", ret));
|
||||
}
|
||||
ret = SDFJna.INSTANCE.SDF_HashUpdate(phSessionHandle.getValue(), data, data.length);
|
||||
if (ret != 0) {
|
||||
throw new RuntimeException("HashUpdate " + String.format("0x%02X", ret));
|
||||
}
|
||||
ret = SDFJna.INSTANCE.SDF_HashFinal(phSessionHandle.getValue(), mac, macLen);
|
||||
if (ret != 0) {
|
||||
throw new RuntimeException("HashFinal " + String.format("0x%02X", ret));
|
||||
}
|
||||
System.out.println( ByteUtil.bytes2HexString( mac , macLen.getValue()) );
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 非对称 签名验签
|
||||
* 外部密钥
|
||||
*/
|
||||
@Test
|
||||
public void asym_ext_sv(){
|
||||
byte[] puk = new byte[256];
|
||||
byte[] pak = new byte[256];
|
||||
byte[] hash = new byte[32];
|
||||
int ret = SDFJna.INSTANCE.SDF_GenerateKeyPair_ECC(phSessionHandle.getValue(), AlgorithmEnum.SGD_SM2.getValue(), 256, puk, pak);
|
||||
if (ret != 0) {
|
||||
throw new RuntimeException("生成非对称密钥 " + String.format("0x%02X", ret));
|
||||
}
|
||||
|
||||
byte[] sign = new byte[512];
|
||||
ret = SDFJna.INSTANCE.SDF_ExternalSign_ECC(
|
||||
phSessionHandle.getValue(),
|
||||
AlgorithmEnum.SGD_SM2.getValue(), pak, hash, hash.length, sign
|
||||
);
|
||||
if (ret != 0) {
|
||||
throw new RuntimeException("ExternalSign_ECC " + String.format("0x%02X", ret));
|
||||
}
|
||||
|
||||
// 验签
|
||||
ret = SDFJna.INSTANCE.SDF_ExternalVerify_ECC(phSessionHandle.getValue(), AlgorithmEnum.SGD_SM2.getValue(), puk, hash, hash.length, sign);
|
||||
if (ret != 0) {
|
||||
throw new RuntimeException("ExternalSign_ECC " + String.format("0x%02X", ret));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 非对称 加密解密
|
||||
* 外部密钥
|
||||
*/
|
||||
@Test
|
||||
public void asym_en(){
|
||||
|
||||
byte[] puk = new byte[256];
|
||||
byte[] pak = new byte[256];
|
||||
int ret = SDFJna.INSTANCE.SDF_GenerateKeyPair_ECC(phSessionHandle.getValue(), AlgorithmEnum.SGD_SM2.getValue(), 256, puk, pak);
|
||||
if (ret != 0) {
|
||||
throw new RuntimeException("生成非对称密钥 " + String.format("0x%02X", ret));
|
||||
}
|
||||
|
||||
|
||||
System.out.println( "ret= " + ret);
|
||||
System.out.println( "puk= " + ByteUtil.bytes2HexString( puk ));
|
||||
System.out.println( "pak= " + ByteUtil.bytes2HexString( pak ));
|
||||
|
||||
|
||||
|
||||
byte[] enc = new byte[512];
|
||||
ret = SDFJna.INSTANCE.SDF_ExternalEncrypt_ECC(
|
||||
phSessionHandle.getValue(),
|
||||
AlgorithmEnum.SGD_SM2.getValue(),
|
||||
puk,
|
||||
data, data.length, enc
|
||||
);
|
||||
if (ret != 0) {
|
||||
throw new RuntimeException("ExternalEncrypt_ECC " + String.format("0x%02X", ret));
|
||||
}
|
||||
|
||||
byte[] buffer = new byte[512];
|
||||
IntByReference bufferLen = new IntByReference( buffer.length );
|
||||
ret = SDFJna.INSTANCE.SDF_ExternalDecrypt_ECC(
|
||||
phSessionHandle.getValue(),
|
||||
AlgorithmEnum.SGD_SM2.getValue(),
|
||||
pak,
|
||||
enc, buffer, bufferLen
|
||||
);
|
||||
if (ret != 0) {
|
||||
throw new RuntimeException("ExternalEncrypt_ECC " + String.format("0x%02X", ret));
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user