Compare commits
56
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
c79aae14e8 | ||
|
|
cec433ad3b | ||
|
|
555da388ef | ||
|
|
dd44703a33 | ||
|
|
c8577571a6 | ||
|
|
374ddad9bc | ||
|
|
ecd2d6cfe1 | ||
|
|
55c00b6579 | ||
|
|
6cd738a172 | ||
|
|
2c8638a167 | ||
|
|
9c4c19d271 | ||
|
|
17a40377d7 | ||
|
|
18aa757871 | ||
|
|
a452376d8d | ||
|
|
7a4a83e6d0 | ||
|
|
b212a265ee | ||
|
|
c9a224f810 | ||
|
|
09f5516792 | ||
|
|
3965146c77 | ||
|
|
12b53a2e0f | ||
|
|
48d9719fbc | ||
|
|
882e84320c | ||
|
|
12bdac2d7c | ||
|
|
31f8c9155e | ||
|
|
09a910006f | ||
|
|
83e5033ba0 | ||
|
|
664bd110c6 | ||
|
|
b82002801d | ||
|
|
d6a27f3341 | ||
|
|
01be8429be | ||
|
|
799f3763d1 | ||
|
|
76809e5521 | ||
|
|
983dc8a47d | ||
|
|
0dc2d7c026 | ||
|
|
02fd07def2 | ||
|
|
10d9d1b0d6 | ||
|
|
b8322538e7 | ||
|
|
83802b6ef6 | ||
|
|
9062a9c17c | ||
|
|
88f4bdf603 | ||
|
|
385e77b766 | ||
|
|
5259876780 | ||
|
|
f7fa777677 | ||
|
|
1439f4aa63 | ||
|
|
d1c8201f98 | ||
|
|
914ba8eee5 | ||
|
|
e8a62c1d4a | ||
|
|
8de764c731 | ||
|
|
1df1e64783 | ||
|
|
6df9d978d5 | ||
|
|
7e4bc7f87b | ||
|
|
1f2709326f | ||
|
|
d80e225158 | ||
|
|
4372362086 | ||
|
|
b4d3c1d193 | ||
|
|
9fbcd1baad |
@@ -14,3 +14,4 @@ src/test/java/com/sunyard/sydapi/sample/*.*
|
|||||||
~$*
|
~$*
|
||||||
/pack/
|
/pack/
|
||||||
/.logs/
|
/.logs/
|
||||||
|
/bin/
|
||||||
|
|||||||
+2
-2
@@ -50,8 +50,8 @@
|
|||||||
</options>
|
</options>
|
||||||
</error>
|
</error>
|
||||||
|
|
||||||
<pk len="32" cn="公钥"></pk>
|
<pk len="128" cn="公钥"></pk>
|
||||||
<sk len="160" cn="私钥"></sk>
|
<sk len="64" cn="私钥"></sk>
|
||||||
</data>
|
</data>
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -1,3 +1,24 @@
|
|||||||
# sydapi4j
|
# sydapi4j
|
||||||
|
|
||||||
加密机 java 接口,基于 jna。
|
加密机 java 接口,基于 jna。
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
## 启动 Slave
|
||||||
|
在作为负载机的 Slave 机器上进行配置,主要有两种方式:
|
||||||
|
|
||||||
|
方法一:配置 jmeter.properties 文件
|
||||||
|
编辑 $JMETER_HOME/bin/jmeter.properties 文件,确认或取消注释以下配置:
|
||||||
|
```
|
||||||
|
server.rmi.ssl.disable=true # 禁用SSL,简化内网配置
|
||||||
|
server.rmi.localport=1099 # 固定RMI端口,方便防火墙放行
|
||||||
|
java.rmi.server.hostname=Slave_IP # 绑定本机网卡IP,避免多网卡问题
|
||||||
|
```
|
||||||
|
|
||||||
|
配置完成后,在 Slave 的 bin 目录下启动服务:
|
||||||
|
|
||||||
|
Windows: 双击 jmeter-server.bat
|
||||||
|
Linux/Mac: 运行 ./jmeter-server
|
||||||
|
|
||||||
|
./jmeter-server -Djava.rmi.server.hostname=172.1.41.24 -Dserver.rmi.localport=1099
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,30 @@
|
|||||||
|
<assembly xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0"
|
||||||
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
|
xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0
|
||||||
|
http://maven.apache.org/xsd/assembly-1.1.0.xsd">
|
||||||
|
<id>assembled-test-jar</id>
|
||||||
|
<formats>
|
||||||
|
<format>jar</format>
|
||||||
|
</formats>
|
||||||
|
<includeBaseDirectory>false</includeBaseDirectory>
|
||||||
|
<fileSets>
|
||||||
|
<!-- 打包主代码 -->
|
||||||
|
<fileSet>
|
||||||
|
<directory>${project.build.outputDirectory}</directory>
|
||||||
|
<outputDirectory>/</outputDirectory>
|
||||||
|
</fileSet>
|
||||||
|
<!-- 打包测试代码 -->
|
||||||
|
<fileSet>
|
||||||
|
<directory>${project.build.testOutputDirectory}</directory>
|
||||||
|
<outputDirectory>/</outputDirectory>
|
||||||
|
</fileSet>
|
||||||
|
</fileSets>
|
||||||
|
<!-- 打包依赖的Jar包 -->
|
||||||
|
<dependencySets>
|
||||||
|
<dependencySet>
|
||||||
|
<outputDirectory>/</outputDirectory>
|
||||||
|
<unpack>true</unpack>
|
||||||
|
<scope>runtime</scope>
|
||||||
|
</dependencySet>
|
||||||
|
</dependencySets>
|
||||||
|
</assembly>
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
{
|
||||||
|
"ip1": "172.1.41.3",
|
||||||
|
"ip2": "172.1.41.139",
|
||||||
|
"port": 8889,
|
||||||
|
"dn": "C=cn,O=CFCA OCA1 SM2,OU=Local RA OCA1,OU=Units,CN=041@N91330108762038374D@杭州信雅达科技有限公司@00000002"
|
||||||
|
}
|
||||||
+3849
File diff suppressed because it is too large
Load Diff
@@ -4,7 +4,7 @@
|
|||||||
|
|
||||||
<groupId>com.sunyard</groupId>
|
<groupId>com.sunyard</groupId>
|
||||||
<artifactId>sydapi4j</artifactId>
|
<artifactId>sydapi4j</artifactId>
|
||||||
<version>1.0.2022-SNAPSHOT</version>
|
<version>2.01</version>
|
||||||
<packaging>jar</packaging>
|
<packaging>jar</packaging>
|
||||||
|
|
||||||
<name>sydapi4j</name>
|
<name>sydapi4j</name>
|
||||||
@@ -32,7 +32,13 @@
|
|||||||
<version>1.0.3</version>
|
<version>1.0.3</version>
|
||||||
<scope>test</scope>
|
<scope>test</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
<!-- JMeter Java Sampler 核心依赖 -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.apache.jmeter</groupId>
|
||||||
|
<artifactId>ApacheJMeter_java</artifactId>
|
||||||
|
<version>5.4.3</version>
|
||||||
|
<scope>provided</scope>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>com.sunyard</groupId>
|
<groupId>com.sunyard</groupId>
|
||||||
@@ -50,8 +56,6 @@
|
|||||||
</exclusions>
|
</exclusions>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>com.google.zxing</groupId>
|
<groupId>com.google.zxing</groupId>
|
||||||
<artifactId>core</artifactId>
|
<artifactId>core</artifactId>
|
||||||
@@ -63,26 +67,16 @@
|
|||||||
<version>3.5.0</version>
|
<version>3.5.0</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.apache.jmeter</groupId>
|
|
||||||
<artifactId>ApacheJMeter_java</artifactId>
|
|
||||||
<version>5.4.3</version>
|
|
||||||
<scope>provided</scope>
|
|
||||||
</dependency>
|
|
||||||
|
|
||||||
|
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.bouncycastle</groupId>
|
<groupId>org.bouncycastle</groupId>
|
||||||
<artifactId>bcpkix-jdk15on</artifactId>
|
<artifactId>bcpkix-jdk15on</artifactId>
|
||||||
<version>1.68</version>
|
<version>1.68</version>
|
||||||
<!-- <scope>provided</scope>-->
|
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.bouncycastle</groupId>
|
<groupId>org.bouncycastle</groupId>
|
||||||
<artifactId>bcprov-jdk15on</artifactId>
|
<artifactId>bcprov-jdk15on</artifactId>
|
||||||
<version>1.68</version>
|
<version>1.68</version>
|
||||||
<!-- <scope>provided</scope>-->
|
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
<!-- https://mvnrepository.com/artifact/cn.hutool/hutool-all -->
|
<!-- https://mvnrepository.com/artifact/cn.hutool/hutool-all -->
|
||||||
@@ -104,29 +98,6 @@
|
|||||||
<artifactId>gson</artifactId>
|
<artifactId>gson</artifactId>
|
||||||
<version>2.13.1</version>
|
<version>2.13.1</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
<!-- <dependency>-->
|
|
||||||
<!-- <groupId>org.codehaus.groovy</groupId>-->
|
|
||||||
<!-- <artifactId>groovy-all</artifactId>-->
|
|
||||||
<!-- <version>3.0.9</version>-->
|
|
||||||
<!-- <version>4.0.26</version>-->
|
|
||||||
<!-- </dependency>-->
|
|
||||||
<!-- <dependency>-->
|
|
||||||
<!-- <groupId>ch.qos.logback</groupId>-->
|
|
||||||
<!-- <artifactId>logback-classic</artifactId>-->
|
|
||||||
<!-- <version>1.3.15</version>-->
|
|
||||||
<!-- <scope>compile</scope>-->
|
|
||||||
<!-- </dependency>-->
|
|
||||||
|
|
||||||
<!--<dependency>-->
|
|
||||||
<!--<groupId>club.fullstack</groupId>-->
|
|
||||||
<!--<artifactId>serialize</artifactId>-->
|
|
||||||
<!--<version>[1.0.201806051035, 1.1.SNAPSHOT)</version>-->
|
|
||||||
<!--</dependency>-->
|
|
||||||
|
|
||||||
|
|
||||||
<!-- https://mvnrepository.com/artifact/com.github.wvengen/proguard-maven-plugin -->
|
|
||||||
<!-- https://mvnrepository.com/artifact/com.github.wvengen/proguard-maven-plugin -->
|
|
||||||
</dependencies>
|
</dependencies>
|
||||||
<build>
|
<build>
|
||||||
<finalName>sydapi4j</finalName>
|
<finalName>sydapi4j</finalName>
|
||||||
@@ -136,7 +107,6 @@
|
|||||||
<groupId>org.codehaus.groovy</groupId>
|
<groupId>org.codehaus.groovy</groupId>
|
||||||
<artifactId>groovy-eclipse-compiler</artifactId>
|
<artifactId>groovy-eclipse-compiler</artifactId>
|
||||||
<version>2.9.2-01</version>
|
<version>2.9.2-01</version>
|
||||||
<!-- <version>3.5.0-01</version>-->
|
|
||||||
<extensions>true</extensions>
|
<extensions>true</extensions>
|
||||||
</plugin>
|
</plugin>
|
||||||
|
|
||||||
@@ -212,22 +182,6 @@
|
|||||||
</executions>
|
</executions>
|
||||||
</plugin>
|
</plugin>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<plugin>
|
|
||||||
<groupId>org.apache.maven.plugins</groupId>
|
|
||||||
<artifactId>maven-jar-plugin</artifactId>
|
|
||||||
<configuration>
|
|
||||||
<archive>
|
|
||||||
<manifest>
|
|
||||||
<addClasspath>true</addClasspath>
|
|
||||||
<classpathPrefix>lib/</classpathPrefix>
|
|
||||||
<mainClass>com.xxx.uploadFile</mainClass>
|
|
||||||
</manifest>
|
|
||||||
</archive>
|
|
||||||
</configuration>
|
|
||||||
</plugin>
|
|
||||||
|
|
||||||
<plugin>
|
<plugin>
|
||||||
<groupId>org.apache.maven.plugins</groupId>
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
<artifactId>maven-dependency-plugin</artifactId>
|
<artifactId>maven-dependency-plugin</artifactId>
|
||||||
@@ -254,9 +208,12 @@
|
|||||||
<plugin>
|
<plugin>
|
||||||
<artifactId>maven-assembly-plugin</artifactId>
|
<artifactId>maven-assembly-plugin</artifactId>
|
||||||
<configuration>
|
<configuration>
|
||||||
|
<descriptors>
|
||||||
|
<descriptor>assembly.xml</descriptor>
|
||||||
|
</descriptors>
|
||||||
<archive>
|
<archive>
|
||||||
<manifest>
|
<manifest>
|
||||||
<mainClass>com.Sample.TestDemo</mainClass>
|
<mainClass>sample.TestDemo</mainClass>
|
||||||
</manifest>
|
</manifest>
|
||||||
</archive>
|
</archive>
|
||||||
<descriptorRefs>
|
<descriptorRefs>
|
||||||
|
|||||||
@@ -1,303 +0,0 @@
|
|||||||
package com.jmeter.test;
|
|
||||||
|
|
||||||
import com.google.gson.Gson;
|
|
||||||
import com.sunyard.SydApiException;
|
|
||||||
import com.sunyard.proto.Util;
|
|
||||||
import org.apache.jmeter.config.Arguments;
|
|
||||||
import org.apache.jmeter.protocol.java.sampler.AbstractJavaSamplerClient;
|
|
||||||
import org.apache.jmeter.protocol.java.sampler.JavaSamplerContext;
|
|
||||||
import org.apache.jmeter.samplers.SampleResult;
|
|
||||||
import racal.sunyard.main.SydApi4j;
|
|
||||||
import racal.sunyard.main.SydApiBuilder;
|
|
||||||
|
|
||||||
import java.nio.charset.StandardCharsets;
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
|
|
||||||
public class Test4Jemter extends AbstractJavaSamplerClient {
|
|
||||||
|
|
||||||
private String SM2dn ;
|
|
||||||
private String RSAdn ;
|
|
||||||
private String ip ;
|
|
||||||
|
|
||||||
private int port;
|
|
||||||
private String ip2 ;
|
|
||||||
private String oData;
|
|
||||||
private String sign;
|
|
||||||
|
|
||||||
private String detachedSign;
|
|
||||||
private byte[] orgData;
|
|
||||||
|
|
||||||
private int type;
|
|
||||||
|
|
||||||
private static ThreadLocal<SydApi4j> api;
|
|
||||||
|
|
||||||
private int dataLength;
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 定义默认的参数,在jmeter中会自动显示在这里定义的默认参数
|
|
||||||
* @return Arguments对象
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public Arguments getDefaultParameters() {
|
|
||||||
Arguments arguments = new Arguments();
|
|
||||||
arguments.addArgument("SM2dn", "C=CN,ST=zz,L=zz,O=zzz,CN=zzzzz");
|
|
||||||
arguments.addArgument("RSAdn", "C=cn,O=CFCA TEST CA,OU=NCS2,OU=Enterprises,CN=041@Z402451000010@ShanDong@00000001");
|
|
||||||
arguments.addArgument("orgData", "12345678");
|
|
||||||
arguments.addArgument("ip", "172.1.41.139");
|
|
||||||
arguments.addArgument("ip2", "172.1.41.96");
|
|
||||||
// arguments.addArgument("port", "8891");
|
|
||||||
// arguments.addArgument("ip2", "172.16.17.161");
|
|
||||||
arguments.addArgument("dataLength", "1024");
|
|
||||||
arguments.addArgument("type", "1");
|
|
||||||
arguments.addArgument("sign", "12345678");
|
|
||||||
arguments.addArgument("detachedSign", "12345678");
|
|
||||||
return arguments;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 在执行测试之前执行,只执行一次,可以获取传递过来的参数,一般用来做初始化操作
|
|
||||||
* @param context 可以获取jmeter传递过来的参数
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public void setupTest(JavaSamplerContext context) {
|
|
||||||
//对成员变量初始化
|
|
||||||
SM2dn = context.getParameter("SM2dn");
|
|
||||||
RSAdn = context.getParameter("RSAdn");
|
|
||||||
oData = context.getParameter("orgData");
|
|
||||||
ip = context.getParameter("ip");
|
|
||||||
ip2 = context.getParameter("ip2");
|
|
||||||
// port = Integer.parseInt(context.getParameter("8891"));
|
|
||||||
// ip2 = context.getParameter("ip2");
|
|
||||||
dataLength = context.getIntParameter("dataLength");
|
|
||||||
type = context.getIntParameter("type");
|
|
||||||
sign = context.getParameter("sign");
|
|
||||||
detachedSign = context.getParameter("detachedSign");
|
|
||||||
System.setProperty("com.sunyard.dnsort", "false");
|
|
||||||
api = new ThreadLocal<SydApi4j>() {
|
|
||||||
@Override
|
|
||||||
public SydApi4j initialValue() {
|
|
||||||
//
|
|
||||||
// SydApiBuilder builder = new SydApiBuilder().setIp(ip);
|
|
||||||
// final SydApi4j api = (SydApi4j) builder.build();
|
|
||||||
SydApi4j.SYD_Set_Parameter_HA(ip, ip2, 8889, 1000);
|
|
||||||
final SydApi4j api1 = (SydApi4j) new SydApi4j();
|
|
||||||
return api1;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 真正的测试代码块,jmeter按照配置的逻辑执行该方法
|
|
||||||
* @param javaSamplerContext 上下文对象,可以获取jmeter传递的参数
|
|
||||||
* @return SampleResult对象用于封装结果
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public SampleResult runTest(JavaSamplerContext javaSamplerContext) {
|
|
||||||
SampleResult sr = new SampleResult();
|
|
||||||
//设置标签
|
|
||||||
sr.setSampleLabel("testDemo");
|
|
||||||
//设置开始标志,否则无法统计tps等
|
|
||||||
sr.sampleStart();
|
|
||||||
try {
|
|
||||||
// orgData = oData.getBytes(); //SM2裸签
|
|
||||||
orgData = new byte[dataLength];
|
|
||||||
//执行业务逻辑
|
|
||||||
switch(type){
|
|
||||||
case 1:
|
|
||||||
// api.get().SYD_NakedSign(SM2dn, orgData, (byte[]) null);
|
|
||||||
api.get().SYD_NakedSign(orgData,SM2dn);
|
|
||||||
sr.setResponseCodeOK();
|
|
||||||
//sr.setResponseData(Util.encodeBase64(nakedSign1), StandardCharsets.UTF_8.displayName());
|
|
||||||
break;
|
|
||||||
|
|
||||||
|
|
||||||
case 2:
|
|
||||||
// api.get().SYD_NakedVerify(SM2dn, Util.decodeBase64(sign), orgData, (byte[])null) ;
|
|
||||||
api.get().SYD_NakedVerify(orgData,Util.hexString2Bytes(sign), SM2dn);
|
|
||||||
sr.setResponseCodeOK();
|
|
||||||
//sr.setResponseData(String.valueOf(nakedVerify1), StandardCharsets.UTF_8.displayName());
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 3:
|
|
||||||
//RSA裸签
|
|
||||||
api.get().SYD_NakedSign(1, RSAdn,orgData,(byte[])null);
|
|
||||||
sr.setResponseCodeOK();
|
|
||||||
//sr.setResponseData(Util.encodeBase64(nakedSign2), StandardCharsets.UTF_8.displayName());
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 4:
|
|
||||||
api.get().SYD_NakedVerify(1, RSAdn,Util.decodeBase64(sign),orgData ,(byte[])null);
|
|
||||||
sr.setResponseCodeOK();
|
|
||||||
//sr.setResponseData(String.valueOf(nakedVerify2), StandardCharsets.UTF_8.displayName());
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 5:
|
|
||||||
// api.get().detachedSign(1, orgData, SM2dn);
|
|
||||||
api.get().detachedSign(orgData, SM2dn);
|
|
||||||
sr.setResponseCodeOK();
|
|
||||||
//sr.setResponseData(detSign1, StandardCharsets.UTF_8.displayName());
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 6:
|
|
||||||
// api.get().detachedVerify(1, orgData, sign);
|
|
||||||
api.get().detachedVerify(orgData, detachedSign);
|
|
||||||
sr.setResponseCodeOK();
|
|
||||||
//sr.setResponseData(String.valueOf(detV1), StandardCharsets.UTF_8.displayName());
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 7:
|
|
||||||
api.get().detachedSign(2,1, orgData, RSAdn);
|
|
||||||
sr.setResponseCodeOK();
|
|
||||||
//sr.setResponseData(detSign2, StandardCharsets.UTF_8.displayName());
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 8:
|
|
||||||
api.get().detachedVerify(2,2, orgData, sign);
|
|
||||||
sr.setResponseCodeOK();
|
|
||||||
//sr.setResponseData(String.valueOf(detV2), StandardCharsets.UTF_8.displayName());
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 9:
|
|
||||||
api.get().attachedSignHsm(orgData, SM2dn);
|
|
||||||
sr.setResponseCodeOK();
|
|
||||||
//sr.setResponseData(attSign1, StandardCharsets.UTF_8.displayName());
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 10:
|
|
||||||
api.get().attachedVerify( sign.getBytes());
|
|
||||||
sr.setResponseCodeOK();
|
|
||||||
// sr.setResponseData(String.valueOf(attV1), StandardCharsets.UTF_8.displayName());
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 11:
|
|
||||||
api.get().attachedSignRSAHsm(2, orgData, RSAdn);
|
|
||||||
sr.setResponseCodeOK();
|
|
||||||
// sr.setResponseData(attSign2, StandardCharsets.UTF_8.displayName());
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 12:
|
|
||||||
api.get().attachedVerifyRSA(2, sign);
|
|
||||||
sr.setResponseCodeOK();
|
|
||||||
// sr.setResponseData(String.valueOf(attV2), StandardCharsets.UTF_8.displayName());
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 13:
|
|
||||||
api.get().generateDE(SM2dn.getBytes(), 3, 1, orgData);
|
|
||||||
// byte[] cipherKey = (byte[]) genSM2.get(SydApi.RET_CIPHER_KEY);
|
|
||||||
sr.setResponseCodeOK();
|
|
||||||
// sr.setResponseData(new String(cipherKey), StandardCharsets.UTF_8.displayName());
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 14:
|
|
||||||
api.get().decryptDE(true, 1, SM2dn.getBytes(), sign);;
|
|
||||||
// byte[] oData = (byte[]) denSM2.get("oData");
|
|
||||||
sr.setResponseCodeOK();
|
|
||||||
// sr.setResponseData(new String(oData), StandardCharsets.UTF_8.displayName());
|
|
||||||
break;
|
|
||||||
|
|
||||||
|
|
||||||
case 15:
|
|
||||||
api.get(). generateDE(RSAdn.getBytes(), 4, 1, orgData);
|
|
||||||
// byte[] cipherKeyRSA = (byte[]) genRSA.get(SydApi.RET_CIPHER_KEY);
|
|
||||||
sr.setResponseCodeOK();
|
|
||||||
//sr.setResponseData(new String(cipherKeyRSA), StandardCharsets.UTF_8.displayName());
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 16:
|
|
||||||
api.get().decryptDERSA(true, 1, RSAdn.getBytes(), sign);
|
|
||||||
// byte[] oDataRSA = (byte[]) denRSA.get("oData");
|
|
||||||
sr.setResponseCodeOK();
|
|
||||||
//sr.setResponseData(new String(oDataRSA), StandardCharsets.UTF_8.displayName());
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 17:
|
|
||||||
sr.setResponseCodeOK();
|
|
||||||
break;
|
|
||||||
case 18:
|
|
||||||
testAhnx();
|
|
||||||
sr.setResponseCodeOK();
|
|
||||||
break;
|
|
||||||
case 19:
|
|
||||||
testImportCert();
|
|
||||||
sr.setResponseCodeOK();
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
sr.setResponseCodeOK();
|
|
||||||
sr.setResponseData("请选择测试组", StandardCharsets.UTF_8.displayName());
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
sr.setSuccessful(true);
|
|
||||||
}catch (SydApiException e){
|
|
||||||
e.printStackTrace();
|
|
||||||
sr.setResponseCode(String.valueOf(e.getRetCode()));
|
|
||||||
sr.setResponseData(e.getMessage(), StandardCharsets.UTF_8.displayName());
|
|
||||||
sr.setSuccessful(false);
|
|
||||||
}finally {
|
|
||||||
sr.sampleEnd();
|
|
||||||
}
|
|
||||||
return sr;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void testAhnx() {
|
|
||||||
|
|
||||||
orgData = new byte[1024];
|
|
||||||
//裸签
|
|
||||||
byte[] nakedSign = api.get().SYD_NakedSign(orgData,SM2dn);
|
|
||||||
|
|
||||||
//裸签验签
|
|
||||||
boolean ver = api.get().SYD_NakedVerify(orgData,nakedSign, SM2dn);
|
|
||||||
|
|
||||||
//detach签名
|
|
||||||
String detachedSign = api.get().detachedSign(orgData, SM2dn);
|
|
||||||
|
|
||||||
//detach验签
|
|
||||||
boolean ver1 = api.get().detachedVerify(orgData, detachedSign);
|
|
||||||
|
|
||||||
|
|
||||||
testImportCert();
|
|
||||||
}
|
|
||||||
|
|
||||||
public void testImportCert() {
|
|
||||||
String cert = "-----BEGIN CERTIFICATE-----\n" +
|
|
||||||
"MIICMDCCAdagAwIBAgIJAOWoGwJCnjlLMAoGCCqBHM9VAYN1MGcxCzAJBgNVBAYT\n" +
|
|
||||||
"AkNOMRAwDgYDVQQIDAdCZWlqaW5nMRAwDgYDVQQHDAdIYWlEaWFuMRMwEQYDVQQK\n" +
|
|
||||||
"DApHTUNlcnQub3JnMR8wHQYDVQQDDBZHTUNlcnQgR00gUm9vdCBDQSAtIDAxMB4X\n" +
|
|
||||||
"DTI1MDUxMzAyMzUxM1oXDTI2MDUxMzAyMzUxM1owRTELMAkGA1UEBgwCQ04xCzAJ\n" +
|
|
||||||
"BgNVBAgMAnp6MQswCQYDVQQHDAJ6ejEMMAoGA1UECgwDenp6MQ4wDAYDVQQDDAV6\n" +
|
|
||||||
"enp6ejBZMBMGByqGSM49AgEGCCqBHM9VAYItA0IABK5fyRSACWPIBBr/3U+qvjvp\n" +
|
|
||||||
"niropv2PrA3ZLU1bG8vQpwAEMA0kwyqGgXURBPbvWdAhN7s9wfvHbJyMd9CMZGqj\n" +
|
|
||||||
"gYwwgYkwDAYDVR0TAQH/BAIwADALBgNVHQ8EBAMCB4AwLAYJYIZIAYb4QgENBB8W\n" +
|
|
||||||
"HUdNQ2VydC5vcmcgU2lnbmVkIENlcnRpZmljYXRlMB0GA1UdDgQWBBSQB7UUqEuG\n" +
|
|
||||||
"kl4mrx3MAhKTptfbYjAfBgNVHSMEGDAWgBR/Wl47AIRZKg+YvqEObzmVQxBNBzAK\n" +
|
|
||||||
"BggqgRzPVQGDdQNIADBFAiEA4kgTdn/iA/XYfjTEeOcELwBXd0tTFghkpfP8DhBF\n" +
|
|
||||||
"KFQCIAXZTL6VPtW67tM/DF4ZgFt5S/YIiFombKa2bWOfL81u\n" +
|
|
||||||
"-----END CERTIFICATE-----";
|
|
||||||
Map<String, String> map = new HashMap<>();
|
|
||||||
map.put("snmp.target.ip", "172.1.41.191");
|
|
||||||
map.put("snmp.target.port", "162");
|
|
||||||
map.put("enterprise.oid", "1.3.6.1.4.1.9999");
|
|
||||||
map.put("snmp.community", "public");
|
|
||||||
map.put("snmp.version", "1");
|
|
||||||
List<String> masterNodes = new ArrayList<>();
|
|
||||||
masterNodes.add("172.1.41.139:8889");
|
|
||||||
|
|
||||||
String snmpConfig = new Gson().toJson(map);
|
|
||||||
SydApi4j sydApi4j = new SydApi4j();
|
|
||||||
sydApi4j.importCertToServers(masterNodes, 100, cert, "12345678", snmpConfig);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 测试完成后执行,一般用于关闭资源
|
|
||||||
* @param context 上下文对象,可用于获取jmeter传递的参数
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public void teardownTest(JavaSamplerContext context) {
|
|
||||||
System.runFinalization();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -9,7 +9,7 @@ import racal.sunyard.main.SydApi4j;
|
|||||||
|
|
||||||
public class SYMEnDeLongData {
|
public class SYMEnDeLongData {
|
||||||
private SydApi4j api;
|
private SydApi4j api;
|
||||||
private String key = "";
|
private String sykey = "";
|
||||||
private String keyValue = "";
|
private String keyValue = "";
|
||||||
private int keyType = 0;
|
private int keyType = 0;
|
||||||
private int inType = 0;
|
private int inType = 0;
|
||||||
@@ -95,11 +95,11 @@ public class SYMEnDeLongData {
|
|||||||
|
|
||||||
|
|
||||||
public String getKey() {
|
public String getKey() {
|
||||||
return key;
|
return sykey;
|
||||||
}
|
}
|
||||||
|
|
||||||
public SYMEnDeLongData setKey(String key) {
|
public SYMEnDeLongData setKey(String sykey) {
|
||||||
this.key = key;
|
this.sykey = sykey;
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -45,6 +45,12 @@ public class SydApiException extends RuntimeException{
|
|||||||
case 4:
|
case 4:
|
||||||
msg = "DER 编码格式错误(公钥) ";
|
msg = "DER 编码格式错误(公钥) ";
|
||||||
break;
|
break;
|
||||||
|
case 31:
|
||||||
|
msg = "缓冲区索引错误";
|
||||||
|
break;
|
||||||
|
case 0xd:
|
||||||
|
msg = "公钥加密错误";
|
||||||
|
break;
|
||||||
case 21:
|
case 21:
|
||||||
msg = "输入的数据格式错误 ";
|
msg = "输入的数据格式错误 ";
|
||||||
break;
|
break;
|
||||||
@@ -138,7 +144,7 @@ public class SydApiException extends RuntimeException{
|
|||||||
}
|
}
|
||||||
|
|
||||||
public SydApiException(String msg, int retCode, boolean flag){
|
public SydApiException(String msg, int retCode, boolean flag){
|
||||||
super(String.format(" %04X", retCode) + ":" + ( null == msg ? transMsg(retCode) : msg ));
|
super(null == msg ? transMsg(retCode) : msg);
|
||||||
this.retCode = retCode;
|
this.retCode = retCode;
|
||||||
if (null == msg || "".equals(msg)){
|
if (null == msg || "".equals(msg)){
|
||||||
transMsg();
|
transMsg();
|
||||||
|
|||||||
@@ -0,0 +1,55 @@
|
|||||||
|
package com.sunyard.entity;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 证书导入结果封装类
|
||||||
|
*/
|
||||||
|
public class ImportResult {
|
||||||
|
/** 成功状态码 */
|
||||||
|
public static final int CODE_SUCCESS = 2000;
|
||||||
|
/** 部分成功状态码 */
|
||||||
|
public static final int CODE_PARTIAL_SUCCESS = 2001;
|
||||||
|
/** 完全失败状态码 */
|
||||||
|
public static final int CODE_COMPLETE_FAILURE = 2002;
|
||||||
|
/** 参数错误状态码 */
|
||||||
|
public static final int CODE_INVALID_PARAM = 4001;
|
||||||
|
|
||||||
|
private int code; //返回码
|
||||||
|
private String certDn; // 证书主题(DN)
|
||||||
|
private List<String> errCnt; // 详细错误列表(每个失败的服务器)
|
||||||
|
|
||||||
|
// 构造方法
|
||||||
|
public ImportResult() {
|
||||||
|
}
|
||||||
|
|
||||||
|
public ImportResult(int code, String certDn) {
|
||||||
|
this.code = code;
|
||||||
|
this.certDn = certDn;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Getters and Setters
|
||||||
|
public int getCode() {
|
||||||
|
return code;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setCode(int code) {
|
||||||
|
this.code = code;
|
||||||
|
}
|
||||||
|
public String getCertDn() {
|
||||||
|
return certDn;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setCertDn(String certDn) {
|
||||||
|
this.certDn = certDn;
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<String> getErrCnt() {
|
||||||
|
return errCnt;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setErrCnt(List<String> errCnt) {
|
||||||
|
this.errCnt = errCnt;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,42 @@
|
|||||||
|
package com.sunyard.entity;
|
||||||
|
|
||||||
|
import java.nio.ByteBuffer;
|
||||||
|
|
||||||
|
public class MutiReturn7 {
|
||||||
|
// 返回码
|
||||||
|
private int ret;
|
||||||
|
// 0-不是最后 1-是最后
|
||||||
|
private int isLast;
|
||||||
|
// 数据
|
||||||
|
private ByteBuffer data;
|
||||||
|
|
||||||
|
public MutiReturn7(int ret, int isLast, ByteBuffer data) {
|
||||||
|
this.ret = ret;
|
||||||
|
this.isLast = isLast;
|
||||||
|
this.data = data;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getRet() {
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setRet(int ret) {
|
||||||
|
this.ret = ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getIsLast() {
|
||||||
|
return isLast;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setIsLast(int isLast) {
|
||||||
|
this.isLast = isLast;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ByteBuffer getData() {
|
||||||
|
return data;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setData(ByteBuffer data) {
|
||||||
|
this.data = data;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,103 @@
|
|||||||
|
package com.sunyard.entity;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* SM2加密解密时间统计类
|
||||||
|
* 用于记录发送、计算、接收三个阶段的耗时
|
||||||
|
*/
|
||||||
|
public class TimeStats {
|
||||||
|
// 发送阶段总耗时(毫秒)- 循环发送数据块的时间
|
||||||
|
private long sendTime;
|
||||||
|
// 计算阶段耗时(毫秒)- 执行加密/解密计算的时间
|
||||||
|
private long computeTime;
|
||||||
|
// 接收阶段总耗时(毫秒)- 循环接收数据块的时间
|
||||||
|
private long receiveTime;
|
||||||
|
// 发送次数
|
||||||
|
private int sendCount;
|
||||||
|
// 接收次数
|
||||||
|
private int receiveCount;
|
||||||
|
|
||||||
|
public TimeStats() {
|
||||||
|
this.sendTime = 0;
|
||||||
|
this.computeTime = 0;
|
||||||
|
this.receiveTime = 0;
|
||||||
|
this.sendCount = 0;
|
||||||
|
this.receiveCount = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
public long getSendTime() {
|
||||||
|
return sendTime;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setSendTime(long sendTime) {
|
||||||
|
this.sendTime = sendTime;
|
||||||
|
}
|
||||||
|
|
||||||
|
public long getComputeTime() {
|
||||||
|
return computeTime;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setComputeTime(long computeTime) {
|
||||||
|
this.computeTime = computeTime;
|
||||||
|
}
|
||||||
|
|
||||||
|
public long getReceiveTime() {
|
||||||
|
return receiveTime;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setReceiveTime(long receiveTime) {
|
||||||
|
this.receiveTime = receiveTime;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getSendCount() {
|
||||||
|
return sendCount;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setSendCount(int sendCount) {
|
||||||
|
this.sendCount = sendCount;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getReceiveCount() {
|
||||||
|
return receiveCount;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setReceiveCount(int receiveCount) {
|
||||||
|
this.receiveCount = receiveCount;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取总耗时
|
||||||
|
*/
|
||||||
|
public long getTotalTime() {
|
||||||
|
return sendTime + computeTime + receiveTime;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取各阶段耗时占比
|
||||||
|
*/
|
||||||
|
public double getSendPercentage() {
|
||||||
|
long total = getTotalTime();
|
||||||
|
return total == 0 ? 0 : (double) sendTime / total * 100;
|
||||||
|
}
|
||||||
|
|
||||||
|
public double getComputePercentage() {
|
||||||
|
long total = getTotalTime();
|
||||||
|
return total == 0 ? 0 : (double) computeTime / total * 100;
|
||||||
|
}
|
||||||
|
|
||||||
|
public double getReceivePercentage() {
|
||||||
|
long total = getTotalTime();
|
||||||
|
return total == 0 ? 0 : (double) receiveTime / total * 100;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
return String.format(
|
||||||
|
"TimeStats{sendTime=%dms(%.1f%%), computeTime=%dms(%.1f%%), receiveTime=%dms(%.1f%%), total=%dms, sendCount=%d, receiveCount=%d}",
|
||||||
|
sendTime, getSendPercentage(),
|
||||||
|
computeTime, getComputePercentage(),
|
||||||
|
receiveTime, getReceivePercentage(),
|
||||||
|
getTotalTime(),
|
||||||
|
sendCount, receiveCount
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,70 @@
|
|||||||
|
package com.sunyard.util;
|
||||||
|
|
||||||
|
import java.util.regex.Pattern;
|
||||||
|
|
||||||
|
public class AddressUtil {
|
||||||
|
// 处理带端口号的地址
|
||||||
|
public static boolean isValidAddressWithPort(String address) {
|
||||||
|
if (address == null) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 分离 IP:port 或 [IPv6]:port
|
||||||
|
String[] parts;
|
||||||
|
if (address.startsWith("[") && address.contains("]:")) {
|
||||||
|
parts = address.split("\\]:", 2);
|
||||||
|
parts[0] = parts[0] + "]"; // 补全 IPv6 的括号
|
||||||
|
} else {
|
||||||
|
parts = address.split(":", 2);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (parts.length != 2) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
String ipPart = parts[0];
|
||||||
|
String portPart = parts[1];
|
||||||
|
|
||||||
|
return isValidIP(ipPart) &&
|
||||||
|
isValidPort(portPart);
|
||||||
|
}
|
||||||
|
|
||||||
|
// IPv4 正则(允许 0-255)
|
||||||
|
private static final Pattern IPV4_PATTERN = Pattern.compile(
|
||||||
|
"^((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$"
|
||||||
|
);
|
||||||
|
|
||||||
|
// IPv6 正则(包含缩写形式)
|
||||||
|
private static final Pattern IPV6_PATTERN = Pattern.compile(
|
||||||
|
"^(?:[0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}$"
|
||||||
|
);
|
||||||
|
|
||||||
|
// 简化域名正则(允许字母、数字、连字符和点)
|
||||||
|
private static final Pattern DOMAIN_PATTERN = Pattern.compile(
|
||||||
|
"^([a-zA-Z0-9-]{1,63}\\.)+[a-zA-Z]{2,63}$"
|
||||||
|
);
|
||||||
|
|
||||||
|
public static boolean isValidIP(String ip) {
|
||||||
|
// 检查 IPv4 或 IPv6
|
||||||
|
return IPV4_PATTERN.matcher(ip).matches() ||
|
||||||
|
IPV6_PATTERN.matcher(ip).matches();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static boolean isValidDomain(String domain) {
|
||||||
|
return DOMAIN_PATTERN.matcher(domain).matches();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static boolean isValidPort(int port) {
|
||||||
|
return port >= 0 && port <= 65535;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 字符串形式的端口校验
|
||||||
|
public static boolean isValidPort(String portStr) {
|
||||||
|
try {
|
||||||
|
int port = Integer.parseInt(portStr);
|
||||||
|
return port >= 0 && port <= 65535;
|
||||||
|
} catch (NumberFormatException e) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,44 @@
|
|||||||
|
package com.sunyard.util;
|
||||||
|
|
||||||
|
import java.nio.ByteBuffer;
|
||||||
|
|
||||||
|
public class ByteBufferUtil {
|
||||||
|
public static ByteBuffer sliceRange(ByteBuffer source, int start, int length) {
|
||||||
|
// 保存原 buffer 的 position 和 limit
|
||||||
|
int oldPos = source.position();
|
||||||
|
int oldLimit = source.limit();
|
||||||
|
|
||||||
|
// 设置新的 position 和 limit 为目标区间
|
||||||
|
source.position(start);
|
||||||
|
source.limit(start + length);
|
||||||
|
|
||||||
|
// 创建共享视图(零拷贝)
|
||||||
|
ByteBuffer slice = source.slice();
|
||||||
|
|
||||||
|
// 恢复原 buffer 的 position 和 limit
|
||||||
|
source.position(oldPos);
|
||||||
|
source.limit(oldLimit);
|
||||||
|
|
||||||
|
return slice;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static ByteBuffer sliceAndConsume(ByteBuffer source, int length) {
|
||||||
|
// 保存原 buffer 的 position 和 limit
|
||||||
|
int oldPos = source.position();
|
||||||
|
int oldLimit = source.limit();
|
||||||
|
|
||||||
|
// 设置新的 position 和 limit 为目标区间
|
||||||
|
int start = oldPos;
|
||||||
|
source.position(start);
|
||||||
|
source.limit(start + length);
|
||||||
|
|
||||||
|
// 创建共享视图(零拷贝)
|
||||||
|
ByteBuffer slice = source.slice();
|
||||||
|
|
||||||
|
// 恢复原 buffer 的 position 和 limit
|
||||||
|
source.position(oldPos + length);
|
||||||
|
source.limit(oldLimit);
|
||||||
|
|
||||||
|
return slice;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,174 @@
|
|||||||
|
package com.sunyard.util;
|
||||||
|
|
||||||
|
import java.nio.ByteOrder;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 字节数组转换工具类,提供常见的基本类型与字节数组之间的互转功能。
|
||||||
|
* 默认采用大端字节序(高位在前),也支持通过参数指定字节序。
|
||||||
|
*
|
||||||
|
* @author YourName
|
||||||
|
*/
|
||||||
|
public final class BytesUtil {
|
||||||
|
|
||||||
|
private BytesUtil() {
|
||||||
|
// 私有构造方法,防止实例化
|
||||||
|
}
|
||||||
|
|
||||||
|
// ==================== 无符号 short 转字节数组 ====================
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 将无符号 short 值(以 int 形式传入,范围 0 ~ 65535)转换为大端字节序的字节数组(2字节)。
|
||||||
|
*
|
||||||
|
* @param value 无符号 short 值(0 到 65535)
|
||||||
|
* @return 长度为 2 的字节数组,高位在前
|
||||||
|
* @throws IllegalArgumentException 如果 value 超出 0~65535 范围
|
||||||
|
*/
|
||||||
|
public static byte[] unsignedShortToBytes(int value) {
|
||||||
|
if (value < 0 || value > 0xFFFF) {
|
||||||
|
throw new IllegalArgumentException("Value out of range for unsigned short: " + value);
|
||||||
|
}
|
||||||
|
return new byte[]{
|
||||||
|
(byte) ((value >> 8) & 0xFF),
|
||||||
|
(byte) (value & 0xFF)
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 将无符号 short 值(以 short 类型传入,自动按无符号处理)转换为大端字节序的字节数组(2字节)。
|
||||||
|
* 例如,传入 (short) 0x8001 会得到 { (byte)0x80, (byte)0x01 }。
|
||||||
|
*
|
||||||
|
* @param value short 类型,将按其二进制补码表示直接作为无符号值处理
|
||||||
|
* @return 长度为 2 的字节数组,高位在前
|
||||||
|
*/
|
||||||
|
public static byte[] unsignedShortToBytes(short value) {
|
||||||
|
// 将 short 转为无符号 int
|
||||||
|
int unsignedValue = value & 0xFFFF;
|
||||||
|
return unsignedShortToBytes(unsignedValue);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 将无符号 short 值(int 类型)转换为指定字节序的字节数组(2字节)。
|
||||||
|
*
|
||||||
|
* @param value 无符号 short 值(0 到 65535)
|
||||||
|
* @param byteOrder 字节序,ByteOrder.BIG_ENDIAN 或 ByteOrder.LITTLE_ENDIAN
|
||||||
|
* @return 长度为 2 的字节数组
|
||||||
|
* @throws IllegalArgumentException 如果 value 超出范围或 byteOrder 为 null
|
||||||
|
*/
|
||||||
|
public static byte[] unsignedShortToBytes(int value, ByteOrder byteOrder) {
|
||||||
|
if (byteOrder == null) {
|
||||||
|
throw new IllegalArgumentException("ByteOrder must not be null");
|
||||||
|
}
|
||||||
|
byte[] bytes = unsignedShortToBytes(value);
|
||||||
|
if (byteOrder == ByteOrder.LITTLE_ENDIAN) {
|
||||||
|
// 交换高低位
|
||||||
|
byte tmp = bytes[0];
|
||||||
|
bytes[0] = bytes[1];
|
||||||
|
bytes[1] = tmp;
|
||||||
|
}
|
||||||
|
return bytes;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 将无符号 short 值(short 类型)转换为指定字节序的字节数组(2字节)。
|
||||||
|
*
|
||||||
|
* @param value short 类型,按无符号处理
|
||||||
|
* @param byteOrder 字节序
|
||||||
|
* @return 长度为 2 的字节数组
|
||||||
|
*/
|
||||||
|
public static byte[] unsignedShortToBytes(short value, ByteOrder byteOrder) {
|
||||||
|
return unsignedShortToBytes(value & 0xFFFF, byteOrder);
|
||||||
|
}
|
||||||
|
|
||||||
|
// ==================== 字节数组转无符号 short ====================
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 从字节数组的起始位置读取 2 字节,按大端序转换为无符号 short 值(返回 int 类型)。
|
||||||
|
*
|
||||||
|
* @param bytes 字节数组
|
||||||
|
* @param offset 起始偏移量
|
||||||
|
* @return 无符号 short 值(0 ~ 65535)
|
||||||
|
* @throws IllegalArgumentException 如果 bytes 为 null 或长度不足
|
||||||
|
*/
|
||||||
|
public static int bytesToUnsignedShort(byte[] bytes, int offset) {
|
||||||
|
if (bytes == null || offset + 2 > bytes.length) {
|
||||||
|
throw new IllegalArgumentException("Invalid byte array or offset");
|
||||||
|
}
|
||||||
|
return ((bytes[offset] & 0xFF) << 8) | (bytes[offset + 1] & 0xFF);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 从字节数组的起始位置读取 2 字节,按指定字节序转换为无符号 short 值。
|
||||||
|
*
|
||||||
|
* @param bytes 字节数组
|
||||||
|
* @param offset 起始偏移量
|
||||||
|
* @param byteOrder 字节序
|
||||||
|
* @return 无符号 short 值
|
||||||
|
*/
|
||||||
|
public static int bytesToUnsignedShort(byte[] bytes, int offset, ByteOrder byteOrder) {
|
||||||
|
if (byteOrder == ByteOrder.LITTLE_ENDIAN) {
|
||||||
|
return ((bytes[offset + 1] & 0xFF) << 8) | (bytes[offset] & 0xFF);
|
||||||
|
} else {
|
||||||
|
return bytesToUnsignedShort(bytes, offset);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ==================== 其他常见转换(扩展) ====================
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 将 int 值转换为大端序的 4 字节数组。
|
||||||
|
*/
|
||||||
|
public static byte[] intToBytes(int value) {
|
||||||
|
return new byte[]{
|
||||||
|
(byte) ((value >> 24) & 0xFF),
|
||||||
|
(byte) ((value >> 16) & 0xFF),
|
||||||
|
(byte) ((value >> 8) & 0xFF),
|
||||||
|
(byte) (value & 0xFF)
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 将大端序的 4 字节数组转换为 int 值。
|
||||||
|
*/
|
||||||
|
public static int bytesToInt(byte[] bytes, int offset) {
|
||||||
|
if (bytes == null || offset + 4 > bytes.length) {
|
||||||
|
throw new IllegalArgumentException("Invalid byte array or offset");
|
||||||
|
}
|
||||||
|
return ((bytes[offset] & 0xFF) << 24)
|
||||||
|
| ((bytes[offset + 1] & 0xFF) << 16)
|
||||||
|
| ((bytes[offset + 2] & 0xFF) << 8)
|
||||||
|
| (bytes[offset + 3] & 0xFF);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 将 long 值转换为大端序的 8 字节数组。
|
||||||
|
*/
|
||||||
|
public static byte[] longToBytes(long value) {
|
||||||
|
return new byte[]{
|
||||||
|
(byte) ((value >> 56) & 0xFF),
|
||||||
|
(byte) ((value >> 48) & 0xFF),
|
||||||
|
(byte) ((value >> 40) & 0xFF),
|
||||||
|
(byte) ((value >> 32) & 0xFF),
|
||||||
|
(byte) ((value >> 24) & 0xFF),
|
||||||
|
(byte) ((value >> 16) & 0xFF),
|
||||||
|
(byte) ((value >> 8) & 0xFF),
|
||||||
|
(byte) (value & 0xFF)
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 将大端序的 8 字节数组转换为 long 值。
|
||||||
|
*/
|
||||||
|
public static long bytesToLong(byte[] bytes, int offset) {
|
||||||
|
if (bytes == null || offset + 8 > bytes.length) {
|
||||||
|
throw new IllegalArgumentException("Invalid byte array or offset");
|
||||||
|
}
|
||||||
|
return ((long) (bytes[offset] & 0xFF) << 56)
|
||||||
|
| ((long) (bytes[offset + 1] & 0xFF) << 48)
|
||||||
|
| ((long) (bytes[offset + 2] & 0xFF) << 40)
|
||||||
|
| ((long) (bytes[offset + 3] & 0xFF) << 32)
|
||||||
|
| ((long) (bytes[offset + 4] & 0xFF) << 24)
|
||||||
|
| ((long) (bytes[offset + 5] & 0xFF) << 16)
|
||||||
|
| ((long) (bytes[offset + 6] & 0xFF) << 8)
|
||||||
|
| ((long) (bytes[offset + 7] & 0xFF));
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,367 @@
|
|||||||
|
package com.sunyard.util;
|
||||||
|
|
||||||
|
import java.util.Collection;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 参数检查工具类,提供常见的参数校验方法。
|
||||||
|
* <p>
|
||||||
|
* 所有方法在校验失败时均抛出 {@link IllegalArgumentException} 异常,
|
||||||
|
* 并附带包含参数名的明确错误信息。成功时返回被校验的值,便于链式调用。
|
||||||
|
* </p>
|
||||||
|
*
|
||||||
|
* <p>使用示例:
|
||||||
|
* <pre>{@code
|
||||||
|
* public void setAge(int age) {
|
||||||
|
* ParamChecker.checkInRange(age, "age", 0, 150);
|
||||||
|
* }
|
||||||
|
*
|
||||||
|
* public void setName(String name) {
|
||||||
|
* ParamChecker.checkNotBlank(name, "name");
|
||||||
|
* }
|
||||||
|
*
|
||||||
|
* public void setStatus(int status) {
|
||||||
|
* ParamChecker.checkInValues(status, "status", 1, 2, 3);
|
||||||
|
* }
|
||||||
|
* }</pre>
|
||||||
|
* </p>
|
||||||
|
*
|
||||||
|
* @author Cheney
|
||||||
|
*/
|
||||||
|
public final class ParamChecker {
|
||||||
|
|
||||||
|
private ParamChecker() {
|
||||||
|
// 私有构造器,防止实例化
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 检查表达式是否为真,若为假则抛出异常。
|
||||||
|
*
|
||||||
|
* @param expression 待检查的布尔表达式
|
||||||
|
* @param message 异常信息
|
||||||
|
* @throws IllegalArgumentException 如果 expression 为 false
|
||||||
|
*/
|
||||||
|
public static void checkArgument(boolean expression, String message) {
|
||||||
|
if (!expression) {
|
||||||
|
throw new IllegalArgumentException(message);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ==================== 对象非空检查 ====================
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 检查对象不为 null。
|
||||||
|
*
|
||||||
|
* @param obj 待检查的对象
|
||||||
|
* @param paramName 参数名称(用于异常信息)
|
||||||
|
* @param <T> 对象类型
|
||||||
|
* @return 传入的对象(便于链式调用)
|
||||||
|
* @throws IllegalArgumentException 如果 obj 为 null
|
||||||
|
*/
|
||||||
|
public static <T> T checkNotNull(T obj, String paramName) {
|
||||||
|
if (obj == null) {
|
||||||
|
throw new IllegalArgumentException("参数 '" + paramName + "' 不能为 null");
|
||||||
|
}
|
||||||
|
return obj;
|
||||||
|
}
|
||||||
|
|
||||||
|
// ==================== 字符串检查 ====================
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 检查字符串不为 null 且长度大于 0(不忽略空白字符)。
|
||||||
|
*
|
||||||
|
* @param str 待检查的字符串
|
||||||
|
* @param paramName 参数名称
|
||||||
|
* @return 传入的字符串
|
||||||
|
* @throws IllegalArgumentException 如果 str 为 null 或空字符串
|
||||||
|
*/
|
||||||
|
public static String checkNotEmpty(String str, String paramName) {
|
||||||
|
if (str == null || str.isEmpty()) {
|
||||||
|
throw new IllegalArgumentException("参数 '" + paramName + "' 不能为 null 或空字符串");
|
||||||
|
}
|
||||||
|
return str;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 检查字符串不为 null 且去除首尾空白后长度大于 0。
|
||||||
|
*
|
||||||
|
* @param str 待检查的字符串
|
||||||
|
* @param paramName 参数名称
|
||||||
|
* @return 传入的字符串(原值,非 trim 后结果)
|
||||||
|
* @throws IllegalArgumentException 如果 str 为 null 或仅包含空白字符
|
||||||
|
*/
|
||||||
|
public static String checkNotBlank(String str, String paramName) {
|
||||||
|
if (str == null || !str.trim().isEmpty()) {
|
||||||
|
throw new IllegalArgumentException("参数 '" + paramName + "' 不能为 null、空字符串或仅包含空白字符");
|
||||||
|
}
|
||||||
|
return str;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 检查字符串长度在指定范围内(包含边界)。
|
||||||
|
*
|
||||||
|
* @param str 待检查的字符串
|
||||||
|
* @param paramName 参数名称
|
||||||
|
* @param min 最小长度(包含)
|
||||||
|
* @param max 最大长度(包含)
|
||||||
|
* @return 传入的字符串
|
||||||
|
* @throws IllegalArgumentException 如果 str 为 null,或长度不在 [min, max] 范围内
|
||||||
|
*/
|
||||||
|
public static String checkLengthBetween(String str, String paramName, int min, int max) {
|
||||||
|
checkNotNull(str, paramName);
|
||||||
|
if (min > max) {
|
||||||
|
throw new IllegalArgumentException("内部错误:长度检查的最小值 " + min + " 不能大于最大值 " + max);
|
||||||
|
}
|
||||||
|
int len = str.length();
|
||||||
|
if (len < min || len > max) {
|
||||||
|
throw new IllegalArgumentException(
|
||||||
|
String.format("参数 '%s' 的长度 %d 不在允许范围 [%d, %d] 内", paramName, len, min, max));
|
||||||
|
}
|
||||||
|
return str;
|
||||||
|
}
|
||||||
|
|
||||||
|
// ==================== 整数(int)检查 ====================
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 检查 int 值大于 0。
|
||||||
|
*
|
||||||
|
* @param value 待检查的值
|
||||||
|
* @param paramName 参数名称
|
||||||
|
* @return 传入的值
|
||||||
|
* @throws IllegalArgumentException 如果 value <= 0
|
||||||
|
*/
|
||||||
|
public static int checkPositive(int value, String paramName) {
|
||||||
|
if (value <= 0) {
|
||||||
|
throw new IllegalArgumentException("参数 '" + paramName + "' 必须为正数,当前值: " + value);
|
||||||
|
}
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 检查 int 值 >= 0。
|
||||||
|
*
|
||||||
|
* @param value 待检查的值
|
||||||
|
* @param paramName 参数名称
|
||||||
|
* @return 传入的值
|
||||||
|
* @throws IllegalArgumentException 如果 value < 0
|
||||||
|
*/
|
||||||
|
public static int checkNonNegative(int value, String paramName) {
|
||||||
|
if (value < 0) {
|
||||||
|
throw new IllegalArgumentException("参数 '" + paramName + "' 不能为负数,当前值: " + value);
|
||||||
|
}
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 检查 int 值在指定范围内(包含边界)。
|
||||||
|
*
|
||||||
|
* @param value 待检查的值
|
||||||
|
* @param paramName 参数名称
|
||||||
|
* @param min 最小值(包含)
|
||||||
|
* @param max 最大值(包含)
|
||||||
|
* @return 传入的值
|
||||||
|
* @throws IllegalArgumentException 如果 value 不在 [min, max] 范围内,或 min > max
|
||||||
|
*/
|
||||||
|
public static int checkInRange(int value, String paramName, int min, int max) {
|
||||||
|
if (min > max) {
|
||||||
|
throw new IllegalArgumentException("内部错误:范围检查的最小值 " + min + " 不能大于最大值 " + max);
|
||||||
|
}
|
||||||
|
if (value < min || value > max) {
|
||||||
|
throw new IllegalArgumentException(
|
||||||
|
String.format("参数 '%s' 的值 %d 不在允许范围 [%d, %d] 内", paramName, value, min, max));
|
||||||
|
}
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 检查 int 值是否等于给定集合中的任意一个值。
|
||||||
|
*
|
||||||
|
* @param value 待检查的值
|
||||||
|
* @param paramName 参数名称
|
||||||
|
* @param validValues 允许的值列表
|
||||||
|
* @return 传入的值
|
||||||
|
* @throws IllegalArgumentException 如果 value 不在 validValues 中,或 validValues 为空
|
||||||
|
*/
|
||||||
|
public static int checkInValues(int value, String paramName, int... validValues) {
|
||||||
|
if (validValues == null || validValues.length == 0) {
|
||||||
|
throw new IllegalArgumentException("内部错误:允许的值集合不能为空");
|
||||||
|
}
|
||||||
|
for (int v : validValues) {
|
||||||
|
if (value == v) {
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// 构建允许值字符串用于提示
|
||||||
|
StringBuilder allowed = new StringBuilder();
|
||||||
|
for (int i = 0; i < validValues.length; i++) {
|
||||||
|
if (i > 0) allowed.append(", ");
|
||||||
|
allowed.append(validValues[i]);
|
||||||
|
}
|
||||||
|
throw new IllegalArgumentException(
|
||||||
|
String.format("参数 '%s' 的值 %d 不在允许值集合 [%s] 中", paramName, value, allowed));
|
||||||
|
}
|
||||||
|
|
||||||
|
// ==================== 长整型(long)检查 ====================
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 检查 long 值大于 0。
|
||||||
|
*
|
||||||
|
* @param value 待检查的值
|
||||||
|
* @param paramName 参数名称
|
||||||
|
* @return 传入的值
|
||||||
|
* @throws IllegalArgumentException 如果 value <= 0
|
||||||
|
*/
|
||||||
|
public static long checkPositive(long value, String paramName) {
|
||||||
|
if (value <= 0) {
|
||||||
|
throw new IllegalArgumentException("参数 '" + paramName + "' 必须为正数,当前值: " + value);
|
||||||
|
}
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 检查 long 值 >= 0。
|
||||||
|
*
|
||||||
|
* @param value 待检查的值
|
||||||
|
* @param paramName 参数名称
|
||||||
|
* @return 传入的值
|
||||||
|
* @throws IllegalArgumentException 如果 value < 0
|
||||||
|
*/
|
||||||
|
public static long checkNonNegative(long value, String paramName) {
|
||||||
|
if (value < 0) {
|
||||||
|
throw new IllegalArgumentException("参数 '" + paramName + "' 不能为负数,当前值: " + value);
|
||||||
|
}
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 检查 long 值在指定范围内(包含边界)。
|
||||||
|
*
|
||||||
|
* @param value 待检查的值
|
||||||
|
* @param paramName 参数名称
|
||||||
|
* @param min 最小值(包含)
|
||||||
|
* @param max 最大值(包含)
|
||||||
|
* @return 传入的值
|
||||||
|
* @throws IllegalArgumentException 如果 value 不在 [min, max] 范围内,或 min > max
|
||||||
|
*/
|
||||||
|
public static long checkInRange(long value, String paramName, long min, long max) {
|
||||||
|
if (min > max) {
|
||||||
|
throw new IllegalArgumentException("内部错误:范围检查的最小值 " + min + " 不能大于最大值 " + max);
|
||||||
|
}
|
||||||
|
if (value < min || value > max) {
|
||||||
|
throw new IllegalArgumentException(
|
||||||
|
String.format("参数 '%s' 的值 %d 不在允许范围 [%d, %d] 内", paramName, value, min, max));
|
||||||
|
}
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
|
||||||
|
// ==================== 浮点数(double)简单检查 ====================
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 检查 double 值大于 0(考虑极小正数,不做精度处理)。
|
||||||
|
*
|
||||||
|
* @param value 待检查的值
|
||||||
|
* @param paramName 参数名称
|
||||||
|
* @return 传入的值
|
||||||
|
* @throws IllegalArgumentException 如果 value <= 0 或为 NaN
|
||||||
|
*/
|
||||||
|
public static double checkPositive(double value, String paramName) {
|
||||||
|
if (value <= 0 || Double.isNaN(value)) {
|
||||||
|
throw new IllegalArgumentException("参数 '" + paramName + "' 必须为正数,当前值: " + value);
|
||||||
|
}
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 检查 double 值 >= 0。
|
||||||
|
*
|
||||||
|
* @param value 待检查的值
|
||||||
|
* @param paramName 参数名称
|
||||||
|
* @return 传入的值
|
||||||
|
* @throws IllegalArgumentException 如果 value < 0 或为 NaN
|
||||||
|
*/
|
||||||
|
public static double checkNonNegative(double value, String paramName) {
|
||||||
|
if (value < 0 || Double.isNaN(value)) {
|
||||||
|
throw new IllegalArgumentException("参数 '" + paramName + "' 不能为负数或 NaN,当前值: " + value);
|
||||||
|
}
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
|
||||||
|
// ==================== 集合与数组非空检查 ====================
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 检查集合不为 null 且非空。
|
||||||
|
*
|
||||||
|
* @param coll 待检查的集合
|
||||||
|
* @param paramName 参数名称
|
||||||
|
* @param <T> 集合元素类型
|
||||||
|
* @return 传入的集合
|
||||||
|
* @throws IllegalArgumentException 如果 coll 为 null 或空集合
|
||||||
|
*/
|
||||||
|
public static <T> Collection<T> checkNotEmpty(Collection<T> coll, String paramName) {
|
||||||
|
if (coll == null || coll.isEmpty()) {
|
||||||
|
throw new IllegalArgumentException("参数 '" + paramName + "' 不能为 null 或空集合");
|
||||||
|
}
|
||||||
|
return coll;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 检查 Map 不为 null 且非空。
|
||||||
|
*
|
||||||
|
* @param map 待检查的 Map
|
||||||
|
* @param paramName 参数名称
|
||||||
|
* @param <K> 键类型
|
||||||
|
* @param <V> 值类型
|
||||||
|
* @return 传入的 Map
|
||||||
|
* @throws IllegalArgumentException 如果 map 为 null 或空 Map
|
||||||
|
*/
|
||||||
|
public static <K, V> Map<K, V> checkNotEmpty(Map<K, V> map, String paramName) {
|
||||||
|
if (map == null || map.isEmpty()) {
|
||||||
|
throw new IllegalArgumentException("参数 '" + paramName + "' 不能为 null 或空 Map");
|
||||||
|
}
|
||||||
|
return map;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 检查数组不为 null 且长度大于 0。
|
||||||
|
*
|
||||||
|
* @param array 待检查的数组
|
||||||
|
* @param paramName 参数名称
|
||||||
|
* @param <T> 数组元素类型
|
||||||
|
* @return 传入的数组
|
||||||
|
* @throws IllegalArgumentException 如果 array 为 null 或长度为 0
|
||||||
|
*/
|
||||||
|
public static <T> T[] checkNotEmpty(T[] array, String paramName) {
|
||||||
|
if (array == null || array.length == 0) {
|
||||||
|
throw new IllegalArgumentException("参数 '" + paramName + "' 不能为 null 或空数组");
|
||||||
|
}
|
||||||
|
return array;
|
||||||
|
}
|
||||||
|
|
||||||
|
// ==================== 布尔条件检查 ====================
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 检查布尔条件为 true。
|
||||||
|
*
|
||||||
|
* @param condition 待检查的条件
|
||||||
|
* @param paramName 参数名称(描述条件含义)
|
||||||
|
* @throws IllegalArgumentException 如果 condition 为 false
|
||||||
|
*/
|
||||||
|
public static void checkTrue(boolean condition, String paramName) {
|
||||||
|
if (!condition) {
|
||||||
|
throw new IllegalArgumentException("参数条件 '" + paramName + "' 必须为 true");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 检查布尔条件为 false。
|
||||||
|
*
|
||||||
|
* @param condition 待检查的条件
|
||||||
|
* @param paramName 参数名称(描述条件含义)
|
||||||
|
* @throws IllegalArgumentException 如果 condition 为 true
|
||||||
|
*/
|
||||||
|
public static void checkFalse(boolean condition, String paramName) {
|
||||||
|
if (condition) {
|
||||||
|
throw new IllegalArgumentException("参数条件 '" + paramName + "' 必须为 false");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,155 @@
|
|||||||
|
package cmbpoc;
|
||||||
|
|
||||||
|
import com.sunyard.RetWrap;
|
||||||
|
import com.sunyard.SydApi;
|
||||||
|
import com.sunyard.proto.PacketSection;
|
||||||
|
import com.sunyard.proto.Util;
|
||||||
|
import org.junit.*;
|
||||||
|
import racal.sunyard.main.SydApi4j;
|
||||||
|
|
||||||
|
public class FunctionTest {
|
||||||
|
|
||||||
|
private SydApi4j api;
|
||||||
|
private String keypairIndex4Sign = "0000000000000sge00000000001";
|
||||||
|
private String keypairIndex4Ende = "0000000000000sge00100000001";
|
||||||
|
private byte[] privateKey4Sign;
|
||||||
|
private byte[] publicKey4Sign;
|
||||||
|
private byte[] privateKey4Ende;
|
||||||
|
private byte[] publicKey4Ende;
|
||||||
|
private byte[] orgData = new byte[1024];
|
||||||
|
private byte[] orgData2K = new byte[ 2 * 1024 ];
|
||||||
|
private byte[] orgData2M = new byte[ 2 * 1024 * 1024 ];
|
||||||
|
private byte[] orgData10M = new byte[ 10 * 1024 * 1024 ];
|
||||||
|
private String sign;
|
||||||
|
|
||||||
|
@Before
|
||||||
|
public void start(){
|
||||||
|
// 调试模式
|
||||||
|
|
||||||
|
System.setProperty("com.sunyard.sydapi4j.debug", "true");
|
||||||
|
|
||||||
|
// 建立链接(单台)
|
||||||
|
this.api = (SydApi4j) new SydApi4j().connect("192.168.100.145", 8889, null, 30000);
|
||||||
|
|
||||||
|
// RetWrap keypair = this.getPrivateKeyAndPublickKey(keypairIndex4Sign);
|
||||||
|
// this.publicKey4Sign = Util.hexString2Bytes( keypair.get("pk").toString() );
|
||||||
|
// this.privateKey4Sign = Util.hexString2Bytes( keypair.get("sk").toString() );
|
||||||
|
//
|
||||||
|
// RetWrap keypair4Ende = this.getPrivateKeyAndPublickKey(keypairIndex4Sign);
|
||||||
|
// this.publicKey4Ende = Util.hexString2Bytes( keypair4Ende.get("pk").toString() );
|
||||||
|
// this.privateKey4Ende = Util.hexString2Bytes( keypair4Ende.get("sk").toString() );
|
||||||
|
|
||||||
|
// 使用预置密钥对
|
||||||
|
this.publicKey4Sign = Util.hexString2Bytes( "034200046508BC4FE965BEB1D57715C180135FC861FDC6527E82E7FD7A6CA25E7CE9CE75101181D7E2CDD16C1974652B38A045465C7FFBAC700E49F949AE5F4C57AEBEAA" );
|
||||||
|
this.privateKey4Sign = Util.hexString2Bytes( "00010000CF945DAFF49B9F3AB67A23E1E1BA700FF1F78F5DFFCBB518FD1303A51DABA6FC0000000000000000000000000000000000000000000000000000000000000000" );
|
||||||
|
this.publicKey4Ende = Util.hexString2Bytes("03420004AF3D4E55D26564C6C937E6EA9232691C01AC5E7916AD2136F788CE7C1E4D0AE8C4754DEC2F7F6A78962D51A171A6F5B4F11823390AEC8B5B0246CD2CCF8052B7");
|
||||||
|
this.privateKey4Ende = Util.hexString2Bytes("00010000963F7C3A98B7810F52D2861A060E18A9D4D59796CF33967DD61EEDA091E1AD9B0000000000000000000000000000000000000000000000000000000000000000");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@After
|
||||||
|
public void stop(){
|
||||||
|
if ( null != api ) {
|
||||||
|
this.api.disconnect();
|
||||||
|
this.api = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@Ignore
|
||||||
|
@Test
|
||||||
|
public void genKeyPair(){
|
||||||
|
// RetWrap r = this.api.SYD_SM2GenKeyPair();
|
||||||
|
// String pk = r.get("publicKey").toString();
|
||||||
|
// String sk = r.get("privateKey").toString();
|
||||||
|
//
|
||||||
|
// System.out.println("pk=" + pk);
|
||||||
|
// System.out.println("sk=" + sk);
|
||||||
|
//
|
||||||
|
// this.privateKey4Sign = Util.hexString2Bytes(sk);
|
||||||
|
// this.publicKey4Sign = Util.hexString2Bytes(pk);
|
||||||
|
|
||||||
|
RetWrap rw = this.api.SM2GenKeyPair();
|
||||||
|
byte[] pk = (byte[]) rw.get(SydApi.RET_PUBLIC_KEY);
|
||||||
|
byte[] sk = (byte[]) rw.get(SydApi.RET_PRIVATE_KEY);
|
||||||
|
System.out.println("pk=" + Util.bytes2HexString(pk));
|
||||||
|
System.out.println("sk=" + Util.bytes2HexString(sk));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public RetWrap getPrivateKeyAndPublickKey(String keypairIndex){
|
||||||
|
String pk = this.api.SM2GetPublicKeyC(keypairIndex);
|
||||||
|
String sk = this.api.SM2GetPrivateKeyC(keypairIndex);
|
||||||
|
|
||||||
|
System.out.println("pk=" + pk);
|
||||||
|
System.out.println("sk=" + sk);
|
||||||
|
|
||||||
|
RetWrap retWrap = new RetWrap();
|
||||||
|
retWrap.put("pk", pk);
|
||||||
|
retWrap.put("sk", sk);
|
||||||
|
return retWrap;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void SYD_SM2_Sign(){
|
||||||
|
String sign = this.api.SYD_SM2_Sign_HA( SydApi.DATA_HASH, privateKey4Sign, publicKey4Sign, orgData);
|
||||||
|
this.api.SYD_SM2_Verify_HA(SydApi.DATA_HASH, publicKey4Sign, orgData, sign);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void SYD_SM2_Sign_2M(){
|
||||||
|
String sign = this.api.SYD_SM2_Sign_HA( SydApi.DATA_HASH, privateKey4Sign, publicKey4Sign, orgData2M);
|
||||||
|
this.api.SYD_SM2_Verify_HA(SydApi.DATA_HASH, publicKey4Sign, orgData2M, sign);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void SYD_SM2_Sign_10M(){
|
||||||
|
String sign = this.api.SYD_SM2_Sign_HA( SydApi.DATA_HASH, privateKey4Sign, publicKey4Sign, orgData10M);
|
||||||
|
this.api.SYD_SM2_Verify_HA(SydApi.DATA_HASH, publicKey4Sign, orgData10M, sign);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void SYD_SM2_Encrypt(){
|
||||||
|
byte[] enData = this.api.SYD_SM2Encrypt(publicKey4Ende, orgData);
|
||||||
|
System.out.println("密文=" + Util.bytes2HexString(enData));
|
||||||
|
byte[] deData = this.api.SYD_SM2Decrypt(privateKey4Ende, enData);
|
||||||
|
Assert.assertArrayEquals(orgData, deData);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void SYD_SM2_Encrypt_2K(){
|
||||||
|
byte[] enData = this.api.SYD_SM2Encrypt(publicKey4Ende, orgData2K);
|
||||||
|
System.out.println("密文=" + Util.bytes2HexString(enData));
|
||||||
|
byte[] deData = this.api.SYD_SM2Decrypt(privateKey4Ende, enData);
|
||||||
|
Assert.assertArrayEquals(orgData2K, deData);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void SYD_SM2_Encrypt_2M(){
|
||||||
|
byte[] enData = this.api.SYD_SM2Encrypt(publicKey4Ende, orgData2M);
|
||||||
|
System.out.println("密文长度=" + enData.length);
|
||||||
|
byte[] deData = this.api.SYD_SM2Decrypt(privateKey4Ende, enData);
|
||||||
|
Assert.assertArrayEquals(orgData2M, deData);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void SYD_SM2_Encrypt_10M(){
|
||||||
|
byte[] enData = this.api.SYD_SM2Encrypt(publicKey4Ende, orgData10M);
|
||||||
|
System.out.println("密文=" + Util.bytes2HexString(enData));
|
||||||
|
byte[] deData = this.api.SYD_SM2Decrypt(privateKey4Ende, enData);
|
||||||
|
Assert.assertArrayEquals(orgData10M, deData);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -0,0 +1,156 @@
|
|||||||
|
package cmbpoc;
|
||||||
|
|
||||||
|
|
||||||
|
import com.sunyard.SydApi;
|
||||||
|
import com.sunyard.proto.Util;
|
||||||
|
import org.apache.jmeter.config.Arguments;
|
||||||
|
import org.apache.jmeter.protocol.java.sampler.AbstractJavaSamplerClient;
|
||||||
|
import org.apache.jmeter.protocol.java.sampler.JavaSamplerContext;
|
||||||
|
import org.apache.jmeter.samplers.SampleResult;
|
||||||
|
import racal.sunyard.main.SydApi4j;
|
||||||
|
|
||||||
|
import java.util.Random;
|
||||||
|
|
||||||
|
|
||||||
|
public class JmeterTest extends AbstractJavaSamplerClient {
|
||||||
|
|
||||||
|
private byte[] publicKey;
|
||||||
|
private byte[] plainData;
|
||||||
|
private byte[] encryptedData;
|
||||||
|
private String sign;
|
||||||
|
private int sleep = 1;
|
||||||
|
|
||||||
|
private byte[] privateKey4Sign;
|
||||||
|
private byte[] publicKey4Sign;
|
||||||
|
private byte[] privateKey4Ende;
|
||||||
|
private byte[] publicKey4Ende;
|
||||||
|
|
||||||
|
private String ip ;
|
||||||
|
private int port;
|
||||||
|
private int timeout;
|
||||||
|
private String ip2 ;
|
||||||
|
|
||||||
|
private ThreadLocal<SydApi4j> api;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Arguments getDefaultParameters() {
|
||||||
|
Arguments params = new Arguments();
|
||||||
|
params.addArgument("function", "sleep");
|
||||||
|
params.addArgument("sleep", "1");
|
||||||
|
params.addArgument("plainDataLen", "1024");
|
||||||
|
params.addArgument("publicKey4Ende", "", "加密用的公钥");
|
||||||
|
params.addArgument("privateKey4Ende", "", "解密用的公钥");
|
||||||
|
params.addArgument("publicKey4Sign", "", "验签用的公钥");
|
||||||
|
params.addArgument("privateKey4Sign", "", "签名用的公钥");
|
||||||
|
params.addArgument("ip", "192.168.100.145");
|
||||||
|
params.addArgument("ip2", "172.1.41.96");
|
||||||
|
params.addArgument("port", "8889");
|
||||||
|
params.addArgument("timeout", "3000");
|
||||||
|
return params;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setupTest(JavaSamplerContext context) {
|
||||||
|
// 签名密钥对
|
||||||
|
String publicKey4Sign = context.getParameter("publicKey4Sign");
|
||||||
|
if ( null != publicKey4Sign && !publicKey4Sign.isEmpty()) {
|
||||||
|
this.publicKey4Sign = Util.hexString2Bytes(publicKey4Sign);
|
||||||
|
}
|
||||||
|
String privateKey4Sign = context.getParameter("privateKey4Sign");
|
||||||
|
if ( null != privateKey4Sign && !privateKey4Sign.isEmpty()) {
|
||||||
|
this.privateKey4Sign = Util.hexString2Bytes(privateKey4Sign);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 加密密钥对
|
||||||
|
String publicKey4Ende = context.getParameter("publicKey4Ende");
|
||||||
|
if ( null != publicKey4Ende && !publicKey4Ende.isEmpty()) {
|
||||||
|
this.publicKey4Ende = Util.hexString2Bytes(publicKey4Ende);
|
||||||
|
}
|
||||||
|
String privateKey4Ende = context.getParameter("privateKey4Ende");
|
||||||
|
if ( null != privateKey4Ende && !privateKey4Ende.isEmpty()) {
|
||||||
|
this.privateKey4Ende = Util.hexString2Bytes(privateKey4Ende);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 原始数据
|
||||||
|
int plainDataLen = context.getIntParameter("plainDataLen");
|
||||||
|
plainData = new byte[plainDataLen];
|
||||||
|
new Random().nextBytes(plainData);
|
||||||
|
System.out.println("原始数据长度:" + plainDataLen);
|
||||||
|
|
||||||
|
// 校准测试
|
||||||
|
sleep = context.getIntParameter("sleep", 1);
|
||||||
|
|
||||||
|
// api
|
||||||
|
ip = context.getParameter("ip");
|
||||||
|
ip2 = context.getParameter("ip2");
|
||||||
|
port = context.getIntParameter("port");
|
||||||
|
timeout = context.getIntParameter("timeout");
|
||||||
|
api = new ThreadLocal<SydApi4j>() {
|
||||||
|
@Override
|
||||||
|
public SydApi4j initialValue() {
|
||||||
|
return (SydApi4j) new SydApi4j().connect(ip, port, null, timeout);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
// 线程开始时准备解密、验签数据
|
||||||
|
String function = context.getParameter("function");
|
||||||
|
switch (function) {
|
||||||
|
case "SYD_SM2_Decrypt":
|
||||||
|
this.encryptedData = this.api.get().SYD_SM2Encrypt(this.publicKey4Ende, this.plainData);
|
||||||
|
break;
|
||||||
|
case "SYD_SM2_Verify":
|
||||||
|
this.sign = this.api.get().SYD_SM2_Sign_HA(SydApi.DATA_HASH, this.privateKey4Sign, this.publicKey4Sign, this.plainData);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public SampleResult runTest(JavaSamplerContext context) {
|
||||||
|
SampleResult result = new SampleResult();
|
||||||
|
// 调用待测函数
|
||||||
|
String function = context.getParameter("function");
|
||||||
|
|
||||||
|
result.sampleStart(); // 开始计时
|
||||||
|
try {
|
||||||
|
switch (function) {
|
||||||
|
case "SYD_SM2_Encrypt":
|
||||||
|
this.api.get().SYD_SM2Encrypt(publicKey4Ende, this.plainData);
|
||||||
|
break;
|
||||||
|
case "SYD_SM2_Decrypt":
|
||||||
|
this.api.get().SYD_SM2Decrypt(privateKey4Ende, this.encryptedData);
|
||||||
|
break;
|
||||||
|
case "SYD_SM2_Sign":
|
||||||
|
this.api.get().SYD_SM2_Sign_HA(SydApi.DATA_HASH, privateKey4Sign, publicKey4Sign, this.plainData);
|
||||||
|
break;
|
||||||
|
case "SYD_SM2_Verify":
|
||||||
|
this.api.get().SYD_SM2_Verify_HA(SydApi.DATA_HASH, publicKey4Sign, this.plainData, this.sign);
|
||||||
|
break;
|
||||||
|
case "sleep":
|
||||||
|
Thread.sleep( this.sleep );
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
// result.setResponseData(encrypted); // 可选
|
||||||
|
result.setSuccessful(true);
|
||||||
|
result.setResponseCodeOK();
|
||||||
|
result.setResponseMessage( function + "执行成功" );
|
||||||
|
} catch (Exception e) {
|
||||||
|
result.setSuccessful(false);
|
||||||
|
result.setResponseCode("500");
|
||||||
|
result.setResponseMessage( function + "执行失败。" + e.getMessage());
|
||||||
|
} finally {
|
||||||
|
result.sampleEnd(); // 结束计时
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void teardownTest(JavaSamplerContext context) {
|
||||||
|
// 释放资源(如有)
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,51 @@
|
|||||||
|
package cmbpoc;
|
||||||
|
|
||||||
|
import org.apache.jmeter.protocol.java.sampler.JavaSamplerContext;
|
||||||
|
|
||||||
|
|
||||||
|
import org.apache.jmeter.config.Arguments;
|
||||||
|
import org.apache.jmeter.protocol.java.sampler.JavaSamplerContext;
|
||||||
|
import org.apache.jmeter.samplers.SampleResult;
|
||||||
|
|
||||||
|
public class JmeterTestTest {
|
||||||
|
|
||||||
|
public static void main(String[] args) {
|
||||||
|
// 1. 创建 JMeter 参数集,并填入您提供的所有参数
|
||||||
|
Arguments jmeterArgs = new Arguments();
|
||||||
|
jmeterArgs.addArgument("function", "SYD_SM2_Encrypt");
|
||||||
|
jmeterArgs.addArgument("sleep", "1");
|
||||||
|
jmeterArgs.addArgument("plainDataLen", "2048");
|
||||||
|
jmeterArgs.addArgument("publicKey4Ende", "03420004AF3D4E55D26564C6C937E6EA9232691C01AC5E7916AD2136F788CE7C1E4D0AE8C4754DEC2F7F6A78962D51A171A6F5B4F11823390AEC8B5B0246CD2CCF8052B7");
|
||||||
|
jmeterArgs.addArgument("privateKey4Ende", "00010000963F7C3A98B7810F52D2861A060E18A9D4D59796CF33967DD61EEDA091E1AD9B0000000000000000000000000000000000000000000000000000000000000000");
|
||||||
|
jmeterArgs.addArgument("ip", "192.168.100.145");
|
||||||
|
jmeterArgs.addArgument("ip2", "172.1.41.96");
|
||||||
|
jmeterArgs.addArgument("port", "8889");
|
||||||
|
jmeterArgs.addArgument("timeout", "3000");
|
||||||
|
|
||||||
|
// 2. 基于参数集创建 JMeter 上下文对象
|
||||||
|
JavaSamplerContext context = new JavaSamplerContext(jmeterArgs);
|
||||||
|
|
||||||
|
// 3. 创建您的测试类实例
|
||||||
|
JmeterTest jmeterTest = new JmeterTest();
|
||||||
|
|
||||||
|
try {
|
||||||
|
// 4. 模拟 JMeter 执行周期:setup -> run -> teardown
|
||||||
|
jmeterTest.setupTest(context);
|
||||||
|
|
||||||
|
SampleResult result = jmeterTest.runTest(context);
|
||||||
|
if (result != null) {
|
||||||
|
System.out.println("SampleResult 状态: " + result.getResponseCode());
|
||||||
|
System.out.println("响应数据: " + result.getResponseDataAsString());
|
||||||
|
System.out.println("是否成功: " + result.isSuccessful());
|
||||||
|
} else {
|
||||||
|
System.out.println("runTest 返回 null,请检查实现逻辑");
|
||||||
|
}
|
||||||
|
|
||||||
|
jmeterTest.teardownTest(context);
|
||||||
|
|
||||||
|
} catch (Exception e) {
|
||||||
|
System.err.println("执行测试时发生异常:");
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,186 @@
|
|||||||
|
package cmbpoc;
|
||||||
|
|
||||||
|
import com.sunyard.RetWrap;
|
||||||
|
import com.sunyard.SydApi;
|
||||||
|
import com.sunyard.entity.TimeStats;
|
||||||
|
import com.sunyard.proto.Util;
|
||||||
|
import org.junit.*;
|
||||||
|
import racal.sunyard.main.SydApi4j;
|
||||||
|
|
||||||
|
public class PerformanceTest {
|
||||||
|
|
||||||
|
private SydApi4j api;
|
||||||
|
private byte[] privateKey4Ende;
|
||||||
|
private byte[] publicKey4Ende;
|
||||||
|
private byte[] orgData2K = new byte[2 * 1024];
|
||||||
|
private byte[] orgData2M = new byte[2 * 1024 * 1024];
|
||||||
|
private byte[] orgData10M = new byte[10 * 1024 * 1024];
|
||||||
|
private static final int TEST_ROUNDS = 10;
|
||||||
|
|
||||||
|
@Before
|
||||||
|
public void start() {
|
||||||
|
System.setProperty("com.sunyard.sydapi4j.debug", "false");
|
||||||
|
String ip = System.getProperty("ip", "192.168.100.145");
|
||||||
|
System.out.println("ip=" + ip);
|
||||||
|
this.api = (SydApi4j) new SydApi4j().connect(ip, 8889, null, 30000);
|
||||||
|
this.publicKey4Ende = Util.hexString2Bytes("03420004AF3D4E55D26564C6C937E6EA9232691C01AC5E7916AD2136F788CE7C1E4D0AE8C4754DEC2F7F6A78962D51A171A6F5B4F11823390AEC8B5B0246CD2CCF8052B7");
|
||||||
|
this.privateKey4Ende = Util.hexString2Bytes("00010000963F7C3A98B7810F52D2861A060E18A9D4D59796CF33967DD61EEDA091E1AD9B0000000000000000000000000000000000000000000000000000000000000000");
|
||||||
|
}
|
||||||
|
|
||||||
|
@After
|
||||||
|
public void stop() {
|
||||||
|
if (null != api) {
|
||||||
|
this.api.disconnect();
|
||||||
|
this.api = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void SYD_SM2_Encrypt_Performance_2K() {
|
||||||
|
System.out.println("=== SYD_SM2_Encrypt Performance Test - 2K Data ===");
|
||||||
|
long totalEncryptTime = 0;
|
||||||
|
long totalDecryptTime = 0;
|
||||||
|
|
||||||
|
for (int i = 0; i < TEST_ROUNDS; i++) {
|
||||||
|
long encryptStart = System.currentTimeMillis();
|
||||||
|
byte[] enData = this.api.SYD_SM2Encrypt(publicKey4Ende, orgData2K);
|
||||||
|
long encryptEnd = System.currentTimeMillis();
|
||||||
|
|
||||||
|
long decryptStart = System.currentTimeMillis();
|
||||||
|
byte[] deData = this.api.SYD_SM2Decrypt(privateKey4Ende, enData);
|
||||||
|
long decryptEnd = System.currentTimeMillis();
|
||||||
|
|
||||||
|
totalEncryptTime += (encryptEnd - encryptStart);
|
||||||
|
totalDecryptTime += (decryptEnd - decryptStart);
|
||||||
|
|
||||||
|
Assert.assertArrayEquals(orgData2K, deData);
|
||||||
|
}
|
||||||
|
|
||||||
|
double avgEncryptTime = (double) totalEncryptTime / TEST_ROUNDS;
|
||||||
|
double avgDecryptTime = (double) totalDecryptTime / TEST_ROUNDS;
|
||||||
|
double encryptThroughput = (2.0 / avgEncryptTime) * 1000;
|
||||||
|
double decryptThroughput = (2.0 / avgDecryptTime) * 1000;
|
||||||
|
|
||||||
|
System.out.println("Test Rounds: " + TEST_ROUNDS);
|
||||||
|
System.out.println("Data Size: 2KB");
|
||||||
|
System.out.printf("Average Encrypt Time: %.2f ms%n", avgEncryptTime);
|
||||||
|
System.out.printf("Average Decrypt Time: %.2f ms%n", avgDecryptTime);
|
||||||
|
System.out.printf("Encrypt Throughput: %.2f KB/s%n", encryptThroughput);
|
||||||
|
System.out.printf("Decrypt Throughput: %.2f KB/s%n", decryptThroughput);
|
||||||
|
System.out.println();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void SYD_SM2_Encrypt_Performance_2M() {
|
||||||
|
System.out.println("=== SYD_SM2_Encrypt Performance Test - 2M Data ===");
|
||||||
|
long totalEncryptTime = 0;
|
||||||
|
long totalDecryptTime = 0;
|
||||||
|
|
||||||
|
for (int i = 0; i < TEST_ROUNDS; i++) {
|
||||||
|
long encryptStart = System.currentTimeMillis();
|
||||||
|
byte[] enData = this.api.SYD_SM2Encrypt(publicKey4Ende, orgData2M);
|
||||||
|
long encryptEnd = System.currentTimeMillis();
|
||||||
|
|
||||||
|
long decryptStart = System.currentTimeMillis();
|
||||||
|
byte[] deData = this.api.SYD_SM2Decrypt(privateKey4Ende, enData);
|
||||||
|
long decryptEnd = System.currentTimeMillis();
|
||||||
|
|
||||||
|
totalEncryptTime += (encryptEnd - encryptStart);
|
||||||
|
totalDecryptTime += (decryptEnd - decryptStart);
|
||||||
|
|
||||||
|
Assert.assertArrayEquals(orgData2M, deData);
|
||||||
|
}
|
||||||
|
|
||||||
|
double avgEncryptTime = (double) totalEncryptTime / TEST_ROUNDS;
|
||||||
|
double avgDecryptTime = (double) totalDecryptTime / TEST_ROUNDS;
|
||||||
|
double encryptThroughput = (2048.0 / avgEncryptTime) * 1000;
|
||||||
|
double decryptThroughput = (2048.0 / avgDecryptTime) * 1000;
|
||||||
|
|
||||||
|
System.out.println("Test Rounds: " + TEST_ROUNDS);
|
||||||
|
System.out.println("Data Size: 2MB");
|
||||||
|
System.out.printf("Average Encrypt Time: %.2f ms%n", avgEncryptTime);
|
||||||
|
System.out.printf("Average Decrypt Time: %.2f ms%n", avgDecryptTime);
|
||||||
|
System.out.printf("Encrypt Throughput: %.2f KB/s%n", encryptThroughput);
|
||||||
|
System.out.printf("Decrypt Throughput: %.2f KB/s%n", decryptThroughput);
|
||||||
|
System.out.println();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void SYD_SM2_Encrypt_Performance_10M() {
|
||||||
|
System.out.println("=== SYD_SM2_Encrypt Performance Test - 10M Data ===");
|
||||||
|
long totalEncryptTime = 0;
|
||||||
|
long totalDecryptTime = 0;
|
||||||
|
|
||||||
|
for (int i = 0; i < TEST_ROUNDS; i++) {
|
||||||
|
long encryptStart = System.currentTimeMillis();
|
||||||
|
byte[] enData = this.api.SYD_SM2Encrypt(publicKey4Ende, orgData10M);
|
||||||
|
long encryptEnd = System.currentTimeMillis();
|
||||||
|
|
||||||
|
long decryptStart = System.currentTimeMillis();
|
||||||
|
byte[] deData = this.api.SYD_SM2Decrypt(privateKey4Ende, enData);
|
||||||
|
long decryptEnd = System.currentTimeMillis();
|
||||||
|
|
||||||
|
totalEncryptTime += (encryptEnd - encryptStart);
|
||||||
|
totalDecryptTime += (decryptEnd - decryptStart);
|
||||||
|
|
||||||
|
Assert.assertArrayEquals(orgData10M, deData);
|
||||||
|
}
|
||||||
|
|
||||||
|
double avgEncryptTime = (double) totalEncryptTime / TEST_ROUNDS;
|
||||||
|
double avgDecryptTime = (double) totalDecryptTime / TEST_ROUNDS;
|
||||||
|
double encryptThroughput = (10240.0 / avgEncryptTime) * 1000;
|
||||||
|
double decryptThroughput = (10240.0 / avgDecryptTime) * 1000;
|
||||||
|
|
||||||
|
System.out.println("Test Rounds: " + TEST_ROUNDS);
|
||||||
|
System.out.println("Data Size: 10MB");
|
||||||
|
System.out.printf("Average Encrypt Time: %.2f ms%n", avgEncryptTime);
|
||||||
|
System.out.printf("Average Decrypt Time: %.2f ms%n", avgDecryptTime);
|
||||||
|
System.out.printf("Encrypt Throughput: %.2f KB/s%n", encryptThroughput);
|
||||||
|
System.out.printf("Decrypt Throughput: %.2f KB/s%n", decryptThroughput);
|
||||||
|
System.out.println();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void SYD_SM2_Encrypt_TimeStats_2M() {
|
||||||
|
System.out.println("=== SYD_SM2_Encrypt Time Statistics Test - 2M Data ===");
|
||||||
|
|
||||||
|
// 预热
|
||||||
|
for (int i = 0; i < 2; i++) {
|
||||||
|
byte[] enData = this.api.SYD_SM2Encrypt(publicKey4Ende, orgData2M);
|
||||||
|
byte[] deData = this.api.SYD_SM2Decrypt(privateKey4Ende, enData);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 正式测试
|
||||||
|
TimeStats encryptStats = new TimeStats();
|
||||||
|
TimeStats decryptStats = new TimeStats();
|
||||||
|
|
||||||
|
byte[] enData = this.api.SYD_SM2Encrypt(publicKey4Ende, orgData2M, encryptStats);
|
||||||
|
byte[] deData = this.api.SYD_SM2Decrypt(privateKey4Ende, enData, decryptStats);
|
||||||
|
|
||||||
|
Assert.assertArrayEquals(orgData2M, deData);
|
||||||
|
|
||||||
|
System.out.println("\n--- 加密阶段时间统计 ---");
|
||||||
|
System.out.printf("发送阶段: %d ms (%.1f%%), 发送次数: %d%n",
|
||||||
|
encryptStats.getSendTime(), encryptStats.getSendPercentage(), encryptStats.getSendCount());
|
||||||
|
System.out.printf("计算阶段: %d ms (%.1f%%)%n",
|
||||||
|
encryptStats.getComputeTime(), encryptStats.getComputePercentage());
|
||||||
|
System.out.printf("接收阶段: %d ms (%.1f%%), 接收次数: %d%n",
|
||||||
|
encryptStats.getReceiveTime(), encryptStats.getReceivePercentage(), encryptStats.getReceiveCount());
|
||||||
|
System.out.printf("加密总耗时: %d ms%n", encryptStats.getTotalTime());
|
||||||
|
|
||||||
|
System.out.println("\n--- 解密阶段时间统计 ---");
|
||||||
|
System.out.printf("发送阶段: %d ms (%.1f%%), 发送次数: %d%n",
|
||||||
|
decryptStats.getSendTime(), decryptStats.getSendPercentage(), decryptStats.getSendCount());
|
||||||
|
System.out.printf("计算阶段: %d ms (%.1f%%)%n",
|
||||||
|
decryptStats.getComputeTime(), decryptStats.getComputePercentage());
|
||||||
|
System.out.printf("接收阶段: %d ms (%.1f%%), 接收次数: %d%n",
|
||||||
|
decryptStats.getReceiveTime(), decryptStats.getReceivePercentage(), decryptStats.getReceiveCount());
|
||||||
|
System.out.printf("解密总耗时: %d ms%n", decryptStats.getTotalTime());
|
||||||
|
|
||||||
|
System.out.println("\n--- 汇总 ---");
|
||||||
|
long totalTime = encryptStats.getTotalTime() + decryptStats.getTotalTime();
|
||||||
|
System.out.printf("加密解密总耗时: %d ms%n", totalTime);
|
||||||
|
System.out.printf("加密吞吐量: %.2f KB/s%n", (2048.0 / encryptStats.getTotalTime()) * 1000);
|
||||||
|
System.out.printf("解密吞吐量: %.2f KB/s%n", (2048.0 / decryptStats.getTotalTime()) * 1000);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,84 @@
|
|||||||
|
package cmbpoc;
|
||||||
|
|
||||||
|
import com.sunyard.RetWrap;
|
||||||
|
import com.sunyard.SydApi;
|
||||||
|
import com.sunyard.proto.Util;
|
||||||
|
import org.junit.After;
|
||||||
|
import org.junit.Assert;
|
||||||
|
import org.junit.Before;
|
||||||
|
import org.junit.Test;
|
||||||
|
import racal.sunyard.main.SydApi4j;
|
||||||
|
|
||||||
|
public class SignatureVerifyTest {
|
||||||
|
|
||||||
|
private SydApi4j api;
|
||||||
|
private byte[] orgData;
|
||||||
|
private String SM2dn;
|
||||||
|
|
||||||
|
@Before
|
||||||
|
public void setUp() {
|
||||||
|
System.setProperty("com.sunyard.sydapi4j.debug", "true");
|
||||||
|
this.api = (SydApi4j) new SydApi4j().connect("172.1.41.139", 8889, null, 3000);
|
||||||
|
this.orgData = "Hello, World! 测试数据".getBytes();
|
||||||
|
this.SM2dn = "C=cn,O=CFCA OCA1 SM2,OU=Local RA OCA1,OU=Units,CN=041@N91330108762038374D@sunyard@00000064";
|
||||||
|
}
|
||||||
|
|
||||||
|
@After
|
||||||
|
public void tearDown() {
|
||||||
|
if (api != null) {
|
||||||
|
this.api.disconnect();
|
||||||
|
this.api = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testP1SignAndVerify() {
|
||||||
|
byte[] sign = this.api.SYD_NakedSign(orgData, SM2dn);
|
||||||
|
Assert.assertNotNull("P1签名结果不应为空", sign);
|
||||||
|
System.out.println("P1签名结果: " + Util.bytes2HexString(sign));
|
||||||
|
|
||||||
|
boolean verifyResult = this.api.SYD_NakedVerify(orgData, sign, SM2dn);
|
||||||
|
Assert.assertTrue("P1验签应通过", verifyResult);
|
||||||
|
System.out.println("P1验签结果: " + verifyResult);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testP7DetachSignAndVerify() {
|
||||||
|
String sign = this.api.detachedSign(1, orgData, SM2dn);
|
||||||
|
Assert.assertNotNull("P7 Detach签名结果不应为空", sign);
|
||||||
|
System.out.println("P7 Detach签名结果: " + sign);
|
||||||
|
|
||||||
|
boolean verifyResult = this.api.detachedVerify(1, orgData, sign);
|
||||||
|
Assert.assertTrue("P7 Detach验签应通过", verifyResult);
|
||||||
|
System.out.println("P7 Detach验签结果: " + verifyResult);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testP7AttachSignAndVerify() throws Exception {
|
||||||
|
String sign = this.api.attachedSign(orgData, SM2dn);
|
||||||
|
Assert.assertNotNull("P7 Attach签名结果不应为空", sign);
|
||||||
|
System.out.println("P7 Attach签名结果: " + sign);
|
||||||
|
|
||||||
|
boolean verifyResult = this.api.attachedVerify(sign);
|
||||||
|
Assert.assertTrue("P7 Attach验签应通过", verifyResult);
|
||||||
|
System.out.println("P7 Attach验签结果: " + verifyResult);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testDigitalEnvelopeEncryptAndDecrypt() {
|
||||||
|
RetWrap genResult = this.api.generateDEByDn(SM2dn, orgData);
|
||||||
|
Assert.assertNotNull("数字信封生成结果不应为空", genResult);
|
||||||
|
|
||||||
|
byte[] cipherKey = (byte[]) genResult.get(SydApi.RET_CIPHER_KEY);
|
||||||
|
Assert.assertNotNull("数字信封密文密钥不应为空", cipherKey);
|
||||||
|
System.out.println("数字信封密文: " + new String(cipherKey));
|
||||||
|
|
||||||
|
RetWrap decryptResult = this.api.decryptDEByDN(SM2dn, cipherKey);
|
||||||
|
Assert.assertNotNull("数字信封解密结果不应为空", decryptResult);
|
||||||
|
|
||||||
|
byte[] decryptedData = (byte[]) decryptResult.get("oData");
|
||||||
|
Assert.assertNotNull("解密数据不应为空", decryptedData);
|
||||||
|
Assert.assertArrayEquals("解密数据应与原始数据一致", orgData, decryptedData);
|
||||||
|
System.out.println("数字信封解密结果: " + new String(decryptedData));
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,50 +0,0 @@
|
|||||||
package com.sunyard.sydapi.loadrunner;
|
|
||||||
|
|
||||||
import com.sunyard.sydapi.loadrunner.action1.Actions;
|
|
||||||
import racal.sunyard.main.SydApi4j;
|
|
||||||
import racal.sunyard.main.SydApiBuilder;
|
|
||||||
|
|
||||||
public class ShangTest {
|
|
||||||
|
|
||||||
private static final String dn = "C=CN,O=CFCA OCA1,OU=YCCA,OU=Individual-2,CN=YCCA@黄金交易所@Zhuangj@1";
|
|
||||||
private static final byte[] testData = new byte[ 4 * 1024 ];
|
|
||||||
|
|
||||||
private SydApi4j api = null;
|
|
||||||
|
|
||||||
public void init() throws Exception {
|
|
||||||
if ( null == api ) {
|
|
||||||
api = (SydApi4j) new SydApiBuilder()
|
|
||||||
.setIp("172.16.18.59") // 192.168.0.162
|
|
||||||
.setPort( 8889 )
|
|
||||||
.useDebugMode()
|
|
||||||
.build();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void action(){
|
|
||||||
String sign = api.attachedSign(testData, dn);
|
|
||||||
boolean ret = api.attachedVerify( sign );
|
|
||||||
|
|
||||||
assert ret;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
public void end(){
|
|
||||||
if (null != this.api ) {
|
|
||||||
this.api.disconnect();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
public static void main(String[] args) throws Throwable {
|
|
||||||
System.out.println( SydApi4j.getVersion() );
|
|
||||||
|
|
||||||
// Actions test = new Actions();
|
|
||||||
ShangTest test = new ShangTest();
|
|
||||||
test.init();
|
|
||||||
test.action();
|
|
||||||
test.end();
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,44 +0,0 @@
|
|||||||
package com.sunyard.sydapi.loadrunner.action1;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* LoadRunner Java script. (Build: _build_number_)
|
|
||||||
*
|
|
||||||
* Script Description:
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
import racal.sunyard.main.SydApi4j;
|
|
||||||
import racal.sunyard.main.SydApiBuilder;
|
|
||||||
|
|
||||||
public class Actions
|
|
||||||
{
|
|
||||||
|
|
||||||
private static final byte[] testData = new byte[ 4 * 1024 ];
|
|
||||||
|
|
||||||
private SydApi4j api = null;
|
|
||||||
|
|
||||||
public int init() throws Throwable {
|
|
||||||
if ( null == api ) {
|
|
||||||
api = (SydApi4j) new SydApiBuilder()
|
|
||||||
.setIp("172.16.18.59")
|
|
||||||
.setPort( 8889 )
|
|
||||||
.useDebugMode()
|
|
||||||
.build();
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}//end of init
|
|
||||||
|
|
||||||
|
|
||||||
public int action() throws Throwable {
|
|
||||||
api.SM3Hash( testData );
|
|
||||||
return 0;
|
|
||||||
}//end of action
|
|
||||||
|
|
||||||
|
|
||||||
public int end() throws Throwable {
|
|
||||||
if (null != this.api ) {
|
|
||||||
this.api.disconnect();
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}//end of end
|
|
||||||
}
|
|
||||||
@@ -1,75 +0,0 @@
|
|||||||
package com.sunyard.sydapi.loadrunner.raw;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* LoadRunner Java script. (Build: _build_number_)
|
|
||||||
*
|
|
||||||
* Script Description:
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
import lrapi.lr;
|
|
||||||
import racal.sunyard.main.SydApi4j;
|
|
||||||
import racal.sunyard.main.SydApiBuilder;
|
|
||||||
import com.sunyard.proto.Util;
|
|
||||||
import com.sunyard.SydApi;
|
|
||||||
|
|
||||||
public class Actions
|
|
||||||
{
|
|
||||||
|
|
||||||
private static final String inHexData = "67c6697351ff4aec29cdbaabf2fbe346";
|
|
||||||
|
|
||||||
private static String pk ;
|
|
||||||
private static String sk ;
|
|
||||||
private SydApi api;
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
public int init() throws Throwable {
|
|
||||||
SydApiBuilder builder = new SydApiBuilder().setIp("192.168.1.123");
|
|
||||||
api = builder.build();
|
|
||||||
|
|
||||||
this.pk = api.SM2GetPublicKeyC("123", 0 );
|
|
||||||
this.sk = api.SM2GetPrivateKeyC("123");
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}//end of init
|
|
||||||
|
|
||||||
|
|
||||||
public int action() throws Throwable {
|
|
||||||
lr.start_transaction("auto");//设置事务开始点
|
|
||||||
|
|
||||||
try {
|
|
||||||
|
|
||||||
System.out.println("begin SYD_Sign_P1");
|
|
||||||
byte[] sign = this.api.SM2SignC( 0 , sk, Util.hexString2Bytes(pk), Util.hexString2Bytes(inHexData) );
|
|
||||||
System.out.println("sign=" + Util.bytes2HexString( sign ));
|
|
||||||
|
|
||||||
System.out.println("begin SYD_Verify_P1");
|
|
||||||
boolean pass = api.SM2Verify(1, Util.hexString2Bytes(pk), Util.hexString2Bytes(inHexData), sign );
|
|
||||||
System.out.println("验签结果 " + pass);
|
|
||||||
System.out.println("end SYD_Verify_P1");
|
|
||||||
|
|
||||||
} finally {
|
|
||||||
lr.end_transaction("auto", lr.AUTO);//设置事务结束点
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}//end of action
|
|
||||||
|
|
||||||
|
|
||||||
public int end() throws Throwable {
|
|
||||||
return 0;
|
|
||||||
}//end of end
|
|
||||||
|
|
||||||
|
|
||||||
public static void main(String[] args) throws Throwable {
|
|
||||||
|
|
||||||
Actions actions = new Actions();
|
|
||||||
actions.init();
|
|
||||||
actions.action();
|
|
||||||
actions.end();
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
@@ -1,76 +0,0 @@
|
|||||||
package com.sunyard.sydapi.loadrunner.raw_uid;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* LoadRunner Java script. (Build: _build_number_)
|
|
||||||
*
|
|
||||||
* Script Description:
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
import lrapi.lr;
|
|
||||||
import racal.sunyard.main.SydApi4j;
|
|
||||||
import racal.sunyard.main.SydApiBuilder;
|
|
||||||
import com.sunyard.proto.Util;
|
|
||||||
import com.sunyard.SydApi;
|
|
||||||
|
|
||||||
public class Actions
|
|
||||||
{
|
|
||||||
|
|
||||||
private static final String inHexData = "67c6697351ff4aec29cdbaabf2fbe346";
|
|
||||||
private static final String uid = "8765432187654321";
|
|
||||||
|
|
||||||
private static String pk ;
|
|
||||||
private static String sk ;
|
|
||||||
private SydApi api;
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
public int init() throws Throwable {
|
|
||||||
SydApiBuilder builder = new SydApiBuilder().setIp("192.168.1.123");
|
|
||||||
api = builder.build();
|
|
||||||
|
|
||||||
this.pk = api.SM2GetPublicKeyC("123", 0 );
|
|
||||||
this.sk = api.SM2GetPrivateKeyC("123");
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}//end of init
|
|
||||||
|
|
||||||
|
|
||||||
public int action() throws Throwable {
|
|
||||||
lr.start_transaction("auto");//设置事务开始点
|
|
||||||
|
|
||||||
try {
|
|
||||||
|
|
||||||
System.out.println("begin SYD_Sign_P1");
|
|
||||||
byte[] sign = this.api.SM2SignC( 0, uid , sk, Util.hexString2Bytes(pk), Util.hexString2Bytes(inHexData) );
|
|
||||||
System.out.println("sign=" + Util.bytes2HexString( sign ));
|
|
||||||
|
|
||||||
System.out.println("begin SYD_Verify_P1");
|
|
||||||
boolean pass = api.SM2Verify( uid, 1, Util.hexString2Bytes(pk), Util.hexString2Bytes(inHexData), sign );
|
|
||||||
System.out.println("验签结果 " + pass);
|
|
||||||
System.out.println("end SYD_Verify_P1");
|
|
||||||
|
|
||||||
} finally {
|
|
||||||
lr.end_transaction("auto", lr.AUTO);//设置事务结束点
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}//end of action
|
|
||||||
|
|
||||||
|
|
||||||
public int end() throws Throwable {
|
|
||||||
return 0;
|
|
||||||
}//end of end
|
|
||||||
|
|
||||||
|
|
||||||
public static void main(String[] args) throws Throwable {
|
|
||||||
|
|
||||||
Actions actions = new Actions();
|
|
||||||
actions.init();
|
|
||||||
actions.action();
|
|
||||||
actions.end();
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
@@ -22,7 +22,7 @@ public class CertTest {
|
|||||||
public static void main(String[] args) {
|
public static void main(String[] args) {
|
||||||
//System.setProperty("com.sunyard.sydapi4j.debug", "true");
|
//System.setProperty("com.sunyard.sydapi4j.debug", "true");
|
||||||
|
|
||||||
SydApi4j api = (SydApi4j) new SydApi4j().connect("172.16.18.5", 8889, null, 1000);
|
SydApi4j api = (SydApi4j) new SydApi4j().connect("192.168.1.129", 8889, null, 1000);
|
||||||
try{
|
try{
|
||||||
List<String>dns = api.getAllCert();
|
List<String>dns = api.getAllCert();
|
||||||
System.out.println(Arrays.toString( dns.toArray() ) );
|
System.out.println(Arrays.toString( dns.toArray() ) );
|
||||||
|
|||||||
@@ -8,54 +8,55 @@ import racal.sunyard.main.SydApiBuilder;
|
|||||||
public class TestShangqingXingye {
|
public class TestShangqingXingye {
|
||||||
private static final byte[] orgDataBig = new byte[ 5 * 1024];
|
private static final byte[] orgDataBig = new byte[ 5 * 1024];
|
||||||
private static final byte[] orgData2k = new byte[ 2 * 1024];
|
private static final byte[] orgData2k = new byte[ 2 * 1024];
|
||||||
private static final String pcDnEN = "C=CN,O=CFCA OCA1,OU=YCCA,OU=Individual-2,CN=YCCA@黄金交易所@Zhuangj@1";
|
private static final String pcDnEN = "C=CN,O=CFCA TEST SM2 OCA31,OU=SGE,OU=Organizational-2,CN=SGE051@7028-702821-b70280002@Z000000001@1";
|
||||||
|
private static final String pcDnEN2 = "C=CN,O=OCA31SM2,OU=Local RA OCA31,OU=Organizational-2,CN=CFCA@sunyard@N91330108762038374D@52";
|
||||||
|
|
||||||
public static void main(String[] args) {
|
public static void main(String[] args) {
|
||||||
//System.setProperty("com.sunyard.sydapi4j.debug", "true");
|
//System.setProperty("com.sunyard.sydapi4j.debug", "true");
|
||||||
long startTime = System.currentTimeMillis(); //获取开始时间
|
long startTime = System.currentTimeMillis(); //获取开始时间
|
||||||
SydApiBuilder builder = new SydApiBuilder().setIp("192.168.0.100");
|
SydApiBuilder builder = new SydApiBuilder().setIp("172.1.41.214");
|
||||||
SydApi4j api = (SydApi4j) builder.build();
|
SydApi4j api = (SydApi4j) builder.build();
|
||||||
|
|
||||||
try {
|
try {
|
||||||
|
|
||||||
/**
|
// /**
|
||||||
* 产生对称密钥,通过公钥加密生成数字信封,。
|
// * 产生对称密钥,通过公钥加密生成数字信封,。
|
||||||
* @param pcDnEN: 清算所的公钥证书
|
// * @param pcDnEN: 清算所的公钥证书
|
||||||
* @param pcData: 明文数据。
|
// * @param pcData: 明文数据。
|
||||||
* @return RetWrap: 数字信封
|
// * @return RetWrap: 数字信封
|
||||||
*/
|
// */
|
||||||
RetWrap signData = api.generateDEByDn(pcDnEN, orgDataBig);
|
// RetWrap signData = api.generateDEByDn(pcDnEN, orgDataBig);
|
||||||
byte[] cpkey2 = (byte[]) signData.get("CipherKey");
|
// byte[] cpkey2 = (byte[]) signData.get("CipherKey");
|
||||||
System.out.println("加密信封:" + new String(cpkey2));
|
// System.out.println("加密信封:" + new String(cpkey2));
|
||||||
|
//
|
||||||
/**
|
// /**
|
||||||
* 接收用私钥解密数字信封,还原原文。。
|
// * 接收用私钥解密数字信封,还原原文。。
|
||||||
* @param pcDnEN: 清算所的公钥证书
|
// * @param pcDnEN: 清算所的公钥证书
|
||||||
* @param cpkey: 数字信封。
|
// * @param cpkey: 数字信封。
|
||||||
* @return preData: 原数据
|
// * @return preData: 原数据
|
||||||
*/
|
// */
|
||||||
RetWrap oDataWrap = api.decryptDEByDN(pcDnEN, cpkey2);
|
// RetWrap oDataWrap = api.decryptDEByDN(pcDnEN, cpkey2);
|
||||||
byte[] preData = (byte[]) oDataWrap.get("oData");
|
// byte[] preData = (byte[]) oDataWrap.get("oData");
|
||||||
System.out.println("解密信封:" + Util.bytes2HexString(preData));
|
// System.out.println("解密信封:" + Util.bytes2HexString(preData));
|
||||||
|
//
|
||||||
|
//
|
||||||
/**
|
// /**
|
||||||
* 通过指定的私钥对指定的原始数据编制带公钥证书的数字签名(遵循PKCS#7),
|
// * 通过指定的私钥对指定的原始数据编制带公钥证书的数字签名(遵循PKCS#7),
|
||||||
* @param orgData: 待签名的原始数据
|
// * @param orgData: 待签名的原始数据
|
||||||
* @param pcDnEN: 签名者证书 DN
|
// * @param pcDnEN: 签名者证书 DN
|
||||||
* @return signsData: 签名数据
|
// * @return signsData: 签名数据
|
||||||
*/
|
// */
|
||||||
String signsData = api.SYD_SM2_DetachedSign_HA(orgData2k, pcDnEN);
|
// String signsData = api.SYD_SM2_DetachedSign_HA(orgData2k, pcDnEN);
|
||||||
System.out.println("签名数据:" + signsData);
|
// System.out.println("签名数据:" + signsData);
|
||||||
|
//
|
||||||
/**
|
// /**
|
||||||
* 利用清算所的公钥证书对签名数据进行验签。
|
// * 利用清算所的公钥证书对签名数据进行验签。
|
||||||
* @param dataType: 数据模式, 0:输入的数据为 HASH 后的数据, 1:输入的数据为原始数据库(本次传入1)
|
// * @param dataType: 数据模式, 0:输入的数据为 HASH 后的数据, 1:输入的数据为原始数据库(本次传入1)
|
||||||
* @param orgData: 待签名的原始数据
|
// * @param orgData: 待签名的原始数据
|
||||||
* @param sign: 签名数据。
|
// * @param sign: 签名数据。
|
||||||
*/
|
// */
|
||||||
boolean result = api.detachedVerify(1, orgData2k, signsData);
|
// boolean result = api.detachedVerify(1, orgData2k, signsData);
|
||||||
System.out.println("验签结果:" + result);
|
// System.out.println("验签结果:" + result);
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -67,7 +68,7 @@ public class TestShangqingXingye {
|
|||||||
* @param pcData: 明文数据。
|
* @param pcData: 明文数据。
|
||||||
* @return pcSignData: 签名数字信封
|
* @return pcSignData: 签名数字信封
|
||||||
*/
|
*/
|
||||||
String pcSignData = api.SYD_SignDigitalEnvelope(pcDnEN, pcDnEN, orgData2k);
|
String pcSignData = api.SYD_SignDigitalEnvelope(pcDnEN2, pcDnEN2, orgData2k);
|
||||||
System.out.println("签名数字信封:" + pcSignData);
|
System.out.println("签名数字信封:" + pcSignData);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -79,7 +80,7 @@ public class TestShangqingXingye {
|
|||||||
* @return pcData:原数据
|
* @return pcData:原数据
|
||||||
*/
|
*/
|
||||||
|
|
||||||
byte[] oData = api.SYD_VerifyDigitalEnveloe(pcDnEN, pcDnEN, pcSignData);
|
byte[] oData = api.SYD_VerifyDigitalEnveloe(pcDnEN2, pcDnEN2, pcSignData);
|
||||||
System.out.println("原数据:" + Util.bytes2HexString(oData));
|
System.out.println("原数据:" + Util.bytes2HexString(oData));
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,378 @@
|
|||||||
|
package jmeter;
|
||||||
|
|
||||||
|
import sample.SydUtils;
|
||||||
|
import com.google.gson.Gson;
|
||||||
|
import com.sunyard.SydApiException;
|
||||||
|
import com.sunyard.entity.ImportResult;
|
||||||
|
import com.sunyard.proto.Util;
|
||||||
|
import org.apache.commons.lang3.StringUtils;
|
||||||
|
import org.apache.jmeter.config.Arguments;
|
||||||
|
import org.apache.jmeter.protocol.java.sampler.AbstractJavaSamplerClient;
|
||||||
|
import org.apache.jmeter.protocol.java.sampler.JavaSamplerContext;
|
||||||
|
import org.apache.jmeter.samplers.SampleResult;
|
||||||
|
import racal.sunyard.main.SydApi4j;
|
||||||
|
|
||||||
|
import java.io.StringWriter;
|
||||||
|
import java.nio.charset.StandardCharsets;
|
||||||
|
import java.util.*;
|
||||||
|
|
||||||
|
|
||||||
|
public class Test4Jmeter extends AbstractJavaSamplerClient {
|
||||||
|
|
||||||
|
private String SM2dn ;
|
||||||
|
private String RSAdn ;
|
||||||
|
private String ip ;
|
||||||
|
|
||||||
|
private int port;
|
||||||
|
private String ip2 ;
|
||||||
|
private String oData;
|
||||||
|
private String sign;
|
||||||
|
|
||||||
|
private String detachedSign;
|
||||||
|
private byte[] orgData;
|
||||||
|
|
||||||
|
private int type;
|
||||||
|
|
||||||
|
private static ThreadLocal<SydApi4j> api;
|
||||||
|
|
||||||
|
private int dataLength;
|
||||||
|
|
||||||
|
private String cert;
|
||||||
|
private String nodes;
|
||||||
|
private String snmpIP;
|
||||||
|
private String snmpPort;
|
||||||
|
private String snmpOID;
|
||||||
|
private String snmpCommunity;
|
||||||
|
|
||||||
|
private int timeout;
|
||||||
|
|
||||||
|
private int logSwitch;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 定义默认的参数,在jmeter中会自动显示在这里定义的默认参数
|
||||||
|
* @return Arguments对象
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public Arguments getDefaultParameters() {
|
||||||
|
Arguments arguments = new Arguments();
|
||||||
|
arguments.addArgument("SM2dn", "C=CN,ST=zz,L=zz,O=zzz,CN=zzzzz");
|
||||||
|
arguments.addArgument("RSAdn", "C=cn,O=CFCA TEST CA,OU=NCS2,OU=Enterprises,CN=041@Z402451000010@ShanDong@00000001");
|
||||||
|
arguments.addArgument("orgData", "null");
|
||||||
|
arguments.addArgument("ip", "172.1.41.139");
|
||||||
|
arguments.addArgument("ip2", "172.1.41.96");
|
||||||
|
arguments.addArgument("port", "8889");
|
||||||
|
arguments.addArgument("timeout", "3000");
|
||||||
|
arguments.addArgument("logSwitch", "1");
|
||||||
|
// arguments.addArgument("ip2", "172.16.17.161");
|
||||||
|
arguments.addArgument("dataLength", "1024");
|
||||||
|
arguments.addArgument("type", "1");
|
||||||
|
arguments.addArgument("sign", "12345678");
|
||||||
|
arguments.addArgument("detachedSign", "12345678");
|
||||||
|
arguments.addArgument("cert", "");
|
||||||
|
arguments.addArgument("nodes", "172.1.41.139:8889;172.1.41.96:8889");
|
||||||
|
arguments.addArgument("snmpIP", "172.1.41.139");
|
||||||
|
arguments.addArgument("snmpPort", "162");
|
||||||
|
arguments.addArgument("snmpOID", "1.3.6.1.4.1.9999");
|
||||||
|
arguments.addArgument("snmpCommunity", "public");
|
||||||
|
|
||||||
|
return arguments;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 在执行测试之前执行,只执行一次,可以获取传递过来的参数,一般用来做初始化操作
|
||||||
|
* @param context 可以获取jmeter传递过来的参数
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void setupTest(JavaSamplerContext context) {
|
||||||
|
//对成员变量初始化
|
||||||
|
SM2dn = context.getParameter("SM2dn");
|
||||||
|
RSAdn = context.getParameter("RSAdn");
|
||||||
|
oData = context.getParameter("orgData");
|
||||||
|
ip = context.getParameter("ip");
|
||||||
|
ip2 = context.getParameter("ip2");
|
||||||
|
port = context.getIntParameter("port");
|
||||||
|
timeout = context.getIntParameter("timeout");
|
||||||
|
logSwitch = context.getIntParameter("logSwitch");
|
||||||
|
// ip2 = context.getParameter("ip2");
|
||||||
|
dataLength = context.getIntParameter("dataLength");
|
||||||
|
type = context.getIntParameter("type");
|
||||||
|
sign = context.getParameter("sign");
|
||||||
|
detachedSign = context.getParameter("detachedSign");
|
||||||
|
cert = context.getParameter("cert");
|
||||||
|
nodes = context.getParameter("nodes");
|
||||||
|
snmpIP = context.getParameter("snmpIP");
|
||||||
|
snmpPort = context.getParameter("snmpPort");
|
||||||
|
snmpOID = context.getParameter("snmpOID");
|
||||||
|
snmpCommunity = context.getParameter("snmpCommunity");
|
||||||
|
System.getProperty("com.sunyard.sydapi4j.debug", "false");
|
||||||
|
System.setProperty("com.sunyard.dnsort", "false");
|
||||||
|
api = new ThreadLocal<SydApi4j>() {
|
||||||
|
@Override
|
||||||
|
public SydApi4j initialValue() {
|
||||||
|
//
|
||||||
|
// SydApiBuilder builder = new SydApiBuilder().setIp(ip);
|
||||||
|
// final SydApi4j api = (SydApi4j) builder.build();
|
||||||
|
SydApi4j.SYD_Set_Parameter_HA(ip, ip2, port, timeout);
|
||||||
|
final SydApi4j api1 = (SydApi4j) new SydApi4j();
|
||||||
|
return api1;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 真正的测试代码块,jmeter按照配置的逻辑执行该方法
|
||||||
|
* @param javaSamplerContext 上下文对象,可以获取jmeter传递的参数
|
||||||
|
* @return SampleResult对象用于封装结果
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public SampleResult runTest(JavaSamplerContext javaSamplerContext) {
|
||||||
|
SampleResult sr = new SampleResult();
|
||||||
|
//设置标签
|
||||||
|
sr.setSampleLabel("testDemo");
|
||||||
|
//设置开始标志,否则无法统计tps等
|
||||||
|
sr.sampleStart();
|
||||||
|
SydUtils sydUtils = null;
|
||||||
|
try {
|
||||||
|
if ("null".equals(oData)) {
|
||||||
|
orgData = null;
|
||||||
|
} else {
|
||||||
|
orgData = oData.getBytes(); //SM2裸签
|
||||||
|
}
|
||||||
|
sydUtils = new SydUtils(ip, ip2, port, timeout);
|
||||||
|
// orgData = new byte[dataLength];
|
||||||
|
//执行业务逻辑
|
||||||
|
switch(type){
|
||||||
|
case 1:
|
||||||
|
// api.get().SYD_NakedSign(SM2dn, orgData, (byte[]) null);
|
||||||
|
// byte[] nakedSign = api.get().SYD_NakedSign(orgData,SM2dn);
|
||||||
|
byte[] nakedSign = sydUtils.SYD_NakedSign(orgData,SM2dn);
|
||||||
|
if (logSwitch == 1) {
|
||||||
|
System.out.println("p1签名(hex):"+ Util.bytes2HexString(nakedSign));
|
||||||
|
}
|
||||||
|
|
||||||
|
sr.setResponseCodeOK();
|
||||||
|
//sr.setResponseData(Util.encodeBase64(nakedSign1), StandardCharsets.UTF_8.displayName());
|
||||||
|
break;
|
||||||
|
|
||||||
|
|
||||||
|
case 2:
|
||||||
|
// api.get().SYD_NakedVerify(SM2dn, Util.decodeBase64(sign), orgData, (byte[])null) ;
|
||||||
|
// boolean flag = api.get().SYD_NakedVerify(orgData,Util.hexString2Bytes(sign), SM2dn);
|
||||||
|
boolean flag = sydUtils.SYD_NakedVerify(orgData,Util.hexString2Bytes(sign), SM2dn);
|
||||||
|
if (logSwitch == 1) {
|
||||||
|
System.out.println("p1验签:"+ flag);
|
||||||
|
}
|
||||||
|
sr.setResponseCodeOK();
|
||||||
|
//sr.setResponseData(String.valueOf(nakedVerify1), StandardCharsets.UTF_8.displayName());
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 3:
|
||||||
|
//RSA裸签
|
||||||
|
api.get().SYD_NakedSign(1, RSAdn,orgData,(byte[])null);
|
||||||
|
sr.setResponseCodeOK();
|
||||||
|
//sr.setResponseData(Util.encodeBase64(nakedSign2), StandardCharsets.UTF_8.displayName());
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 4:
|
||||||
|
api.get().SYD_NakedVerify(1, RSAdn,Util.decodeBase64(sign),orgData ,(byte[])null);
|
||||||
|
sr.setResponseCodeOK();
|
||||||
|
//sr.setResponseData(String.valueOf(nakedVerify2), StandardCharsets.UTF_8.displayName());
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 5:
|
||||||
|
// api.get().detachedSign(1, orgData, SM2dn);
|
||||||
|
//p7 detached签名
|
||||||
|
String detachedSign1 = sydUtils.detachedSign(orgData, SM2dn);
|
||||||
|
if (logSwitch == 1) {
|
||||||
|
System.out.println("p7 detach签名:"+ detachedSign1);
|
||||||
|
}
|
||||||
|
sr.setResponseCodeOK();
|
||||||
|
//sr.setResponseData(detSign1, StandardCharsets.UTF_8.displayName());
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 6:
|
||||||
|
// api.get().detachedVerify(1, orgData, sign);
|
||||||
|
//p7 detached验签
|
||||||
|
// boolean ver = api.get().detachedVerify(orgData, detachedSign);
|
||||||
|
boolean ver = sydUtils.detachedVerify(orgData, detachedSign);
|
||||||
|
if (logSwitch == 1) {
|
||||||
|
System.out.println("p7 detach验签:"+ ver);
|
||||||
|
}
|
||||||
|
sr.setResponseCodeOK();
|
||||||
|
//sr.setResponseData(String.valueOf(detV1), StandardCharsets.UTF_8.displayName());
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 7:
|
||||||
|
api.get().detachedSign(2,1, orgData, RSAdn);
|
||||||
|
sr.setResponseCodeOK();
|
||||||
|
//sr.setResponseData(detSign2, StandardCharsets.UTF_8.displayName());
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 8:
|
||||||
|
api.get().detachedVerify(2,2, orgData, sign);
|
||||||
|
sr.setResponseCodeOK();
|
||||||
|
//sr.setResponseData(String.valueOf(detV2), StandardCharsets.UTF_8.displayName());
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 9:
|
||||||
|
api.get().attachedSignHsm(orgData, SM2dn);
|
||||||
|
sr.setResponseCodeOK();
|
||||||
|
//sr.setResponseData(attSign1, StandardCharsets.UTF_8.displayName());
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 10:
|
||||||
|
api.get().attachedVerify( sign.getBytes());
|
||||||
|
sr.setResponseCodeOK();
|
||||||
|
// sr.setResponseData(String.valueOf(attV1), StandardCharsets.UTF_8.displayName());
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 11:
|
||||||
|
api.get().attachedSignRSAHsm(2, orgData, RSAdn);
|
||||||
|
sr.setResponseCodeOK();
|
||||||
|
// sr.setResponseData(attSign2, StandardCharsets.UTF_8.displayName());
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 12:
|
||||||
|
api.get().attachedVerifyRSA(2, sign);
|
||||||
|
sr.setResponseCodeOK();
|
||||||
|
// sr.setResponseData(String.valueOf(attV2), StandardCharsets.UTF_8.displayName());
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 13:
|
||||||
|
api.get().generateDE(SM2dn.getBytes(), 3, 1, orgData);
|
||||||
|
// byte[] cipherKey = (byte[]) genSM2.get(SydApi.RET_CIPHER_KEY);
|
||||||
|
sr.setResponseCodeOK();
|
||||||
|
// sr.setResponseData(new String(cipherKey), StandardCharsets.UTF_8.displayName());
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 14:
|
||||||
|
api.get().decryptDE(true, 1, SM2dn.getBytes(), sign);;
|
||||||
|
// byte[] oData = (byte[]) denSM2.get("oData");
|
||||||
|
sr.setResponseCodeOK();
|
||||||
|
// sr.setResponseData(new String(oData), StandardCharsets.UTF_8.displayName());
|
||||||
|
break;
|
||||||
|
|
||||||
|
|
||||||
|
case 15:
|
||||||
|
api.get().generateDE(RSAdn.getBytes(), 4, 1, orgData);
|
||||||
|
// byte[] cipherKeyRSA = (byte[]) genRSA.get(SydApi.RET_CIPHER_KEY);
|
||||||
|
sr.setResponseCodeOK();
|
||||||
|
//sr.setResponseData(new String(cipherKeyRSA), StandardCharsets.UTF_8.displayName());
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 16:
|
||||||
|
api.get().decryptDERSA(true, 1, RSAdn.getBytes(), sign);
|
||||||
|
// byte[] oDataRSA = (byte[]) denRSA.get("oData");
|
||||||
|
sr.setResponseCodeOK();
|
||||||
|
//sr.setResponseData(new String(oDataRSA), StandardCharsets.UTF_8.displayName());
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 17:
|
||||||
|
String cert1 = api.get().getCertBySign(detachedSign);
|
||||||
|
System.out.println("根据p7签名值获取的证书为:" + cert1);
|
||||||
|
sr.setResponseCodeOK();
|
||||||
|
break;
|
||||||
|
case 18:
|
||||||
|
testAhnx(sydUtils);
|
||||||
|
sr.setResponseCodeOK();
|
||||||
|
break;
|
||||||
|
case 19:
|
||||||
|
testImportCert();
|
||||||
|
sr.setResponseCodeOK();
|
||||||
|
break;
|
||||||
|
case 20:
|
||||||
|
boolean delFlag = api.get().deleteCert(SM2dn);
|
||||||
|
System.out.println("删除证书成功:"+ delFlag);
|
||||||
|
break;
|
||||||
|
case 21:
|
||||||
|
SydApi4j.SYD_Set_Parameter_HA(ip, ip2, port, timeout);
|
||||||
|
break;
|
||||||
|
case 22:
|
||||||
|
api.get().connect(ip, port, "", timeout);
|
||||||
|
break;
|
||||||
|
case 23:
|
||||||
|
api.get().disconnect();
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
sr.setResponseCodeOK();
|
||||||
|
sr.setResponseData("请选择测试组", StandardCharsets.UTF_8.displayName());
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
sr.setSuccessful(true);
|
||||||
|
}catch (SydApiException e){
|
||||||
|
e.printStackTrace();
|
||||||
|
sr.setResponseCode(String.valueOf(e.getRetCode()));
|
||||||
|
sr.setResponseData(e.getMessage(), StandardCharsets.UTF_8.displayName());
|
||||||
|
sr.setSuccessful(false);
|
||||||
|
}finally {
|
||||||
|
if (sydUtils != null) {
|
||||||
|
sydUtils.disconnect();
|
||||||
|
}
|
||||||
|
sr.sampleEnd();
|
||||||
|
}
|
||||||
|
return sr;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testAhnx(SydUtils sydUtils) {
|
||||||
|
|
||||||
|
//裸签
|
||||||
|
byte[] nakedSign = sydUtils.SYD_NakedSign(orgData,SM2dn);
|
||||||
|
|
||||||
|
//裸签验签
|
||||||
|
boolean ver = sydUtils.SYD_NakedVerify(orgData,nakedSign, SM2dn);
|
||||||
|
|
||||||
|
//detach签名
|
||||||
|
String detachedSign = sydUtils.detachedSign(orgData, SM2dn);
|
||||||
|
|
||||||
|
//detach验签
|
||||||
|
boolean ver1 = sydUtils.detachedVerify(orgData, detachedSign);
|
||||||
|
|
||||||
|
// testImportCert();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void testImportCert(){
|
||||||
|
List<String> masterNodes = Arrays.asList(StringUtils.split(nodes, ";"));
|
||||||
|
Map<String, String> map = new HashMap<>();
|
||||||
|
map.put("snmp.target.ip", snmpIP);
|
||||||
|
map.put("snmp.target.port", snmpPort);
|
||||||
|
map.put("enterprise.oid", snmpOID);
|
||||||
|
map.put("snmp.community", snmpCommunity);
|
||||||
|
map.put("snmp.version", "1");
|
||||||
|
Gson gson = new Gson();
|
||||||
|
String snmpConfig = gson.toJson(map);
|
||||||
|
SydApi4j sydApi4j = new SydApi4j();
|
||||||
|
String cert21 = convertToPem(Base64.getDecoder().decode(cert));
|
||||||
|
ImportResult importResult = sydApi4j.importCertToServers(masterNodes, timeout, cert21, "12345678", snmpConfig);
|
||||||
|
System.out.println("证书导入结果:" + gson.toJson(importResult));
|
||||||
|
}
|
||||||
|
|
||||||
|
private String convertToPem(byte[] derCert){
|
||||||
|
// 使用Base64编码器(兼容RFC 4648,每行64字符)
|
||||||
|
StringWriter writer = new StringWriter();
|
||||||
|
writer.write("-----BEGIN CERTIFICATE-----\n");
|
||||||
|
// 将DER转换为Base64并分割为每行64字符
|
||||||
|
String base64Cert = Base64.getMimeEncoder(64, "\n".getBytes()).encodeToString(derCert);
|
||||||
|
writer.write(base64Cert);
|
||||||
|
// 如果Base64编码的字符串没有以换行结束,则添加换行
|
||||||
|
if (!base64Cert.endsWith("\n")) {
|
||||||
|
writer.write("\n");
|
||||||
|
}
|
||||||
|
writer.write("-----END CERTIFICATE-----\n");
|
||||||
|
return writer.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 测试完成后执行,一般用于关闭资源
|
||||||
|
* @param context 上下文对象,可用于获取jmeter传递的参数
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void teardownTest(JavaSamplerContext context) {
|
||||||
|
System.runFinalization();
|
||||||
|
if (api != null) {
|
||||||
|
api.get().disconnect();
|
||||||
|
api.remove();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,14 +0,0 @@
|
|||||||
package lrapi;
|
|
||||||
|
|
||||||
public class lr {
|
|
||||||
|
|
||||||
public static String AUTO = "AUTO";
|
|
||||||
|
|
||||||
public static void start_transaction(String t) {
|
|
||||||
System.out.println("start_transaction" + t);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void end_transaction(String t, String type) {
|
|
||||||
System.out.println("end_transaction" + t);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -0,0 +1,215 @@
|
|||||||
|
package sample;
|
||||||
|
|
||||||
|
import cn.hutool.core.io.FileUtil;
|
||||||
|
import cn.hutool.json.JSONObject;
|
||||||
|
import cn.hutool.json.JSONUtil;
|
||||||
|
import com.sunyard.RetWrap;
|
||||||
|
import racal.sunyard.main.SydApi4j;
|
||||||
|
|
||||||
|
import java.nio.charset.StandardCharsets;
|
||||||
|
import java.nio.file.Path;
|
||||||
|
import java.nio.file.Paths;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public class CertKit {
|
||||||
|
|
||||||
|
private static String ip1;
|
||||||
|
private static String ip2;
|
||||||
|
private static int port;
|
||||||
|
private static int timeout = 3000;
|
||||||
|
|
||||||
|
private static SydApi4j api;
|
||||||
|
|
||||||
|
private static void printHelp() {
|
||||||
|
System.out.println("CertKit - 证书管理工具");
|
||||||
|
System.out.println("用法: java -jar CertKit.jar <命令> [参数]");
|
||||||
|
System.out.println();
|
||||||
|
System.out.println("命令列表:");
|
||||||
|
System.out.println(" help 显示此帮助信息");
|
||||||
|
System.out.println(" import <证书文件路径> [机构号] 上传证书到加密设备");
|
||||||
|
System.out.println(" delete <证书DN> 从加密设备删除指定证书");
|
||||||
|
System.out.println(" list 列出加密设备中的所有证书");
|
||||||
|
System.out.println(" set <key> <value> 设置配置项并保存到 config.json");
|
||||||
|
System.out.println();
|
||||||
|
System.out.println("可用配置项:");
|
||||||
|
System.out.println(" ip1 加密设备主IP地址");
|
||||||
|
System.out.println(" ip2 加密设备备IP地址");
|
||||||
|
System.out.println(" port 加密设备端口号");
|
||||||
|
System.out.println(" timeout 连接超时时间(毫秒)");
|
||||||
|
System.out.println(" dn 默认证书DN");
|
||||||
|
System.out.println();
|
||||||
|
System.out.println("配置文件: config.json (需放在当前目录)");
|
||||||
|
System.out.println(" { \"ip1\": \"172.1.41.3\", \"ip2\": \"172.1.41.139\", \"port\": 8889 }");
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void loadConfig() {
|
||||||
|
String workDir = System.getProperty("user.dir");
|
||||||
|
Path filePath = Paths.get(workDir, "config.json");
|
||||||
|
if (FileUtil.exist(filePath.toFile())) {
|
||||||
|
String configStr = FileUtil.readString(filePath.toFile(), StandardCharsets.UTF_8);
|
||||||
|
JSONObject config = JSONUtil.parseObj(configStr);
|
||||||
|
ip1 = config.getStr("ip1");
|
||||||
|
ip2 = config.getStr("ip2");
|
||||||
|
port = config.getInt("port");
|
||||||
|
System.out.println("配置已加载: ip1=" + ip1 + ", ip2=" + ip2 + ", port=" + port);
|
||||||
|
} else {
|
||||||
|
System.err.println("警告: 未找到配置文件 config.json,使用默认值");
|
||||||
|
ip1 = "172.1.41.3";
|
||||||
|
ip2 = "172.1.41.139";
|
||||||
|
port = 8889;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void connect() {
|
||||||
|
SydApi4j.SYD_Set_Parameter_HA(ip1, ip2, port, timeout);
|
||||||
|
api = (SydApi4j) new SydApi4j();
|
||||||
|
System.out.println("已连接到加密设备");
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void disconnect() {
|
||||||
|
if (api != null) {
|
||||||
|
api.disconnect();
|
||||||
|
System.out.println("已断开连接");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void importCert(String certFilePath, String organizationId) {
|
||||||
|
try {
|
||||||
|
if (!FileUtil.exist(certFilePath)) {
|
||||||
|
System.err.println("错误: 证书文件不存在 - " + certFilePath);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
byte[] certData = FileUtil.readBytes(certFilePath);
|
||||||
|
byte[] orgIdBytes = organizationId != null ? organizationId.getBytes(StandardCharsets.UTF_8) : null;
|
||||||
|
|
||||||
|
RetWrap result = api.importCert(certData, orgIdBytes);
|
||||||
|
System.out.println("证书上传成功");
|
||||||
|
if (result != null) {
|
||||||
|
System.out.println("返回结果: " + result.toString());
|
||||||
|
}
|
||||||
|
} catch (Exception e) {
|
||||||
|
System.err.println("证书上传失败: " + e.getMessage());
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void deleteCert(String dn) {
|
||||||
|
try {
|
||||||
|
boolean result = api.deleteCert(dn);
|
||||||
|
if (result) {
|
||||||
|
System.out.println("证书删除成功");
|
||||||
|
} else {
|
||||||
|
System.out.println("证书删除失败");
|
||||||
|
}
|
||||||
|
} catch (Exception e) {
|
||||||
|
System.err.println("证书删除失败: " + e.getMessage());
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void listCerts() {
|
||||||
|
try {
|
||||||
|
List<String> certs = api.getAllCert();
|
||||||
|
System.out.println("证书列表 (" + certs.size() + " 个):");
|
||||||
|
for (int i = 0; i < certs.size(); i++) {
|
||||||
|
System.out.println((i + 1) + ". " + certs.get(i));
|
||||||
|
}
|
||||||
|
} catch (Exception e) {
|
||||||
|
System.err.println("获取证书列表失败: " + e.getMessage());
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void setConfig(String key, String value) {
|
||||||
|
String workDir = System.getProperty("user.dir");
|
||||||
|
Path filePath = Paths.get(workDir, "config.json");
|
||||||
|
|
||||||
|
JSONObject config;
|
||||||
|
if (FileUtil.exist(filePath.toFile())) {
|
||||||
|
String configStr = FileUtil.readString(filePath.toFile(), StandardCharsets.UTF_8);
|
||||||
|
config = JSONUtil.parseObj(configStr);
|
||||||
|
} else {
|
||||||
|
config = new JSONObject();
|
||||||
|
}
|
||||||
|
|
||||||
|
config.set(key, value);
|
||||||
|
|
||||||
|
try {
|
||||||
|
FileUtil.writeString(JSONUtil.toJsonStr(config), filePath.toFile(), StandardCharsets.UTF_8);
|
||||||
|
System.out.println("配置已保存: " + key + " = " + value);
|
||||||
|
} catch (Exception e) {
|
||||||
|
System.err.println("保存配置失败: " + e.getMessage());
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void main(String[] args) {
|
||||||
|
if (args.length == 0) {
|
||||||
|
printHelp();
|
||||||
|
System.exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
String command = args[0].toLowerCase();
|
||||||
|
|
||||||
|
if ("help".equals(command)) {
|
||||||
|
printHelp();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ("set".equals(command)) {
|
||||||
|
if (args.length < 3) {
|
||||||
|
System.err.println("错误: set 命令需要 key 和 value 参数");
|
||||||
|
System.err.println("用法: set <key> <value>");
|
||||||
|
} else {
|
||||||
|
String key = args[1];
|
||||||
|
String value = args[2];
|
||||||
|
setConfig(key, value);
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
loadConfig();
|
||||||
|
|
||||||
|
try {
|
||||||
|
connect();
|
||||||
|
|
||||||
|
switch (command) {
|
||||||
|
case "import":
|
||||||
|
if (args.length < 2) {
|
||||||
|
System.err.println("错误: import 命令需要证书文件路径参数");
|
||||||
|
System.err.println("用法: import <证书文件路径> [机构号]");
|
||||||
|
} else {
|
||||||
|
String certFilePath = args[1];
|
||||||
|
String organizationId = args.length > 2 ? args[2] : null;
|
||||||
|
importCert(certFilePath, organizationId);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case "delete":
|
||||||
|
if (args.length < 2) {
|
||||||
|
System.err.println("错误: delete 命令需要证书DN参数");
|
||||||
|
System.err.println("用法: delete <证书DN>");
|
||||||
|
} else {
|
||||||
|
String dn = args[1];
|
||||||
|
deleteCert(dn);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case "list":
|
||||||
|
listCerts();
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
System.err.println("未知命令: " + command);
|
||||||
|
printHelp();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
} catch (Exception e) {
|
||||||
|
System.err.println("执行命令失败: " + e.getMessage());
|
||||||
|
e.printStackTrace();
|
||||||
|
} finally {
|
||||||
|
disconnect();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,38 @@
|
|||||||
|
package sample;
|
||||||
|
|
||||||
|
import racal.sunyard.main.SydApi4j;
|
||||||
|
|
||||||
|
public class SydUtils {
|
||||||
|
|
||||||
|
private final SydApi4j sydApi4j;
|
||||||
|
|
||||||
|
static {
|
||||||
|
System.setProperty("com.sunyard.dnsort", "true");
|
||||||
|
}
|
||||||
|
|
||||||
|
public SydUtils(String ip1, String ip2, int port, int timeout) {
|
||||||
|
SydApi4j.SYD_Set_Parameter_HA(ip1, ip2, port, timeout);
|
||||||
|
sydApi4j = (SydApi4j) new SydApi4j();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public void disconnect() {
|
||||||
|
sydApi4j.disconnect();
|
||||||
|
}
|
||||||
|
|
||||||
|
public byte[] SYD_NakedSign(byte[] orgData, String SM2dn) {
|
||||||
|
return sydApi4j.SYD_NakedSign(orgData,SM2dn);
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean SYD_NakedVerify(byte[] orgData, byte[] nakedSign, String SM2dn){
|
||||||
|
return sydApi4j.SYD_NakedVerify(orgData, nakedSign, SM2dn);
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean detachedVerify(byte[] orgData, String sign) {
|
||||||
|
return sydApi4j.detachedVerify(orgData, sign);
|
||||||
|
}
|
||||||
|
|
||||||
|
public String detachedSign(byte[] orgData, String sCertDN) {
|
||||||
|
return sydApi4j.detachedSign(orgData, sCertDN);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,125 @@
|
|||||||
|
package sample;
|
||||||
|
|
||||||
|
import cn.hutool.core.io.FileUtil;
|
||||||
|
import cn.hutool.json.JSONObject;
|
||||||
|
import cn.hutool.json.JSONUtil;
|
||||||
|
import com.sunyard.SydApiException;
|
||||||
|
import racal.sunyard.main.SydApi4j;
|
||||||
|
|
||||||
|
import java.io.UnsupportedEncodingException;
|
||||||
|
import java.nio.charset.StandardCharsets;
|
||||||
|
import java.nio.file.Path;
|
||||||
|
import java.nio.file.Paths;
|
||||||
|
|
||||||
|
public class Test {
|
||||||
|
|
||||||
|
private static final String odata = "<?xml version=\"1.0\" encoding=\"utf-8\"?><SignData><TradeType name=\"银行账号转账\" authLevel=\"0\">BankAcctTransfer</TradeType><Timestamp>1710469760912</Timestamp><Fields><AcctType>INNERDEBIT</AcctType><PayerSubAcSeq></PayerSubAcSeq><PayerBankAcType>96</PayerBankAcType><PayerAcNo>6229539600100010640</PayerAcNo><PayerAcName>王二类</PayerAcName><PayerCurrency>156</PayerCurrency><PayeeAcNo name=\"收款人账号:\">6217788308301020599</PayeeAcNo><PayeeAcName name=\"收款人名称:\">王二类</PayeeAcName><Amount name=\"转账金额:\">1</Amount><PayeeBankCode>402/402361018886</PayeeBankCode><PayeeBankName>安徽农金</PayeeBankName><ProvinceCode></ProvinceCode><ProvinceName></ProvinceName><CityCode></CityCode><CityName></CityName><UnionDeptId></UnionDeptId><UnionDeptName></UnionDeptName><TransType>0</TransType><Remark></Remark><Fee>0.00</Fee><CRFlag>1</CRFlag><TransTypeFlag>0</TransTypeFlag><TrsRouteType>0</TrsRouteType><AddPayeeBookFlag>1</AddPayeeBookFlag></Fields></SignData>";
|
||||||
|
|
||||||
|
private static String ip1 = null;
|
||||||
|
private static String ip2 = null;
|
||||||
|
private static int port = 0;
|
||||||
|
private static String dn = null;
|
||||||
|
|
||||||
|
|
||||||
|
private static int success = 0;
|
||||||
|
private static int error = 0;
|
||||||
|
|
||||||
|
private static void printInfo(){
|
||||||
|
System.out.println(String.format("调用总数=%d\t成功总数=%d\t失败总数=%d", success+error, success, error));
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void checkOK(){
|
||||||
|
success += 1;
|
||||||
|
printInfo();
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void checkError(){
|
||||||
|
error += 1;
|
||||||
|
printInfo();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public static void case1(){
|
||||||
|
SydApi4j.SYD_Set_Parameter_HA(ip1, ip2, port, 3000);
|
||||||
|
SydApi4j api = (SydApi4j) new SydApi4j();
|
||||||
|
try {
|
||||||
|
// 获取签名证书
|
||||||
|
String cert1 = api.getCertByDn(dn,0);
|
||||||
|
// 获取加密证书
|
||||||
|
String cert2 = api.getCertByDn(dn,0);
|
||||||
|
String odata = "<?xml version=\"1.0\" encoding=\"utf-8\"?><SignData><TradeType name=\"银行账号转账\" authLevel=\"0\">BankAcctTransfer</TradeType><Timestamp>1710469760912</Timestamp><Fields><AcctType>INNERDEBIT</AcctType><PayerSubAcSeq></PayerSubAcSeq><PayerBankAcType>96</PayerBankAcType><PayerAcNo>6229539600100010640</PayerAcNo><PayerAcName>王二类</PayerAcName><PayerCurrency>156</PayerCurrency><PayeeAcNo name=\"收款人账号:\">6217788308301020599</PayeeAcNo><PayeeAcName name=\"收款人名称:\">王二类</PayeeAcName><Amount name=\"转账金额:\">1</Amount><PayeeBankCode>402/402361018886</PayeeBankCode><PayeeBankName>安徽农金</PayeeBankName><ProvinceCode></ProvinceCode><ProvinceName></ProvinceName><CityCode></CityCode><CityName></CityName><UnionDeptId></UnionDeptId><UnionDeptName></UnionDeptName><TransType>0</TransType><Remark></Remark><Fee>0.00</Fee><CRFlag>1</CRFlag><TransTypeFlag>0</TransTypeFlag><TrsRouteType>0</TrsRouteType><AddPayeeBookFlag>1</AddPayeeBookFlag></Fields></SignData>";
|
||||||
|
|
||||||
|
byte[] nakedSign = api.SYD_NakedSign(dn, odata.getBytes(), null);
|
||||||
|
boolean nakedVerify2 = api.SYD_NakedVerifyAll4NX(cert1,4, odata.getBytes(), nakedSign, dn);
|
||||||
|
|
||||||
|
api.importCert(cert1.getBytes(), null);
|
||||||
|
api.importCert(cert2.getBytes(), null);
|
||||||
|
System.out.println("验签结果:" + nakedVerify2 );
|
||||||
|
} catch (SydApiException e) {
|
||||||
|
throw e;
|
||||||
|
} catch (UnsupportedEncodingException e) {
|
||||||
|
throw new RuntimeException(e);
|
||||||
|
} finally {
|
||||||
|
api.disconnect();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void case2(){
|
||||||
|
SydApi4j.SYD_Set_Parameter_HA(ip1, ip2, port, 3000);
|
||||||
|
SydApi4j api = (SydApi4j) new SydApi4j();
|
||||||
|
try {
|
||||||
|
String sde = api.detachedSignAll(4, odata.getBytes(), dn);
|
||||||
|
System.out.println("SM2detach签名:"+sde);
|
||||||
|
boolean bde = api.detachedVerifyAll(4, odata.getBytes(), sde);
|
||||||
|
System.out.println("SM2detach验签:"+bde);
|
||||||
|
} finally {
|
||||||
|
api.disconnect();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
public static void main(String[] args) {
|
||||||
|
System.out.println("载入配置文件 ./config.json");
|
||||||
|
String workDir = System.getProperty("user.dir");
|
||||||
|
Path filePath = Paths.get(workDir,"config.json");
|
||||||
|
String configStr = FileUtil.readString(filePath.toFile(), StandardCharsets.UTF_8);
|
||||||
|
JSONObject config = JSONUtil.parseObj(configStr);
|
||||||
|
ip1 = config.getStr("ip1");
|
||||||
|
ip2 = config.getStr("ip2");
|
||||||
|
port = config.getInt("port");
|
||||||
|
dn = config.getStr("dn");
|
||||||
|
System.out.println("ip1=" + ip1);
|
||||||
|
System.out.println("ip2=" + ip2);
|
||||||
|
System.out.println("port=" + port);
|
||||||
|
System.out.println("dn=" + dn);
|
||||||
|
System.out.println("载入配置完成");
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
System.out.println("开始持续交易, HA 模式,短链接模式");
|
||||||
|
while (true) {
|
||||||
|
try {
|
||||||
|
case1();
|
||||||
|
checkOK();
|
||||||
|
Thread.sleep(3000);
|
||||||
|
|
||||||
|
// case2();
|
||||||
|
// checkOK();
|
||||||
|
// Thread.sleep(3000);
|
||||||
|
|
||||||
|
|
||||||
|
} catch (Exception e) {
|
||||||
|
System.err.println("发生错误");
|
||||||
|
e.printStackTrace();
|
||||||
|
checkError();
|
||||||
|
try {
|
||||||
|
Thread.sleep(3000);
|
||||||
|
} catch (InterruptedException ex) {
|
||||||
|
throw new RuntimeException(ex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,18 +1,19 @@
|
|||||||
package sample;
|
package sample;
|
||||||
|
|
||||||
import cn.hutool.core.date.StopWatch;
|
import cn.hutool.core.date.StopWatch;
|
||||||
import cn.hutool.core.date.Week;
|
|
||||||
import com.google.gson.Gson;
|
import com.google.gson.Gson;
|
||||||
import com.sunyard.SydApiException;
|
import com.sunyard.SydApiException;
|
||||||
|
import com.sunyard.entity.ImportResult;
|
||||||
import com.sunyard.proto.Util;
|
import com.sunyard.proto.Util;
|
||||||
import com.sunyard.snmp.SnmpTrapSender;
|
import com.sunyard.util.CertUtil;
|
||||||
import com.sunyard.util.IpLockUtils;
|
import com.sunyard.util.IpLockUtils;
|
||||||
import org.bouncycastle.util.encoders.Hex;
|
|
||||||
import org.junit.After;
|
import org.junit.After;
|
||||||
import org.junit.Before;
|
import org.junit.Before;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
import racal.sunyard.main.SydApi4j;
|
import racal.sunyard.main.SydApi4j;
|
||||||
|
|
||||||
|
import java.io.StringWriter;
|
||||||
|
import java.nio.charset.StandardCharsets;
|
||||||
import java.security.cert.X509Certificate;
|
import java.security.cert.X509Certificate;
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
import java.util.concurrent.*;
|
import java.util.concurrent.*;
|
||||||
@@ -25,18 +26,13 @@ public class Test4NongxinCW {
|
|||||||
|
|
||||||
final String SM2dn = "C=CN,ST=zz,L=zz,O=zzz,CN=zzzzz";
|
final String SM2dn = "C=CN,ST=zz,L=zz,O=zzz,CN=zzzzz";
|
||||||
|
|
||||||
byte[] orgData = new byte[100];
|
byte[] orgData = new byte[1024];
|
||||||
|
|
||||||
@Before
|
@Before
|
||||||
public void before() {
|
public void before() {
|
||||||
//主备调用接口
|
//主备调用接口
|
||||||
SydApi4j.SYD_Set_Parameter_HA("172.1.41.96", "172.1.41.139", 8889, 1000);
|
SydApi4j.SYD_Set_Parameter_HA("172.1.41.139", "172.1.41.96", 8889, 3000);
|
||||||
api = (SydApi4j) new SydApi4j();
|
api = (SydApi4j) new SydApi4j();
|
||||||
// api.startHeartbeat();
|
|
||||||
|
|
||||||
// 通过设置debug的属性开启debug,如果不设置则默认不打开
|
|
||||||
// api = (SydApi4j) new SydApi4j().connect("172.1.41.139", 8891, null, 1000);
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@@ -55,46 +51,55 @@ public class Test4NongxinCW {
|
|||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testHA() {
|
public void testHA() {
|
||||||
|
// byte[] nakedSign1 = api.SYD_NakedSignAll(4,orgData, SM2dn);
|
||||||
for (int i = 0; i < 10000; i++) {
|
// System.out.println("SM2大数据裸签:"+ Util.bytes2HexString(nakedSign1));
|
||||||
|
// boolean nakedVerify1 = api.SYD_NakedVerifyAll(4,orgData, nakedSign1, SM2dn);
|
||||||
|
// System.out.println("SM2数据验签:"+nakedVerify1 );
|
||||||
|
// for (int i = 0; i < 10000; i++) {
|
||||||
byte[] nakedSign = api.SYD_NakedSign(orgData,SM2dn);
|
byte[] nakedSign = api.SYD_NakedSign(orgData,SM2dn);
|
||||||
}
|
System.out.println("SM2签名:"+ Util.encodeBase64(nakedSign));
|
||||||
|
byte[] nakedSign1 = api.SYD_NakedSignAll(4,orgData, SM2dn);
|
||||||
|
// System.out.println("SM2大数据裸签:"+ Util.bytes2HexString(nakedSign1));
|
||||||
|
// boolean nakedVerify1 = api.SYD_NakedVerifyAll(4,orgData, nakedSign1, SM2dn);
|
||||||
|
// System.out.println("SM2数据验签:"+nakedVerify1 );
|
||||||
|
// }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 长连接性能测试
|
||||||
|
* @throws InterruptedException
|
||||||
|
* @throws ExecutionException
|
||||||
|
*/
|
||||||
@Test
|
@Test
|
||||||
public void tes() throws InterruptedException, ExecutionException {
|
public void testPerformance() throws InterruptedException, ExecutionException {
|
||||||
// 配置HA参数
|
// 创建200个线程并发操作API
|
||||||
// SydApi4j.SYD_Set_Parameter_HA("172.1.41.139", "172.1.41.96", 8889, 1000);
|
ExecutorService executor = Executors.newFixedThreadPool(10);
|
||||||
|
|
||||||
// 创建20个线程并发操作API
|
|
||||||
ExecutorService executor = Executors.newFixedThreadPool(20);
|
|
||||||
List<Future<?>> futures = new ArrayList<>();
|
List<Future<?>> futures = new ArrayList<>();
|
||||||
|
|
||||||
// 模拟主节点故障
|
|
||||||
CountDownLatch startLatch = new CountDownLatch(1);
|
CountDownLatch startLatch = new CountDownLatch(1);
|
||||||
|
|
||||||
for (int i = 0; i < 20; i++) {
|
for (int i = 0; i < 10; i++) {
|
||||||
futures.add(executor.submit(() -> {
|
futures.add(executor.submit(() -> {
|
||||||
try {
|
|
||||||
startLatch.await(); // 等待统一开始
|
|
||||||
} catch (InterruptedException e) {
|
|
||||||
throw new RuntimeException(e);
|
|
||||||
}
|
|
||||||
|
|
||||||
SydApi4j api2 = new SydApi4j();
|
SydApi4j api2 = new SydApi4j();
|
||||||
|
|
||||||
for (int j = 0; j < 10000; j++) {
|
for (int j = 0; j < 10000; j++) {
|
||||||
|
StopWatch stopWatch = new StopWatch();
|
||||||
|
stopWatch.start();
|
||||||
byte[] nakedSign = api2.SYD_NakedSign(orgData,SM2dn);
|
byte[] nakedSign = api2.SYD_NakedSign(orgData,SM2dn);
|
||||||
|
stopWatch.stop();
|
||||||
|
// System.out.println("p1签名耗时---:" + stopWatch.getLastTaskTimeMillis() + "ms");
|
||||||
|
// stopWatch.start();
|
||||||
|
// String sign = "304502204ACEE7FA06644B6EAE62E5FBF824B6ED8D4432D5CE52580381ECF3570DE032F4022100F30DF2B902A3C34E183498C14565D03C9F28FD1BCCDFB557B52996539BCCF58F";
|
||||||
|
// boolean ver = api2.SYD_NakedVerify(orgData,nakedSign, SM2dn);
|
||||||
|
// stopWatch.stop();
|
||||||
|
// System.out.println("p1验签耗时:" + stopWatch.getLastTaskTimeMillis() + "ms");
|
||||||
}
|
}
|
||||||
|
api2.disconnect();
|
||||||
}));
|
}));
|
||||||
}
|
}
|
||||||
|
|
||||||
// 触发所有线程开始
|
// 触发所有线程开始
|
||||||
startLatch.countDown();
|
startLatch.countDown();
|
||||||
|
|
||||||
// 随机触发主节点故障(模拟网络中断)
|
|
||||||
Thread.sleep(500);
|
Thread.sleep(500);
|
||||||
|
|
||||||
// 等待所有任务完成
|
// 等待所有任务完成
|
||||||
for (Future<?> future : futures) {
|
for (Future<?> future : futures) {
|
||||||
future.get();
|
future.get();
|
||||||
@@ -103,20 +108,69 @@ public class Test4NongxinCW {
|
|||||||
executor.shutdown();
|
executor.shutdown();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 短连接性能测试
|
||||||
|
* @throws InterruptedException
|
||||||
|
* @throws ExecutionException
|
||||||
|
*/
|
||||||
|
@Test
|
||||||
|
public void testUtils() throws InterruptedException, ExecutionException {
|
||||||
|
// 创建200个线程并发操作API
|
||||||
|
ExecutorService executor = Executors.newFixedThreadPool(10);
|
||||||
|
List<Future<?>> futures = new ArrayList<>();
|
||||||
|
CountDownLatch startLatch = new CountDownLatch(1);
|
||||||
|
for (int i = 0; i < 20; i++) {
|
||||||
|
futures.add(executor.submit(() -> {
|
||||||
|
for (int j = 0; j < 1000; j++) {
|
||||||
|
StopWatch stopWatch = new StopWatch();
|
||||||
|
SydUtils sydUtils = new SydUtils("172.1.41.139", "172.1.41.96", 8889, 3000);
|
||||||
|
stopWatch.start();
|
||||||
|
byte[] nakedSign = sydUtils.SYD_NakedSign(orgData,SM2dn);
|
||||||
|
stopWatch.stop();
|
||||||
|
System.out.println("p1签名耗时---:" + stopWatch.getLastTaskTimeMillis() + "ms");
|
||||||
|
stopWatch.start();
|
||||||
|
boolean ver = sydUtils.SYD_NakedVerify(orgData,nakedSign, SM2dn);
|
||||||
|
stopWatch.stop();
|
||||||
|
System.out.println("p1验签耗时:" + stopWatch.getLastTaskTimeMillis() + "ms");
|
||||||
|
sydUtils.disconnect();
|
||||||
|
}
|
||||||
|
}));
|
||||||
|
}
|
||||||
|
// 触发所有线程开始
|
||||||
|
startLatch.countDown();
|
||||||
|
Thread.sleep(500);
|
||||||
|
// 等待所有任务完成
|
||||||
|
for (Future<?> future : futures) {
|
||||||
|
future.get();
|
||||||
|
}
|
||||||
|
executor.shutdown();
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void nakeSign(){
|
public void nakeSign(){
|
||||||
|
String ori = "2025071700064382|2025-06-21T15:39:47|102100088898|102100088898|402361018886|402361018886|BEPS|DM00|202507170013|010000|123456789123456789|1|2025071700064387|王二|地址908|6232208340101760984|402361018886|402361018886|CNY0.05|";
|
||||||
|
System.out.println(Util.encodeBase64(ori.getBytes(StandardCharsets.UTF_8)));
|
||||||
|
|
||||||
|
String signValue = "MEYCIQDdG83MV2zyX2ZboKKUKZX+8qHr3ZfmxlBY7gElqEQZsAIhAPXjePjHfjChP0Rdlsf4PU9eJN7Lbl29nrHCQ7NzhZOV";
|
||||||
|
byte[] s = Util.decodeBase64(signValue);
|
||||||
|
System.out.println(Util.bytes2HexString(s));
|
||||||
|
|
||||||
// String SM2dn1 = "C=CN,ST=3,L=3,O=3,OU=3,OU=3,CN=3";
|
// String SM2dn1 = "C=CN,ST=3,L=3,O=3,OU=3,OU=3,CN=3";
|
||||||
// orgData = Hex.decode("80a370b809e8a46ba51211a35d6f0180fea32b4acc97916bc9c517ea6651134c");
|
// orgData = Hex.decode("80a370b809e8a46ba51211a35d6f0180fea32b4acc97916bc9c517ea6651134c");
|
||||||
// byte[] nakedSign1 = api.SYD_NakedSign(SM2dn, (byte[])null, orgData);
|
// byte[] nakedSign1 = api.SYD_NakedSign(SM2dn, (byte[])null, orgData);
|
||||||
// System.out.println("SM2签名:"+ Util.bytes2HexString(nakedSign1));
|
// System.out.println("SM2签名:"+ Util.bytes2HexString(nakedSign1));
|
||||||
orgData = new byte[4096];
|
// String dn ="C=cn,O=CFCA CS OCA11,OU=CNAPS,OU=Enterprises,CN=041@Z313641099995@BHN@00000010";
|
||||||
//裸签
|
// orgData = "123456".getBytes();
|
||||||
byte[] nakedSign = api.SYD_NakedSign(orgData,SM2dn);
|
//
|
||||||
System.out.println("SM2签名:"+ Util.bytes2HexString(nakedSign));
|
// //裸签
|
||||||
//裸签验签
|
// byte[] nakedSign = api.SYD_NakedSign(orgData, SM2dn);
|
||||||
boolean ver = api.SYD_NakedVerify(orgData,nakedSign, SM2dn);
|
// System.out.println("SM2签名:"+ Util.bytes2HexString(nakedSign));
|
||||||
System.out.println("SM2验签:"+ ver);
|
// System.out.println(Util.encodeBase64(nakedSign));
|
||||||
|
// //裸签验签
|
||||||
|
//
|
||||||
|
// String sign = "30450220400849D815EE6C73A6D7334D76EF6076452367E444BBF902B4278A0D7C9843C302210095086DDC9A42E53ABCD0B172BA6A9A9814AEA580C19CDD229ABD3277321984C1";
|
||||||
|
// boolean ver = api.SYD_NakedVerify(orgData, nakedSign, SM2dn);
|
||||||
|
// System.out.println("SM2验签:"+ ver);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@@ -133,14 +187,18 @@ public class Test4NongxinCW {
|
|||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void detSign(){
|
public void detSign(){
|
||||||
orgData = new byte[4096];
|
orgData = new byte[1024];
|
||||||
|
byte[] orgData1 = "12345678".getBytes(StandardCharsets.UTF_8);
|
||||||
|
// for (int i = 0; i < 10000; i++) {
|
||||||
//detach签名
|
//detach签名
|
||||||
String detachedSign = api.detachedSign(orgData, SM2dn);
|
String detachedSign = api.detachedSign(orgData1, SM2dn);
|
||||||
System.out.println("detach签名:"+ detachedSign);
|
System.out.println("detach签名:"+ detachedSign);
|
||||||
|
|
||||||
//detach验签
|
//detach验签
|
||||||
boolean ver = api.detachedVerify(orgData, detachedSign);
|
boolean ver = api.detachedVerify(orgData1, detachedSign);
|
||||||
System.out.println("detach验签:"+ ver);
|
System.out.println("detach验签:"+ ver);
|
||||||
|
// }
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -261,8 +319,13 @@ public class Test4NongxinCW {
|
|||||||
List<Thread> threads = new ArrayList<>();
|
List<Thread> threads = new ArrayList<>();
|
||||||
|
|
||||||
// 创建100个线程
|
// 创建100个线程
|
||||||
for (int i = 0; i < 200; i++) {
|
for (int i = 0; i < 20; i++) {
|
||||||
Thread thread = new Thread(this::importAllCert);
|
Thread thread = new Thread(() -> {
|
||||||
|
for (int j = 0; j < 1000; j++) {
|
||||||
|
api.SYD_NakedSign(orgData,SM2dn);
|
||||||
|
importAllCert();
|
||||||
|
}
|
||||||
|
});
|
||||||
thread.start();
|
thread.start();
|
||||||
threads.add(thread);
|
threads.add(thread);
|
||||||
}
|
}
|
||||||
@@ -272,7 +335,7 @@ public class Test4NongxinCW {
|
|||||||
thread.join();
|
thread.join();
|
||||||
}
|
}
|
||||||
|
|
||||||
System.out.println(IpLockUtils.getLockStatus("172.1.41.96:8889"));
|
System.out.println(IpLockUtils.getLockStatus("172.1.41.139:8889"));
|
||||||
|
|
||||||
System.out.println("所有线程执行完毕");
|
System.out.println("所有线程执行完毕");
|
||||||
}
|
}
|
||||||
@@ -281,6 +344,103 @@ public class Test4NongxinCW {
|
|||||||
public void importAllCert() {
|
public void importAllCert() {
|
||||||
StopWatch stopWatch = new StopWatch();
|
StopWatch stopWatch = new StopWatch();
|
||||||
stopWatch.start();
|
stopWatch.start();
|
||||||
|
String cert = "-----BEGIN CERTIFICATE-----\n" +
|
||||||
|
"MIIC2TCCAn2gAwIBAgIFIGh5YWAwDAYIKoEcz1UBg3UFADBdMQswCQYDVQQGEwJD\n" +
|
||||||
|
"TjEwMC4GA1UECgwnQ2hpbmEgRmluYW5jaWFsIENlcnRpZmljYXRpb24gQXV0aG9y\n" +
|
||||||
|
"aXR5MRwwGgYDVQQDDBNDRkNBIFRFU1QgU00yIE9DQTExMB4XDTI0MDQwOTAxMTAy\n" +
|
||||||
|
"M1oXDTI1MTEzMDAxMTAyM1owgY4xCzAJBgNVBAYTAmNuMR8wHQYDVQQKDBZDRkNB\n" +
|
||||||
|
"IENTIFRFU1QgU00yIE9DQTExMQ0wCwYDVQQLDARERU1QMRkwFwYDVQQLDBBPcmdh\n" +
|
||||||
|
"bml6YXRpb25hbC0xMTQwMgYDVQQDDCswNTFAM0MzMTIyOTM0MDAwMDE0QEMzMTIy\n" +
|
||||||
|
"OTM0MDAwMDE0QDAwMDAwMDAxMFkwEwYHKoZIzj0CAQYIKoEcz1UBgi0DQgAEyW/R\n" +
|
||||||
|
"iEfheoKHHf8UGA8D8dMRIKiGr1M3kId/f1mfWsTX/BTH8+FmruZxfGZAXcSGcn5Z\n" +
|
||||||
|
"gR582ck7YO2bhDcap6OB9TCB8jAfBgNVHSMEGDAWgBS+pn5NPXyPoFXmwS8JLiwg\n" +
|
||||||
|
"Q7NCfzBIBgNVHSAEQTA/MD0GCGCBHIbvKgECMDEwLwYIKwYBBQUHAgEWI2h0dHA6\n" +
|
||||||
|
"Ly93d3cuY2ZjYS5jb20uY24vdXMvdXMtMTUuaHRtMDoGA1UdHwQzMDEwL6AtoCuG\n" +
|
||||||
|
"KWh0dHA6Ly8yMTAuNzQuNDIuMy9PQ0ExMS9TTTIvY3JsMjkyNzMuY3JsMAsGA1Ud\n" +
|
||||||
|
"DwQEAwID6DAdBgNVHQ4EFgQU1K07X7clXMkYBI3JblkykKilnskwHQYDVR0lBBYw\n" +
|
||||||
|
"FAYIKwYBBQUHAwIGCCsGAQUFBwMEMAwGCCqBHM9VAYN1BQADSAAwRQIhAL8uWl4K\n" +
|
||||||
|
"hUEIUnSsM0RlUn4aSkK3R0QFpqdBu7AYCtXcAiB5tIOkP1ycAtp0W3mSHPabAgUq\n" +
|
||||||
|
"dHXEO3AzKABKxIAH7Q==\n" +
|
||||||
|
"-----END";
|
||||||
|
List<String> masterNodes = new ArrayList<>();
|
||||||
|
// masterNodes.add("172.16.18.99:8889");
|
||||||
|
// masterNodes.add("172.16.18.5:8889");
|
||||||
|
masterNodes.add("172.1.41.139:8889");
|
||||||
|
// masterNodes.add("172.1.41.196:8889333");
|
||||||
|
// masterNodes.add("172.16.18.89");
|
||||||
|
// masterNodes.add("172.16.18.89");
|
||||||
|
int timeout = 3000;
|
||||||
|
Map<String, String> map = new HashMap<>();
|
||||||
|
map.put("snmp.target.ip", "172.1.41.191");
|
||||||
|
map.put("snmp.target.port", "162");
|
||||||
|
map.put("enterprise.oid", "1.3.6.1.4.1.9999");
|
||||||
|
map.put("snmp.community", "public");
|
||||||
|
map.put("snmp.version", "1");
|
||||||
|
Gson gson = new Gson();
|
||||||
|
String snmpConfig = gson.toJson(map);
|
||||||
|
SydApi4j sydApi4j = new SydApi4j();
|
||||||
|
ImportResult result = sydApi4j.importCertToServers(masterNodes, timeout, cert, "12345678", snmpConfig);
|
||||||
|
System.out.println(gson.toJson(result));
|
||||||
|
System.out.println(result.getCode());
|
||||||
|
System.out.println(gson.toJson(result.getErrCnt()));
|
||||||
|
System.out.println(result.getCertDn());
|
||||||
|
stopWatch.stop();
|
||||||
|
System.out.println(stopWatch.getTotalTimeSeconds());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void delCert() {
|
||||||
|
String SM2dn1 = "C=CN,ST=北京,L=北京,O=信雅达,OU=测试部门1,CN=172.1.41.139";
|
||||||
|
boolean del = api.deleteCert(SM2dn1);
|
||||||
|
System.out.println("删除:"+ del);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void selectCert() throws Exception {
|
||||||
|
String SM2dn1 = "C=CN,ST=2,L=3,O=3,OU=1,OU=1,CN=qwqq";
|
||||||
|
String dn = "C=CN,ST=2,L=3,O=3,OU=1,CN=qwqq";
|
||||||
|
|
||||||
|
String dn1 = "C=cn,O=CFCA CS OCA11,OU=CNAPS,OU=Enterprises,CN=041@Z313641099995@BHN@00000010";
|
||||||
|
String dn2 = "C=cn,O=CFCA TEST OCA1,OU=DEMP,OU=Organizational-1,CN=041@ZDEMP@DEMP@00000001";
|
||||||
|
// String s = api.getCertByDn(dn1);
|
||||||
|
String s = api.getCertByDn(dn1.getBytes());
|
||||||
|
System.out.println(s);
|
||||||
|
String message = "sdas发顺丰";
|
||||||
|
byte[] gbkBytes = message.getBytes("GBK");
|
||||||
|
System.out.println("GBK Encoded Bytes: " + Arrays.toString(gbkBytes));
|
||||||
|
|
||||||
|
// Decoding back to String
|
||||||
|
String decodedMessage = new String(gbkBytes, "GBK");
|
||||||
|
System.out.println("Decoded Message: " + decodedMessage);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void selCert() throws Exception {
|
||||||
|
// String certBase64 = "MIICujCCAl6gAwIBAgIFEFeGNUIwDAYIKoEcz1UBg3UFADBcMQswCQYDVQQGEwJDTjEwMC4GA1UECgwnQ2hpbmEgRmluYW5jaWFsIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MRswGQYDVQQDDBJDRkNBIFRFU1QgU00yIE9DQTEwHhcNMjMxMDI2MDYwMDU5WhcNMjgxMDI2MDYwMDU5WjByMQswCQYDVQQGEwJjbjEXMBUGA1UECgwOQ0ZDQSBURVNUIE9DQTExDTALBgNVBAsMBERFTVAxGTAXBgNVBAsMEE9yZ2FuaXphdGlvbmFsLTExIDAeBgNVBAMMFzA0MUBaREVNUEBERU1QQDAwMDAwMDAxMFkwEwYHKoZIzj0CAQYIKoEcz1UBgi0DQgAE3NOLwnCvPxeZxS5lUSl+fxojdYwV1mD5eDGOkPeATl88oW0Q1PuBd0aQ29HmufRamZb2BlfLhjcgS5TsKlX4qqOB9DCB8TAfBgNVHSMEGDAWgBRr/hjaj0I6prhtsy6Igzo0osEw4TBIBgNVHSAEQTA/MD0GCGCBHIbvKgEBMDEwLwYIKwYBBQUHAgEWI2h0dHA6Ly93d3cuY2ZjYS5jb20uY24vdXMvdXMtMTQuaHRtMDkGA1UdHwQyMDAwLqAsoCqGKGh0dHA6Ly91Y3JsLmNmY2EuY29tLmNuL1NNMi9jcmw1Mzg2My5jcmwwCwYDVR0PBAQDAgPoMB0GA1UdDgQWBBSElGKzsZJ04RMd60sFqiHpxl9/njAdBgNVHSUEFjAUBggrBgEFBQcDAgYIKwYBBQUHAwQwDAYIKoEcz1UBg3UFAANIADBFAiEAjmCCIlDNdXw0qRZe7oYrkel4wTpg++c/C+MKLbPfRpgCIEVyrM68qeuVmaFZ5ZA3TtUXQg1RYQjz/5yhl/3jhdQ9";
|
||||||
|
// String s = "MIICzDCCAnCgAwIBAgIFIGdEBSgwDAYIKoEcz1UBg3UFADBdMQswCQYDVQQGEwJDTjEwMC4GA1UECgwnQ2hpbmEgRmluYW5jaWFsIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MRwwGgYDVQQDDBNDRkNBIFRFU1QgU00yIE9DQTExMB4XDTIzMDcxMDA4MDIyN1oXDTI2MDQwNTA4MDIyN1owgYExCzAJBgNVBAYTAmNuMR8wHQYDVQQKDBZDRkNBIENTIFRFU1QgU00yIE9DQTExMQ4wDAYDVQQLDAVDTkFQUzEZMBcGA1UECwwQT3JnYW5pemF0aW9uYWwtMTEmMCQGA1UEAwwdMDUxQDMxMDIxMDAwODg4OThAeGxAMDAwMDAwMDEwWTATBgcqhkjOPQIBBggqgRzPVQGCLQNCAASSIGceUTcELVdBO6F0xd4LWSvG2KfDeJJDeVFT0GxKyZ+CwJqLZCVX9V7rH3OGim34olp7QFPHjFj16UQCj7Doo4H1MIHyMB8GA1UdIwQYMBaAFL6mfk09fI+gVebBLwkuLCBDs0J/MEgGA1UdIARBMD8wPQYIYIEchu8qAQIwMTAvBggrBgEFBQcCARYjaHR0cDovL3d3dy5jZmNhLmNvbS5jbi91cy91cy0xNS5odG0wOgYDVR0fBDMwMTAvoC2gK4YpaHR0cDovLzIxMC43NC40Mi4zL09DQTExL1NNMi9jcmwyODI4MC5jcmwwCwYDVR0PBAQDAgPoMB0GA1UdDgQWBBSdAfIokLVhVjYzOE8B1JmupwFeTDAdBgNVHSUEFjAUBggrBgEFBQcDAgYIKwYBBQUHAwQwDAYIKoEcz1UBg3UFAANIADBFAiAgtrRZ4HENDv11/yNFhSOdSrRrmvHuyVahXH8+aVZQrAIhAM6NTl1CFVewOOVB3VbPuVtYs5dyNpLSqC1tmxj5QtWd";
|
||||||
|
// String cert = convertToPem( Base64.getDecoder().decode(s));
|
||||||
|
// System.out.println("------------------------------------------------------------------------------------");
|
||||||
|
// String dn = api.importCertAndGetDN(cert);
|
||||||
|
// System.out.println("导入证书成功,dn:" + dn);
|
||||||
|
System.out.println("------------------------------------------------------------------------------------");
|
||||||
|
String cert1 = api.getCertByDn(SM2dn,0);
|
||||||
|
System.out.println("查询证书:" + cert1);
|
||||||
|
System.out.println("------------------------------------------------------------------------------------");
|
||||||
|
// boolean delFlag = api.deleteCert(dn);
|
||||||
|
// System.out.println("删除证书:"+ delFlag);
|
||||||
|
// System.out.println("------------------------------------------------------------------------------------");
|
||||||
|
// try {
|
||||||
|
// String cert2 = api.getCertByDn(dn,0);
|
||||||
|
// System.out.println("删除后查询证书:" + cert1);
|
||||||
|
// } catch (Exception e) {
|
||||||
|
// System.out.println("查询证书失败,证书不存在");
|
||||||
|
// }
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testAll() {
|
||||||
|
//国密证书
|
||||||
String cert = "-----BEGIN CERTIFICATE-----\n" +
|
String cert = "-----BEGIN CERTIFICATE-----\n" +
|
||||||
"MIICMDCCAdagAwIBAgIJAOWoGwJCnjlLMAoGCCqBHM9VAYN1MGcxCzAJBgNVBAYT\n" +
|
"MIICMDCCAdagAwIBAgIJAOWoGwJCnjlLMAoGCCqBHM9VAYN1MGcxCzAJBgNVBAYT\n" +
|
||||||
"AkNOMRAwDgYDVQQIDAdCZWlqaW5nMRAwDgYDVQQHDAdIYWlEaWFuMRMwEQYDVQQK\n" +
|
"AkNOMRAwDgYDVQQIDAdCZWlqaW5nMRAwDgYDVQQHDAdIYWlEaWFuMRMwEQYDVQQK\n" +
|
||||||
@@ -295,73 +455,141 @@ public class Test4NongxinCW {
|
|||||||
"BggqgRzPVQGDdQNIADBFAiEA4kgTdn/iA/XYfjTEeOcELwBXd0tTFghkpfP8DhBF\n" +
|
"BggqgRzPVQGDdQNIADBFAiEA4kgTdn/iA/XYfjTEeOcELwBXd0tTFghkpfP8DhBF\n" +
|
||||||
"KFQCIAXZTL6VPtW67tM/DF4ZgFt5S/YIiFombKa2bWOfL81u\n" +
|
"KFQCIAXZTL6VPtW67tM/DF4ZgFt5S/YIiFombKa2bWOfL81u\n" +
|
||||||
"-----END CERTIFICATE-----";
|
"-----END CERTIFICATE-----";
|
||||||
String cert1 = "-----BEGIN CERTIFICATE-----\n" +
|
|
||||||
"MIIDNTCCAh2gAwIBAgIFE2lVIzcwDQYJKoZIhvcNAQEFBQAwITELMAkGA1UEBhMC\n" +
|
|
||||||
"Q04xEjAQBgNVBAoTCUNGQ0EgT0NBMTAeFw0yMjA0MjIwODIyMTVaFw0yNzA0MjIw\n" +
|
|
||||||
"ODIyMTVaMGQxCzAJBgNVBAYTAkNOMRIwEAYDVQQKEwlDRkNBIE9DQTExDzANBgNV\n" +
|
|
||||||
"BAsTBlRQQy1TMzEVMBMGA1UECxMMSW5kaXZpZHVhbC0xMRkwFwYDVQQDExBBUkNV\n" +
|
|
||||||
"NTIwMDAyNTI3MDg1MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC74cciiBbs\n" +
|
|
||||||
"UcfmBxVlMWtsILsc85erRngknMaMW6wFyBsfJGrcL0TC7EO5XIsJXRrJN32vWdoo\n" +
|
|
||||||
"6Qm8WUGour+hrSNDzJ7cVtNA1ragPIjlkmMgbDLD0UsEbjHmA902079Fktv35L4l\n" +
|
|
||||||
"Hqe/vBygXcUoWJsGY5+8ykmI8W0LYPRkVwIDAQABo4G0MIGxMB8GA1UdIwQYMBaA\n" +
|
|
||||||
"FNHb6YiC5d0aj0yqAIy+fPKrG/bZMDgGA1UdHwQxMC8wLaAroCmGJ2h0dHA6Ly9j\n" +
|
|
||||||
"cmwuY2ZjYS5jb20uY24vUlNBL2NybDMwMDgyLmNybDALBgNVHQ8EBAMCA+gwHQYD\n" +
|
|
||||||
"VR0OBBYEFMM/joQIWvRFdLOx0HarTXAtZk7RMCgGA1UdJQQhMB8GCCsGAQUFBwMC\n" +
|
|
||||||
"BggrBgEFBQcDBAYJKoZIhvcvAQEFMA0GCSqGSIb3DQEBBQUAA4IBAQANEhHR34gg\n" +
|
|
||||||
"iivRj9VTO2lS0StsHQy4A4seq9YmaQa6QZDUEndFwcxr5DN6CAf6xA1YiHG5FoYd\n" +
|
|
||||||
"yH4sLORUhdfzQUWle7ZTPn4TfFjddPh3RDHXMXOh+pHNgrSjXpdACwadHedJO5e4\n" +
|
|
||||||
"HqXI8wEoNovDA8HT4ucMmsZHbIyQMhxW9k+DgTHx8nvltqv3reoDou3ekQ1tSWvW\n" +
|
|
||||||
"nUteKp64vop1ktgiIKjLshKRaUmZO4/fo9EcJHCH51J6f/2TAM7S+IaFzXR/VWf3\n" +
|
|
||||||
"JaiaGbT8kAJI854SmKWqRE8HVzMo/NYNdP0M7xZ2kt68PVE/UIl20xWii9P2/7Oh\n" +
|
|
||||||
"KYAnLX1nKjbg\n" +
|
|
||||||
"-----END CERTIFICATE-----";
|
|
||||||
List<String> masterNodes = new ArrayList<>();
|
List<String> masterNodes = new ArrayList<>();
|
||||||
// masterNodes.add("172.16.18.99:8889");
|
|
||||||
// masterNodes.add("172.16.18.5:8889");
|
|
||||||
masterNodes.add("172.1.41.139:8889");
|
|
||||||
masterNodes.add("172.1.41.96:8889");
|
masterNodes.add("172.1.41.96:8889");
|
||||||
// masterNodes.add("172.16.18.8:8889");
|
masterNodes.add("172.1.41.139:8889");
|
||||||
int timeout = 1;
|
int timeout = 100;
|
||||||
Map<String, String> map = new HashMap<>();
|
Map<String, String> map = new HashMap<>();
|
||||||
map.put("snmp.target.ip", "172.1.41.191");
|
map.put("snmp.target.ip", "172.1.1.191");
|
||||||
map.put("snmp.target.port", "162");
|
map.put("snmp.target.port", "162");
|
||||||
map.put("enterprise.oid", "1.3.6.1.4.1.9999");
|
map.put("enterprise.oid", "1.3.6.1.4.1.9999");
|
||||||
map.put("snmp.community", "public");
|
map.put("snmp.community", "public");
|
||||||
map.put("snmp.version", "1");
|
map.put("snmp.version", "1");
|
||||||
String snmpConfig = new Gson().toJson(map);
|
String snmpConfig = new Gson().toJson(map);
|
||||||
|
|
||||||
|
|
||||||
|
//导入证书并获取DN
|
||||||
SydApi4j sydApi4j = new SydApi4j();
|
SydApi4j sydApi4j = new SydApi4j();
|
||||||
sydApi4j.importCertToServers(masterNodes, timeout, cert1, "12345678", snmpConfig);
|
|
||||||
stopWatch.stop();
|
ImportResult importResult = sydApi4j.importCertToServers(masterNodes, timeout, cert, "12345678", snmpConfig);
|
||||||
System.out.println(stopWatch.getTotalTimeSeconds());
|
System.out.println("导入结果ImportResult:" + new Gson().toJson(importResult));
|
||||||
|
System.out.println("------------------------------------------------------------------------------------");
|
||||||
|
String SM2dn = importResult.getCertDn();
|
||||||
|
System.out.println("导入证书主题为:"+ SM2dn);
|
||||||
|
|
||||||
|
//主备模式设置
|
||||||
|
SydApi4j.SYD_Set_Parameter_HA("172.1.41.139", "172.1.41.139", 8889, 1000);
|
||||||
|
SydApi4j api = (SydApi4j) new SydApi4j();
|
||||||
|
|
||||||
|
//签名原始数据
|
||||||
|
byte[] orgData = "12345678".getBytes();
|
||||||
|
//p1裸签名(国密证书)
|
||||||
|
byte[] nakedSign = api.SYD_NakedSign(orgData, SM2dn);
|
||||||
|
System.out.println("------------------------------------------------------------------------------------");
|
||||||
|
System.out.println("p1签名:"+ Util.bytes2HexString(nakedSign));
|
||||||
|
System.out.println("p1签名2:"+ Util.encodeBase64(nakedSign));
|
||||||
|
//p1裸签验签(国密证书)
|
||||||
|
String si = "MEUCIQCp26t1r3lAWrSSM6NmvqfJKlOFgdPyVKzK6FyImDnzYAIgXJV8GUztPGk0YxYGNU5OMoIqnFJRyLGh72hkUjfWDaM=";
|
||||||
|
boolean ver = api.SYD_NakedVerify(orgData, Util.decodeBase64(si), SM2dn);
|
||||||
|
System.out.println("------------------------------------------------------------------------------------");
|
||||||
|
System.out.println("p1验签:"+ ver);
|
||||||
|
|
||||||
|
//p7 detach签名(带公钥证书)
|
||||||
|
String detachedSign = api.detachedSign(orgData, SM2dn);
|
||||||
|
System.out.println("------------------------------------------------------------------------------------");
|
||||||
|
System.out.println("p7 detach签名:"+ detachedSign);
|
||||||
|
|
||||||
|
//p7 detach验签(带公钥证书)
|
||||||
|
boolean ver1 = api.detachedVerify(orgData, detachedSign);
|
||||||
|
System.out.println("------------------------------------------------------------------------------------");
|
||||||
|
System.out.println("p7 detach验签:"+ ver1);
|
||||||
|
|
||||||
|
//从p7签名数据中获取证书,签名数据为base64编码格式
|
||||||
|
String cert1 = api.getCertBySign(detachedSign);
|
||||||
|
System.out.println("------------------------------------------------------------------------------------");
|
||||||
|
System.out.println("根据p7签名值获取的证书为:" + cert1);
|
||||||
|
|
||||||
|
//数字信封
|
||||||
|
// RetWrap genSM2 = api.generateDEByDn(SM2dn, orgData);
|
||||||
|
// byte[] cipherKey = (byte[]) genSM2.get(SydApi.RET_CIPHER_KEY);
|
||||||
|
// System.out.println("SM2数字信封: " + new String(cipherKey));
|
||||||
|
// RetWrap denSM2 = api.decryptDEByDN( SM2dn, cipherKey);
|
||||||
|
// byte[] oData = (byte[]) denSM2.get("oData");
|
||||||
|
// System.out.println("SM2信封解密:"+Util.bytes2HexString(oData));
|
||||||
|
|
||||||
|
//根据证书DN从加密码机删除证书
|
||||||
|
// boolean delFlag = api.deleteCert(SM2dn);
|
||||||
|
// System.out.println("------------------------------------------------------------------------------------");
|
||||||
|
// System.out.println("删除证书成功:"+ delFlag);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void delCert() {
|
public void testDE() {
|
||||||
String SM2dn1 = "C=CN,ST=北京,L=北京,O=信雅达,OU=测试部门1,CN=172.1.41.139";
|
// SydApi4j sydApi4j = new SydApi4j();
|
||||||
boolean del = api.deleteCert(SM2dn1);
|
//// String SM2dn = "C=CN,ST=北京,L=北京,O=信雅达,CN=172.1.40.188";
|
||||||
System.out.println("删除:"+ del);
|
// String SM2dn = "C=CN,O=China Financial Certification Authority,CN=CFCA ACS TEST SM2 OCA31";
|
||||||
|
// //数字信封
|
||||||
|
// RetWrap genSM2 = api.generateDEByDn(SM2dn, orgData);
|
||||||
|
// byte[] cipherKey = (byte[]) genSM2.get(SydApi.RET_CIPHER_KEY);
|
||||||
|
// System.out.println("SM2数字信封: " + new String(cipherKey));
|
||||||
|
// RetWrap denSM2 = api.decryptDEByDN( SM2dn, cipherKey);
|
||||||
|
// byte[] oData = (byte[]) denSM2.get("oData");
|
||||||
|
// System.out.println("SM2信封解密:"+Util.bytes2HexString(oData));
|
||||||
|
|
||||||
|
String sign = "MEYCIQDo11zaTBYiesXP5Xk2BWHoBI2u+F3W2Kb9DFfDQEntLwIhANzKl8eV3M1cYxrZbsiP2I02HQBQFrkyeUhwW1iVKSt2";
|
||||||
|
byte[] s1 = Util.decodeBase64(sign);
|
||||||
|
System.out.println(Util.bytes2HexString(s1));
|
||||||
|
|
||||||
|
// String SM2dn = "C=CN,ST=北京,L=北京,O=信雅达,OU=双证,CN=172.1.40.188";
|
||||||
|
// String ivHex = "31323334353637383132333435363738";
|
||||||
|
// RetWrap genByDn = api.generateDEByDnICBC(SM2dn, ivHex,orgData,1);
|
||||||
|
// String cipherKey1 = (String) genByDn.get(SydApi.RET_CIPHER_KEY);
|
||||||
|
// System.out.println("SM2数字信封: " +cipherKey1);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void selectCert() throws Exception {
|
public void verifyCert() throws Exception {
|
||||||
String SM2dn1 = "C=CN,ST=1,L=1,O=1,OU=1,OU=1,CN=1";
|
String cert1 = "-----BEGIN CERTIFICATE-----\n" +
|
||||||
String s = api.getCertByDn(SM2dn);
|
"MIIDzQYKKoEcz1UGAQQCAqCCA70wggO5AgEBMQ4wDAYIKoEcz1UBgxEFADAMBgoqgRzPVQYBBAIBoIICvjCCArowggJeoAMCAQICBRBXhjVCMAwGCCqBHM9VAYN1BQAwXDELMAkGA1UEBhMCQ04xMDAuBgNVBAoMJ0NoaW5hIEZpbmFuY2lhbCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEbMBkGA1UEAwwSQ0ZDQSBURVNUIFNNMiBPQ0ExMB4XDTIzMTAyNjA2MDA1OVoXDTI4MTAyNjA2MDA1OVowcjELMAkGA1UEBhMCY24xFzAVBgNVBAoMDkNGQ0EgVEVTVCBPQ0ExMQ0wCwYDVQQLDARERU1QMRkwFwYDVQQLDBBPcmdhbml6YXRpb25hbC0xMSAwHgYDVQQDDBcwNDFAWkRFTVBAREVNUEAwMDAwMDAwMTBZMBMGByqGSM49AgEGCCqBHM9VAYItA0IABNzTi8Jwrz8XmcUuZVEpfn8aI3WMFdZg+XgxjpD3gE5fPKFtENT7gXdGkNvR5rn0WpmW9gZXy4Y3IEuU7CpV+KqjgfQwgfEwHwYDVR0jBBgwFoAUa/4Y2o9COqa4bbMuiIM6NKLBMOEwSAYDVR0gBEEwPzA9BghggRyG7yoBATAxMC8GCCsGAQUFBwIBFiNodHRwOi8vd3d3LmNmY2EuY29tLmNuL3VzL3VzLTE0Lmh0bTA5BgNVHR8EMjAwMC6gLKAqhihodHRwOi8vdWNybC5jZmNhLmNvbS5jbi9TTTIvY3JsNTM4NjMuY3JsMAsGA1UdDwQEAwID6DAdBgNVHQ4EFgQUhJRis7GSdOETHetLBaoh6cZff54wHQYDVR0lBBYwFAYIKwYBBQUHAwIGCCsGAQUFBwMEMAwGCCqBHM9VAYN1BQADSAAwRQIhAI5ggiJQzXV8NKkWXu6GK5HpeME6YPvnPwvjCi2z30aYAiBFcqzOvKnrlZmhWeWQN07VF0INUWEI8/+coZf944XUPTGB0zCB0AIBATBlMFwxCzAJBgNVBAYTAkNOMTAwLgYDVQQKDCdDaGluYSBGaW5hbmNpYWwgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxGzAZBgNVBAMMEkNGQ0EgVEVTVCBTTTIgT0NBMQIFEFeGNUIwDAYIKoEcz1UBgxEFADANBgkqgRzPVQGCLQEFAARHMEUCIAty3HjlED9ti0NkRI1wpCr8oUws93qHwlYMU0X2HnS3AiEAtv2/HiXabruxV9WLYeMNsO58qcMiBAy1CKmM/zMJCHI=\n" +
|
||||||
System.out.println(s);
|
"-----END CERTIFICATE-----";
|
||||||
String message = "sdas发顺丰";
|
String cert2 =
|
||||||
byte[] gbkBytes = message.getBytes("GBK");
|
"MIIC3DCCAoCgAwIBAgIFIGiRZIYwDAYIKoEcz1UBg3UFADBdMQswCQYDVQQGEwJDTjEwMC4GA1UECgwnQ2hpbmEgRmluYW5jaWFsIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MRwwGgYDVQQDDBNDRkNBIFRFU1QgU00yIE9DQTExMB4XDTI0MDgxNTA4MzAxMloXDTI3MDIwMTA4MzAxMlowgZExCzAJBgNVBAYTAmNuMR8wHQYDVQQKDBZDRkNBIENTIFRFU1QgU00yIE9DQTExMQ4wDAYDVQQLDAVDTkFQUzEZMBcGA1UECwwQT3JnYW5pemF0aW9uYWwtMTE2MDQGA1UEAwwtMDUxQFozMTM1ODEwMDMyODRAMzEzNTgxMDAzMjg0Q05BUFMyQDAwMDAwMDAxMFkwEwYHKoZIzj0CAQYIKoEcz1UBgi0DQgAEFRjj5zgEwAnsF7hh6RVJfXSdybPBGBlF7gsVOUX5tU7E0YN/eYZk9j1jbOCrBWz611gsr+HkU0OZsFFlQTattKOB9TCB8jAfBgNVHSMEGDAWgBS+pn5NPXyPoFXmwS8JLiwgQ7NCfzBIBgNVHSAEQTA/MD0GCGCBHIbvKgECMDEwLwYIKwYBBQUHAgEWI2h0dHA6Ly93d3cuY2ZjYS5jb20uY24vdXMvdXMtMTUuaHRtMDoGA1UdHwQzMDEwL6AtoCuGKWh0dHA6Ly8yMTAuNzQuNDIuMy9PQ0ExMS9TTTIvY3JsMjkyODkuY3JsMAsGA1UdDwQEAwID6DAdBgNVHQ4EFgQUDONZoezPmMkCIHifM0KK9y0N8bQwHQYDVR0lBBYwFAYIKwYBBQUHAwIGCCsGAQUFBwMEMAwGCCqBHM9VAYN1BQADSAAwRQIhAKesbWSJQXAHBoLvTbtM+CP7eqwfBMQc0nRridvyXOPOAiAp2Zr1Ncren8n2U1XP4tWeYp1YyPBMke0BSlOFunJ0Jg==";
|
||||||
System.out.println("GBK Encoded Bytes: " + Arrays.toString(gbkBytes));
|
byte[] s = Base64.getDecoder().decode(cert2);
|
||||||
|
System.out.println(convertToPem(s));
|
||||||
// Decoding back to String
|
X509Certificate certificate = null;
|
||||||
String decodedMessage = new String(gbkBytes, "GBK");
|
try {
|
||||||
System.out.println("Decoded Message: " + decodedMessage);
|
certificate = CertUtil.convertToX509Cert(cert1);
|
||||||
|
} catch (Exception e) {
|
||||||
|
System.out.println("证书格式错误!");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void selCert() {
|
public void convert() throws Exception {
|
||||||
String sign = "3045022100F2C494D20823AB12D9D4D23FA12C7D856D4993BE122089D86A515F217CF51C0C02207E06F505F4E70893226F7B22B34E6578570E2813CB0CF1A6775A7782C7C45F7B";
|
//原始证书
|
||||||
String s = api.getCertBySign(sign);
|
String cert =
|
||||||
System.out.println(s);
|
"MIICujCCAl6gAwIBAgIFEFeGNUIwDAYIKoEcz1UBg3UFADBcMQswCQYDVQQGEwJDTjEwMC4GA1UECgwnQ2hpbmEgRmluYW5jaWFsIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MRswGQYDVQQDDBJDRkNBIFRFU1QgU00yIE9DQTEwHhcNMjMxMDI2MDYwMDU5WhcNMjgxMDI2MDYwMDU5WjByMQswCQYDVQQGEwJjbjEXMBUGA1UECgwOQ0ZDQSBURVNUIE9DQTExDTALBgNVBAsMBERFTVAxGTAXBgNVBAsMEE9yZ2FuaXphdGlvbmFsLTExIDAeBgNVBAMMFzA0MUBaREVNUEBERU1QQDAwMDAwMDAxMFkwEwYHKoZIzj0CAQYIKoEcz1UBgi0DQgAE3NOLwnCvPxeZxS5lUSl+fxojdYwV1mD5eDGOkPeATl88oW0Q1PuBd0aQ29HmufRamZb2BlfLhjcgS5TsKlX4qqOB9DCB8TAfBgNVHSMEGDAWgBRr/hjaj0I6prhtsy6Igzo0osEw4TBIBgNVHSAEQTA/MD0GCGCBHIbvKgEBMDEwLwYIKwYBBQUHAgEWI2h0dHA6Ly93d3cuY2ZjYS5jb20uY24vdXMvdXMtMTQuaHRtMDkGA1UdHwQyMDAwLqAsoCqGKGh0dHA6Ly91Y3JsLmNmY2EuY29tLmNuL1NNMi9jcmw1Mzg2My5jcmwwCwYDVR0PBAQDAgPoMB0GA1UdDgQWBBSElGKzsZJ04RMd60sFqiHpxl9/njAdBgNVHSUEFjAUBggrBgEFBQcDAgYIKwYBBQUHAwQwDAYIKoEcz1UBg3UFAANIADBFAiEAjmCCIlDNdXw0qRZe7oYrkel4wTpg++c/C+MKLbPfRpgCIEVyrM68qeuVmaFZ5ZA3TtUXQg1RYQjz/5yhl/3jhdQ9";
|
||||||
|
byte[] s = Base64.getDecoder().decode(cert);
|
||||||
|
System.out.println(convertToPem(s));
|
||||||
|
|
||||||
|
String ss = "2025071700064382|2025-06-21T15:39:47|102100088898|102100088898|402361018886|402361018886|BEPS|DM00|202507170013|010000|123456789123456789|1|2025071700064387|王二|地址908|6232208340101760984|402361018886|402361018886|CNY0.05|";
|
||||||
|
byte[] sss = ss.getBytes();
|
||||||
|
System.out.println(Util.bytes2HexString(sss));
|
||||||
|
}
|
||||||
|
|
||||||
|
public String convertToPem(byte[] derCert) throws Exception {
|
||||||
|
// 使用Base64编码器(兼容RFC 4648,每行64字符)
|
||||||
|
StringWriter writer = new StringWriter();
|
||||||
|
writer.write("-----BEGIN CERTIFICATE-----\n");
|
||||||
|
// 将DER转换为Base64并分割为每行64字符
|
||||||
|
String base64Cert = Base64.getMimeEncoder(64, "\n".getBytes()).encodeToString(derCert);
|
||||||
|
writer.write(base64Cert);
|
||||||
|
// 如果Base64编码的字符串没有以换行结束,则添加换行
|
||||||
|
if (!base64Cert.endsWith("\n")) {
|
||||||
|
writer.write("\n");
|
||||||
|
}
|
||||||
|
writer.write("-----END CERTIFICATE-----\n");
|
||||||
|
return writer.toString();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
package com.Sample;
|
package sample;
|
||||||
|
|
||||||
import com.sunyard.RetWrap;
|
import com.sunyard.RetWrap;
|
||||||
import com.sunyard.proto.Util;
|
import com.sunyard.proto.Util;
|
||||||
Reference in New Issue
Block a user