Compare commits
3
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
c90bb3ea0f | ||
|
|
c516397ad6 | ||
|
|
e299efe782 |
@@ -14,4 +14,3 @@ src/test/java/com/sunyard/sydapi/sample/*.*
|
|||||||
~$*
|
~$*
|
||||||
/pack/
|
/pack/
|
||||||
/.logs/
|
/.logs/
|
||||||
/bin/
|
|
||||||
|
|||||||
@@ -1,6 +0,0 @@
|
|||||||
{
|
|
||||||
"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"
|
|
||||||
}
|
|
||||||
@@ -4,7 +4,7 @@
|
|||||||
|
|
||||||
<groupId>com.sunyard</groupId>
|
<groupId>com.sunyard</groupId>
|
||||||
<artifactId>sydapi4j</artifactId>
|
<artifactId>sydapi4j</artifactId>
|
||||||
<version>2.01</version>
|
<version>1.13.20220909-1</version>
|
||||||
<packaging>jar</packaging>
|
<packaging>jar</packaging>
|
||||||
|
|
||||||
<name>sydapi4j</name>
|
<name>sydapi4j</name>
|
||||||
@@ -14,8 +14,8 @@
|
|||||||
<vertx>3.4.2</vertx>
|
<vertx>3.4.2</vertx>
|
||||||
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||||
<maven.compiler.encoding>UTF-8</maven.compiler.encoding>
|
<maven.compiler.encoding>UTF-8</maven.compiler.encoding>
|
||||||
<maven.compiler.source>1.8</maven.compiler.source>
|
<maven.compiler.source>1.6</maven.compiler.source>
|
||||||
<maven.compiler.target>1.8</maven.compiler.target>
|
<maven.compiler.target>1.6</maven.compiler.target>
|
||||||
</properties>
|
</properties>
|
||||||
|
|
||||||
<dependencies>
|
<dependencies>
|
||||||
@@ -26,78 +26,19 @@
|
|||||||
<version>4.12</version>
|
<version>4.12</version>
|
||||||
<scope>test</scope>
|
<scope>test</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>com.github.houbb</groupId>
|
<groupId>com.sunyard</groupId>
|
||||||
<artifactId>junitperf</artifactId>
|
<artifactId>proto</artifactId>
|
||||||
<version>1.0.3</version>
|
<version>1.0.20221215</version>
|
||||||
<scope>test</scope>
|
|
||||||
</dependency>
|
</dependency>
|
||||||
<!-- JMeter Java Sampler 核心依赖 -->
|
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.apache.jmeter</groupId>
|
<groupId>org.apache.jmeter</groupId>
|
||||||
<artifactId>ApacheJMeter_java</artifactId>
|
<artifactId>ApacheJMeter_java</artifactId>
|
||||||
<version>5.4.3</version>
|
<version>5.4.3</version>
|
||||||
<scope>provided</scope>
|
<scope>provided</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
<dependency>
|
|
||||||
<groupId>com.sunyard</groupId>
|
|
||||||
<artifactId>proto</artifactId>
|
|
||||||
<version>1.1.20221215</version>
|
|
||||||
<exclusions>
|
|
||||||
<exclusion>
|
|
||||||
<groupId>cn.hutool</groupId>
|
|
||||||
<artifactId>hutool-core</artifactId>
|
|
||||||
</exclusion>
|
|
||||||
<exclusion>
|
|
||||||
<groupId>org.codehaus.groovy</groupId>
|
|
||||||
<artifactId>groovy-all</artifactId>
|
|
||||||
</exclusion>
|
|
||||||
</exclusions>
|
|
||||||
</dependency>
|
|
||||||
|
|
||||||
<dependency>
|
|
||||||
<groupId>com.google.zxing</groupId>
|
|
||||||
<artifactId>core</artifactId>
|
|
||||||
<version>3.5.0</version>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>com.google.zxing</groupId>
|
|
||||||
<artifactId>javase</artifactId>
|
|
||||||
<version>3.5.0</version>
|
|
||||||
</dependency>
|
|
||||||
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.bouncycastle</groupId>
|
|
||||||
<artifactId>bcpkix-jdk15on</artifactId>
|
|
||||||
<version>1.68</version>
|
|
||||||
</dependency>
|
|
||||||
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.bouncycastle</groupId>
|
|
||||||
<artifactId>bcprov-jdk15on</artifactId>
|
|
||||||
<version>1.68</version>
|
|
||||||
</dependency>
|
|
||||||
|
|
||||||
<!-- https://mvnrepository.com/artifact/cn.hutool/hutool-all -->
|
|
||||||
<dependency>
|
|
||||||
<groupId>cn.hutool</groupId>
|
|
||||||
<artifactId>hutool-all</artifactId>
|
|
||||||
<version>5.8.38</version>
|
|
||||||
</dependency>
|
|
||||||
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.snmp4j</groupId>
|
|
||||||
<artifactId>snmp4j</artifactId>
|
|
||||||
<version>2.8.18</version>
|
|
||||||
</dependency>
|
|
||||||
|
|
||||||
<!-- https://mvnrepository.com/artifact/com.google.code.gson/gson -->
|
|
||||||
<dependency>
|
|
||||||
<groupId>com.google.code.gson</groupId>
|
|
||||||
<artifactId>gson</artifactId>
|
|
||||||
<version>2.13.1</version>
|
|
||||||
</dependency>
|
|
||||||
</dependencies>
|
</dependencies>
|
||||||
<build>
|
<build>
|
||||||
<finalName>sydapi4j</finalName>
|
<finalName>sydapi4j</finalName>
|
||||||
@@ -114,7 +55,6 @@
|
|||||||
<groupId>org.apache.maven.plugins</groupId>
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
<artifactId>maven-compiler-plugin</artifactId>
|
<artifactId>maven-compiler-plugin</artifactId>
|
||||||
<version>3.3</version>
|
<version>3.3</version>
|
||||||
<!-- <version>3.8.1</version>-->
|
|
||||||
<executions>
|
<executions>
|
||||||
<execution>
|
<execution>
|
||||||
<id>compile</id>
|
<id>compile</id>
|
||||||
@@ -132,8 +72,8 @@
|
|||||||
</execution>
|
</execution>
|
||||||
</executions>
|
</executions>
|
||||||
<configuration>
|
<configuration>
|
||||||
<source>8</source>
|
<source>1.6</source>
|
||||||
<target>8</target>
|
<target>1.6</target>
|
||||||
<compilerId>groovy-eclipse-compiler</compilerId>
|
<compilerId>groovy-eclipse-compiler</compilerId>
|
||||||
<verbose>true</verbose>
|
<verbose>true</verbose>
|
||||||
<fork>true</fork>
|
<fork>true</fork>
|
||||||
@@ -226,7 +166,7 @@
|
|||||||
<configuration>
|
<configuration>
|
||||||
<archive>
|
<archive>
|
||||||
<manifest>
|
<manifest>
|
||||||
<mainClass>com.Sample.TestDemo</mainClass>
|
<mainClass>racal.sunyard.main.Version</mainClass>
|
||||||
</manifest>
|
</manifest>
|
||||||
</archive>
|
</archive>
|
||||||
<descriptorRefs>
|
<descriptorRefs>
|
||||||
|
|||||||
@@ -1,38 +0,0 @@
|
|||||||
package com.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);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,20 +1,15 @@
|
|||||||
package com.jmeter.test;
|
package com.jmeter.test;
|
||||||
|
|
||||||
import com.Sample.SydUtils;
|
|
||||||
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 org.apache.commons.lang3.StringUtils;
|
|
||||||
import org.apache.jmeter.config.Arguments;
|
import org.apache.jmeter.config.Arguments;
|
||||||
import org.apache.jmeter.protocol.java.sampler.AbstractJavaSamplerClient;
|
import org.apache.jmeter.protocol.java.sampler.AbstractJavaSamplerClient;
|
||||||
import org.apache.jmeter.protocol.java.sampler.JavaSamplerContext;
|
import org.apache.jmeter.protocol.java.sampler.JavaSamplerContext;
|
||||||
import org.apache.jmeter.samplers.SampleResult;
|
import org.apache.jmeter.samplers.SampleResult;
|
||||||
import racal.sunyard.main.SydApi4j;
|
import racal.sunyard.main.SydApi4j;
|
||||||
|
import racal.sunyard.main.SydApiBuilder;
|
||||||
|
|
||||||
import java.io.StringWriter;
|
|
||||||
import java.nio.charset.StandardCharsets;
|
import java.nio.charset.StandardCharsets;
|
||||||
import java.util.*;
|
|
||||||
|
|
||||||
|
|
||||||
public class Test4Jemter extends AbstractJavaSamplerClient {
|
public class Test4Jemter extends AbstractJavaSamplerClient {
|
||||||
@@ -22,32 +17,15 @@ public class Test4Jemter extends AbstractJavaSamplerClient {
|
|||||||
private String SM2dn ;
|
private String SM2dn ;
|
||||||
private String RSAdn ;
|
private String RSAdn ;
|
||||||
private String ip ;
|
private String ip ;
|
||||||
|
|
||||||
private int port;
|
|
||||||
private String ip2 ;
|
private String ip2 ;
|
||||||
private String oData;
|
private String oData;
|
||||||
private String sign;
|
private String sign;
|
||||||
|
|
||||||
private String detachedSign;
|
|
||||||
private byte[] orgData;
|
private byte[] orgData;
|
||||||
|
|
||||||
private int type;
|
private int type;
|
||||||
|
|
||||||
private static ThreadLocal<SydApi4j> api;
|
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中会自动显示在这里定义的默认参数
|
* 定义默认的参数,在jmeter中会自动显示在这里定义的默认参数
|
||||||
@@ -56,26 +34,13 @@ public class Test4Jemter extends AbstractJavaSamplerClient {
|
|||||||
@Override
|
@Override
|
||||||
public Arguments getDefaultParameters() {
|
public Arguments getDefaultParameters() {
|
||||||
Arguments arguments = new Arguments();
|
Arguments arguments = new Arguments();
|
||||||
arguments.addArgument("SM2dn", "C=CN,ST=zz,L=zz,O=zzz,CN=zzzzz");
|
arguments.addArgument("SM2dn", "C=CN,O=CFCA OCA1,OU=YCCA,OU=Individual-2,CN=YCCA@黄金交易所@Zhuangj@1");
|
||||||
arguments.addArgument("RSAdn", "C=cn,O=CFCA TEST CA,OU=NCS2,OU=Enterprises,CN=041@Z402451000010@ShanDong@00000001");
|
arguments.addArgument("RSAdn", "C=cn,O=CFCA TEST CA,OU=NCS2,OU=Enterprises,CN=041@Z402451000010@ShanDong@00000001");
|
||||||
arguments.addArgument("orgData", "null");
|
arguments.addArgument("orgData", "12345678");
|
||||||
arguments.addArgument("ip", "172.1.41.139");
|
arguments.addArgument("ip", "192.168.0.166");
|
||||||
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("ip2", "172.16.17.161");
|
||||||
arguments.addArgument("dataLength", "1024");
|
|
||||||
arguments.addArgument("type", "1");
|
arguments.addArgument("type", "1");
|
||||||
arguments.addArgument("sign", "12345678");
|
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;
|
return arguments;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -90,32 +55,16 @@ public class Test4Jemter extends AbstractJavaSamplerClient {
|
|||||||
RSAdn = context.getParameter("RSAdn");
|
RSAdn = context.getParameter("RSAdn");
|
||||||
oData = context.getParameter("orgData");
|
oData = context.getParameter("orgData");
|
||||||
ip = context.getParameter("ip");
|
ip = context.getParameter("ip");
|
||||||
ip2 = context.getParameter("ip2");
|
|
||||||
port = context.getIntParameter("port");
|
|
||||||
timeout = context.getIntParameter("timeout");
|
|
||||||
logSwitch = context.getIntParameter("logSwitch");
|
|
||||||
// ip2 = context.getParameter("ip2");
|
// ip2 = context.getParameter("ip2");
|
||||||
dataLength = context.getIntParameter("dataLength");
|
|
||||||
type = context.getIntParameter("type");
|
type = context.getIntParameter("type");
|
||||||
sign = context.getParameter("sign");
|
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");
|
System.setProperty("com.sunyard.dnsort", "false");
|
||||||
api = new ThreadLocal<SydApi4j>() {
|
api = new ThreadLocal<SydApi4j>() {
|
||||||
@Override
|
|
||||||
public SydApi4j initialValue() {
|
public SydApi4j initialValue() {
|
||||||
//
|
|
||||||
// SydApiBuilder builder = new SydApiBuilder().setIp(ip);
|
SydApiBuilder builder = new SydApiBuilder().setIp(ip);
|
||||||
// final SydApi4j api = (SydApi4j) builder.build();
|
final SydApi4j api = (SydApi4j) builder.build();
|
||||||
SydApi4j.SYD_Set_Parameter_HA(ip, ip2, port, timeout);
|
return api;
|
||||||
final SydApi4j api1 = (SydApi4j) new SydApi4j();
|
|
||||||
return api1;
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -133,37 +82,19 @@ public class Test4Jemter extends AbstractJavaSamplerClient {
|
|||||||
sr.setSampleLabel("testDemo");
|
sr.setSampleLabel("testDemo");
|
||||||
//设置开始标志,否则无法统计tps等
|
//设置开始标志,否则无法统计tps等
|
||||||
sr.sampleStart();
|
sr.sampleStart();
|
||||||
SydUtils sydUtils = null;
|
|
||||||
try {
|
try {
|
||||||
if ("null".equals(oData)) {
|
|
||||||
orgData = null;
|
|
||||||
} else {
|
|
||||||
orgData = oData.getBytes(); //SM2裸签
|
orgData = oData.getBytes(); //SM2裸签
|
||||||
}
|
|
||||||
sydUtils = new SydUtils(ip, ip2, port, timeout);
|
|
||||||
// orgData = new byte[dataLength];
|
|
||||||
//执行业务逻辑
|
//执行业务逻辑
|
||||||
switch(type){
|
switch(type){
|
||||||
case 1:
|
case 1:
|
||||||
// api.get().SYD_NakedSign(SM2dn, orgData, (byte[]) null);
|
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.setResponseCodeOK();
|
||||||
//sr.setResponseData(Util.encodeBase64(nakedSign1), StandardCharsets.UTF_8.displayName());
|
//sr.setResponseData(Util.encodeBase64(nakedSign1), StandardCharsets.UTF_8.displayName());
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
|
||||||
case 2:
|
case 2:
|
||||||
// api.get().SYD_NakedVerify(SM2dn, Util.decodeBase64(sign), orgData, (byte[])null) ;
|
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.setResponseCodeOK();
|
||||||
//sr.setResponseData(String.valueOf(nakedVerify1), StandardCharsets.UTF_8.displayName());
|
//sr.setResponseData(String.valueOf(nakedVerify1), StandardCharsets.UTF_8.displayName());
|
||||||
break;
|
break;
|
||||||
@@ -182,24 +113,13 @@ public class Test4Jemter extends AbstractJavaSamplerClient {
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case 5:
|
case 5:
|
||||||
// api.get().detachedSign(1, orgData, SM2dn);
|
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.setResponseCodeOK();
|
||||||
//sr.setResponseData(detSign1, StandardCharsets.UTF_8.displayName());
|
//sr.setResponseData(detSign1, StandardCharsets.UTF_8.displayName());
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 6:
|
case 6:
|
||||||
// api.get().detachedVerify(1, orgData, sign);
|
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.setResponseCodeOK();
|
||||||
//sr.setResponseData(String.valueOf(detV1), StandardCharsets.UTF_8.displayName());
|
//sr.setResponseData(String.valueOf(detV1), StandardCharsets.UTF_8.displayName());
|
||||||
break;
|
break;
|
||||||
@@ -269,32 +189,6 @@ public class Test4Jemter extends AbstractJavaSamplerClient {
|
|||||||
//sr.setResponseData(new String(oDataRSA), StandardCharsets.UTF_8.displayName());
|
//sr.setResponseData(new String(oDataRSA), StandardCharsets.UTF_8.displayName());
|
||||||
break;
|
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:
|
default:
|
||||||
sr.setResponseCodeOK();
|
sr.setResponseCodeOK();
|
||||||
sr.setResponseData("请选择测试组", StandardCharsets.UTF_8.displayName());
|
sr.setResponseData("请选择测试组", StandardCharsets.UTF_8.displayName());
|
||||||
@@ -307,62 +201,11 @@ public class Test4Jemter extends AbstractJavaSamplerClient {
|
|||||||
sr.setResponseData(e.getMessage(), StandardCharsets.UTF_8.displayName());
|
sr.setResponseData(e.getMessage(), StandardCharsets.UTF_8.displayName());
|
||||||
sr.setSuccessful(false);
|
sr.setSuccessful(false);
|
||||||
}finally {
|
}finally {
|
||||||
if (sydUtils != null) {
|
|
||||||
sydUtils.disconnect();
|
|
||||||
}
|
|
||||||
sr.sampleEnd();
|
sr.sampleEnd();
|
||||||
}
|
}
|
||||||
return sr;
|
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传递的参数
|
* @param context 上下文对象,可用于获取jmeter传递的参数
|
||||||
@@ -370,9 +213,5 @@ public class Test4Jemter extends AbstractJavaSamplerClient {
|
|||||||
@Override
|
@Override
|
||||||
public void teardownTest(JavaSamplerContext context) {
|
public void teardownTest(JavaSamplerContext context) {
|
||||||
System.runFinalization();
|
System.runFinalization();
|
||||||
if (api != null) {
|
|
||||||
api.get().disconnect();
|
|
||||||
api.remove();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1,125 +0,0 @@
|
|||||||
package com.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);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -9,7 +9,7 @@ import racal.sunyard.main.SydApi4j;
|
|||||||
|
|
||||||
public class SYMEnDeLongData {
|
public class SYMEnDeLongData {
|
||||||
private SydApi4j api;
|
private SydApi4j api;
|
||||||
private String sykey = "";
|
private String key = "";
|
||||||
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 sykey;
|
return key;
|
||||||
}
|
}
|
||||||
|
|
||||||
public SYMEnDeLongData setKey(String sykey) {
|
public SYMEnDeLongData setKey(String key) {
|
||||||
this.sykey = sykey;
|
this.key = key;
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -8,8 +8,6 @@ import com.sunyard.inf.customize.SydQNUCApi;
|
|||||||
import com.sunyard.inf.customize.SydUnionPayApi;
|
import com.sunyard.inf.customize.SydUnionPayApi;
|
||||||
import racal.sunyard.main.SydApiBuilder;
|
import racal.sunyard.main.SydApiBuilder;
|
||||||
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Created by Cheney on 2017/11/11.
|
* Created by Cheney on 2017/11/11.
|
||||||
* 程序调用接口
|
* 程序调用接口
|
||||||
@@ -119,5 +117,4 @@ public interface SydApi extends
|
|||||||
public Object getBindObject();
|
public Object getBindObject();
|
||||||
|
|
||||||
public void setBindObject(Object bindObject);
|
public void setBindObject(Object bindObject);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -68,11 +68,6 @@ public class SydApiException extends RuntimeException{
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
case 0x8004 : {
|
|
||||||
msg = "证书已过期";
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
case 32770:
|
case 32770:
|
||||||
msg = "签名验证错误(P7) ";
|
msg = "签名验证错误(P7) ";
|
||||||
break;
|
break;
|
||||||
@@ -137,16 +132,6 @@ public class SydApiException extends RuntimeException{
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public SydApiException(String msg, int retCode, boolean flag){
|
|
||||||
super(null == msg ? transMsg(retCode) : msg);
|
|
||||||
this.retCode = retCode;
|
|
||||||
if (null == msg || "".equals(msg)){
|
|
||||||
transMsg();
|
|
||||||
}else {
|
|
||||||
this.msg = msg;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public SydApiException(String msg, int ret, Throwable e) {
|
public SydApiException(String msg, int ret, Throwable e) {
|
||||||
super("SydApiException(code =" + String.format(" %04x", ret) + " : " + "msg =" + (msg == null ? "未定义的错误" : msg) + ")", e);
|
super("SydApiException(code =" + String.format(" %04x", ret) + " : " + "msg =" + (msg == null ? "未定义的错误" : msg) + ")", e);
|
||||||
this.retCode = ret;
|
this.retCode = ret;
|
||||||
|
|||||||
@@ -1,55 +0,0 @@
|
|||||||
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;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,42 +0,0 @@
|
|||||||
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;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,86 +0,0 @@
|
|||||||
package com.sunyard.entity;
|
|
||||||
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
public class ServerConfig {
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 主机节点信息
|
|
||||||
*/
|
|
||||||
private List<ServerAddress> masterNodeList;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 备机节点信息
|
|
||||||
*/
|
|
||||||
private List<ServerAddress> slaveNodeList;
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 连接超时时间
|
|
||||||
*/
|
|
||||||
private Integer timeout;
|
|
||||||
|
|
||||||
public ServerConfig(List<ServerAddress> masterNodeList, List<ServerAddress> slaveNodeList, Integer timeout) {
|
|
||||||
this.masterNodeList = masterNodeList;
|
|
||||||
this.slaveNodeList = slaveNodeList;
|
|
||||||
this.timeout = timeout;
|
|
||||||
}
|
|
||||||
|
|
||||||
public List<ServerAddress> getMasterNodeList() {
|
|
||||||
return masterNodeList;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setMasterNodeList(List<ServerAddress> masterNodeList) {
|
|
||||||
this.masterNodeList = masterNodeList;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Integer getTimeout() {
|
|
||||||
return timeout;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setTimeout(Integer timeout) {
|
|
||||||
this.timeout = timeout;
|
|
||||||
}
|
|
||||||
|
|
||||||
public List<ServerAddress> getSlaveNodeList() {
|
|
||||||
return slaveNodeList;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setSlaveNodeList(List<ServerAddress> slaveNodeList) {
|
|
||||||
this.slaveNodeList = slaveNodeList;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
public static class ServerAddress {
|
|
||||||
|
|
||||||
|
|
||||||
private String ip;
|
|
||||||
|
|
||||||
private Integer port;
|
|
||||||
|
|
||||||
public ServerAddress(String ip, Integer port) {
|
|
||||||
this.ip = ip;
|
|
||||||
this.port = port;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
public String getIp() {
|
|
||||||
return ip;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setIp(String ip) {
|
|
||||||
this.ip = ip;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Integer getPort() {
|
|
||||||
return port;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setPort(Integer port) {
|
|
||||||
this.port = port;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -151,8 +151,6 @@ public interface SydCertApi {
|
|||||||
RetWrap importCert(byte[] certData, byte[] organizationId, CertUsage... us);
|
RetWrap importCert(byte[] certData, byte[] organizationId, CertUsage... us);
|
||||||
RetWrap importCert(byte[] certData, byte[] organizationId);
|
RetWrap importCert(byte[] certData, byte[] organizationId);
|
||||||
|
|
||||||
String importCert(String cert);
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 从加密设备中删除指定 DN 的公钥证书
|
* 从加密设备中删除指定 DN 的公钥证书
|
||||||
|
|||||||
@@ -240,9 +240,6 @@ public interface SydGenApi {
|
|||||||
*/
|
*/
|
||||||
RetWrap generateDEByDn(String certSerial, byte[] oData);
|
RetWrap generateDEByDn(String certSerial, byte[] oData);
|
||||||
|
|
||||||
|
|
||||||
RetWrap generateDEByDnICBC(String certSerial,String iv, byte[] oData,int roundmod);
|
|
||||||
|
|
||||||
RetWrap generateDEByDnRSA(int alg,String certSerial, byte[] oData);
|
RetWrap generateDEByDnRSA(int alg,String certSerial, byte[] oData);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -326,8 +323,6 @@ public interface SydGenApi {
|
|||||||
* orgCode 如果有机构码的话会返回机构码
|
* orgCode 如果有机构码的话会返回机构码
|
||||||
*/
|
*/
|
||||||
RetWrap decryptDEByDN(String certSerial, byte[] pCipherKey);
|
RetWrap decryptDEByDN(String certSerial, byte[] pCipherKey);
|
||||||
|
|
||||||
RetWrap decryptDEByDNICBC(String certSerial, String IV,String pCipherKey,int roundmod);
|
|
||||||
RetWrap decryptDEByDNRSA(int alg,String certSerial, byte[] pCipherKey);
|
RetWrap decryptDEByDNRSA(int alg,String certSerial, byte[] pCipherKey);
|
||||||
/**
|
/**
|
||||||
* 接收用私钥解密数字信封,还原对称密钥。
|
* 接收用私钥解密数字信封,还原对称密钥。
|
||||||
|
|||||||
@@ -1,112 +0,0 @@
|
|||||||
package com.sunyard.snmp;
|
|
||||||
|
|
||||||
import org.snmp4j.*;
|
|
||||||
import org.snmp4j.event.ResponseEvent;
|
|
||||||
import org.snmp4j.event.ResponseListener;
|
|
||||||
import org.snmp4j.mp.*;
|
|
||||||
import org.snmp4j.security.*;
|
|
||||||
import org.snmp4j.smi.*;
|
|
||||||
import org.snmp4j.transport.DefaultUdpTransportMapping;
|
|
||||||
import java.io.IOException;
|
|
||||||
import java.io.InputStream;
|
|
||||||
import java.nio.charset.StandardCharsets;
|
|
||||||
import java.util.Map;
|
|
||||||
import java.util.Properties;
|
|
||||||
import java.util.Vector;
|
|
||||||
|
|
||||||
public class SnmpTrapSender implements AutoCloseable{
|
|
||||||
private Snmp snmp;
|
|
||||||
|
|
||||||
// 配置参数
|
|
||||||
private String ip;
|
|
||||||
private int port;
|
|
||||||
private String enterpriseOid;
|
|
||||||
private String community;
|
|
||||||
private int version;
|
|
||||||
|
|
||||||
public SnmpTrapSender(Map<String, String> map) throws Exception {
|
|
||||||
loadConfig(map);
|
|
||||||
initializeSNMP();
|
|
||||||
}
|
|
||||||
|
|
||||||
public void loadConfig(Map<String, String> map) {
|
|
||||||
ip = map.getOrDefault("snmp.target.ip", null);
|
|
||||||
port = Integer.parseInt(map.getOrDefault("snmp.target.port", "162"));
|
|
||||||
enterpriseOid = map.getOrDefault("enterprise.oid", null);
|
|
||||||
community = map.getOrDefault("snmp.community", "public");
|
|
||||||
version = Integer.parseInt(map.getOrDefault("snmp.version", "1"));
|
|
||||||
}
|
|
||||||
|
|
||||||
private void initializeSNMP() throws Exception {
|
|
||||||
TransportMapping<?> transport = new DefaultUdpTransportMapping();
|
|
||||||
snmp = new Snmp(transport);
|
|
||||||
snmp.listen();
|
|
||||||
}
|
|
||||||
|
|
||||||
public ResponseEvent sendTrap(String message, int severity) throws Exception {
|
|
||||||
ResponseEvent event = null;
|
|
||||||
switch (version) {
|
|
||||||
case SnmpConstants.version1:
|
|
||||||
event = sendV1Trap(message, severity);
|
|
||||||
break;
|
|
||||||
case SnmpConstants.version2c:
|
|
||||||
event = sendV2Trap(message, severity);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
throw new IllegalArgumentException("不支持的SNMP版本");
|
|
||||||
}
|
|
||||||
return event;
|
|
||||||
}
|
|
||||||
|
|
||||||
private ResponseEvent sendV1Trap(String message, int severity) throws Exception {
|
|
||||||
CommunityTarget target = createCommunityTarget(SnmpConstants.version1);
|
|
||||||
PDUv1 pdu = new PDUv1();
|
|
||||||
configureCommonTrap(pdu, message, severity);
|
|
||||||
pdu.setGenericTrap(PDUv1.ENTERPRISE_SPECIFIC);
|
|
||||||
return snmp.send(pdu, target);
|
|
||||||
}
|
|
||||||
|
|
||||||
private ResponseEvent sendV2Trap(String message, int severity) throws Exception {
|
|
||||||
CommunityTarget target = createCommunityTarget(SnmpConstants.version2c);
|
|
||||||
PDU pdu = new PDU();
|
|
||||||
configureCommonTrap(pdu, message, severity);
|
|
||||||
pdu.setType(PDU.TRAP);
|
|
||||||
return snmp.send(pdu, target);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
private void configureCommonTrap(PDU pdu, String message, int severity) {
|
|
||||||
pdu.add(new VariableBinding(SnmpConstants.sysUpTime,
|
|
||||||
new TimeTicks(System.currentTimeMillis()/1000)));
|
|
||||||
pdu.add(new VariableBinding(SnmpConstants.snmpTrapOID,
|
|
||||||
new OID(enterpriseOid + ".1.1")));
|
|
||||||
byte[] msg = new byte[10];
|
|
||||||
try {
|
|
||||||
msg = message.getBytes("GBK");
|
|
||||||
} catch (Exception e) {
|
|
||||||
System.out.println("编码错误");
|
|
||||||
}
|
|
||||||
pdu.add(new VariableBinding(new OID(enterpriseOid + ".2.1"),
|
|
||||||
new OctetString(msg)));
|
|
||||||
pdu.add(new VariableBinding(new OID(enterpriseOid + ".2.2"),
|
|
||||||
new Integer32(severity)));
|
|
||||||
}
|
|
||||||
|
|
||||||
private CommunityTarget createCommunityTarget(int version) {
|
|
||||||
CommunityTarget target = new CommunityTarget();
|
|
||||||
target.setCommunity(new OctetString(community));
|
|
||||||
target.setAddress(GenericAddress.parse("udp:"+ip+"/"+port));
|
|
||||||
target.setVersion(version);
|
|
||||||
target.setTimeout(5000);
|
|
||||||
target.setRetries(3);
|
|
||||||
return target;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void close() throws Exception {
|
|
||||||
if (snmp != null) {
|
|
||||||
snmp.close();
|
|
||||||
snmp = null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,121 +0,0 @@
|
|||||||
package com.sunyard.task;
|
|
||||||
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.concurrent.*;
|
|
||||||
import java.util.stream.Collectors;
|
|
||||||
|
|
||||||
public class AsyncTaskExecutor {
|
|
||||||
|
|
||||||
private final ExecutorService taskExecutor;
|
|
||||||
private final ScheduledExecutorService retryScheduler;
|
|
||||||
|
|
||||||
public AsyncTaskExecutor(int taskThreads, int retryThreads) {
|
|
||||||
this.taskExecutor = Executors.newFixedThreadPool(taskThreads);
|
|
||||||
this.retryScheduler = Executors.newScheduledThreadPool(retryThreads);
|
|
||||||
}
|
|
||||||
|
|
||||||
// 默认配置构造函数
|
|
||||||
public AsyncTaskExecutor() {
|
|
||||||
this(2, 2);
|
|
||||||
}
|
|
||||||
|
|
||||||
public List<TaskOutcome<String>> execBatchTasks(List<TaskContext<String>> taskContexts) {
|
|
||||||
// 转换每个Future为明确的TaskOutcome类型
|
|
||||||
List<CompletableFuture<TaskOutcome<String>>> futures = taskContexts.stream()
|
|
||||||
.map(task ->
|
|
||||||
retryWithDelay(task)
|
|
||||||
.<TaskOutcome<String>>handle((result, ex) -> {
|
|
||||||
if (ex != null) {
|
|
||||||
// 提取原始异常
|
|
||||||
Throwable cause = ex instanceof CompletionException ? ex.getCause() : ex;
|
|
||||||
return new TaskOutcome<>(task, cause);
|
|
||||||
} else {
|
|
||||||
return new TaskOutcome<>(task, result);
|
|
||||||
}
|
|
||||||
})
|
|
||||||
)
|
|
||||||
.collect(Collectors.toList());
|
|
||||||
|
|
||||||
// 等待所有任务完成
|
|
||||||
CompletableFuture<Void> allFutures = CompletableFuture.allOf(
|
|
||||||
futures.toArray(new CompletableFuture[0])
|
|
||||||
);
|
|
||||||
|
|
||||||
// 收集处理结果
|
|
||||||
return allFutures.thenApply(v ->
|
|
||||||
futures.stream()
|
|
||||||
.map(CompletableFuture::join)
|
|
||||||
.collect(Collectors.toList())
|
|
||||||
).join();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 带延迟的重试逻辑
|
|
||||||
*/
|
|
||||||
private <T> CompletableFuture<T> retryWithDelay(TaskContext<T> context) {
|
|
||||||
return CompletableFuture.supplyAsync(context.getTask(), taskExecutor)
|
|
||||||
.handleAsync((result, ex) -> {
|
|
||||||
if (ex == null) {
|
|
||||||
return CompletableFuture.completedFuture(result);
|
|
||||||
} else {
|
|
||||||
return handleRetry(context, ex);
|
|
||||||
}
|
|
||||||
}, taskExecutor)
|
|
||||||
.thenCompose(f -> f);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 处理重试逻辑
|
|
||||||
*/
|
|
||||||
private <T> CompletableFuture<T> handleRetry(TaskContext<T> context, Throwable ex) {
|
|
||||||
if (context.canRetry()) {
|
|
||||||
context.decreaseRetry();
|
|
||||||
// System.out.printf("[重试调度] ID: %s| IP:%s | 延迟: %ss | 剩余重试: %d | 错误: %s%n",
|
|
||||||
// context.getTaskId(),
|
|
||||||
// context.getAddress(),
|
|
||||||
// context.getRetryDelay().getSeconds(),
|
|
||||||
// context.getRetriesLeft(),
|
|
||||||
// ex.getCause().getMessage());
|
|
||||||
|
|
||||||
// 创建延迟重试的Future
|
|
||||||
CompletableFuture<T> delayedRetry = new CompletableFuture<>();
|
|
||||||
retryScheduler.schedule(() -> {
|
|
||||||
retryWithDelay(context).whenComplete((retryResult, retryEx) -> {
|
|
||||||
if (retryEx != null) {
|
|
||||||
delayedRetry.completeExceptionally(retryEx);
|
|
||||||
} else {
|
|
||||||
delayedRetry.complete(retryResult);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}, context.getRetryDelay().toMillis(), TimeUnit.MILLISECONDS);
|
|
||||||
|
|
||||||
return delayedRetry;
|
|
||||||
} else {
|
|
||||||
// 重试耗尽,传递原始异常
|
|
||||||
CompletableFuture<T> failed = new CompletableFuture<>();
|
|
||||||
failed.completeExceptionally(ex);
|
|
||||||
return failed;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 关闭线程池
|
|
||||||
*/
|
|
||||||
public void shutdown() {
|
|
||||||
taskExecutor.shutdown();
|
|
||||||
retryScheduler.shutdown();
|
|
||||||
try {
|
|
||||||
if (!taskExecutor.awaitTermination(1, TimeUnit.SECONDS)) {
|
|
||||||
taskExecutor.shutdownNow();
|
|
||||||
}
|
|
||||||
if (!retryScheduler.awaitTermination(1, TimeUnit.SECONDS)) {
|
|
||||||
retryScheduler.shutdownNow();
|
|
||||||
}
|
|
||||||
} catch (InterruptedException e) {
|
|
||||||
Thread.currentThread().interrupt();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,50 +0,0 @@
|
|||||||
package com.sunyard.task;
|
|
||||||
|
|
||||||
import java.time.Duration;
|
|
||||||
import java.util.UUID;
|
|
||||||
import java.util.function.Supplier;
|
|
||||||
|
|
||||||
public class TaskContext<T> {
|
|
||||||
private final String taskId; // 唯一任务ID
|
|
||||||
private final Supplier<T> task; // 原始任务逻辑
|
|
||||||
private int retriesLeft; // 剩余重试次数
|
|
||||||
private final Duration retryDelay; // 重试延迟
|
|
||||||
|
|
||||||
private final String address;
|
|
||||||
|
|
||||||
public TaskContext(Supplier<T> task, int maxRetries, Duration retryDelay, String address) {
|
|
||||||
this.taskId = UUID.randomUUID().toString();
|
|
||||||
this.task = task;
|
|
||||||
this.retriesLeft = maxRetries;
|
|
||||||
this.retryDelay = retryDelay;
|
|
||||||
this.address = address;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getAddress() {
|
|
||||||
return address;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getTaskId() {
|
|
||||||
return taskId;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Supplier<T> getTask() {
|
|
||||||
return task;
|
|
||||||
}
|
|
||||||
|
|
||||||
public int getRetriesLeft() {
|
|
||||||
return retriesLeft;
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean canRetry() {
|
|
||||||
return retriesLeft > 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void decreaseRetry() {
|
|
||||||
retriesLeft--;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Duration getRetryDelay() {
|
|
||||||
return retryDelay;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,35 +0,0 @@
|
|||||||
package com.sunyard.task;
|
|
||||||
|
|
||||||
public class TaskOutcome<T> {
|
|
||||||
private final TaskContext<T> context;
|
|
||||||
private final T result;
|
|
||||||
private final Throwable error;
|
|
||||||
|
|
||||||
public TaskOutcome(TaskContext<T> context, T result) {
|
|
||||||
this.context = context;
|
|
||||||
this.result = result;
|
|
||||||
this.error = null;
|
|
||||||
}
|
|
||||||
|
|
||||||
public TaskOutcome(TaskContext<T> context, Throwable error) {
|
|
||||||
this.context = context;
|
|
||||||
this.result = null;
|
|
||||||
this.error = error;
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean isSuccess() {
|
|
||||||
return error == null;
|
|
||||||
}
|
|
||||||
|
|
||||||
public TaskContext<T> getContext() {
|
|
||||||
return context;
|
|
||||||
}
|
|
||||||
|
|
||||||
public T getResult() {
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Throwable getError() {
|
|
||||||
return error;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,70 +0,0 @@
|
|||||||
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;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,44 +0,0 @@
|
|||||||
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;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -46,14 +46,12 @@ public class CertUtil {
|
|||||||
return (X509Certificate) CF.generateCertificate(new ByteArrayInputStream(certificateString.getBytes())); // 将文件流的证书转化为证书类
|
return (X509Certificate) CF.generateCertificate(new ByteArrayInputStream(certificateString.getBytes())); // 将文件流的证书转化为证书类
|
||||||
}
|
}
|
||||||
|
|
||||||
public static String convertToPem(String cert) throws CertificateEncodingException {
|
public static String convertToPem(X509Certificate cert) throws CertificateEncodingException {
|
||||||
|
|
||||||
String cert_begin = "-----BEGIN CERTIFICATE-----\n";
|
String cert_begin = "-----BEGIN CERTIFICATE-----\n";
|
||||||
String end_cert = "\n-----END CERTIFICATE-----";
|
String end_cert = "\n-----END CERTIFICATE-----";
|
||||||
|
|
||||||
// byte[] derCert = cert.getEncoded();
|
byte[] derCert = cert.getEncoded();
|
||||||
|
|
||||||
byte[] derCert = cert.getBytes();
|
|
||||||
String pemCertPre = new String(Base64.encode(derCert, true));
|
String pemCertPre = new String(Base64.encode(derCert, true));
|
||||||
String pemCert = cert_begin + pemCertPre + end_cert;
|
String pemCert = cert_begin + pemCertPre + end_cert;
|
||||||
return pemCert;
|
return pemCert;
|
||||||
@@ -100,25 +98,6 @@ public class CertUtil {
|
|||||||
return signAlg.toUpperCase().indexOf("SM2") >= 0;
|
return signAlg.toUpperCase().indexOf("SM2") >= 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public static String getDN(String cert) {
|
|
||||||
String pemCert;
|
|
||||||
if(cert.contains("-----BEGIN CERTIFICATE-----")){
|
|
||||||
pemCert =cert;
|
|
||||||
}else {
|
|
||||||
String cert_begin = "-----BEGIN CERTIFICATE-----\n";
|
|
||||||
String end_cert = "\n-----END CERTIFICATE-----";
|
|
||||||
pemCert = cert_begin + cert + end_cert;
|
|
||||||
}
|
|
||||||
X509Certificate certificate = null;
|
|
||||||
try {
|
|
||||||
certificate = convertToX509Cert(pemCert);
|
|
||||||
} catch (Exception e) {
|
|
||||||
throw new SydApiException( 0xC101, e );
|
|
||||||
}
|
|
||||||
return certificate.getSubjectDN().toString();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 判断 p7 是否是国密证书签的
|
* 判断 p7 是否是国密证书签的
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -1,107 +0,0 @@
|
|||||||
package com.sunyard.util;
|
|
||||||
|
|
||||||
import java.util.concurrent.ConcurrentHashMap;
|
|
||||||
import java.util.concurrent.ConcurrentMap;
|
|
||||||
import java.util.concurrent.TimeUnit;
|
|
||||||
import java.util.concurrent.locks.ReentrantLock;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* IP锁工具类 - 高并发安全实现
|
|
||||||
*
|
|
||||||
* 为每个IP地址提供唯一的可重入锁,确保同一IP的操作顺序执行
|
|
||||||
*/
|
|
||||||
public class IpLockUtils {
|
|
||||||
|
|
||||||
private static final ConcurrentMap<String, ReentrantLock> LOCK_MAP = new ConcurrentHashMap<>();
|
|
||||||
|
|
||||||
private static final Object CREATION_LOCK = new Object();
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 获取IP对应的锁(保证唯一性)
|
|
||||||
* @param ip IP地址
|
|
||||||
* @return 可重入锁实例
|
|
||||||
*/
|
|
||||||
public static ReentrantLock getLockForIp(String ip) {
|
|
||||||
ReentrantLock lock = LOCK_MAP.get(ip);
|
|
||||||
if (lock != null) {
|
|
||||||
return lock;
|
|
||||||
}
|
|
||||||
|
|
||||||
synchronized (CREATION_LOCK) {
|
|
||||||
// 双重检查
|
|
||||||
lock = LOCK_MAP.get(ip);
|
|
||||||
if (lock == null) {
|
|
||||||
lock = new ReentrantLock(true); // 公平锁
|
|
||||||
LOCK_MAP.put(ip, lock);
|
|
||||||
}
|
|
||||||
return lock;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 安全加锁(带超时机制)
|
|
||||||
* @param ip IP地址
|
|
||||||
* @param timeout 超时时间
|
|
||||||
* @param unit 时间单位
|
|
||||||
* @return 是否成功获取锁
|
|
||||||
* @throws InterruptedException
|
|
||||||
*/
|
|
||||||
public static boolean lockWithTimeout(String ip, long timeout, TimeUnit unit)
|
|
||||||
throws InterruptedException {
|
|
||||||
|
|
||||||
ReentrantLock lock = getLockForIp(ip);
|
|
||||||
return lock.tryLock(timeout, unit);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 解锁指定IP的锁
|
|
||||||
* @param ip IP地址
|
|
||||||
*/
|
|
||||||
public static void unlockForIp(String ip) {
|
|
||||||
ReentrantLock lock = LOCK_MAP.get(ip);
|
|
||||||
if (lock != null && lock.isHeldByCurrentThread()) {
|
|
||||||
lock.unlock();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 清理未使用的锁(可选)
|
|
||||||
*/
|
|
||||||
public static void cleanupUnusedLocks() {
|
|
||||||
LOCK_MAP.entrySet().removeIf(entry ->
|
|
||||||
!entry.getValue().isLocked() &&
|
|
||||||
entry.getValue().getQueueLength() == 0
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 获取当前锁数量
|
|
||||||
*/
|
|
||||||
public static int getLockCount() {
|
|
||||||
return LOCK_MAP.size();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 获取IP锁状态
|
|
||||||
* @param ip IP地址
|
|
||||||
* @return 锁状态字符串
|
|
||||||
*/
|
|
||||||
public static String getLockStatus(String ip) {
|
|
||||||
ReentrantLock lock = LOCK_MAP.get(ip);
|
|
||||||
if (lock == null) {
|
|
||||||
return "No lock exists";
|
|
||||||
}
|
|
||||||
|
|
||||||
return String.format("Locked: %s, Queue: %d, HoldCount: %d",
|
|
||||||
lock.isLocked(), lock.getQueueLength(), lock.getHoldCount());
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 重置所有锁
|
|
||||||
*/
|
|
||||||
public static void reset() {
|
|
||||||
synchronized (CREATION_LOCK) {
|
|
||||||
LOCK_MAP.clear();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,367 +0,0 @@
|
|||||||
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");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,140 +0,0 @@
|
|||||||
package com.sunyard.util;
|
|
||||||
|
|
||||||
import com.google.zxing.*;
|
|
||||||
import com.google.zxing.client.j2se.BufferedImageLuminanceSource;
|
|
||||||
import com.google.zxing.client.j2se.MatrixToImageWriter;
|
|
||||||
import com.google.zxing.common.BitMatrix;
|
|
||||||
import com.google.zxing.common.HybridBinarizer;
|
|
||||||
import com.google.zxing.qrcode.QRCodeReader;
|
|
||||||
import com.sunyard.SydApiException;
|
|
||||||
|
|
||||||
import javax.imageio.ImageIO;
|
|
||||||
import java.awt.image.BufferedImage;
|
|
||||||
import java.io.File;
|
|
||||||
import java.io.IOException;
|
|
||||||
import java.util.Hashtable;
|
|
||||||
|
|
||||||
public class QRCodeUtil {
|
|
||||||
|
|
||||||
public static void genQRCode(String data,String filepath){
|
|
||||||
// 图片的尺寸(宽度和高度)
|
|
||||||
int width = 300;
|
|
||||||
int height = 300;
|
|
||||||
|
|
||||||
// 设置二维码的相关参数
|
|
||||||
Hashtable<EncodeHintType, Object> hintMap = new Hashtable<>();
|
|
||||||
hintMap.put(EncodeHintType.MARGIN, 1); // 设置二维码的空白边距
|
|
||||||
|
|
||||||
try {
|
|
||||||
// 创建二维码矩阵
|
|
||||||
BitMatrix bitMatrix = new MultiFormatWriter().encode(
|
|
||||||
data,
|
|
||||||
BarcodeFormat.QR_CODE,
|
|
||||||
width,
|
|
||||||
height,
|
|
||||||
hintMap
|
|
||||||
);
|
|
||||||
|
|
||||||
// 将二维码矩阵转换为图片,并保存
|
|
||||||
File outputFile = new File(filepath);
|
|
||||||
MatrixToImageWriter.writeToFile(bitMatrix, "PNG", outputFile);
|
|
||||||
|
|
||||||
} catch (Exception e) {
|
|
||||||
System.err.println("Error occurred while generating QR code: " + e.getMessage());
|
|
||||||
throw new SydApiException(1001,e);
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void genBarCode(String data,String filepath){
|
|
||||||
// 图片的尺寸(宽度和高度)
|
|
||||||
int width = 300;
|
|
||||||
int height = 300;
|
|
||||||
|
|
||||||
// 设置二维码的相关参数
|
|
||||||
Hashtable<EncodeHintType, Object> hintMap = new Hashtable<>();
|
|
||||||
hintMap.put(EncodeHintType.MARGIN, 1); // 设置二维码的空白边距
|
|
||||||
|
|
||||||
try {
|
|
||||||
// 生成 Code 128 条形码
|
|
||||||
BitMatrix bitMatrix= new MultiFormatWriter().encode(
|
|
||||||
data,
|
|
||||||
BarcodeFormat.PDF_417,
|
|
||||||
width,
|
|
||||||
height,
|
|
||||||
hintMap
|
|
||||||
);
|
|
||||||
|
|
||||||
// 将二维码矩阵转换为图片,并保存
|
|
||||||
File outputFile = new File(filepath);
|
|
||||||
MatrixToImageWriter.writeToFile(bitMatrix, "PNG", outputFile);
|
|
||||||
|
|
||||||
} catch (Exception e) {
|
|
||||||
System.err.println("Error occurred while generating QR code: " + e.getMessage());
|
|
||||||
throw new SydApiException(1001,e);
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
public static String readQRCode(String filepath){
|
|
||||||
// 加载二维码图像
|
|
||||||
File qrCodeImage = new File(filepath);
|
|
||||||
|
|
||||||
// 读取二维码图像
|
|
||||||
BufferedImage bufferedImage = null;
|
|
||||||
try {
|
|
||||||
bufferedImage = ImageIO.read(qrCodeImage);
|
|
||||||
} catch (IOException e) {
|
|
||||||
throw new RuntimeException(e);
|
|
||||||
}
|
|
||||||
|
|
||||||
// 使用 ZXing 的 QRCodeReader 进行解码
|
|
||||||
QRCodeReader reader = new QRCodeReader();
|
|
||||||
LuminanceSource source = new BufferedImageLuminanceSource(bufferedImage);
|
|
||||||
BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source));
|
|
||||||
|
|
||||||
try {
|
|
||||||
// 解码二维码
|
|
||||||
Result result = reader.decode(bitmap);
|
|
||||||
|
|
||||||
// 提取二维码中的数据
|
|
||||||
return result.getText();
|
|
||||||
|
|
||||||
} catch (NotFoundException e) {
|
|
||||||
throw new SydApiException(1003,e);
|
|
||||||
} catch (ChecksumException e) {
|
|
||||||
throw new SydApiException(1004,e);
|
|
||||||
} catch (FormatException e) {
|
|
||||||
throw new SydApiException(1005,e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
public static String readBarCode(String filepath){
|
|
||||||
// 加载二维码图像
|
|
||||||
File BarCodeImage = new File(filepath);
|
|
||||||
|
|
||||||
try {
|
|
||||||
// 读取条形码图像
|
|
||||||
BufferedImage bufferedImage = ImageIO.read(BarCodeImage);
|
|
||||||
|
|
||||||
// 使用 ZXing 的 MultiFormatReader 进行解码
|
|
||||||
MultiFormatReader reader = new MultiFormatReader();
|
|
||||||
LuminanceSource source = new BufferedImageLuminanceSource(bufferedImage);
|
|
||||||
BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source));
|
|
||||||
|
|
||||||
// 解码条形码
|
|
||||||
Result result = reader.decode(bitmap);
|
|
||||||
|
|
||||||
// 提取条形码中的数据
|
|
||||||
return result.getText();
|
|
||||||
} catch (NotFoundException e) {
|
|
||||||
throw new SydApiException(1006,e);
|
|
||||||
} catch (IOException e) {
|
|
||||||
throw new SydApiException(1007,e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -1,116 +0,0 @@
|
|||||||
import com.sunyard.snmp.SnmpTrapSender;
|
|
||||||
import com.sunyard.task.AsyncTaskExecutor;
|
|
||||||
import com.sunyard.task.TaskContext;
|
|
||||||
import com.sunyard.task.TaskOutcome;
|
|
||||||
|
|
||||||
import java.io.File;
|
|
||||||
import java.io.IOException;
|
|
||||||
import java.time.Duration;
|
|
||||||
import java.util.*;
|
|
||||||
import java.util.concurrent.CompletableFuture;
|
|
||||||
import java.util.function.Supplier;
|
|
||||||
import java.util.stream.Collectors;
|
|
||||||
|
|
||||||
public class SimpleTest {
|
|
||||||
|
|
||||||
public static void main(String[] args) throws Exception {
|
|
||||||
// testt();
|
|
||||||
testSnmp();
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void testt() {
|
|
||||||
|
|
||||||
AsyncTaskExecutor executor = new AsyncTaskExecutor();
|
|
||||||
// 使用示例
|
|
||||||
List<TaskContext<String>> tasks = Arrays.asList(
|
|
||||||
createTaskContext("1", 1000, "cert"),
|
|
||||||
createTaskContext("2", 1000, "cert"),
|
|
||||||
createTaskContext("3", 1000, "cert"),
|
|
||||||
createTaskContext("4", 1000, "cert")
|
|
||||||
);
|
|
||||||
|
|
||||||
List<TaskOutcome<String>> outcomes = executor.execBatchTasks(tasks);
|
|
||||||
executor.shutdown();
|
|
||||||
// 分离成功失败
|
|
||||||
List<String> successes = outcomes.stream()
|
|
||||||
.filter(TaskOutcome::isSuccess)
|
|
||||||
.map(TaskOutcome::getResult)
|
|
||||||
.collect(Collectors.toList());
|
|
||||||
|
|
||||||
List<TaskOutcome<String>> failures = outcomes.stream()
|
|
||||||
.filter(out -> !out.isSuccess())
|
|
||||||
.collect(Collectors.toList());
|
|
||||||
String result = "[" + failures.stream()
|
|
||||||
.map(p -> p.getContext().getAddress())
|
|
||||||
.collect(Collectors.joining(",")) + "]";
|
|
||||||
String message = "信雅达签名服务器:" + result + ",证书: " + "cert" + ",导入失败";
|
|
||||||
System.out.println(message);
|
|
||||||
System.out.println("成功节点: " + successes);
|
|
||||||
System.out.println("失败详情: ");
|
|
||||||
failures.forEach(f ->
|
|
||||||
System.out.println(f.getContext().getAddress() + ": " + f.getError().getMessage())
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
private static TaskContext<String> createTaskContext(String address, int timeout, String cert) {
|
|
||||||
Supplier<String> task = () -> importS(address);
|
|
||||||
return new TaskContext<>(task, 2, Duration.ofSeconds(1), address);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
public static void test() throws InterruptedException {
|
|
||||||
List<String> addressList = new ArrayList<>();
|
|
||||||
addressList.add("1");
|
|
||||||
addressList.add("2");
|
|
||||||
addressList.add("3");
|
|
||||||
addressList.add("4");
|
|
||||||
addressList.add("6");
|
|
||||||
CompletableFuture<String>[] futures = new CompletableFuture[addressList.size()];
|
|
||||||
for(int i = 0; i < addressList.size(); i++){
|
|
||||||
int finalI = i;
|
|
||||||
futures[i] = CompletableFuture.supplyAsync(() -> {
|
|
||||||
return importS(addressList.get(finalI));
|
|
||||||
});
|
|
||||||
}
|
|
||||||
// Thread.sleep(2000);
|
|
||||||
//汇总失败的任务
|
|
||||||
List<String> failedTasks = new ArrayList<>();
|
|
||||||
for(int i = 0; i < futures.length; i++){
|
|
||||||
if(futures[i].isCompletedExceptionally()){
|
|
||||||
failedTasks.add(addressList.get(i));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
for (String s : failedTasks) {
|
|
||||||
System.out.println(s);
|
|
||||||
try {
|
|
||||||
String path = "/Users/waner/Work" + "/" + s + ".txt";
|
|
||||||
File file = new File(path);
|
|
||||||
file.createNewFile();
|
|
||||||
} catch (Exception e) {
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static String importS(String s){
|
|
||||||
// System.out.println("handle:" + s);
|
|
||||||
if (Integer.parseInt(s) % 2 == 0) {
|
|
||||||
System.out.println("handle1:" + s);
|
|
||||||
throw new RuntimeException();
|
|
||||||
|
|
||||||
}
|
|
||||||
return s;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void testSnmp() throws IOException {
|
|
||||||
Map<String, String> map = new HashMap<>();
|
|
||||||
map.put("snmp.target.ip", "172.16.18.113");
|
|
||||||
map.put("snmp.target.port", "162");
|
|
||||||
map.put("enterprise.oid", "11");
|
|
||||||
map.put("snmp.community", "public");
|
|
||||||
map.put("snmp.version", "1");
|
|
||||||
// SnmpTrapSender.getInstance().loadConfig(map);
|
|
||||||
// SnmpTrapSender.getInstance().sendTrap("serve ip[127.0.0.1], import cert failed", 1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,54 +0,0 @@
|
|||||||
import org.snmp4j.CommunityTarget;
|
|
||||||
import org.snmp4j.PDU;
|
|
||||||
import org.snmp4j.Snmp;
|
|
||||||
import org.snmp4j.TransportMapping;
|
|
||||||
import org.snmp4j.mp.SnmpConstants;
|
|
||||||
import org.snmp4j.smi.Address;
|
|
||||||
import org.snmp4j.smi.GenericAddress;
|
|
||||||
import org.snmp4j.smi.OID;
|
|
||||||
import org.snmp4j.smi.OctetString;
|
|
||||||
import org.snmp4j.smi.UdpAddress;
|
|
||||||
import org.snmp4j.smi.VariableBinding;
|
|
||||||
import org.snmp4j.transport.DefaultUdpTransportMapping;
|
|
||||||
|
|
||||||
public class SnmpTrapSenderV2c {
|
|
||||||
|
|
||||||
public static void main(String[] args) {
|
|
||||||
try {
|
|
||||||
// 1. 创建SNMP对象并监听
|
|
||||||
TransportMapping<?> transport = new DefaultUdpTransportMapping();
|
|
||||||
Snmp snmp = new Snmp(transport);
|
|
||||||
transport.listen();
|
|
||||||
|
|
||||||
// 2. 创建目标地址
|
|
||||||
Address targetAddress = new UdpAddress("172.16.18.50/162"); // 接收方的IP和端口
|
|
||||||
CommunityTarget target = new CommunityTarget();
|
|
||||||
target.setCommunity(new OctetString("public")); // 社区字符串
|
|
||||||
target.setAddress(targetAddress);
|
|
||||||
target.setVersion(SnmpConstants.version2c);
|
|
||||||
target.setTimeout(3000);
|
|
||||||
target.setRetries(1);
|
|
||||||
|
|
||||||
// 3. 创建PDU(协议数据单元)
|
|
||||||
PDU pdu = new PDU();
|
|
||||||
|
|
||||||
// 必须的系统信息
|
|
||||||
pdu.add(new VariableBinding(SnmpConstants.sysUpTime, new OctetString("12345")));
|
|
||||||
pdu.add(new VariableBinding(SnmpConstants.snmpTrapOID, new OID("1.3.6.1.6.3.1.1.5.3")));
|
|
||||||
|
|
||||||
// 添加自定义变量绑定(可选)
|
|
||||||
pdu.add(new VariableBinding(new OID("1.3.6.1.2.1.1.1.0"), new OctetString("My Device")));
|
|
||||||
pdu.add(new VariableBinding(new OID("1.3.6.1.2.1.1.5.0"), new OctetString("Critical Error")));
|
|
||||||
|
|
||||||
pdu.setType(PDU.TRAP);
|
|
||||||
|
|
||||||
// 4. 发送Trap
|
|
||||||
snmp.send(pdu, target);
|
|
||||||
System.out.println("SNMPv2c Trap 发送成功");
|
|
||||||
|
|
||||||
snmp.close();
|
|
||||||
} catch (Exception e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,71 +0,0 @@
|
|||||||
package cmbpoc;
|
|
||||||
|
|
||||||
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 FunctionTest {
|
|
||||||
|
|
||||||
private SydApi4j api;
|
|
||||||
private String keypairIndex;
|
|
||||||
private byte[] privateKey;
|
|
||||||
private byte[] publicKey;
|
|
||||||
private byte[] orgData;
|
|
||||||
private String sign;
|
|
||||||
|
|
||||||
@Before
|
|
||||||
public void start(){
|
|
||||||
// 调试模式
|
|
||||||
System.setProperty("com.sunyard.sydapi4j.debug", "true");
|
|
||||||
|
|
||||||
// 建立链接(单台)
|
|
||||||
this.api = (SydApi4j) new SydApi4j().connect("192.168.0.100", 8889, null, 1000);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
@After
|
|
||||||
public void stop(){
|
|
||||||
if ( null != api ) {
|
|
||||||
this.api.disconnect();
|
|
||||||
this.api = null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void getPrivateKeyAndPublickKey(){
|
|
||||||
this.publicKey = Util.hexString2Bytes(
|
|
||||||
this.api.SM2GetPublicKeyC(keypairIndex)
|
|
||||||
);
|
|
||||||
|
|
||||||
|
|
||||||
this.privateKey = Util.hexString2Bytes(
|
|
||||||
this.api.SM2GetPrivateKeyC(keypairIndex)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void SYD_SM2_Sign(){
|
|
||||||
this.api.SYD_SM2_Sign_HA(1, privateKey, publicKey, orgData);
|
|
||||||
this.api.SYD_SM2_Verify_HA(1, publicKey, orgData, sign);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void SYD_SM2_Encrypt(){
|
|
||||||
byte[] enData = this.api.SYD_SM2_Encrypt(publicKey, orgData);
|
|
||||||
byte[] deData = this.api.SYD_SM2Decrypt(privateKey, enData);
|
|
||||||
Assert.assertArrayEquals(enData, deData);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,84 +0,0 @@
|
|||||||
package cmbpoc;
|
|
||||||
|
|
||||||
|
|
||||||
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 java.nio.charset.StandardCharsets;
|
|
||||||
import java.util.Base64;
|
|
||||||
|
|
||||||
public class JmeterTest extends AbstractJavaSamplerClient {
|
|
||||||
|
|
||||||
private byte[] publicKey;
|
|
||||||
private byte[] plainData;
|
|
||||||
private int sleep = 1;
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Arguments getDefaultParameters() {
|
|
||||||
Arguments params = new Arguments();
|
|
||||||
params.addArgument("publicKeyBase64", "MFkwEwYHKoZIzj0CAQYIKoEcz1UBgi0DQgAE...");
|
|
||||||
params.addArgument("plainText", "Hello JMeter");
|
|
||||||
return params;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void setupTest(JavaSamplerContext context) {
|
|
||||||
// 初始化:将 Base64 参数转为字节数组,避免每个循环都转换
|
|
||||||
String pubBase64 = context.getParameter("publicKeyBase64");
|
|
||||||
String plainText = context.getParameter("plainText");
|
|
||||||
publicKey = Base64.getDecoder().decode(pubBase64);
|
|
||||||
plainData = plainText.getBytes(StandardCharsets.UTF_8);
|
|
||||||
|
|
||||||
// 校准测试
|
|
||||||
sleep = context.getIntParameter("sleep", 1);
|
|
||||||
|
|
||||||
// 线程开始时准备解密、验签数据
|
|
||||||
String function = context.getParameter("function");
|
|
||||||
switch (function) {
|
|
||||||
case "SYD_SM2_Sign":
|
|
||||||
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_Sign":
|
|
||||||
break;
|
|
||||||
case "sleep":
|
|
||||||
Thread.sleep(1);
|
|
||||||
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) {
|
|
||||||
// 释放资源(如有)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,84 +0,0 @@
|
|||||||
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("192.168.0.100", 8889, null, 1000);
|
|
||||||
this.orgData = "Hello, World! 测试数据".getBytes();
|
|
||||||
this.SM2dn = "C=CN,ST=北京,L=北京,O=信雅达,CN=172.1.40.188";
|
|
||||||
}
|
|
||||||
|
|
||||||
@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));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -8,55 +8,54 @@ 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 TEST SM2 OCA31,OU=SGE,OU=Organizational-2,CN=SGE051@7028-702821-b70280002@Z000000001@1";
|
private static final String pcDnEN = "C=CN,O=CFCA OCA1,OU=YCCA,OU=Individual-2,CN=YCCA@黄金交易所@Zhuangj@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("172.1.41.214");
|
SydApiBuilder builder = new SydApiBuilder().setIp("192.168.0.100");
|
||||||
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);
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -68,7 +67,7 @@ public class TestShangqingXingye {
|
|||||||
* @param pcData: 明文数据。
|
* @param pcData: 明文数据。
|
||||||
* @return pcSignData: 签名数字信封
|
* @return pcSignData: 签名数字信封
|
||||||
*/
|
*/
|
||||||
String pcSignData = api.SYD_SignDigitalEnvelope(pcDnEN2, pcDnEN2, orgData2k);
|
String pcSignData = api.SYD_SignDigitalEnvelope(pcDnEN, pcDnEN, orgData2k);
|
||||||
System.out.println("签名数字信封:" + pcSignData);
|
System.out.println("签名数字信封:" + pcSignData);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -80,7 +79,7 @@ public class TestShangqingXingye {
|
|||||||
* @return pcData:原数据
|
* @return pcData:原数据
|
||||||
*/
|
*/
|
||||||
|
|
||||||
byte[] oData = api.SYD_VerifyDigitalEnveloe(pcDnEN2, pcDnEN2, pcSignData);
|
byte[] oData = api.SYD_VerifyDigitalEnveloe(pcDnEN, pcDnEN, pcSignData);
|
||||||
System.out.println("原数据:" + Util.bytes2HexString(oData));
|
System.out.println("原数据:" + Util.bytes2HexString(oData));
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -1,134 +0,0 @@
|
|||||||
package sample;
|
|
||||||
|
|
||||||
import com.google.zxing.*;
|
|
||||||
import com.google.zxing.client.j2se.BufferedImageLuminanceSource;
|
|
||||||
import com.google.zxing.client.j2se.MatrixToImageWriter;
|
|
||||||
import com.google.zxing.common.BitMatrix;
|
|
||||||
import com.google.zxing.common.HybridBinarizer;
|
|
||||||
import com.google.zxing.qrcode.QRCodeReader;
|
|
||||||
import org.junit.Test;
|
|
||||||
|
|
||||||
|
|
||||||
import javax.imageio.ImageIO;
|
|
||||||
import java.awt.image.BufferedImage;
|
|
||||||
import java.io.File;
|
|
||||||
import java.io.IOException;
|
|
||||||
import java.util.Hashtable;
|
|
||||||
|
|
||||||
public class EasyPDF {
|
|
||||||
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void test2(){
|
|
||||||
String qrCodeText = "12345678";
|
|
||||||
|
|
||||||
// 图片输出路径
|
|
||||||
String filePath = "./QRCode.png";
|
|
||||||
String filePath2 = "./Code.png";
|
|
||||||
|
|
||||||
// 图片的尺寸(宽度和高度)
|
|
||||||
int width = 300;
|
|
||||||
int height = 300;
|
|
||||||
|
|
||||||
// 设置二维码的相关参数
|
|
||||||
Hashtable<EncodeHintType, Object> hintMap = new Hashtable<>();
|
|
||||||
hintMap.put(EncodeHintType.MARGIN, 1); // 设置二维码的空白边距
|
|
||||||
|
|
||||||
try {
|
|
||||||
// 创建二维码矩阵
|
|
||||||
BitMatrix bitMatrix = new MultiFormatWriter().encode(
|
|
||||||
qrCodeText,
|
|
||||||
BarcodeFormat.QR_CODE,
|
|
||||||
width,
|
|
||||||
height,
|
|
||||||
hintMap
|
|
||||||
);
|
|
||||||
|
|
||||||
|
|
||||||
//生成条形码
|
|
||||||
|
|
||||||
// 生成 Code 128 条形码
|
|
||||||
BitMatrix bitMatrix2= new MultiFormatWriter().encode(
|
|
||||||
qrCodeText,
|
|
||||||
BarcodeFormat.CODE_128,
|
|
||||||
width,
|
|
||||||
height,
|
|
||||||
hintMap
|
|
||||||
);
|
|
||||||
|
|
||||||
// 将二维码矩阵转换为图片,并保存
|
|
||||||
File outputFile = new File(filePath);
|
|
||||||
|
|
||||||
File outputFile2 = new File(filePath2);
|
|
||||||
MatrixToImageWriter.writeToFile(bitMatrix, "PNG", outputFile);
|
|
||||||
MatrixToImageWriter.writeToFile(bitMatrix2, "PNG", outputFile2);
|
|
||||||
|
|
||||||
System.out.println("QR Code has been generated successfully!");
|
|
||||||
} catch (Exception e) {
|
|
||||||
System.err.println("Error occurred while generating QR code: " + e.getMessage());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void test3(){
|
|
||||||
// 加载二维码图像
|
|
||||||
File qrCodeImage = new File("./QRCode.png");
|
|
||||||
|
|
||||||
// 读取二维码图像
|
|
||||||
BufferedImage bufferedImage = null;
|
|
||||||
try {
|
|
||||||
bufferedImage = ImageIO.read(qrCodeImage);
|
|
||||||
} catch (IOException e) {
|
|
||||||
throw new RuntimeException(e);
|
|
||||||
}
|
|
||||||
|
|
||||||
// 使用 ZXing 的 QRCodeReader 进行解码
|
|
||||||
QRCodeReader reader = new QRCodeReader();
|
|
||||||
LuminanceSource source = new BufferedImageLuminanceSource(bufferedImage);
|
|
||||||
BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source));
|
|
||||||
|
|
||||||
try {
|
|
||||||
// 解码二维码
|
|
||||||
Result result = reader.decode(bitmap);
|
|
||||||
|
|
||||||
// 提取二维码中的数据
|
|
||||||
String qrCodeData = result.getText();
|
|
||||||
System.out.println("QR Code Data: " + qrCodeData);
|
|
||||||
} catch (NotFoundException e) {
|
|
||||||
System.out.println("QR Code could not be read.");
|
|
||||||
} catch (ChecksumException e) {
|
|
||||||
throw new RuntimeException(e);
|
|
||||||
} catch (FormatException e) {
|
|
||||||
throw new RuntimeException(e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void test4(){
|
|
||||||
// 条形码图片文件路径
|
|
||||||
File barcodeImage = new File("./Code.png");
|
|
||||||
|
|
||||||
try {
|
|
||||||
// 读取条形码图像
|
|
||||||
BufferedImage bufferedImage = ImageIO.read(barcodeImage);
|
|
||||||
|
|
||||||
// 使用 ZXing 的 MultiFormatReader 进行解码
|
|
||||||
MultiFormatReader reader = new MultiFormatReader();
|
|
||||||
LuminanceSource source = new BufferedImageLuminanceSource(bufferedImage);
|
|
||||||
BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source));
|
|
||||||
|
|
||||||
// 解码条形码
|
|
||||||
Result result = reader.decode(bitmap);
|
|
||||||
|
|
||||||
// 提取条形码中的数据
|
|
||||||
String barcodeData = result.getText();
|
|
||||||
System.out.println("Barcode Data: " + barcodeData);
|
|
||||||
} catch (NotFoundException e) {
|
|
||||||
System.out.println("Barcode could not be read.");
|
|
||||||
} catch (IOException e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,91 +0,0 @@
|
|||||||
package sample;
|
|
||||||
|
|
||||||
import com.sunyard.RetWrap;
|
|
||||||
import com.sunyard.proto.Util;
|
|
||||||
import com.sunyard.util.ASN1Util;
|
|
||||||
import com.sunyard.util.CertUtil;
|
|
||||||
import org.bouncycastle.asn1.ASN1Sequence;
|
|
||||||
import org.junit.Test;
|
|
||||||
|
|
||||||
import java.io.IOException;
|
|
||||||
import java.security.NoSuchProviderException;
|
|
||||||
import java.security.cert.CertificateException;
|
|
||||||
import java.security.cert.X509Certificate;
|
|
||||||
|
|
||||||
import static org.bouncycastle.cms.SydCmsUtil.readContentInfo;
|
|
||||||
|
|
||||||
public class GetHash {
|
|
||||||
public static void main(String[] args) throws IOException, CertificateException, NoSuchProviderException {
|
|
||||||
String sign = "MIIGyQYJKoZIhvcNAQcCoIIGujCCBrYCAQExCzAJBgUrDgMCGgUAMAsGCSqGSIb3DQEHAaCCBSMwggUfMIIEB6ADAgECAhBzC3UOpXNEkLmQ8Ik7KKxGMA0GCSqGSIb3DQEBCwUAMDMxCzAJBgNVBAYTAkNOMREwDwYDVQQKDAhVbmlUcnVzdDERMA8GA1UEAwwIU0hFQ0EgRzIwHhcNMjMwODExMDkyNTM3WhcNMjYwODExMTU1OTU5WjCB+zFOMEwGA1UEAwxF5rWL6K+V5Lit5Zu95bel5ZWG6ZO26KGM6IKh5Lu95pyJ6ZmQ5YWs5Y+45LiK5rW35biC5YiG6KGM77yI5Zu95bqT77yJMTwwOgYDVQQLDDPkuK3lm73lt6XllYbpk7booYzogqHku73mnInpmZDlhazlj7jkuIrmtbfluILliIbooYwxPDA6BgNVBAoMM+S4reWbveW3peWVhumTtuihjOiCoeS7veaciemZkOWFrOWPuOS4iua1t+W4guWIhuihjDEPMA0GA1UEBwwG5LiK5rW3MQ8wDQYDVQQIDAbkuIrmtbcxCzAJBgNVBAYTAkNOMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA3mAyAJ+oeuJR81T6f60FquoOsCy5woSuTrTLlAiEh430jsiJ0OW+fH38NMRmLKZYRt+SonElr3/q40j4S/VOpmIFjeX3qrDL5rHu52yBW8q+c3WM5veCDIOROS8+Cnj7UrTnLt8AIsZr0XWVNTszM0XS4a/wkVWMqkBipgZdCgGqCZ5IIdBGpehxTqfr7nuPdQPvcySZBynOrbGZFki+VsYBc9cHLORLZmnH/WmmDH02XJCfRXiE5SKLnLSvSvyqgNDJd5PEz9FqeYKZwQ9F1xZj13zyhwy8Z1WOjufxWFDCXd5X8lIZP3aprsFsU/04/DSb0mgroU4qT66rV24NhQIDAQABo4IBZDCCAWAwFAYDVR0lBA0wCwYJKoZIhvcvAQEFMH0GCCsGAQUFBwEBBHEwbzA4BggrBgEFBQcwAYYsaHR0cDovL29jc3AzLnNoZWNhLmNvbS9vY3NwL3NoZWNhL3NoZWNhLm9jc3AwMwYIKwYBBQUHMAKGJ2h0dHA6Ly9sZGFwMi5zaGVjYS5jb20vcm9vdC9zaGVjYWcyLmRlcjAfBgNVHSMEGDAWgBRWiN7jGEOCt3KkJutEqWLQh8SsJjAdBgNVHQ4EFgQUh48kzFu1UiU4IVgXQtmAhlVi3dowDgYDVR0PAQH/BAQDAgbAMAwGA1UdEwEB/wQCMAAwIgYDVR0gBBswGTAKBggqgRyG7zoBAzALBgkqgRyG7zoBAgQwRwYDVR0fBEAwPjA8oDqgOIY2aHR0cDovL2xkYXAyLnNoZWNhLmNvbS9DQTIwMDExL1JBMTIwNTAxMDAvQ1JMOTk0NzAuY3JsMA0GCSqGSIb3DQEBCwUAA4IBAQBbgeI5zAxrONyaPojaN6tIenPMXjOsem/C7dMZ7qBgAum2dQvxcFFB2mrwWquhpwklMdqEwFMW8fT4KpTelEC1oJh6X5+MmeCIj/zQy6X/Gd8EuwfYbbhSy745qrtlY90UgOrD9bXZ1yBSRDpC5lRB1AG00o5nqqvhee3RQxkmq3BSm4FSGzBETXz3fdfmTM9+7ZW6dK+zyKO4lrYjLTgc6K3tex9RB1hnlYjlDDrniB2qEDP76oRkctlCi1YNNn0gNBBaLlIKCu9JcodSy9tVaUyFDe4Rql7NbJX+EIbrUo41VbeB/HeMC5Ay5DZ+8JwxEnpqBBv2vPPseY6epiLLMYIBbjCCAWoCAQEwRzAzMQswCQYDVQQGEwJDTjERMA8GA1UECgwIVW5pVHJ1c3QxETAPBgNVBAMMCFNIRUNBIEcyAhBzC3UOpXNEkLmQ8Ik7KKxGMAkGBSsOAwIaBQAwDQYJKoZIhvcNAQEBBQAEggEARpoVnaitTgpMe9vsxbFjsVKBKtepqZVkVN4Qofs8n1Zkg7xOB7PYGCFjDG1jXFCWGr9PtwA5eWujPRIsjvFz9TD2cGrMI1ncXd1lWR9DfndqJIzT5TK8cvUnUYt25wyiOrD/ON1xGWBTSXwP72QfMAPU61aMrCQbe+EaVqnpsEncq8No2hPYtoRIt0z20jvESIbvUOjQgZ46zCyU0o1Vz2CyFVyAu4RTQbo3gq6nMGNOysp7rAF8RvCuU3RGi0nmRtLILWWsala1I5Y+3PAiSG6yzJJbgh37jnBffDP7CoEXbklUttJ0asO59BAE+4r8JZJZksx/i6WIu0BM7/jW9A==";
|
|
||||||
RetWrap retWrap = ASN1Util.takeOutOriginDataFromPKCS7Sign(sign);
|
|
||||||
String cert =(String) retWrap.get("cert");
|
|
||||||
System.out.println(cert);
|
|
||||||
|
|
||||||
String pemCert = null;
|
|
||||||
if(cert.contains("-----BEGIN CERTIFICATE-----")){
|
|
||||||
pemCert =cert;
|
|
||||||
}else {
|
|
||||||
String cert_begin = "-----BEGIN CERTIFICATE-----\n";
|
|
||||||
String end_cert = "\n-----END CERTIFICATE-----";
|
|
||||||
pemCert = cert_begin + cert + end_cert;
|
|
||||||
}
|
|
||||||
|
|
||||||
System.out.println(pemCert);
|
|
||||||
|
|
||||||
|
|
||||||
X509Certificate certificate = CertUtil.convertToX509Cert(pemCert);
|
|
||||||
String sigAlgName = certificate.getSigAlgName();
|
|
||||||
System.out.println(sigAlgName);
|
|
||||||
System.out.println(sigAlgName.toUpperCase().contains("SHA1"));
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void getDn() throws CertificateException, NoSuchProviderException {
|
|
||||||
String cert = "-----BEGIN CERTIFICATE-----\n" +
|
|
||||||
"MIIFNzCCBB+gAwIBAgIQewelBvoQTWilE9UF5pwiBDANBgkqhkiG9w0BAQsFADAz\n" +
|
|
||||||
"MQswCQYDVQQGEwJDTjERMA8GA1UECgwIVW5pVHJ1c3QxETAPBgNVBAMMCFNIRUNB\n" +
|
|
||||||
"IEcyMB4XDTIzMDkwNzA3NTQ1MloXDTI2MDkwNzE1NTk1OVowge8xQjBABgNVBAMM\n" +
|
|
||||||
"Oea1i+ivleS4reWbveWGnOS4mumTtuihjOiCoeS7veaciemZkOWFrOWPuOS4iua1\n" +
|
|
||||||
"t+W4guWIhuihjDE8MDoGA1UECwwz5Lit5Zu95Yac5Lia6ZO26KGM6IKh5Lu95pyJ\n" +
|
|
||||||
"6ZmQ5YWs5Y+45LiK5rW35biC5YiG6KGMMTwwOgYDVQQKDDPkuK3lm73lhpzkuJrp\n" +
|
|
||||||
"k7booYzogqHku73mnInpmZDlhazlj7jkuIrmtbfluILliIbooYwxDzANBgNVBAcM\n" +
|
|
||||||
"BuS4iua1tzEPMA0GA1UECAwG5LiK5rW3MQswCQYDVQQGEwJDTjCCASIwDQYJKoZI\n" +
|
|
||||||
"hvcNAQEBBQADggEPADCCAQoCggEBAL6d0aFiewo3RkYA0sb3kMaH6bvlUNCw+FFN\n" +
|
|
||||||
"ZMWwqFCt5K2FrwRkfZjtNWVuF6MXVBX605D/mML85+hbCrKs/Rj6rq3V3ur1mYja\n" +
|
|
||||||
"2duNTBlT9WzrKSCdPP1ae9kSM8Fwde2w0tAGqn41kjQgn3nw8twPSqnG/mqDlzkV\n" +
|
|
||||||
"OCwaZoxNqHouOCL3OYTATDOj48e9c4Q9In5NXbUFeu16JP8Y9SSlusfZof7v8umq\n" +
|
|
||||||
"XlMfzIyw5tpA9hQGrBtmFRY41gM1j1JwO2/BjFtDVHDe4QxG2cmzc9T3YT2bN2+h\n" +
|
|
||||||
"tSAEZKbOxY4G3AUlPhgkxEJuzdFEN1zpgctAUnrUmDTy4chk6W8CAwEAAaOCAYgw\n" +
|
|
||||||
"ggGEMBQGA1UdJQQNMAsGCSqGSIb3LwEBBTB9BggrBgEFBQcBAQRxMG8wOAYIKwYB\n" +
|
|
||||||
"BQUHMAGGLGh0dHA6Ly9vY3NwMy5zaGVjYS5jb20vb2NzcC9zaGVjYS9zaGVjYS5v\n" +
|
|
||||||
"Y3NwMDMGCCsGAQUFBzAChidodHRwOi8vbGRhcDIuc2hlY2EuY29tL3Jvb3Qvc2hl\n" +
|
|
||||||
"Y2FnMi5kZXIwHwYDVR0jBBgwFoAUVoje4xhDgrdypCbrRKli0IfErCYwHQYDVR0O\n" +
|
|
||||||
"BBYEFK6AF/JiY5AhOi04JSg6KltgUy69MA4GA1UdDwEB/wQEAwIGwDAhBgkqgRyG\n" +
|
|
||||||
"7zoLgVIEFBMSOTEzMTAwMDAxMzIyMDI1MjhMMAwGA1UdEwEB/wQCMAAwIgYDVR0g\n" +
|
|
||||||
"BBswGTAKBggqgRyG7zoBAzALBgkqgRyG7zoBAgQwSAYDVR0fBEEwPzA9oDugOYY3\n" +
|
|
||||||
"aHR0cDovL2xkYXAyLnNoZWNhLmNvbS9DQTIwMDExL1JBMTIwNTAxMDAvQ1JMMTAw\n" +
|
|
||||||
"MDc0LmNybDANBgkqhkiG9w0BAQsFAAOCAQEAaNG0Zl2W4RlCM934eaZFp30Sj3kx\n" +
|
|
||||||
"EHBtZ4x1FXrjS0Vq+Jzflcb+3lVhfmt/FiaPA+ShF1vxy0UOO9tszs3Wj8gWX6p8\n" +
|
|
||||||
"W2uNaOdq9PCk6Y0N4x8U0LEzWGBj0dXfEK8UZxMrorzsZWN8LO1imUFVbu+WV+9M\n" +
|
|
||||||
"eRP7RIF3Y9Ah8QCozMvzHk7z4JRMgRoe6GtE0ehevph93YFNdTamulLTjt5hZaFU\n" +
|
|
||||||
"SFZL028+RVa7k2DhQetZuUdD1/DBLTrlz8DqGHYHptifDtZapPALGr4nx94YChMT\n" +
|
|
||||||
"OsOvFugFTrtg0H3vWTRX4Al5mftx356VE8nt9A/6DYA7sGnFRKDPMoIPCg==\n" +
|
|
||||||
"-----END CERTIFICATE-----\n";
|
|
||||||
X509Certificate certificate = CertUtil.convertToX509Cert(cert);
|
|
||||||
String sigAlgName = certificate.getSubjectDN().toString();
|
|
||||||
System.out.println(sigAlgName);
|
|
||||||
System.out.println(certificate.getSubjectDN().toString());
|
|
||||||
System.out.println(sigAlgName.toUpperCase().contains("SHA1"));
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void getOID(){
|
|
||||||
String sign = "MIIBOwYJKoZIhvcNAQcDoIIBLDCCASgCAQAxgdUwgdICAQAwQzA5MQswCQYDVQQGEwJDTjEOMAwGA1UECgwFR01TU0wxGjAYBgNVBAMMEU1pZGRsZUNBIGZvciBUZXN0AgYBkZGPx4AwCwYJKoEcz1UBgi0DBHsweQIgfLZlDgJJ9201wsYsQ9S4KNvOlgrX0WtZGPQBXPKRTG0CIQD2PthXQ7hHnxN287jAbHqQXaeDuVC3ohQ06Pv+eMzruQQgG8iD0R2vtl//q1JkdWjIwibgL3ZdNWkrJEEiNw2NqEkEEHT7hJTar0bnrKlE5BxCIJIwSwYKKoEcz1UGAQQCATAbBgcqgRzPVQFoBBAT1Kuxlcocuacphn3Iadr6gCB26bmHVsH8aQrj7tTACj2PmdMxALYkI2eUKmiJTH/96Q==";
|
|
||||||
Object pkContent = readContentInfo( Util.decodeBase64(sign) );
|
|
||||||
ASN1Sequence pkSeq = ASN1Sequence.getInstance( pkContent );
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
File diff suppressed because one or more lines are too long
@@ -1,149 +0,0 @@
|
|||||||
package sample;
|
|
||||||
|
|
||||||
import com.sunyard.RetWrap;
|
|
||||||
import com.sunyard.SydApi;
|
|
||||||
import com.sunyard.proto.Util;
|
|
||||||
import com.sunyard.util.CertUtil;
|
|
||||||
import org.junit.After;
|
|
||||||
import org.junit.Before;
|
|
||||||
import org.junit.Test;
|
|
||||||
import racal.sunyard.main.SydApi4j;
|
|
||||||
|
|
||||||
import java.security.NoSuchProviderException;
|
|
||||||
import java.security.Principal;
|
|
||||||
import java.security.cert.CertificateException;
|
|
||||||
import java.security.cert.X509Certificate;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @Author:Cheney
|
|
||||||
* @Date:2023/8/19 16:24
|
|
||||||
*/
|
|
||||||
public class Sample4P1 {
|
|
||||||
private SydApi4j api;
|
|
||||||
|
|
||||||
final String SM2dn = "C=CN,O=CFCA TEST CA,OU=NCS2,OU=Enterprises,CN=041@Z402451000010@ShanDong@00000001";
|
|
||||||
byte[] orgData = new byte[8000];
|
|
||||||
@Before
|
|
||||||
public void before() {
|
|
||||||
// 通过设置debug的属性开启debug,如果不设置则默认不打开
|
|
||||||
System.setProperty("com.sunyard.sydapi4j.debug", "true");
|
|
||||||
api = (SydApi4j) new SydApi4j().connect("172.16.17.161", 8889, null, 1000);
|
|
||||||
}
|
|
||||||
|
|
||||||
@After
|
|
||||||
public void after() {
|
|
||||||
try {
|
|
||||||
this.api.disconnect();
|
|
||||||
} catch (Exception e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
//sm2算法
|
|
||||||
public void sm2sign(){
|
|
||||||
/**
|
|
||||||
* 正常证书 SM2 P1 裸签签名
|
|
||||||
* @param orgData 原始数据
|
|
||||||
* @param sm2Dn 签名者证书 DN
|
|
||||||
* @return 裸签签名数据
|
|
||||||
*/
|
|
||||||
byte[] nakedSign = api.SYD_NakedSign(orgData,SM2dn);
|
|
||||||
System.out.println("裸签名:"+Util.encodeBase64(nakedSign));
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 使用指定的证书 DN,对指定的原始数据编制裸验签(遵循PKCS#1)
|
|
||||||
* @param orgData 待签名的原始数据
|
|
||||||
* @param sign 签名数据
|
|
||||||
* @param sCertDN 签名者证书 DN
|
|
||||||
* @return 验签是否通过
|
|
||||||
*/
|
|
||||||
boolean ver = api.SYD_NakedVerify(orgData, nakedSign,SM2dn );
|
|
||||||
System.out.println("验签:"+ver);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void getDn() throws CertificateException, NoSuchProviderException {
|
|
||||||
String cert ="-----BEGIN CERTIFICATE-----\n" +
|
|
||||||
"MIIFFzCCA/+gAwIBAgIQVZErQ4caem9EAi7zgWIlMzANBgkqhkiG9w0BAQsFADAz\n" +
|
|
||||||
"MQswCQYDVQQGEwJDTjERMA8GA1UECgwIVW5pVHJ1c3QxETAPBgNVBAMMCFNIRUNB\n" +
|
|
||||||
"IEcyMB4XDTI0MDMyNzAzMTUyNVoXDTI1MDMyNzE1NTk1OVowgb8xCzAJBgNVBAYT\n" +
|
|
||||||
"AkNOMQ8wDQYDVQQIDAbkuIrmtbcxDzANBgNVBAcMBuS4iua1tzEqMCgGA1UECgwh\n" +
|
|
||||||
"5Lit5Zu95Lq65rCR6ZO26KGM5LiK5rW35biC5YiG6KGMMSowKAYDVQQLDCHkuK3l\n" +
|
|
||||||
"m73kurrmsJHpk7booYzkuIrmtbfluILliIbooYwxNjA0BgNVBAMMLea1i+ivleS4\n" +
|
|
||||||
"reWbveS6uuawkemTtuihjOS4iua1t+W4guWIhuihjOetvuWQjTCCASIwDQYJKoZI\n" +
|
|
||||||
"hvcNAQEBBQADggEPADCCAQoCggEBALqXQHI6GeefK4pu/KLVLZDvrjNjcAVKxr1m\n" +
|
|
||||||
"Czu+uwhrMIdelr+72Tj+8tsC8dRdRKEti9lNZ2eKCiI56gKjg6nJiByhVnCju5No\n" +
|
|
||||||
"jqiOyvhgIGl4TulDK9Oq1nTX3MuNfWJuwG9fsa749pBGvvdvXglkOeZTbZ9hrMJ7\n" +
|
|
||||||
"ga4ft9vZZYTc8syPxJNnoPDCbDqiPBg9+U6ECI/6UZ4p7nV8Q8BaopkhKqqrpUQR\n" +
|
|
||||||
"+sygk8V7QX7D3E1TDeoxwFHyNBKpBRonGI2DwfdpxG0aq916MGdoHSWcvu5XxpfO\n" +
|
|
||||||
"nMf8Ur8qK7XO3F5pla8sbXeOesL8aNMw/f5/uM+Xt6YQPfKKs88CAwEAAaOCAZgw\n" +
|
|
||||||
"ggGUMB8GA1UdIwQYMBaAFFaI3uMYQ4K3cqQm60SpYtCHxKwmMB0GA1UdDgQWBBSk\n" +
|
|
||||||
"pQSgIAR1k1zPq9A6//h/892n2TAOBgNVHQ8BAf8EBAMCBsAwFAYDVR0lBA0wCwYJ\n" +
|
|
||||||
"KoZIhvcvAQEFMCIGA1UdIAQbMBkwCgYIKoEchu86AQMwCwYJKoEchu86AQIEMAwG\n" +
|
|
||||||
"A1UdEwEB/wQCMAAwWAYDVR0fBFEwTzBNoEugSYZHaHR0cDovL2xkYXAyLnNoZWNh\n" +
|
|
||||||
"LmNvbS9hYzg4NDg2MC9kODQ4L2VjOGYvYjkzYTQ1ZTYvOTFjYTEzOTBhMmFlNWM3\n" +
|
|
||||||
"MC5jcmwwfQYIKwYBBQUHAQEEcTBvMDgGCCsGAQUFBzABhixodHRwOi8vb2NzcDMu\n" +
|
|
||||||
"c2hlY2EuY29tL29jc3Avc2hlY2Evc2hlY2Eub2NzcDAzBggrBgEFBQcwAoYnaHR0\n" +
|
|
||||||
"cDovL2xkYXAyLnNoZWNhLmNvbS9yb290L3NoZWNhZzIuZGVyMCEGCSqBHIbvOguB\n" +
|
|
||||||
"UgQUExIxMTMxMDAwMDAwMjQwNzIwWEowDQYJKoZIhvcNAQELBQADggEBALmYF/nZ\n" +
|
|
||||||
"jed5UiqBpb8mA9xIxJRi4QD5c6Mmww3Ks9cLq72RiLQV0QG+sjApPHTOosRka0l7\n" +
|
|
||||||
"oqUyQhMzATHFUW/cjFuYVLwjvSANNPVtxKJxHPe105DA+34CPxwd25DeMvhNsq5X\n" +
|
|
||||||
"sEMiLVZacA9RD1pGI8KlmnA9SK7ZzN3yf1exMbVYb3LqQH9kW2BfBX83reewiF1N\n" +
|
|
||||||
"1TlLDCsEd41pF20twpw6xWUKekXW7Tok0gR9c5+lpWH6gtZiQvFUp05VbbuVhmee\n" +
|
|
||||||
"zGYX8e9202S7YYEY+A9+4CIN+u7JYbI88Zr2HY5RErTeDcZGHKD/3c2aPwaE1lFb\n" +
|
|
||||||
"aEACH34c7sDBTTE=\n" +
|
|
||||||
"-----END CERTIFICATE-----";
|
|
||||||
String pemCert = null;
|
|
||||||
if(cert.contains("-----BEGIN CERTIFICATE-----")){
|
|
||||||
pemCert =cert;
|
|
||||||
}else {
|
|
||||||
String cert_begin = "-----BEGIN CERTIFICATE-----\n";
|
|
||||||
String end_cert = "\n-----END CERTIFICATE-----";
|
|
||||||
pemCert = cert_begin + cert + end_cert;
|
|
||||||
}
|
|
||||||
|
|
||||||
System.out.println(pemCert);
|
|
||||||
|
|
||||||
X509Certificate certificate = CertUtil.convertToX509Cert(pemCert);
|
|
||||||
String dn = certificate.getSubjectDN().toString();
|
|
||||||
System.out.println(dn);
|
|
||||||
;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void ver(){
|
|
||||||
SydApi4j api = (SydApi4j) new SydApi4j().connect("172.16.17.134", 8889, null, 1000);
|
|
||||||
String data = "<root xmlns=\"namespace_string\"><MsgHeader><SndDt>2024-10-11T17:22:18</SndDt><MsgTp>farms.107.001.01</MsgTp><InstgId>B0000011000023</InstgId><SignSN>4032069546</SignSN><DgtlEnvlp>MHkCIQCRl/FXCJP7TriAhT6SLrN1GUb4o7tujxHC9j/UGJftOwIgSK/nzCTmNSrA1jYO9G/PiToSTptTCexEJ2o7QYOfwWgEIPs+BFe8v7K0DoyXCBf4drsWPzifKaVwPeQFOaK9IKkiBBD6NkgVbBVCeXLc2pzjA8OG</DgtlEnvlp><NcrptnSN>4067545618</NcrptnSN></MsgHeader><MsgBody><TrxId>2024101117215204292585511300101</TrxId><FnTp>21</FnTp><InstgId>B9999999999090</InstgId><InstdIdInfoList><InstdIdInfo><InstdId>C1020211000034</InstdId></InstdIdInfo></InstdIdInfoList><NtfyDtTm>2024-10-11T17:21:52</NtfyDtTm><DataTrTp>27</DataTrTp><DataCnttInfoList><DataCnttInfo><DataMn>01</DataMn><DataTp>03</DataTp><DataCntt>Wiwdanx6NtGjjUA+Qb5rbHddhfvAtT1fa8s6wgiqjamQCq3NWu5K4uYt/efuEXR7Alu6whWgMPjSQnn2/d0P1/I4N2F4m0kxy5HYSrQwpnB0x98zXvX/aDLvbcCY9zO5DyWUMpJhLv28NP0ikiXQEQChcp23C8MSWYZy1HaM/jaLWBuaLDvhiDaDvu9EC+T9GmOfbC2zgGaKZPnSMMXHvK1OVrTwKcvOe3xUsHkUY5FdPshrCIsyWH3PfH8Yc+CmPSf1b/iO5szOVmUgw6dXNqZ+3j3BJlitNvPTs4KeZtDgIT1MBa/yy6yPGw/h1NiWgqXBPvT6IwsxSMAqw4jQmFMfKJ7m9bXwi130lRVcI1/5KJtDf7CwuGnmnrKdVucJTAlqh8iUqs/zOgz0bnAbbayyqJsi/6ksTDrMjp/hFybiboSyG2L6+58yMwcI4zGZcZdbGwrftRxeq/ceTiF2mztDK4PtdXy9aqLrsazZyvvUiFDHOepZW1h4ccIA/NMOYK5WS5IgpXve4msLJlU5QVAqfntj1YsiITnwLoIsn6QjmrjmoMwOPLRg9kTGsxH/ScMpoTGE2wmXnYRR0PJxZ2Acm+LZlIneqaRQgv9wZ/l6Gf6A0Zb7nwdsjSjnvOIH13US8p3wbBBybHuzmgLhYJIVkvnA9TcP5PreN0+sLa3fLMkc1Xpxnkc5A/Zar0WfHb3MhXZeA1w8vzANBq5ocDygzqqSHzHlSgVZ6x85GbSPDMrCEsZb5NSODiyNWOfTAcV2cltlGsVlC+YF5mLySVojkwfhstMkoj7WoiG/ADf9vckBOLWmQvuh5289l/ih9hy+/uQ3SFBYVwi4m2CdYdSIUMc56llbWHhxwgD80w5YUNI59nZoVUGKwV+dBehsjwWHVVOoLGtLcJEbBpbDEdW9jL4I9oemSSXmEnoIjxhlnTMoKF22kYn8Q6ynmn5g/pJ+ziDqOcja8zRfM8vQk1SLvWmvnO8WiE/VR5B84xPVvYy+CPaHpkkl5hJ6CI8Y0ZAPQrsDF2A/udfY8pV+vLXpezGMoyLj/02lxtfTFpj11CjmHYjlrQAX8Vb1v4AN0PLwdz5ns3wTi+fj03B2p7y4Z5Cclp50sF4cInR4B7H6gq5CkUHFw3xLT6q1DjledSJ5EJNfSvl8WvU5MUEvwygNrWpYcvbqyOW70efoEYNrKpGy9T0RKDMuk5EsxLX++SibQ3+wsLhp5p6ynVbnCfOzW20qDzgYmqcSZ6Hq+1hSw/mTr3ZnncZuuqTY3TXKLcQOa7Q+iJQHayCwWs5R640GTv1ani1CBzywQXagLI/KPwecIfCCSJSIM//YNyttvxDm2Wk+TmJKU28CVOJXukiQyq0xnc8ac9LUZhkm+GDJQu0iJjkfwgeK3k6cfm30bGOhg0xAuvIcgWpmLVuKFiKKJuzMPpw6R5EpaYQMP7vsB5wjIpHr81iFHGAGRi8WkJWwQTxMBiSR303A1iRB1ncx76YhSDoZza851fEA80HizZy+fBanI5SQJx1K9kwaDYc+hfaWNqvERhE4sr9w1gzek5iyJsjiL2D1D/I/ahGAfJ5qvaEpr4yFp2TnS1yI1UDJLXBIX/clayNlMMHzIgiisfe5r2xcJYfWrNTJaXHywrBopfB8hA8MpXd8YnYxJDjnXBmo1fWgku9YegHmi0+V1pldLw7WA7BX3Ou2QoSIRsQiyclXPZylW6N1YavYxByGDxrXfzLIufJ8Od6lPFoPEbb9Nld2xfk7KUKUBX1dOLb77/ZiBlywTE21qvQy8sKwaKXwfIQPDKV3fGJ2MfrE711rH6xvO7lpfUXRMWGMfpCccB83/p5hclHeUIPzQx7BvXSDFxt1pq5AxKjmmd270zEz3ZYBxM/Hm/pxUrk=</DataCntt><EncrptnId>00</EncrptnId></DataCnttInfo><DataCnttInfo><DataMn>02</DataMn><DataTp>02</DataTp><DataCntt>{\"fileInfoList\":[{\"fileName\":\"FC_B9999999999090_C1020211000034_2024101117215204292585511300101.zip.sec\",\"idcList\":\"30\"}]}</DataCntt><EncrptnId>01</EncrptnId></DataCnttInfo><DataCnttInfo><DataMn>03</DataMn><DataTp>02</DataTp><DataCntt>{\"policeInnerId\":\"1111111111\",\"applicationId\":\"030100000FZ2024092409441727142255391\"}</DataCntt><EncrptnId>01</EncrptnId></DataCnttInfo></DataCnttInfoList><Desc></Desc></MsgBody></root>";
|
|
||||||
//计算整个报文的hash值
|
|
||||||
byte[] hash = api.SM3Hash(data.getBytes());
|
|
||||||
|
|
||||||
System.out.println("报文hash值hex:"+ Util.bytes2HexString(hash));
|
|
||||||
//对hash值签名
|
|
||||||
byte[] nakedSign = api.SYD_NakedSign(data.getBytes(),SM2dn);
|
|
||||||
|
|
||||||
boolean ver = api.SYD_NakedVerify(SM2dn,nakedSign, data.getBytes(),hash);
|
|
||||||
|
|
||||||
boolean ver2 = api.SYD_NakedVerify( data.getBytes(),nakedSign,SM2dn);
|
|
||||||
System.out.println("验签结果:"+ver);
|
|
||||||
|
|
||||||
System.out.println("验签结果:"+ver2);
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
@@ -1,119 +0,0 @@
|
|||||||
package sample;
|
|
||||||
|
|
||||||
import com.sunyard.RetWrap;
|
|
||||||
import com.sunyard.SydApi;
|
|
||||||
import com.sunyard.proto.Util;
|
|
||||||
import org.junit.After;
|
|
||||||
import org.junit.Before;
|
|
||||||
import org.junit.Test;
|
|
||||||
import racal.sunyard.main.SydApi4j;
|
|
||||||
|
|
||||||
import java.util.HashMap;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @Author:Cheney
|
|
||||||
* @Date:2024/8/09 16:24
|
|
||||||
*/
|
|
||||||
public class SampleICBC {
|
|
||||||
private SydApi4j api;
|
|
||||||
|
|
||||||
final String SM2dn = "C=CN,O=CFCA OCA1,OU=YCCA,OU=Individual-2,CN=YCCA@黄金交易所@Zhuangj@1";
|
|
||||||
byte[] orgData = "12345678123456".getBytes();
|
|
||||||
@Before
|
|
||||||
public void before() {
|
|
||||||
// 通过设置debug的属性开启debug,如果不设置则默认不打开
|
|
||||||
System.setProperty("com.sunyard.sydapi4j.debug", "true");
|
|
||||||
|
|
||||||
//通过设置不校验证书是否反序
|
|
||||||
System.setProperty("com.sunyard.dnsort", "false");
|
|
||||||
api = (SydApi4j) new SydApi4j().connect("172.16.17.232", 8889, null, 1000);
|
|
||||||
}
|
|
||||||
|
|
||||||
@After
|
|
||||||
public void after() {
|
|
||||||
try {
|
|
||||||
this.api.disconnect();
|
|
||||||
} catch (Exception e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
//证书导入
|
|
||||||
public void importCert(){
|
|
||||||
String cert = "-----BEGIN CERTIFICATE-----\n" +
|
|
||||||
"MIICMjCCAdWgAwIBAgIGAYqHSuwHMAwGCCqBHM9VAYN1BQAwSzELMAkGA1UEBhMC\n" +
|
|
||||||
"Q04xDjAMBgNVBAoTBUdNU1NMMRAwDgYDVQQLEwdQS0kvU00yMRowGAYDVQQDExFN\n" +
|
|
||||||
"aWRkbGVDQSBmb3IgVGVzdDAiGA8yMDIzMDkxMTE2MDAwMFoYDzIwMjQwOTExMTYw\n" +
|
|
||||||
"MDAwWjBgMQswCQYDVQQGDAJDTjELMAkGA1UECAwCemoxCzAJBgNVBAcMAmh6MRAw\n" +
|
|
||||||
"DgYDVQQKDAdzdW55YXJkMRAwDgYDVQQLDAd6eWhUZXN0MRMwEQYDVQQDDAp6eWhU\n" +
|
|
||||||
"ZXN0U00yMFkwEwYHKoZIzj0CAQYIKoEcz1UBgi0DQgAEYB3P271TUdDKfUr0VbkL\n" +
|
|
||||||
"v+N6QlrYcfAqbqjgqHaa3Xt5/8n3rHXp5ILj8QdU1pCFOF6xaaCwg1L7oR90MHZe\n" +
|
|
||||||
"GKOBiTCBhjAbBgNVHSMEFDASgBD5f1W0J5QzYqZWym/MXRr/MBkGA1UdDgQSBBAK\n" +
|
|
||||||
"g03SZSfU07aY4XNDfVIOMDEGCCsGAQUFBwEBBCUwIzAhBggrBgEFBQcwAYYVaHR0\n" +
|
|
||||||
"cHM6Ly9vY3NwLmdtc3NsLmNuMAkGA1UdEwQCMAAwDgYDVR0PAQH/BAQDAgDAMAwG\n" +
|
|
||||||
"CCqBHM9VAYN1BQADSQAwRgIhAK1lDGV1UtbYz5Hf8DCpq8UySCtu5dguh/eZsc4c\n" +
|
|
||||||
"V9PtAiEA5SO99BSunZMtrpHFJC1XbEQ5Xp0zIJQvzjRqZwfkyrw=\n" +
|
|
||||||
"-----END CERTIFICATE-----\n";
|
|
||||||
String dn = api.importCert(cert);
|
|
||||||
System.out.println("返回证书主题:"+dn);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
@Test
|
|
||||||
//sm2算法 attach签名验签
|
|
||||||
public void sm2signAtt(){
|
|
||||||
String attachedSign = api.attachedSign(orgData, SM2dn);
|
|
||||||
System.out.println("attach签名:"+attachedSign);
|
|
||||||
|
|
||||||
boolean attachedVerify = api.attachedVerify(attachedSign);
|
|
||||||
System.out.println("attach验签:"+attachedVerify);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
@Test
|
|
||||||
//sm2数字信封加密解密
|
|
||||||
public void sm2gen(){
|
|
||||||
|
|
||||||
String ivHex = "31323334353637383132333435363738";
|
|
||||||
|
|
||||||
/**
|
|
||||||
* SM2数字信封生成
|
|
||||||
* @param sm2Dn 证书DN
|
|
||||||
* @param IV iv
|
|
||||||
* @param orgData 原始数据
|
|
||||||
* @param roundmod 轮模式 0 ECB 1 CBC
|
|
||||||
* @return 加密后的数据
|
|
||||||
*/
|
|
||||||
RetWrap genByDn = api.generateDEByDnICBC(SM2dn, ivHex,orgData,1);
|
|
||||||
String cipherKey = (String) genByDn.get(SydApi.RET_CIPHER_KEY);
|
|
||||||
System.out.println("SM2数字信封: " +cipherKey);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* SM2数字信封解密
|
|
||||||
* @param sm2Dn 证书DN
|
|
||||||
* @param IV iv
|
|
||||||
* @param cipherKey 数字信封
|
|
||||||
* @param roundmod 轮模式 0 ECB 1 CBC
|
|
||||||
* @return 加密后的数据
|
|
||||||
*/
|
|
||||||
RetWrap denSM2 = api.decryptDEByDNICBC( SM2dn,ivHex, cipherKey,1);
|
|
||||||
byte[] oData = (byte[]) denSM2.get("oData");
|
|
||||||
System.out.println("SM2信封解密:"+ new String(oData));
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void getTIme(){
|
|
||||||
|
|
||||||
HashMap<String, String> certTime = api.getCertTime(SM2dn);
|
|
||||||
System.out.println(certTime.get("after"));
|
|
||||||
System.out.println(certTime.get("before"));
|
|
||||||
|
|
||||||
Util.bytes2HexString("aa".getBytes());
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
@@ -16,7 +16,7 @@ public class Shangqing {
|
|||||||
// 测试数据
|
// 测试数据
|
||||||
private String uid = "8012";
|
private String uid = "8012";
|
||||||
private String dn = "C=CN,ST=ZJ,L=HZ,O=sunyard,OU=test1,CN=test1";
|
private String dn = "C=CN,ST=ZJ,L=HZ,O=sunyard,OU=test1,CN=test1";
|
||||||
private String SM2dn = "C=CN,O=CFCA OCA1,OU=YCCA,OU=Individual-2,CN=YCCA@黄金交易所@Zhuangj@1";
|
private String SM2dn = "C=CN,ST=zj,L=hz,O=sunyard,OU=sm2Test,CN=sm2Test";
|
||||||
|
|
||||||
|
|
||||||
private String RSA ="C=cn,O=CFCA TEST CA,OU=NCS2,OU=Enterprises,CN=041@Z402451000010@ShanDong@00000001";
|
private String RSA ="C=cn,O=CFCA TEST CA,OU=NCS2,OU=Enterprises,CN=041@Z402451000010@ShanDong@00000001";
|
||||||
@@ -26,8 +26,8 @@ public class Shangqing {
|
|||||||
public void before() {
|
public void before() {
|
||||||
// 通过设置debug的属性开启debug,如果不设置则默认不打开
|
// 通过设置debug的属性开启debug,如果不设置则默认不打开
|
||||||
System.setProperty("com.sunyard.sydapi4j.debug", "true");
|
System.setProperty("com.sunyard.sydapi4j.debug", "true");
|
||||||
api = (SydApi4j) new SydApi4j().connect("172.16.17.161", 8889, null, 1000);
|
// api = (SydApi4j) new SydApi4j().connect("172.16.17.161", 8889, null, 1000);
|
||||||
//api = (SydApi4j) new SydApi4j().connect("192.168.0.100", 8889, null, 1000);
|
api = (SydApi4j) new SydApi4j().connect("192.168.0.100", 8889, null, 1000);
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -17,7 +17,7 @@ import java.util.List;
|
|||||||
|
|
||||||
public class Test4Nongxin {
|
public class Test4Nongxin {
|
||||||
|
|
||||||
private static final String SM2dn = "C=CN,ST=zz,L=zz,O=zzz,CN=zzzzz";
|
private static final String SM2dn = "C=CN,O=Sunyard,OU=8001,CN=8001";
|
||||||
private static final String RSAdn = "C=cn,O=CFCA TEST CA,OU=NCS2,OU=Enterprises,CN=041@Z402451000010@ShanDong@00000001";
|
private static final String RSAdn = "C=cn,O=CFCA TEST CA,OU=NCS2,OU=Enterprises,CN=041@Z402451000010@ShanDong@00000001";
|
||||||
private static final byte[] orgData = new byte[ 2*1024 ];
|
private static final byte[] orgData = new byte[ 2*1024 ];
|
||||||
private static final byte[] orgDataBig = new byte[ 10*1024 ];
|
private static final byte[] orgDataBig = new byte[ 10*1024 ];
|
||||||
@@ -25,7 +25,7 @@ public class Test4Nongxin {
|
|||||||
System.setProperty("com.sunyard.sydapi4j.debug", "true");
|
System.setProperty("com.sunyard.sydapi4j.debug", "true");
|
||||||
System.setProperty("com.sunyard.dnsort", "true");
|
System.setProperty("com.sunyard.dnsort", "true");
|
||||||
//设置连接
|
//设置连接
|
||||||
SydApiBuilder builder = new SydApiBuilder().setIp("172.1.41.139");
|
SydApiBuilder builder = new SydApiBuilder().setIp("192.168.0.200");
|
||||||
SydApi4j api = (SydApi4j) builder.build();
|
SydApi4j api = (SydApi4j) builder.build();
|
||||||
try {
|
try {
|
||||||
//SM2裸签
|
//SM2裸签
|
||||||
@@ -209,7 +209,7 @@ public class Test4Nongxin {
|
|||||||
System.setProperty("com.sunyard.sydapi4j.debug", "true");
|
System.setProperty("com.sunyard.sydapi4j.debug", "true");
|
||||||
|
|
||||||
//设置连接
|
//设置连接
|
||||||
SydApiBuilder builder = new SydApiBuilder().setIp("172.16.17.64");
|
SydApiBuilder builder = new SydApiBuilder().setIp("192.168.0.156");
|
||||||
SydApi4j api = (SydApi4j) builder.build();
|
SydApi4j api = (SydApi4j) builder.build();
|
||||||
|
|
||||||
String cert = "-----BEGIN CERTIFICATE-----\n" +
|
String cert = "-----BEGIN CERTIFICATE-----\n" +
|
||||||
|
|||||||
@@ -1,601 +0,0 @@
|
|||||||
package sample;
|
|
||||||
|
|
||||||
import cn.hutool.core.date.StopWatch;
|
|
||||||
import com.Sample.SydUtils;
|
|
||||||
import com.google.gson.Gson;
|
|
||||||
import com.sunyard.RetWrap;
|
|
||||||
import com.sunyard.SydApi;
|
|
||||||
import com.sunyard.SydApiException;
|
|
||||||
import com.sunyard.entity.ImportResult;
|
|
||||||
import com.sunyard.proto.Util;
|
|
||||||
import com.sunyard.util.CertUtil;
|
|
||||||
import com.sunyard.util.IpLockUtils;
|
|
||||||
import org.junit.After;
|
|
||||||
import org.junit.Before;
|
|
||||||
import org.junit.Test;
|
|
||||||
import racal.sunyard.main.SydApi4j;
|
|
||||||
|
|
||||||
import java.io.StringWriter;
|
|
||||||
import java.nio.charset.StandardCharsets;
|
|
||||||
import java.security.cert.X509Certificate;
|
|
||||||
import java.util.*;
|
|
||||||
import java.util.concurrent.*;
|
|
||||||
|
|
||||||
import static com.sunyard.util.CertUtil.convertToX509Cert;
|
|
||||||
|
|
||||||
public class Test4NongxinCW {
|
|
||||||
|
|
||||||
private SydApi4j api;
|
|
||||||
|
|
||||||
final String SM2dn = "C=CN,ST=zz,L=zz,O=zzz,CN=zzzzz";
|
|
||||||
|
|
||||||
byte[] orgData = new byte[1024];
|
|
||||||
|
|
||||||
@Before
|
|
||||||
public void before() {
|
|
||||||
//主备调用接口
|
|
||||||
SydApi4j.SYD_Set_Parameter_HA("172.1.41.139", "172.1.41.96", 8889, 3000);
|
|
||||||
api = (SydApi4j) new SydApi4j();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void connection() {
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
@After
|
|
||||||
public void after() {
|
|
||||||
try {
|
|
||||||
this.api.disconnect();
|
|
||||||
} catch (Exception e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void testHA() {
|
|
||||||
// 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 );
|
|
||||||
// for (int i = 0; i < 10000; i++) {
|
|
||||||
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
|
|
||||||
public void testPerformance() 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 < 10; i++) {
|
|
||||||
futures.add(executor.submit(() -> {
|
|
||||||
SydApi4j api2 = new SydApi4j();
|
|
||||||
|
|
||||||
for (int j = 0; j < 10000; j++) {
|
|
||||||
StopWatch stopWatch = new StopWatch();
|
|
||||||
stopWatch.start();
|
|
||||||
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();
|
|
||||||
Thread.sleep(500);
|
|
||||||
// 等待所有任务完成
|
|
||||||
for (Future<?> future : futures) {
|
|
||||||
future.get();
|
|
||||||
}
|
|
||||||
|
|
||||||
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
|
|
||||||
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";
|
|
||||||
// orgData = Hex.decode("80a370b809e8a46ba51211a35d6f0180fea32b4acc97916bc9c517ea6651134c");
|
|
||||||
// byte[] nakedSign1 = api.SYD_NakedSign(SM2dn, (byte[])null, orgData);
|
|
||||||
// System.out.println("SM2签名:"+ Util.bytes2HexString(nakedSign1));
|
|
||||||
// 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));
|
|
||||||
// System.out.println(Util.encodeBase64(nakedSign));
|
|
||||||
// //裸签验签
|
|
||||||
//
|
|
||||||
// String sign = "30450220400849D815EE6C73A6D7334D76EF6076452367E444BBF902B4278A0D7C9843C302210095086DDC9A42E53ABCD0B172BA6A9A9814AEA580C19CDD229ABD3277321984C1";
|
|
||||||
// boolean ver = api.SYD_NakedVerify(orgData, nakedSign, SM2dn);
|
|
||||||
// System.out.println("SM2验签:"+ ver);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void rsaSign() {
|
|
||||||
String RSAdn = "C=CN,ST=3,L=3,O=3,OU=3,OU=3,CN=3";
|
|
||||||
byte[] nakedSign = api.SYD_NakedSign(1, RSAdn,orgData,(byte[])null);
|
|
||||||
System.out.println("RSA签名:"+ Util.bytes2HexString(nakedSign));
|
|
||||||
//裸签验签
|
|
||||||
boolean ver = api.SYD_NakedVerify(1, RSAdn,nakedSign,orgData ,(byte[])null);
|
|
||||||
System.out.println("RSA验签:"+ ver);
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void detSign(){
|
|
||||||
orgData = new byte[1024];
|
|
||||||
byte[] orgData1 = "12345678".getBytes(StandardCharsets.UTF_8);
|
|
||||||
// for (int i = 0; i < 10000; i++) {
|
|
||||||
//detach签名
|
|
||||||
String detachedSign = api.detachedSign(orgData1, SM2dn);
|
|
||||||
System.out.println("detach签名:"+ detachedSign);
|
|
||||||
|
|
||||||
//detach验签
|
|
||||||
boolean ver = api.detachedVerify(orgData1, detachedSign);
|
|
||||||
System.out.println("detach验签:"+ ver);
|
|
||||||
// }
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void folw(){
|
|
||||||
String detSign = "MIICpQYKKoEcz1UGAQQCAqCCApUwggKRAgEBMQ4wDAYIKoEcz1UBgxEFADAMBgoqgRzPVQYBBAIBoIIByTCCAcUwggFooAMCAQICCDyTAAAAAAAlMAwGCCqBHM9VAYN1BQAwJjELMAkGA1UEBhMCQ04xFzAVBgNVBAMMDlN1bnlhcmRTTTJSb290MB4XDTE3MDUxNzAyNTI0NFoXDTIyMDcyNTAyNTI0NFowPTELMAkGA1UEBhMCQ04xEDAOBgNVBAoMB1N1bnlhcmQxDTALBgNVBAsMBDgwMDExDTALBgNVBAMMBDgwMDEwWTATBgcqhkjOPQIBBggqgRzPVQGCLQNCAAQ+2joQe3zDXMAFx/vwu05rQ6B+4U42BgPSLsoqYAstD6AwVdQA0SQDAPVGSLhJ0T9QszD/FDUbVkWxNoaCCmW7o2cwZTAOBgNVHQ8BAf8EBAMCAMAwEwYDVR0lBAwwCgYIKwYBBQUHAwEwHwYDVR0jBBgwFoAU93/arv8hxtk6eq2g+6z+AqVO1cEwHQYDVR0OBBYEFAMWZaY2AwaQTNiFLpsa0dyCzBZ6MAwGCCqBHM9VAYN1BQADSQAwRgIhAIl2ZHGfln5hedcousARzZ2yeUjUbxSFMmhMmr5t6Q6nAiEAvqYX/KpIcvnPyB/Yiil+oq6DFdVM6P3vDxBhU/8taXExgaAwgZ0CAQEwMjAmMQswCQYDVQQGEwJDTjEXMBUGA1UEAwwOU3VueWFyZFNNMlJvb3QCCDyTAAAAAAAlMAwGCCqBHM9VAYMRBQAwDQYJKoEcz1UBgi0BBQAERzBFAiEArdbDSpZUSvPTGjzPOhyJhR7BK8owUpQjcq8eKSH8Xa8CIFmGgCdsd5V8qzeOOB7QtKnjH9KoyoGe8bASpgquX2p6";
|
|
||||||
String netSignHex = "304402202EC53E985C09575A64A7B96C8A23713165FB0733C800145F07B9D5F990F546070220046F854CA62DF93AF8F0D541CA8B8697957423182EE70BB03B678A920985004F";
|
|
||||||
|
|
||||||
// //从detach签名中获取证书
|
|
||||||
// String certBySign = api.getCertBySign(detSign);
|
|
||||||
// //System.out.println("获取证书内容为:"+certBySign);
|
|
||||||
// System.out.println(certBySign);
|
|
||||||
|
|
||||||
String certBySign = "-----BEGIN CERTIFICATE-----\n" +
|
|
||||||
"MIIC2TCCAn2gAwIBAgIFIGhhlgkwDAYIKoEcz1UBg3UFADBdMQswCQYDVQQGEwJDTjEwMC4GA1UE\n" +
|
|
||||||
"CgwnQ2hpbmEgRmluYW5jaWFsIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MRwwGgYDVQQDDBNDRkNB\n" +
|
|
||||||
"IFRFU1QgU00yIE9DQTExMB4XDTIzMTAzMDAyMzQzNVoXDTI1MDkyOTAyMzQzNVowgY4xCzAJBgNV\n" +
|
|
||||||
"BAYTAmNuMR8wHQYDVQQKDBZDRkNBIENTIFRFU1QgU00yIE9DQTExMQ0wCwYDVQQLDARHRklYMRkw\n" +
|
|
||||||
"FwYDVQQLDBBPcmdhbml6YXRpb25hbC0xMTQwMgYDVQQDDCswNTFAWjQwMjM2MTAxODg4NkA0MDIz\n" +
|
|
||||||
"NjEwMTg4ODZHRklYQDAwMDAwMDAzMFkwEwYHKoZIzj0CAQYIKoEcz1UBgi0DQgAECyoVBYoJB4gA\n" +
|
|
||||||
"KsQJCOXv4mRpK6+9r3ygeuHfVlfM/Ry05TVEmTnYAx1EvPnpgzDsgufEQU7oCjLTeznV0Ytc9qOB\n" +
|
|
||||||
"9TCB8jAfBgNVHSMEGDAWgBS+pn5NPXyPoFXmwS8JLiwgQ7NCfzBIBgNVHSAEQTA/MD0GCGCBHIbv\n" +
|
|
||||||
"KgECMDEwLwYIKwYBBQUHAgEWI2h0dHA6Ly93d3cuY2ZjYS5jb20uY24vdXMvdXMtMTUuaHRtMDoG\n" +
|
|
||||||
"A1UdHwQzMDEwL6AtoCuGKWh0dHA6Ly8yMTAuNzQuNDIuMy9PQ0ExMS9TTTIvY3JsMjkyMzYuY3Js\n" +
|
|
||||||
"MAsGA1UdDwQEAwID6DAdBgNVHQ4EFgQUEXk8fc+VwuPgF2uLzPJwLunm1mswHQYDVR0lBBYwFAYI\n" +
|
|
||||||
"KwYBBQUHAwIGCCsGAQUFBwMEMAwGCCqBHM9VAYN1BQADSAAwRQIhANBoYhm7RwzcWi0QJa4IeBW3\n" +
|
|
||||||
"jY4S64AdH/IWiO+aUyfPAiAu+9MrvCfd27KGZQKurf/djfbe5xBQg2CG6ae+Tax9lQ==\n" +
|
|
||||||
"-----END CERTIFICATE-----";
|
|
||||||
|
|
||||||
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-----";;
|
|
||||||
|
|
||||||
//将证书导入设备,获取证书主题
|
|
||||||
String dn = api.importCertAndGetDN(cert);
|
|
||||||
System.out.println("导入证书主题为:"+dn);
|
|
||||||
|
|
||||||
|
|
||||||
//裸签名格式转换
|
|
||||||
byte[] netSign = Util.hexString2Bytes(netSignHex);
|
|
||||||
//使用导入证书对裸签名验签
|
|
||||||
boolean verify = api.SYD_NakedVerify(orgData, netSign, dn);
|
|
||||||
System.out.println("验证裸签名:"+verify);
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void test(){
|
|
||||||
String cert = "-----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-----";
|
|
||||||
|
|
||||||
|
|
||||||
String pemCert;
|
|
||||||
if(cert.contains("-----BEGIN CERTIFICATE-----")){
|
|
||||||
pemCert =cert;
|
|
||||||
}else {
|
|
||||||
String cert_begin = "-----BEGIN CERTIFICATE-----\n";
|
|
||||||
String end_cert = "\n-----END CERTIFICATE-----";
|
|
||||||
pemCert = cert_begin + cert + end_cert;
|
|
||||||
}
|
|
||||||
X509Certificate certificate = null;
|
|
||||||
try {
|
|
||||||
certificate = convertToX509Cert(pemCert);
|
|
||||||
} catch (Exception e) {
|
|
||||||
throw new SydApiException( 0xC101, e );
|
|
||||||
}
|
|
||||||
String dn = certificate.getSubjectDN().toString();
|
|
||||||
System.out.println(dn);
|
|
||||||
String name = certificate.getSubjectDN().getName();
|
|
||||||
System.out.println(name);
|
|
||||||
|
|
||||||
String hex = "6D32F5C0151C8E25686E5016A1A3EE2118063C2FB83F941F01ED8C418563FCB5248BE6C50E504D19AC0CFA4573564F11878CBA3E2F2E40D8DAFD6CBD2929570223964D7C479639999C4CA3A84AFA3F791E296A3058F704DEB9BE5B96EEF5904A72DF5EA7CB88C1176B52292D9629784576D33F11D4DD721A585BAE359130DD5F";
|
|
||||||
System.out.println(Util.encodeBase64(Util.hexString2Bytes(hex)));
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void test2(){
|
|
||||||
String index = "000000000000000000A00000000";
|
|
||||||
String data = "12345678";
|
|
||||||
String s = api.SYMEncrytByKeyIndex(index, data);
|
|
||||||
System.out.println(s);
|
|
||||||
}
|
|
||||||
@Test
|
|
||||||
public void testMutiImport() throws InterruptedException {
|
|
||||||
List<Thread> threads = new ArrayList<>();
|
|
||||||
|
|
||||||
// 创建100个线程
|
|
||||||
for (int i = 0; i < 20; i++) {
|
|
||||||
Thread thread = new Thread(() -> {
|
|
||||||
for (int j = 0; j < 1000; j++) {
|
|
||||||
api.SYD_NakedSign(orgData,SM2dn);
|
|
||||||
importAllCert();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
thread.start();
|
|
||||||
threads.add(thread);
|
|
||||||
}
|
|
||||||
|
|
||||||
// 等待所有线程完成
|
|
||||||
for (Thread thread : threads) {
|
|
||||||
thread.join();
|
|
||||||
}
|
|
||||||
|
|
||||||
System.out.println(IpLockUtils.getLockStatus("172.1.41.139:8889"));
|
|
||||||
|
|
||||||
System.out.println("所有线程执行完毕");
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void importAllCert() {
|
|
||||||
StopWatch stopWatch = new StopWatch();
|
|
||||||
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" +
|
|
||||||
"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-----";
|
|
||||||
List<String> masterNodes = new ArrayList<>();
|
|
||||||
masterNodes.add("172.1.41.96:8889");
|
|
||||||
masterNodes.add("172.1.41.139:8889");
|
|
||||||
int timeout = 100;
|
|
||||||
Map<String, String> map = new HashMap<>();
|
|
||||||
map.put("snmp.target.ip", "172.1.1.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");
|
|
||||||
String snmpConfig = new Gson().toJson(map);
|
|
||||||
|
|
||||||
|
|
||||||
//导入证书并获取DN
|
|
||||||
SydApi4j sydApi4j = new SydApi4j();
|
|
||||||
|
|
||||||
ImportResult importResult = sydApi4j.importCertToServers(masterNodes, timeout, cert, "12345678", snmpConfig);
|
|
||||||
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
|
|
||||||
public void testDE() {
|
|
||||||
// SydApi4j sydApi4j = new SydApi4j();
|
|
||||||
//// String SM2dn = "C=CN,ST=北京,L=北京,O=信雅达,CN=172.1.40.188";
|
|
||||||
// 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
|
|
||||||
public void verifyCert() throws Exception {
|
|
||||||
String cert1 = "-----BEGIN CERTIFICATE-----\n" +
|
|
||||||
"MIIDzQYKKoEcz1UGAQQCAqCCA70wggO5AgEBMQ4wDAYIKoEcz1UBgxEFADAMBgoqgRzPVQYBBAIBoIICvjCCArowggJeoAMCAQICBRBXhjVCMAwGCCqBHM9VAYN1BQAwXDELMAkGA1UEBhMCQ04xMDAuBgNVBAoMJ0NoaW5hIEZpbmFuY2lhbCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEbMBkGA1UEAwwSQ0ZDQSBURVNUIFNNMiBPQ0ExMB4XDTIzMTAyNjA2MDA1OVoXDTI4MTAyNjA2MDA1OVowcjELMAkGA1UEBhMCY24xFzAVBgNVBAoMDkNGQ0EgVEVTVCBPQ0ExMQ0wCwYDVQQLDARERU1QMRkwFwYDVQQLDBBPcmdhbml6YXRpb25hbC0xMSAwHgYDVQQDDBcwNDFAWkRFTVBAREVNUEAwMDAwMDAwMTBZMBMGByqGSM49AgEGCCqBHM9VAYItA0IABNzTi8Jwrz8XmcUuZVEpfn8aI3WMFdZg+XgxjpD3gE5fPKFtENT7gXdGkNvR5rn0WpmW9gZXy4Y3IEuU7CpV+KqjgfQwgfEwHwYDVR0jBBgwFoAUa/4Y2o9COqa4bbMuiIM6NKLBMOEwSAYDVR0gBEEwPzA9BghggRyG7yoBATAxMC8GCCsGAQUFBwIBFiNodHRwOi8vd3d3LmNmY2EuY29tLmNuL3VzL3VzLTE0Lmh0bTA5BgNVHR8EMjAwMC6gLKAqhihodHRwOi8vdWNybC5jZmNhLmNvbS5jbi9TTTIvY3JsNTM4NjMuY3JsMAsGA1UdDwQEAwID6DAdBgNVHQ4EFgQUhJRis7GSdOETHetLBaoh6cZff54wHQYDVR0lBBYwFAYIKwYBBQUHAwIGCCsGAQUFBwMEMAwGCCqBHM9VAYN1BQADSAAwRQIhAI5ggiJQzXV8NKkWXu6GK5HpeME6YPvnPwvjCi2z30aYAiBFcqzOvKnrlZmhWeWQN07VF0INUWEI8/+coZf944XUPTGB0zCB0AIBATBlMFwxCzAJBgNVBAYTAkNOMTAwLgYDVQQKDCdDaGluYSBGaW5hbmNpYWwgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxGzAZBgNVBAMMEkNGQ0EgVEVTVCBTTTIgT0NBMQIFEFeGNUIwDAYIKoEcz1UBgxEFADANBgkqgRzPVQGCLQEFAARHMEUCIAty3HjlED9ti0NkRI1wpCr8oUws93qHwlYMU0X2HnS3AiEAtv2/HiXabruxV9WLYeMNsO58qcMiBAy1CKmM/zMJCHI=\n" +
|
|
||||||
"-----END CERTIFICATE-----";
|
|
||||||
String cert2 =
|
|
||||||
"MIIC3DCCAoCgAwIBAgIFIGiRZIYwDAYIKoEcz1UBg3UFADBdMQswCQYDVQQGEwJDTjEwMC4GA1UECgwnQ2hpbmEgRmluYW5jaWFsIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MRwwGgYDVQQDDBNDRkNBIFRFU1QgU00yIE9DQTExMB4XDTI0MDgxNTA4MzAxMloXDTI3MDIwMTA4MzAxMlowgZExCzAJBgNVBAYTAmNuMR8wHQYDVQQKDBZDRkNBIENTIFRFU1QgU00yIE9DQTExMQ4wDAYDVQQLDAVDTkFQUzEZMBcGA1UECwwQT3JnYW5pemF0aW9uYWwtMTE2MDQGA1UEAwwtMDUxQFozMTM1ODEwMDMyODRAMzEzNTgxMDAzMjg0Q05BUFMyQDAwMDAwMDAxMFkwEwYHKoZIzj0CAQYIKoEcz1UBgi0DQgAEFRjj5zgEwAnsF7hh6RVJfXSdybPBGBlF7gsVOUX5tU7E0YN/eYZk9j1jbOCrBWz611gsr+HkU0OZsFFlQTattKOB9TCB8jAfBgNVHSMEGDAWgBS+pn5NPXyPoFXmwS8JLiwgQ7NCfzBIBgNVHSAEQTA/MD0GCGCBHIbvKgECMDEwLwYIKwYBBQUHAgEWI2h0dHA6Ly93d3cuY2ZjYS5jb20uY24vdXMvdXMtMTUuaHRtMDoGA1UdHwQzMDEwL6AtoCuGKWh0dHA6Ly8yMTAuNzQuNDIuMy9PQ0ExMS9TTTIvY3JsMjkyODkuY3JsMAsGA1UdDwQEAwID6DAdBgNVHQ4EFgQUDONZoezPmMkCIHifM0KK9y0N8bQwHQYDVR0lBBYwFAYIKwYBBQUHAwIGCCsGAQUFBwMEMAwGCCqBHM9VAYN1BQADSAAwRQIhAKesbWSJQXAHBoLvTbtM+CP7eqwfBMQc0nRridvyXOPOAiAp2Zr1Ncren8n2U1XP4tWeYp1YyPBMke0BSlOFunJ0Jg==";
|
|
||||||
byte[] s = Base64.getDecoder().decode(cert2);
|
|
||||||
System.out.println(convertToPem(s));
|
|
||||||
X509Certificate certificate = null;
|
|
||||||
try {
|
|
||||||
certificate = CertUtil.convertToX509Cert(cert1);
|
|
||||||
} catch (Exception e) {
|
|
||||||
System.out.println("证书格式错误!");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void convert() throws Exception {
|
|
||||||
//原始证书
|
|
||||||
String cert =
|
|
||||||
"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();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -15,14 +15,14 @@ import racal.sunyard.main.SydApi4j;
|
|||||||
public class Test4WL {
|
public class Test4WL {
|
||||||
private SydApi4j api;
|
private SydApi4j api;
|
||||||
|
|
||||||
final String SM2dn = "C=CN,ST=zz,L=zz,O=zzz,CN=zzzzz";
|
final String SM2dn = "C=CN,O=1,OU=1,CN=1";
|
||||||
final String RSAdn = "C=CN,O=2,OU=2,CN=2";
|
final String RSAdn = "C=CN,O=2,OU=2,CN=2";
|
||||||
byte[] orgData = new byte[100];
|
byte[] orgData = new byte[100];
|
||||||
@Before
|
@Before
|
||||||
public void before() {
|
public void before() {
|
||||||
// 通过设置debug的属性开启debug,如果不设置则默认不打开
|
// 通过设置debug的属性开启debug,如果不设置则默认不打开
|
||||||
//System.setProperty("com.sunyard.sydapi4j.debug", "true");
|
//System.setProperty("com.sunyard.sydapi4j.debug", "true");
|
||||||
api = (SydApi4j) new SydApi4j().connect("172.1.41.139", 8889, null, 1000);
|
api = (SydApi4j) new SydApi4j().connect("172.16.18.91", 8889, null, 1000);
|
||||||
}
|
}
|
||||||
|
|
||||||
@After
|
@After
|
||||||
|
|||||||
@@ -1,50 +0,0 @@
|
|||||||
package sample;
|
|
||||||
|
|
||||||
import com.sunyard.proto.Util;
|
|
||||||
import org.junit.Before;
|
|
||||||
import org.junit.Test;
|
|
||||||
import racal.sunyard.main.SydApi4j;
|
|
||||||
|
|
||||||
public class TestQR {
|
|
||||||
SydApi4j api;
|
|
||||||
|
|
||||||
String Sm2Dn = "C=CN,O=CFCA OCA1,OU=YCCA,OU=Individual-2,CN=YCCA@黄金交易所@Zhuangj@1";
|
|
||||||
String RsaDn = "C=cn,O=CFCA TEST CA,OU=NCS2,OU=Enterprises,CN=041@Z402451000010@ShanDong@00000001";
|
|
||||||
String odata = "123456787654321";
|
|
||||||
@Before
|
|
||||||
public void before() {
|
|
||||||
// 通过设置debug的属性开启debug,如果不设置则默认不打开
|
|
||||||
System.setProperty("com.sunyard.sydapi4j.debug", "true");
|
|
||||||
|
|
||||||
|
|
||||||
api = (SydApi4j) new SydApi4j().connect("172.1.41.139", 8889, null, 1000);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void test1(){
|
|
||||||
api.QRCodeSign(odata,Sm2Dn,"./QRcode.png");
|
|
||||||
boolean b = api.QRCodeVer(Sm2Dn, "./QRcode.png");
|
|
||||||
System.out.println(b);
|
|
||||||
}
|
|
||||||
@Test
|
|
||||||
public void test2(){
|
|
||||||
api.BarCodeSign(odata,Sm2Dn,"./Barcode.png");
|
|
||||||
boolean b = api.BarCodeVer(Sm2Dn, "./Barcode.png");
|
|
||||||
System.out.println(b);
|
|
||||||
}
|
|
||||||
@Test
|
|
||||||
public void test3(){
|
|
||||||
api.QRCodeSignRSA(2,odata,RsaDn,"./QRcodeRSA.png");
|
|
||||||
boolean b = api.QRCodeVerRSA(2,RsaDn, "./QRcodeRSA.png");
|
|
||||||
System.out.println(b);
|
|
||||||
}
|
|
||||||
@Test
|
|
||||||
public void test4(){
|
|
||||||
api.BarCodeSignRSA(2,odata,RsaDn,"./BarcodeRSA.png");
|
|
||||||
boolean b = api.BarCodeVerRSA(2,RsaDn, "./BarcodeRSA.png");
|
|
||||||
System.out.println(b);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
Reference in New Issue
Block a user