Compare commits

...

23 Commits

Author SHA1 Message Date
cheney
e8a62c1d4a 一个 xml 测试 2026-05-18 17:15:00 +08:00
waner
8de764c731 fix:key漏洞 2025-07-31 11:57:12 +08:00
waner
1df1e64783 fix:key漏洞 2025-07-31 11:57:05 +08:00
waner
6df9d978d5 jmeter测试类 2025-07-25 09:39:03 +08:00
waner
7e4bc7f87b 增加参数范围校验 2025-07-24 18:02:14 +08:00
waner
1f2709326f jmeter测试修改 2025-07-18 09:44:54 +08:00
waner
d80e225158 jmeter测试 2025-07-16 15:43:32 +08:00
waner
4372362086 证书导入结果修改 2025-06-19 11:05:12 +08:00
waner
b4d3c1d193 jmeter测试完善 2025-06-09 10:51:51 +08:00
waner
9fbcd1baad 单元测试 2025-06-05 09:30:32 +08:00
waner
e2c8695f47 fix:删除证书 2025-06-04 10:32:13 +08:00
waner
e4020b1bbc fix:主备切换 2025-06-04 10:13:37 +08:00
waner
fbcbe79388 fix:主备切换测试 2025-05-30 16:21:39 +08:00
waner
085d71feb9 fix:jmeter测试 2025-05-23 17:54:00 +08:00
waner
0f46865151 fix:测试demo完善 2025-05-20 17:12:54 +08:00
waner
a919287719 fix:测试demo完善 2025-05-20 14:09:45 +08:00
waner
35150c9af4 fix 2025-05-20 14:01:25 +08:00
waner
4616f1b700 测试脚本 2025-05-20 10:30:45 +08:00
waner
f8bf4b10fb fix 2025-05-15 13:58:53 +08:00
waner
b7cd62a872 fix 2025-05-14 15:02:24 +08:00
waner
d3ff2e3646 fix:完善多机证书导入功能 2025-05-14 14:25:34 +08:00
waner
55a9cfbdbe feat:多机证书导入功能 2025-05-08 16:46:30 +08:00
yihzhou
db80b1dd83 增加二维码、条形码签名验签测试 2024-11-21 10:56:01 +08:00
34 changed files with 3450 additions and 212 deletions

6
config.json Normal file
View File

@ -0,0 +1,6 @@
{
"ip1": "172.1.41.3",
"ip2": "172.1.41.139",
"port": 8889,
"dn": "C=cn,O=CFCA OCA1 SM2,OU=Local RA OCA1,OU=Units,CN=041@N91330108762038374D@杭州信雅达科技有限公司@00000002"
}

109
pom.xml
View File

@ -14,8 +14,8 @@
<vertx>3.4.2</vertx>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.encoding>UTF-8</maven.compiler.encoding>
<maven.compiler.source>1.6</maven.compiler.source>
<maven.compiler.target>1.6</maven.compiler.target>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
<dependencies>
@ -33,52 +33,34 @@
<scope>test</scope>
</dependency>
<!-- &lt;!&ndash; https://mvnrepository.com/artifact/org.apache.commons/commons-pool2 &ndash;&gt;-->
<!-- <dependency>-->
<!-- <groupId>org.apache.commons</groupId>-->
<!-- <artifactId>commons-pool2</artifactId>-->
<!-- <version>2.11.1</version>-->
<!-- </dependency>-->
<!-- <dependency>-->
<!-- <groupId>org.jetbrains.kotlin</groupId>-->
<!-- <artifactId>kotlin-test</artifactId>-->
<!-- <version>${kotlin.version}</version>-->
<!-- <scope>test</scope>-->
<!-- </dependency>-->
<!-- &lt;!&ndash; https://mvnrepository.com/artifact/dom4j/dom4j &ndash;&gt;-->
<!-- <dependency>-->
<!-- <groupId>dom4j</groupId>-->
<!-- <artifactId>dom4j</artifactId>-->
<!-- <version>1.6.1</version>-->
<!-- </dependency>-->
<!-- &lt;!&ndash; https://mvnrepository.com/artifact/com.alibaba/fastjson &ndash;&gt;-->
<!-- <dependency>-->
<!-- <groupId>com.alibaba</groupId>-->
<!-- <artifactId>fastjson</artifactId>-->
<!-- <version>1.2.80</version>-->
<!-- </dependency>-->
<!-- <dependency>-->
<!-- <groupId>org.jetbrains.kotlin</groupId>-->
<!-- <artifactId>kotlin-stdlib-jdk8</artifactId>-->
<!-- <version>${kotlin.version}</version>-->
<!-- </dependency>-->
<!--<dependency>-->
<!--<groupId>com.sunyard</groupId>-->
<!--<artifactId>Converter</artifactId>-->
<!--<version>[1.0.201807251700, 1.1-SNAPSHOT)</version>-->
<!--</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>
@ -92,21 +74,50 @@
<dependency>
<groupId>org.bouncycastle</groupId>
<artifactId>bcpkix-jdk15on</artifactId>
<version>1.65</version>
<version>1.68</version>
<!-- <scope>provided</scope>-->
</dependency>
<dependency>
<groupId>org.bouncycastle</groupId>
<artifactId>bcprov-jdk15on</artifactId>
<version>1.65</version>
<version>1.68</version>
<!-- <scope>provided</scope>-->
</dependency>
<!-- https://mvnrepository.com/artifact/cn.hutool/hutool-all -->
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.8.4.M1</version>
<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>
<!-- <dependency>-->
<!-- <groupId>org.codehaus.groovy</groupId>-->
<!-- <artifactId>groovy-all</artifactId>-->
<!-- <version>2.4.15</version>-->
<!--&lt;!&ndash; <version>4.0.26</version>&ndash;&gt;-->
<!-- </dependency>-->
<!-- <dependency>-->
<!-- <groupId>ch.qos.logback</groupId>-->
<!-- <artifactId>logback-classic</artifactId>-->
<!-- <version>1.3.15</version>-->
<!-- <scope>compile</scope>-->
<!-- </dependency>-->
<!--<dependency>-->
<!--<groupId>club.fullstack</groupId>-->
<!--<artifactId>serialize</artifactId>-->
@ -125,6 +136,7 @@
<groupId>org.codehaus.groovy</groupId>
<artifactId>groovy-eclipse-compiler</artifactId>
<version>2.9.2-01</version>
<!-- <version>3.5.0-01</version>-->
<extensions>true</extensions>
</plugin>
@ -132,6 +144,7 @@
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.3</version>
<!-- <version>3.8.1</version>-->
<executions>
<execution>
<id>compile</id>
@ -149,8 +162,8 @@
</execution>
</executions>
<configuration>
<source>6</source>
<target>6</target>
<source>8</source>
<target>8</target>
<compilerId>groovy-eclipse-compiler</compilerId>
<verbose>true</verbose>
<fork>true</fork>

View File

@ -0,0 +1,38 @@
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);
}
}

View File

@ -1,15 +1,20 @@
package com.jmeter.test;
import com.Sample.SydUtils;
import com.google.gson.Gson;
import com.sunyard.SydApiException;
import com.sunyard.entity.ImportResult;
import com.sunyard.proto.Util;
import org.apache.commons.lang3.StringUtils;
import org.apache.jmeter.config.Arguments;
import org.apache.jmeter.protocol.java.sampler.AbstractJavaSamplerClient;
import org.apache.jmeter.protocol.java.sampler.JavaSamplerContext;
import org.apache.jmeter.samplers.SampleResult;
import racal.sunyard.main.SydApi4j;
import racal.sunyard.main.SydApiBuilder;
import java.io.StringWriter;
import java.nio.charset.StandardCharsets;
import java.util.*;
public class Test4Jemter extends AbstractJavaSamplerClient {
@ -17,15 +22,32 @@ public class Test4Jemter extends AbstractJavaSamplerClient {
private String SM2dn ;
private String RSAdn ;
private String ip ;
private int port;
private String ip2 ;
private String oData;
private String sign;
private String detachedSign;
private byte[] orgData;
private int type;
private static ThreadLocal<SydApi4j> api;
private int dataLength;
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中会自动显示在这里定义的默认参数
@ -34,13 +56,26 @@ public class Test4Jemter extends AbstractJavaSamplerClient {
@Override
public Arguments getDefaultParameters() {
Arguments arguments = new Arguments();
arguments.addArgument("SM2dn", "C=CN,O=CFCA OCA1,OU=YCCA,OU=Individual-2,CN=YCCA@黄金交易所@Zhuangj@1");
arguments.addArgument("SM2dn", "C=CN,ST=zz,L=zz,O=zzz,CN=zzzzz");
arguments.addArgument("RSAdn", "C=cn,O=CFCA TEST CA,OU=NCS2,OU=Enterprises,CN=041@Z402451000010@ShanDong@00000001");
arguments.addArgument("orgData", "12345678");
arguments.addArgument("ip", "192.168.0.166");
// arguments.addArgument("ip2", "172.16.17.161");
arguments.addArgument("orgData", "null");
arguments.addArgument("ip", "172.1.41.139");
arguments.addArgument("ip2", "172.1.41.96");
arguments.addArgument("port", "8889");
arguments.addArgument("timeout", "3000");
arguments.addArgument("logSwitch", "1");
// arguments.addArgument("ip2", "172.16.17.161");
arguments.addArgument("dataLength", "1024");
arguments.addArgument("type", "1");
arguments.addArgument("sign", "12345678");
arguments.addArgument("detachedSign", "12345678");
arguments.addArgument("cert", "");
arguments.addArgument("nodes", "172.1.41.139:8889;172.1.41.96:8889");
arguments.addArgument("snmpIP", "172.1.41.139");
arguments.addArgument("snmpPort", "162");
arguments.addArgument("snmpOID", "1.3.6.1.4.1.9999");
arguments.addArgument("snmpCommunity", "public");
return arguments;
}
@ -55,16 +90,32 @@ public class Test4Jemter extends AbstractJavaSamplerClient {
RSAdn = context.getParameter("RSAdn");
oData = context.getParameter("orgData");
ip = context.getParameter("ip");
// ip2 = context.getParameter("ip2");
ip2 = context.getParameter("ip2");
port = context.getIntParameter("port");
timeout = context.getIntParameter("timeout");
logSwitch = context.getIntParameter("logSwitch");
// ip2 = context.getParameter("ip2");
dataLength = context.getIntParameter("dataLength");
type = context.getIntParameter("type");
sign = context.getParameter("sign");
detachedSign = context.getParameter("detachedSign");
cert = context.getParameter("cert");
nodes = context.getParameter("nodes");
snmpIP = context.getParameter("snmpIP");
snmpPort = context.getParameter("snmpPort");
snmpOID = context.getParameter("snmpOID");
snmpCommunity = context.getParameter("snmpCommunity");
System.getProperty("com.sunyard.sydapi4j.debug", "false");
System.setProperty("com.sunyard.dnsort", "false");
api = new ThreadLocal<SydApi4j>() {
@Override
public SydApi4j initialValue() {
SydApiBuilder builder = new SydApiBuilder().setIp(ip);
final SydApi4j api = (SydApi4j) builder.build();
return api;
//
// SydApiBuilder builder = new SydApiBuilder().setIp(ip);
// final SydApi4j api = (SydApi4j) builder.build();
SydApi4j.SYD_Set_Parameter_HA(ip, ip2, port, timeout);
final SydApi4j api1 = (SydApi4j) new SydApi4j();
return api1;
}
};
@ -82,117 +133,172 @@ public class Test4Jemter extends AbstractJavaSamplerClient {
sr.setSampleLabel("testDemo");
//设置开始标志否则无法统计tps等
sr.sampleStart();
SydUtils sydUtils = null;
try {
orgData = oData.getBytes(); //SM2裸签
if ("null".equals(oData)) {
orgData = null;
} else {
orgData = oData.getBytes(); //SM2裸签
}
sydUtils = new SydUtils(ip, ip2, port, timeout);
// orgData = new byte[dataLength];
//执行业务逻辑
switch(type){
case 1:
api.get().SYD_NakedSign(SM2dn, orgData, (byte[]) null);
// api.get().SYD_NakedSign(SM2dn, orgData, (byte[]) null);
// byte[] nakedSign = api.get().SYD_NakedSign(orgData,SM2dn);
byte[] nakedSign = sydUtils.SYD_NakedSign(orgData,SM2dn);
if (logSwitch == 1) {
System.out.println("p1签名(hex)"+ Util.bytes2HexString(nakedSign));
}
sr.setResponseCodeOK();
//sr.setResponseData(Util.encodeBase64(nakedSign1), StandardCharsets.UTF_8.displayName());
break;
//sr.setResponseData(Util.encodeBase64(nakedSign1), StandardCharsets.UTF_8.displayName());
break;
case 2:
api.get().SYD_NakedVerify(SM2dn, Util.decodeBase64(sign), orgData, (byte[])null) ;
// api.get().SYD_NakedVerify(SM2dn, Util.decodeBase64(sign), orgData, (byte[])null) ;
// boolean flag = api.get().SYD_NakedVerify(orgData,Util.hexString2Bytes(sign), SM2dn);
boolean flag = sydUtils.SYD_NakedVerify(orgData,Util.hexString2Bytes(sign), SM2dn);
if (logSwitch == 1) {
System.out.println("p1验签"+ flag);
}
sr.setResponseCodeOK();
//sr.setResponseData(String.valueOf(nakedVerify1), StandardCharsets.UTF_8.displayName());
break;
break;
case 3:
//RSA裸签
api.get().SYD_NakedSign(1, RSAdn,orgData,(byte[])null);
api.get().SYD_NakedSign(1, RSAdn,orgData,(byte[])null);
sr.setResponseCodeOK();
//sr.setResponseData(Util.encodeBase64(nakedSign2), StandardCharsets.UTF_8.displayName());
break;
break;
case 4:
api.get().SYD_NakedVerify(1, RSAdn,Util.decodeBase64(sign),orgData ,(byte[])null);
api.get().SYD_NakedVerify(1, RSAdn,Util.decodeBase64(sign),orgData ,(byte[])null);
sr.setResponseCodeOK();
//sr.setResponseData(String.valueOf(nakedVerify2), StandardCharsets.UTF_8.displayName());
break;
break;
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.setResponseData(detSign1, StandardCharsets.UTF_8.displayName());
break;
break;
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.setResponseData(String.valueOf(detV1), StandardCharsets.UTF_8.displayName());
break;
break;
case 7:
api.get().detachedSign(2,1, orgData, RSAdn);
api.get().detachedSign(2,1, orgData, RSAdn);
sr.setResponseCodeOK();
//sr.setResponseData(detSign2, StandardCharsets.UTF_8.displayName());
break;
break;
case 8:
api.get().detachedVerify(2,2, orgData, sign);
api.get().detachedVerify(2,2, orgData, sign);
sr.setResponseCodeOK();
//sr.setResponseData(String.valueOf(detV2), StandardCharsets.UTF_8.displayName());
break;
break;
case 9:
api.get().attachedSignHsm(orgData, SM2dn);
api.get().attachedSignHsm(orgData, SM2dn);
sr.setResponseCodeOK();
//sr.setResponseData(attSign1, StandardCharsets.UTF_8.displayName());
break;
break;
case 10:
api.get().attachedVerify( sign.getBytes());
api.get().attachedVerify( sign.getBytes());
sr.setResponseCodeOK();
// sr.setResponseData(String.valueOf(attV1), StandardCharsets.UTF_8.displayName());
break;
// sr.setResponseData(String.valueOf(attV1), StandardCharsets.UTF_8.displayName());
break;
case 11:
api.get().attachedSignRSAHsm(2, orgData, RSAdn);
api.get().attachedSignRSAHsm(2, orgData, RSAdn);
sr.setResponseCodeOK();
// sr.setResponseData(attSign2, StandardCharsets.UTF_8.displayName());
break;
// sr.setResponseData(attSign2, StandardCharsets.UTF_8.displayName());
break;
case 12:
api.get().attachedVerifyRSA(2, sign);
api.get().attachedVerifyRSA(2, sign);
sr.setResponseCodeOK();
// sr.setResponseData(String.valueOf(attV2), StandardCharsets.UTF_8.displayName());
break;
// sr.setResponseData(String.valueOf(attV2), StandardCharsets.UTF_8.displayName());
break;
case 13:
api.get().generateDE(SM2dn.getBytes(), 3, 1, orgData);
// byte[] cipherKey = (byte[]) genSM2.get(SydApi.RET_CIPHER_KEY);
api.get().generateDE(SM2dn.getBytes(), 3, 1, orgData);
// byte[] cipherKey = (byte[]) genSM2.get(SydApi.RET_CIPHER_KEY);
sr.setResponseCodeOK();
// sr.setResponseData(new String(cipherKey), StandardCharsets.UTF_8.displayName());
break;
// sr.setResponseData(new String(cipherKey), StandardCharsets.UTF_8.displayName());
break;
case 14:
api.get().decryptDE(true, 1, SM2dn.getBytes(), sign);;
// byte[] oData = (byte[]) denSM2.get("oData");
api.get().decryptDE(true, 1, SM2dn.getBytes(), sign);;
// byte[] oData = (byte[]) denSM2.get("oData");
sr.setResponseCodeOK();
// sr.setResponseData(new String(oData), StandardCharsets.UTF_8.displayName());
break;
// sr.setResponseData(new String(oData), StandardCharsets.UTF_8.displayName());
break;
case 15:
api.get(). generateDE(RSAdn.getBytes(), 4, 1, orgData);
// byte[] cipherKeyRSA = (byte[]) genRSA.get(SydApi.RET_CIPHER_KEY);
api.get().generateDE(RSAdn.getBytes(), 4, 1, orgData);
// byte[] cipherKeyRSA = (byte[]) genRSA.get(SydApi.RET_CIPHER_KEY);
sr.setResponseCodeOK();
//sr.setResponseData(new String(cipherKeyRSA), StandardCharsets.UTF_8.displayName());
break;
break;
case 16:
api.get().decryptDERSA(true, 1, RSAdn.getBytes(), sign);
// byte[] oDataRSA = (byte[]) denRSA.get("oData");
api.get().decryptDERSA(true, 1, RSAdn.getBytes(), sign);
// byte[] oDataRSA = (byte[]) denRSA.get("oData");
sr.setResponseCodeOK();
//sr.setResponseData(new String(oDataRSA), StandardCharsets.UTF_8.displayName());
break;
break;
case 17:
String cert1 = api.get().getCertBySign(detachedSign);
System.out.println("根据p7签名值获取的证书为" + cert1);
sr.setResponseCodeOK();
break;
case 18:
testAhnx(sydUtils);
sr.setResponseCodeOK();
break;
case 19:
testImportCert();
sr.setResponseCodeOK();
break;
case 20:
boolean delFlag = api.get().deleteCert(SM2dn);
System.out.println("删除证书成功:"+ delFlag);
break;
case 21:
SydApi4j.SYD_Set_Parameter_HA(ip, ip2, port, timeout);
break;
case 22:
api.get().connect(ip, port, "", timeout);
break;
case 23:
api.get().disconnect();
break;
default:
sr.setResponseCodeOK();
sr.setResponseData("请选择测试组", StandardCharsets.UTF_8.displayName());
break;
break;
}
sr.setSuccessful(true);
}catch (SydApiException e){
@ -201,11 +307,62 @@ public class Test4Jemter extends AbstractJavaSamplerClient {
sr.setResponseData(e.getMessage(), StandardCharsets.UTF_8.displayName());
sr.setSuccessful(false);
}finally {
if (sydUtils != null) {
sydUtils.disconnect();
}
sr.sampleEnd();
}
return sr;
}
public void testAhnx(SydUtils sydUtils) {
//裸签
byte[] nakedSign = sydUtils.SYD_NakedSign(orgData,SM2dn);
//裸签验签
boolean ver = sydUtils.SYD_NakedVerify(orgData,nakedSign, SM2dn);
//detach签名
String detachedSign = sydUtils.detachedSign(orgData, SM2dn);
//detach验签
boolean ver1 = sydUtils.detachedVerify(orgData, detachedSign);
// testImportCert();
}
private void testImportCert(){
List<String> masterNodes = Arrays.asList(StringUtils.split(nodes, ";"));
Map<String, String> map = new HashMap<>();
map.put("snmp.target.ip", snmpIP);
map.put("snmp.target.port", snmpPort);
map.put("enterprise.oid", snmpOID);
map.put("snmp.community", snmpCommunity);
map.put("snmp.version", "1");
Gson gson = new Gson();
String snmpConfig = gson.toJson(map);
SydApi4j sydApi4j = new SydApi4j();
String cert21 = convertToPem(Base64.getDecoder().decode(cert));
ImportResult importResult = sydApi4j.importCertToServers(masterNodes, timeout, cert21, "12345678", snmpConfig);
System.out.println("证书导入结果:" + gson.toJson(importResult));
}
private String convertToPem(byte[] derCert){
// 使用Base64编码器兼容RFC 4648每行64字符
StringWriter writer = new StringWriter();
writer.write("-----BEGIN CERTIFICATE-----\n");
// 将DER转换为Base64并分割为每行64字符
String base64Cert = Base64.getMimeEncoder(64, "\n".getBytes()).encodeToString(derCert);
writer.write(base64Cert);
// 如果Base64编码的字符串没有以换行结束则添加换行
if (!base64Cert.endsWith("\n")) {
writer.write("\n");
}
writer.write("-----END CERTIFICATE-----\n");
return writer.toString();
}
/**
* 测试完成后执行一般用于关闭资源
* @param context 上下文对象可用于获取jmeter传递的参数
@ -213,5 +370,9 @@ public class Test4Jemter extends AbstractJavaSamplerClient {
@Override
public void teardownTest(JavaSamplerContext context) {
System.runFinalization();
if (api != null) {
api.get().disconnect();
api.remove();
}
}
}

View File

@ -0,0 +1,125 @@
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);
}
}
}
}
}

View File

@ -9,7 +9,7 @@ import racal.sunyard.main.SydApi4j;
public class SYMEnDeLongData {
private SydApi4j api;
private String key = "";
private String sykey = "";
private String keyValue = "";
private int keyType = 0;
private int inType = 0;
@ -95,11 +95,11 @@ public class SYMEnDeLongData {
public String getKey() {
return key;
return sykey;
}
public SYMEnDeLongData setKey(String key) {
this.key = key;
public SYMEnDeLongData setKey(String sykey) {
this.sykey = sykey;
return this;
}

View File

@ -8,6 +8,8 @@ import com.sunyard.inf.customize.SydQNUCApi;
import com.sunyard.inf.customize.SydUnionPayApi;
import racal.sunyard.main.SydApiBuilder;
import java.util.List;
/**
* Created by Cheney on 2017/11/11.
* 程序调用接口
@ -117,4 +119,5 @@ public interface SydApi extends
public Object getBindObject();
public void setBindObject(Object bindObject);
}

View File

@ -68,6 +68,11 @@ public class SydApiException extends RuntimeException{
break;
}
case 0x8004 : {
msg = "证书已过期";
break;
}
case 32770:
msg = "签名验证错误(P7) ";
break;
@ -132,6 +137,16 @@ 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) {
super("SydApiException(code =" + String.format(" %04x", ret) + " : " + "msg =" + (msg == null ? "未定义的错误" : msg) + ")", e);
this.retCode = ret;

View File

@ -0,0 +1,55 @@
package com.sunyard.entity;
import java.util.List;
/**
* 证书导入结果封装类
*/
public class ImportResult {
/** 成功状态码 */
public static final int CODE_SUCCESS = 2000;
/** 部分成功状态码 */
public static final int CODE_PARTIAL_SUCCESS = 2001;
/** 完全失败状态码 */
public static final int CODE_COMPLETE_FAILURE = 2002;
/** 参数错误状态码 */
public static final int CODE_INVALID_PARAM = 4001;
private int code; //返回码
private String certDn; // 证书主题(DN)
private List<String> errCnt; // 详细错误列表每个失败的服务器
// 构造方法
public ImportResult() {
}
public ImportResult(int code, String certDn) {
this.code = code;
this.certDn = certDn;
}
// Getters and Setters
public int getCode() {
return code;
}
public void setCode(int code) {
this.code = code;
}
public String getCertDn() {
return certDn;
}
public void setCertDn(String certDn) {
this.certDn = certDn;
}
public List<String> getErrCnt() {
return errCnt;
}
public void setErrCnt(List<String> errCnt) {
this.errCnt = errCnt;
}
}

View File

@ -0,0 +1,86 @@
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;
}
}
}

View File

@ -151,6 +151,8 @@ public interface SydCertApi {
RetWrap importCert(byte[] certData, byte[] organizationId, CertUsage... us);
RetWrap importCert(byte[] certData, byte[] organizationId);
String importCert(String cert);
/**
* 从加密设备中删除指定 DN 的公钥证书

View File

@ -240,6 +240,9 @@ public interface SydGenApi {
*/
RetWrap generateDEByDn(String certSerial, byte[] oData);
RetWrap generateDEByDnICBC(String certSerial,String iv, byte[] oData,int roundmod);
RetWrap generateDEByDnRSA(int alg,String certSerial, byte[] oData);
/**
@ -323,6 +326,8 @@ public interface SydGenApi {
* orgCode 如果有机构码的话会返回机构码
*/
RetWrap decryptDEByDN(String certSerial, byte[] pCipherKey);
RetWrap decryptDEByDNICBC(String certSerial, String IV,String pCipherKey,int roundmod);
RetWrap decryptDEByDNRSA(int alg,String certSerial, byte[] pCipherKey);
/**
* 接收用私钥解密数字信封还原对称密钥

View File

@ -0,0 +1,112 @@
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;
}
}
}

View File

@ -0,0 +1,121 @@
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();
}
}
}

View File

@ -0,0 +1,50 @@
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;
}
}

View File

@ -0,0 +1,35 @@
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;
}
}

View File

@ -0,0 +1,70 @@
package com.sunyard.util;
import java.util.regex.Pattern;
public class AddressUtil {
// 处理带端口号的地址
public static boolean isValidAddressWithPort(String address) {
if (address == null) {
return false;
}
// 分离 IP:port [IPv6]:port
String[] parts;
if (address.startsWith("[") && address.contains("]:")) {
parts = address.split("\\]:", 2);
parts[0] = parts[0] + "]"; // 补全 IPv6 的括号
} else {
parts = address.split(":", 2);
}
if (parts.length != 2) {
return false;
}
String ipPart = parts[0];
String portPart = parts[1];
return isValidIP(ipPart) &&
isValidPort(portPart);
}
// IPv4 正则允许 0-255
private static final Pattern IPV4_PATTERN = Pattern.compile(
"^((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$"
);
// IPv6 正则包含缩写形式
private static final Pattern IPV6_PATTERN = Pattern.compile(
"^(?:[0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}$"
);
// 简化域名正则允许字母数字连字符和点
private static final Pattern DOMAIN_PATTERN = Pattern.compile(
"^([a-zA-Z0-9-]{1,63}\\.)+[a-zA-Z]{2,63}$"
);
public static boolean isValidIP(String ip) {
// 检查 IPv4 IPv6
return IPV4_PATTERN.matcher(ip).matches() ||
IPV6_PATTERN.matcher(ip).matches();
}
public static boolean isValidDomain(String domain) {
return DOMAIN_PATTERN.matcher(domain).matches();
}
public static boolean isValidPort(int port) {
return port >= 0 && port <= 65535;
}
// 字符串形式的端口校验
public static boolean isValidPort(String portStr) {
try {
int port = Integer.parseInt(portStr);
return port >= 0 && port <= 65535;
} catch (NumberFormatException e) {
return false;
}
}
}

View File

@ -46,12 +46,14 @@ public class CertUtil {
return (X509Certificate) CF.generateCertificate(new ByteArrayInputStream(certificateString.getBytes())); // 将文件流的证书转化为证书类
}
public static String convertToPem(X509Certificate cert) throws CertificateEncodingException {
public static String convertToPem(String cert) throws CertificateEncodingException {
String cert_begin = "-----BEGIN CERTIFICATE-----\n";
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 pemCert = cert_begin + pemCertPre + end_cert;
return pemCert;
@ -98,6 +100,25 @@ public class CertUtil {
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 是否是国密证书签的
*

View File

@ -0,0 +1,107 @@
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();
}
}
}

View File

@ -0,0 +1,140 @@
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

View File

@ -0,0 +1,116 @@
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);
}
}

View File

@ -0,0 +1,54 @@
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();
}
}
}

View File

@ -22,7 +22,7 @@ public class CertTest {
public static void main(String[] args) {
//System.setProperty("com.sunyard.sydapi4j.debug", "true");
SydApi4j api = (SydApi4j) new SydApi4j().connect("192.168.1.129", 8889, null, 1000);
SydApi4j api = (SydApi4j) new SydApi4j().connect("172.16.18.5", 8889, null, 1000);
try{
List<String>dns = api.getAllCert();
System.out.println(Arrays.toString( dns.toArray() ) );

View File

@ -0,0 +1,134 @@
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();
}
}
}

View File

@ -0,0 +1,91 @@
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

View File

@ -0,0 +1,149 @@
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;
/**
* @AuthorCheney
* @Date2023/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);
}
}

View File

@ -0,0 +1,119 @@
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;
/**
* @AuthorCheney
* @Date2024/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());
}
}

View File

@ -16,7 +16,7 @@ public class Shangqing {
// 测试数据
private String uid = "8012";
private String dn = "C=CN,ST=ZJ,L=HZ,O=sunyard,OU=test1,CN=test1";
private String SM2dn = "C=CN,ST=zj,L=hz,O=sunyard,OU=sm2Test,CN=sm2Test";
private String SM2dn = "C=CN,O=CFCA OCA1,OU=YCCA,OU=Individual-2,CN=YCCA@黄金交易所@Zhuangj@1";
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() {
// 通过设置debug的属性开启debug如果不设置则默认不打开
System.setProperty("com.sunyard.sydapi4j.debug", "true");
// 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("172.16.17.161", 8889, null, 1000);
//api = (SydApi4j) new SydApi4j().connect("192.168.0.100", 8889, null, 1000);
}

View File

@ -17,7 +17,7 @@ import java.util.List;
public class Test4Nongxin {
private static final String SM2dn = "C=CN,O=Sunyard,OU=8001,CN=8001";
private static final String SM2dn = "C=CN,ST=zz,L=zz,O=zzz,CN=zzzzz";
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[] orgDataBig = new byte[ 10*1024 ];
@ -25,7 +25,7 @@ public class Test4Nongxin {
System.setProperty("com.sunyard.sydapi4j.debug", "true");
System.setProperty("com.sunyard.dnsort", "true");
//设置连接
SydApiBuilder builder = new SydApiBuilder().setIp("192.168.0.200");
SydApiBuilder builder = new SydApiBuilder().setIp("172.1.41.139");
SydApi4j api = (SydApi4j) builder.build();
try {
//SM2裸签
@ -209,7 +209,7 @@ public class Test4Nongxin {
System.setProperty("com.sunyard.sydapi4j.debug", "true");
//设置连接
SydApiBuilder builder = new SydApiBuilder().setIp("192.168.0.156");
SydApiBuilder builder = new SydApiBuilder().setIp("172.16.17.64");
SydApi4j api = (SydApi4j) builder.build();
String cert = "-----BEGIN CERTIFICATE-----\n" +

View File

@ -0,0 +1,601 @@
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();
}
}

View File

@ -15,14 +15,14 @@ import racal.sunyard.main.SydApi4j;
public class Test4WL {
private SydApi4j api;
final String SM2dn = "C=CN,O=1,OU=1,CN=1";
final String SM2dn = "C=CN,ST=zz,L=zz,O=zzz,CN=zzzzz";
final String RSAdn = "C=CN,O=2,OU=2,CN=2";
byte[] orgData = new byte[100];
@Before
public void before() {
// 通过设置debug的属性开启debug如果不设置则默认不打开
//System.setProperty("com.sunyard.sydapi4j.debug", "true");
api = (SydApi4j) new SydApi4j().connect("172.16.18.91", 8889, null, 1000);
api = (SydApi4j) new SydApi4j().connect("172.1.41.139", 8889, null, 1000);
}
@After

View File

@ -0,0 +1,50 @@
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);
}
}