From 7a4f9892f5e64dd34d94b799b8ded91cb7747788 Mon Sep 17 00:00:00 2001 From: yihzhou <468340218@qq.com> Date: Wed, 2 Aug 2023 14:00:36 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=9D=E5=AD=98=E5=91=A8=E4=B8=80=E8=B1=AA?= =?UTF-8?q?=E7=94=B5=E8=84=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 15 +- src/main/java/com/jmeter/test/Test4ZS.java | 210 ++++ src/main/java/com/sunyard/inf/SydCertApi.java | 2 + src/main/java/com/sunyard/inf/SydGenApi.java | 4 +- .../com/sunyard/inf/sva/SydAttachedSVApi.java | 4 +- .../java/com/sunyard/util/FrameCache.java | 183 ++++ .../java/racal/sunyard/main/SydApi4j.java | 981 +++++++++++------- src/test/java/sample/Sample4HY.java | 74 ++ src/test/java/sample/Sample4ZS.java | 97 ++ src/test/java/sample/Shangqing.java | 30 +- src/test/java/sample/Test4Nongxin.java | 199 +++- src/test/java/sample/Test4SLS.java | 29 + src/test/java/sample/TestDE.java | 13 - 13 files changed, 1453 insertions(+), 388 deletions(-) create mode 100644 src/main/java/com/jmeter/test/Test4ZS.java create mode 100644 src/main/java/com/sunyard/util/FrameCache.java create mode 100644 src/test/java/sample/Sample4HY.java create mode 100644 src/test/java/sample/Sample4ZS.java create mode 100644 src/test/java/sample/Test4SLS.java diff --git a/pom.xml b/pom.xml index 2ff0cfc..2f61431 100644 --- a/pom.xml +++ b/pom.xml @@ -14,8 +14,8 @@ 3.4.2 UTF-8 UTF-8 - 1.6 - 1.6 + 1.8 + 1.8 @@ -81,6 +81,13 @@ 1.0.20221215 + + org.apache.jmeter + ApacheJMeter_java + 5.4.3 + provided + + org.bouncycastle @@ -142,8 +149,8 @@ - 1.6 - 1.6 + 7 + 7 groovy-eclipse-compiler true true diff --git a/src/main/java/com/jmeter/test/Test4ZS.java b/src/main/java/com/jmeter/test/Test4ZS.java new file mode 100644 index 0000000..9d98959 --- /dev/null +++ b/src/main/java/com/jmeter/test/Test4ZS.java @@ -0,0 +1,210 @@ +package com.jmeter.test; + +import com.sunyard.RetWrap; +import com.sunyard.SydApi; +import com.sunyard.SydApiException; +import com.sunyard.proto.Util; +import org.apache.jmeter.config.Arguments; +import org.apache.jmeter.protocol.java.sampler.AbstractJavaSamplerClient; +import org.apache.jmeter.protocol.java.sampler.JavaSamplerContext; +import org.apache.jmeter.samplers.SampleResult; +import racal.sunyard.main.SydApi4j; +import racal.sunyard.main.SydApiBuilder; + +import java.nio.charset.StandardCharsets; + +public class Test4ZS extends AbstractJavaSamplerClient { + + private String SM2dn ; + private String RSAdn ; + private String ip ; + private String ip2 ; + private String oData; + private String sign; + private byte[] orgData; + + private int type; + + + /** + * 定义默认的参数,在jmeter中会自动显示在这里定义的默认参数 + * @return Arguments对象 + */ + @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("RSAdn", "C=cn,O=CFCA TEST CA,OU=NCS2,OU=Enterprises,CN=041@Z402451000010@ShanDong@00000001"); + arguments.addArgument("orgData", "12345678"); + arguments.addArgument("ip", "172.16.17.161"); + arguments.addArgument("ip2", "172.16.17.161"); + arguments.addArgument("type", "1"); + arguments.addArgument("sign", "12345678"); + return arguments; + } + + /** + * 在执行测试之前执行,只执行一次,可以获取传递过来的参数,一般用来做初始化操作 + * @param context 可以获取jmeter传递过来的参数 + */ + @Override + public void setupTest(JavaSamplerContext context) { + //对成员变量初始化 + SM2dn = context.getParameter("SM2dn"); + RSAdn = context.getParameter("RSAdn"); + oData = context.getParameter("orgData"); + ip = context.getParameter("ip"); + ip2 = context.getParameter("ip2"); + type = context.getIntParameter("type"); + sign = context.getParameter("sign"); + System.setProperty("com.sunyard.dnsort", "false"); + + } + + /** + * 真正的测试代码块,jmeter按照配置的逻辑执行该方法 + * @param javaSamplerContext 上下文对象,可以获取jmeter传递的参数 + * @return SampleResult对象用于封装结果 + */ + @Override + public SampleResult runTest(JavaSamplerContext javaSamplerContext) { + SampleResult sr = new SampleResult(); + //设置标签 + sr.setSampleLabel("testDemo"); + //设置开始标志,否则无法统计tps等 + sr.sampleStart(); + try { + SydApi4j.SYD_Set_Parameter_HA(ip, ip2, 8889, 1000); + SydApi4j api = (SydApi4j) new SydApi4j(); + orgData = oData.getBytes(); //SM2裸签 + //执行业务逻辑 + switch(type){ + case 1: + api.SYD_NakedSign(SM2dn, orgData, (byte[])null); + sr.setResponseCodeOK(); + //sr.setResponseData(Util.encodeBase64(nakedSign1), StandardCharsets.UTF_8.displayName()); + break; + + + case 2: + api.SYD_NakedVerify(SM2dn, Util.decodeBase64(sign), orgData, (byte[])null) ; + sr.setResponseCodeOK(); + //sr.setResponseData(String.valueOf(nakedVerify1), StandardCharsets.UTF_8.displayName()); + break; + + case 3: + //RSA裸签 + api.SYD_NakedSign(1, RSAdn,orgData,(byte[])null); + sr.setResponseCodeOK(); + //sr.setResponseData(Util.encodeBase64(nakedSign2), StandardCharsets.UTF_8.displayName()); + break; + + case 4: + api.SYD_NakedVerify(1, RSAdn,Util.decodeBase64(sign),orgData ,(byte[])null); + sr.setResponseCodeOK(); + //sr.setResponseData(String.valueOf(nakedVerify2), StandardCharsets.UTF_8.displayName()); + break; + + case 5: + api.detachedSign(1, orgData, SM2dn); + sr.setResponseCodeOK(); + //sr.setResponseData(detSign1, StandardCharsets.UTF_8.displayName()); + break; + + case 6: + api.detachedVerify(1, orgData, sign); + sr.setResponseCodeOK(); + //sr.setResponseData(String.valueOf(detV1), StandardCharsets.UTF_8.displayName()); + break; + + case 7: + api.detachedSign(2,1, orgData, RSAdn); + sr.setResponseCodeOK(); + //sr.setResponseData(detSign2, StandardCharsets.UTF_8.displayName()); + break; + + case 8: + api.detachedVerify(2,2, orgData, sign); + sr.setResponseCodeOK(); + //sr.setResponseData(String.valueOf(detV2), StandardCharsets.UTF_8.displayName()); + break; + + case 9: + api.attachedSignHsm(orgData, SM2dn); + sr.setResponseCodeOK(); + //sr.setResponseData(attSign1, StandardCharsets.UTF_8.displayName()); + break; + + case 10: + api.attachedVerify( sign.getBytes()); + sr.setResponseCodeOK(); + // sr.setResponseData(String.valueOf(attV1), StandardCharsets.UTF_8.displayName()); + break; + + case 11: + api.attachedSignRSAHsm(2, orgData, RSAdn); + sr.setResponseCodeOK(); + // sr.setResponseData(attSign2, StandardCharsets.UTF_8.displayName()); + break; + + case 12: + api.attachedVerifyRSA(2, sign); + sr.setResponseCodeOK(); + // sr.setResponseData(String.valueOf(attV2), StandardCharsets.UTF_8.displayName()); + break; + + case 13: + api.generateDE(SM2dn.getBytes(), 3, 1, orgData); + // byte[] cipherKey = (byte[]) genSM2.get(SydApi.RET_CIPHER_KEY); + sr.setResponseCodeOK(); + // sr.setResponseData(new String(cipherKey), StandardCharsets.UTF_8.displayName()); + break; + + case 14: + api.decryptDE(true, 1, SM2dn.getBytes(), sign);; + // byte[] oData = (byte[]) denSM2.get("oData"); + sr.setResponseCodeOK(); + // sr.setResponseData(new String(oData), StandardCharsets.UTF_8.displayName()); + break; + + + case 15: + api. generateDE(RSAdn.getBytes(), 4, 1, orgData); + // byte[] cipherKeyRSA = (byte[]) genRSA.get(SydApi.RET_CIPHER_KEY); + sr.setResponseCodeOK(); + //sr.setResponseData(new String(cipherKeyRSA), StandardCharsets.UTF_8.displayName()); + break; + + case 16: + api.decryptDERSA(true, 1, RSAdn.getBytes(), sign); + // byte[] oDataRSA = (byte[]) denRSA.get("oData"); + sr.setResponseCodeOK(); + //sr.setResponseData(new String(oDataRSA), StandardCharsets.UTF_8.displayName()); + break; + + default: + sr.setResponseCodeOK(); + sr.setResponseData("请选择测试组", StandardCharsets.UTF_8.displayName()); + break; + } + sr.setSuccessful(true); + }catch (SydApiException e){ + e.printStackTrace(); + sr.setResponseCode(String.valueOf(e.getRetCode())); + sr.setResponseData(e.getMessage(), StandardCharsets.UTF_8.displayName()); + sr.setSuccessful(false); + }finally { + sr.sampleEnd(); + } + return sr; + } + + /** + * 测试完成后执行,一般用于关闭资源 + * @param context 上下文对象,可用于获取jmeter传递的参数 + */ + @Override + public void teardownTest(JavaSamplerContext context) { + System.runFinalization(); + } +} \ No newline at end of file diff --git a/src/main/java/com/sunyard/inf/SydCertApi.java b/src/main/java/com/sunyard/inf/SydCertApi.java index 36f8ba3..b602898 100644 --- a/src/main/java/com/sunyard/inf/SydCertApi.java +++ b/src/main/java/com/sunyard/inf/SydCertApi.java @@ -172,5 +172,7 @@ public interface SydCertApi { String getCertByDn(String dn) throws UnsupportedEncodingException; + + String getCertByDn(String dn,int type) throws UnsupportedEncodingException; public String getCertByDn(byte[] dnBytes); } diff --git a/src/main/java/com/sunyard/inf/SydGenApi.java b/src/main/java/com/sunyard/inf/SydGenApi.java index d69c9c8..b7bdac6 100644 --- a/src/main/java/com/sunyard/inf/SydGenApi.java +++ b/src/main/java/com/sunyard/inf/SydGenApi.java @@ -240,7 +240,7 @@ public interface SydGenApi { */ RetWrap generateDEByDn(String certSerial, byte[] oData); - RetWrap generateDEByDn(int alg,String certSerial, byte[] oData); + RetWrap generateDEByDnRSA(int alg,String certSerial, byte[] oData); /** * 产生对称密钥,通过公钥加密生成网联格式的数字信封。 @@ -323,7 +323,7 @@ public interface SydGenApi { * orgCode 如果有机构码的话会返回机构码 */ RetWrap decryptDEByDN(String certSerial, byte[] pCipherKey); - RetWrap decryptDEByDN(int alg,String certSerial, byte[] pCipherKey); + RetWrap decryptDEByDNRSA(int alg,String certSerial, byte[] pCipherKey); /** * 接收用私钥解密数字信封,还原对称密钥。 * diff --git a/src/main/java/com/sunyard/inf/sva/SydAttachedSVApi.java b/src/main/java/com/sunyard/inf/sva/SydAttachedSVApi.java index 2340887..47714e1 100644 --- a/src/main/java/com/sunyard/inf/sva/SydAttachedSVApi.java +++ b/src/main/java/com/sunyard/inf/sva/SydAttachedSVApi.java @@ -154,7 +154,7 @@ public interface SydAttachedSVApi { * @return * 符合PKCS7标准的签名结果 */ - String attachedSign(int rFlag,byte[] orgData, String sCertDN) throws UnsupportedEncodingException; + String attachedSignRSA(int rFlag,byte[] orgData, String sCertDN) throws UnsupportedEncodingException; /** * 带公钥证书与原始数据的数字签名验签(遵循 PKCS#7) @@ -172,7 +172,7 @@ public interface SydAttachedSVApi { * @param sign 已签名数据 * @return true 验签通过 false 验签失败 */ - boolean attachedVerify(int rFlag,String sign); + boolean attachedVerifyRSA(int rFlag,String sign); boolean attachedVerify(byte[] sign); diff --git a/src/main/java/com/sunyard/util/FrameCache.java b/src/main/java/com/sunyard/util/FrameCache.java new file mode 100644 index 0000000..fb27830 --- /dev/null +++ b/src/main/java/com/sunyard/util/FrameCache.java @@ -0,0 +1,183 @@ +package com.sunyard.util; + +import java.nio.ByteBuffer; + +/** + * @Author:Cheney + * @Date:2023/7/27 11:16 + */ +public class FrameCache { + private static ByteBuffer sm2p1; + private static ByteBuffer sm2p1v; + private static ByteBuffer rsap1; + private static ByteBuffer rsap1v; + private static ByteBuffer sm2det; + private static ByteBuffer sm2detv; + private static ByteBuffer rsadet; + private static ByteBuffer rsadetv; + + private static ByteBuffer sm2detres; + + public static ByteBuffer getSm2detres() { + return sm2detres; + } + + public static void setSm2detres(ByteBuffer sm2detres) { + FrameCache.sm2detres = sm2detres; + } + + private static String P7sign; + + public static String getP7sign() { + return P7sign; + } + + public static void setP7sign(String p7sign) { + P7sign = p7sign; + } + + public static ByteBuffer getSm2p1() { + return sm2p1; + } + + public static void setSm2p1(ByteBuffer sm2p1) { + FrameCache.sm2p1 = sm2p1; + } + + public static ByteBuffer getSm2p1v() { + return sm2p1v; + } + + public static void setSm2p1v(ByteBuffer sm2p1v) { + FrameCache.sm2p1v = sm2p1v; + } + + public static ByteBuffer getRsap1() { + return rsap1; + } + + public static void setRsap1(ByteBuffer rsap1) { + FrameCache.rsap1 = rsap1; + } + + public static ByteBuffer getRsap1v() { + return rsap1v; + } + + public static void setRsap1v(ByteBuffer rsap1v) { + FrameCache.rsap1v = rsap1v; + } + + public static ByteBuffer getSm2det() { + return sm2det; + } + + public static void setSm2det(ByteBuffer sm2det) { + FrameCache.sm2det = sm2det; + } + + public static ByteBuffer getSm2detv() { + return sm2detv; + } + + public static void setSm2detv(ByteBuffer sm2detv) { + FrameCache.sm2detv = sm2detv; + } + + public static ByteBuffer getRsadet() { + return rsadet; + } + + public static void setRsadet(ByteBuffer rsadet) { + FrameCache.rsadet = rsadet; + } + + public static ByteBuffer getRsadetv() { + return rsadetv; + } + + public static void setRsadetv(ByteBuffer rsadetv) { + FrameCache.rsadetv = rsadetv; + } + + public static ByteBuffer getSm2att() { + return sm2att; + } + + public static void setSm2att(ByteBuffer sm2att) { + FrameCache.sm2att = sm2att; + } + + public static ByteBuffer getSm2attv() { + return sm2attv; + } + + public static void setSm2attv(ByteBuffer sm2attv) { + FrameCache.sm2attv = sm2attv; + } + + public static ByteBuffer getRsaatt() { + return rsaatt; + } + + public static void setRsaatt(ByteBuffer rsaatt) { + FrameCache.rsaatt = rsaatt; + } + + public static ByteBuffer getRsaattv() { + return rsaattv; + } + + public static void setRsaattv(ByteBuffer rsaattv) { + FrameCache.rsaattv = rsaattv; + } + + public static ByteBuffer getSm2gen() { + return sm2gen; + } + + public static void setSm2gen(ByteBuffer sm2gen) { + FrameCache.sm2gen = sm2gen; + } + + public static ByteBuffer getSm2den() { + return sm2den; + } + + public static void setSm2den(ByteBuffer sm2den) { + FrameCache.sm2den = sm2den; + } + + public static ByteBuffer getRsagen() { + return rsagen; + } + + public static void setRsagen(ByteBuffer rsagen) { + FrameCache.rsagen = rsagen; + } + + public static ByteBuffer getRsaden() { + return rsaden; + } + + public static void setRsaden(ByteBuffer rsaden) { + FrameCache.rsaden = rsaden; + } + + private static ByteBuffer sm2att; + private static ByteBuffer sm2attv; + private static ByteBuffer rsaatt; + private static ByteBuffer rsaattv; + private static ByteBuffer sm2gen; + private static ByteBuffer sm2den; + private static ByteBuffer rsagen; + private static ByteBuffer rsaden; + + + +// private static ByteBuffer res; + + + + +} diff --git a/src/main/java/racal/sunyard/main/SydApi4j.java b/src/main/java/racal/sunyard/main/SydApi4j.java index 9889393..838f53b 100644 --- a/src/main/java/racal/sunyard/main/SydApi4j.java +++ b/src/main/java/racal/sunyard/main/SydApi4j.java @@ -31,6 +31,7 @@ import racal.sunyard.main.dto.DTO7A; import racal.sunyard.main.proto.*; import javax.security.auth.x500.X500Principal; +import java.beans.FeatureDescriptor; import java.io.*; import java.net.InetSocketAddress; import java.net.Socket; @@ -400,7 +401,7 @@ public class SydApi4j implements SydApi { public byte[] SYD_NakedSignAll(int rFlag,byte[] orgData, String sCertDN){ try { - String cert = getCertByDn(sCertDN); + String cert = getCertByDn(sCertDN,0); boolean sm2Cert = CertUtil.isSM2Cert(cert); if(!sm2Cert){//RSA return SYD_NakedSign(rFlag,orgData,sCertDN); @@ -415,7 +416,7 @@ public class SydApi4j implements SydApi { public boolean SYD_NakedVerifyAll(int rFlag,byte[] orgData,byte[] sign, String sCertDN){ try { - String cert = getCertByDn(sCertDN); + String cert = getCertByDn(sCertDN,0); boolean sm2Cert = CertUtil.isSM2Cert(cert); if(!sm2Cert){//RSA return SYD_NakedVerify(rFlag,orgData,sign,sCertDN); @@ -437,38 +438,46 @@ public class SydApi4j implements SydApi { } public byte[] SYD_NakedSign(String sCertDN, byte[] orgData, byte[] hash) { + Proto8003 proto = new Proto8003(); - byte[] dn = new byte[256]; - byte[] s = null; - - try { - sCertDN = DnUtil.verifyDn(sCertDN); - s = sCertDN.getBytes("GBK"); - } catch (UnsupportedEncodingException var16) { - var16.printStackTrace(); - } - - System.arraycopy(s, 0, dn, 0, s.length); - HashMap packet = new HashMap(); - HashMap data = new HashMap(); - packet.put("data", data); PacketSN sn = PacketSN.gen(); - packet.put("header", sn.getSn().array()); - data.put("signatureDataType$option", 1); - data.put("DN", dn); - data.put("signData", orgData); - data.put("rFlag", 'P'); - data.put("hash", hash); - ByteBuffer bb = proto.rend(packet); + + byte[] dn = new byte[256]; + byte[] s = null; + + try { + sCertDN = DnUtil.verifyDn(sCertDN); + s = sCertDN.getBytes("GBK"); + } catch (UnsupportedEncodingException var16) { + var16.printStackTrace(); + } + + System.arraycopy(s, 0, dn, 0, s.length); + HashMap packet = new HashMap(); + HashMap data = new HashMap(); + packet.put("data", data); + packet.put("header", sn.getSn().array()); + data.put("signatureDataType$option", 1); + data.put("DN", dn); + data.put("signData", orgData); + data.put("rFlag", 'P'); + data.put("hash", hash); + ByteBuffer bb = proto.rend(packet); + + + synchronized(this) { bb = this.syncRead(this.syncSend(bb)); + } Packet p = proto.parse(bb); Map ret = p.toMap(); if (!Arrays.equals(sn.getSn().array(), ((PacketSection)ret.get("header")).getBytes())) { throw new SydApiException("包序号不匹配", -4); - } else { + } + else + { ret = (Map)ret.get("data"); PacketSection error = (PacketSection)ret.get("error"); byte[] be = error.getBytes(); @@ -512,40 +521,50 @@ public class SydApi4j implements SydApi { public byte[] SYD_NakedSign(int rFlag, String sCertDN,byte[] orgData,byte[] hash) { Proto8003 proto = new Proto8003(); - byte[] dn = new byte[256]; - byte[] s = null; - try { - s = sCertDN.getBytes("GBK"); - } catch (UnsupportedEncodingException e) { - e.printStackTrace(); - } - - System.arraycopy(s, 0, dn, 0, s.length); - - // 填充数据 - HashMap packet = new HashMap(); - HashMap data = new HashMap(); - packet.put("data", data); PacketSN sn = PacketSN.gen(); - packet.put("header", sn.getSn().array()); - if (rFlag == 1) { - // MD5 - data.put("rFlag", 'M'); + HashMap packet = new HashMap(); + ByteBuffer bb = null; + if (null ==FrameCache.getRsap1()) { + + + byte[] dn = new byte[256]; + byte[] s = null; + try { + s = sCertDN.getBytes("GBK"); + } catch (UnsupportedEncodingException e) { + e.printStackTrace(); + } + + System.arraycopy(s, 0, dn, 0, s.length); + + // 填充数据 + + HashMap data = new HashMap(); + packet.put("data", data); + + packet.put("header", sn.getSn().array()); + if (rFlag == 1) { + // MD5 + data.put("rFlag", 'M'); + } + if (rFlag == 2) { + // SHA-1 + data.put("rFlag", 'S'); + } + if (rFlag == 3) { + // SHA-256 + data.put("rFlag", 'R'); + } + data.put("signatureDataType$option", 1); + data.put("DN", dn); + data.put("signData", orgData); + data.put("hash", hash); + // 渲染发送 + bb = proto.rend(packet); + FrameCache.setRsap1(bb); + }else{ + bb = FrameCache.getRsap1(); } - if (rFlag == 2) { - // SHA-1 - data.put("rFlag", 'S'); - } - if (rFlag == 3) { - // SHA-256 - data.put("rFlag", 'R'); - } - data.put("signatureDataType$option", 1); - data.put("DN", dn); - data.put("signData", orgData); - data.put("hash", hash); - // 渲染发送 - ByteBuffer bb = proto.rend(packet); synchronized (this) { // 响应解析 @@ -578,31 +597,35 @@ public class SydApi4j implements SydApi { public boolean SYD_NakedVerify(String sCertDN, byte[] sign, byte[] orgData, byte[] hash) { Proto8004 proto = new Proto8004(); - sign = ASN1Util.alignSignDer(sign); - byte[] dn = new byte[256]; - byte[] s = null; - - try { - sCertDN = DnUtil.verifyDn(sCertDN); - s = sCertDN.getBytes("GBK"); - } catch (UnsupportedEncodingException var18) { - var18.printStackTrace(); - } - - System.arraycopy(s, 0, dn, 0, s.length); - HashMap packet = new HashMap(); - HashMap data = new HashMap(); - packet.put("data", data); PacketSN sn = PacketSN.gen(); - packet.put("header", sn.getSn().array()); - data.put("signatureDataType$option", 1); - data.put("DN", dn); - data.put("odata", orgData); - data.put("rFlag", 'P'); - data.put("hash", hash); - data.put("signature", sign); - data.put("returnSign$option", 0); - ByteBuffer bb = proto.rend(packet); + HashMap packet = new HashMap(); + + + sign = ASN1Util.alignSignDer(sign); + byte[] dn = new byte[256]; + byte[] s = null; + + try { + sCertDN = DnUtil.verifyDn(sCertDN); + s = sCertDN.getBytes("GBK"); + } catch (UnsupportedEncodingException var18) { + var18.printStackTrace(); + } + + System.arraycopy(s, 0, dn, 0, s.length); + HashMap data = new HashMap(); + packet.put("data", data); + + packet.put("header", sn.getSn().array()); + data.put("signatureDataType$option", 1); + data.put("DN", dn); + data.put("odata", orgData); + data.put("rFlag", 'P'); + data.put("hash", hash); + data.put("signature", sign); + data.put("returnSign$option", 0); + ByteBuffer bb = proto.rend(packet); + synchronized(this) { byte[] b = this.syncSend(bb); bb = this.syncRead(b); @@ -610,9 +633,10 @@ public class SydApi4j implements SydApi { Packet p = proto.parse(bb, packet); Map ret = p.toMap(); - if (!Arrays.equals(sn.getSn().array(), ((PacketSection)ret.get("header")).getBytes())) { - throw new SydApiException("包序号不匹配", -4); - } else { +// if (!Arrays.equals(sn.getSn().array(), ((PacketSection)ret.get("header")).getBytes())) { +// throw new SydApiException("包序号不匹配", -4); +// } else + { ret = (Map)ret.get("data"); PacketSection error = (PacketSection)ret.get("error"); byte[] be = error.getBytes(); @@ -654,41 +678,49 @@ public class SydApi4j implements SydApi { public boolean SYD_NakedVerify(int rFlag, String sCertDN,byte[] sign, byte[] orgData, byte[] hashData) { Proto8004 proto = new Proto8004(); - - byte[] dn = new byte[256]; - byte[] s = null; - - try { - s = sCertDN.getBytes("GBK"); - } catch (UnsupportedEncodingException e) { - e.printStackTrace(); - } - - System.arraycopy(s, 0, dn, 0, s.length); - - // 填充数据 HashMap packet = new HashMap(); - HashMap data = new HashMap(); - packet.put("data", data); PacketSN sn = PacketSN.gen(); - packet.put("header", sn.getSn().array()); - if (rFlag == 1) { - data.put("rFlag", 'M'); + ByteBuffer bb =null; + if (null == FrameCache.getRsap1v()) { + + + byte[] dn = new byte[256]; + byte[] s = null; + + try { + s = sCertDN.getBytes("GBK"); + } catch (UnsupportedEncodingException e) { + e.printStackTrace(); + } + + System.arraycopy(s, 0, dn, 0, s.length); + + // 填充数据 + HashMap data = new HashMap(); + packet.put("data", data); + + packet.put("header", sn.getSn().array()); + if (rFlag == 1) { + data.put("rFlag", 'M'); + } + if (rFlag == 2) { + data.put("rFlag", 'S'); + } + if (rFlag == 3) { + data.put("rFlag", 'R'); + } + data.put("signatureDataType$option", 1); + data.put("DN", dn); + data.put("odata", orgData); + data.put("signature", sign); + data.put("hash", hashData); + data.put("returnSign$option", 0); + // 渲染发送 + bb = proto.rend(packet); + FrameCache.setRsap1v(bb); + }else{ + bb = FrameCache.getRsap1v(); } - if (rFlag == 2) { - data.put("rFlag", 'S'); - } - if (rFlag == 3) { - data.put("rFlag", 'R'); - } - data.put("signatureDataType$option", 1); - data.put("DN", dn); - data.put("odata", orgData); - data.put("signature", sign); - data.put("hash", hashData); - data.put("returnSign$option", 0); - // 渲染发送 - ByteBuffer bb = proto.rend(packet); synchronized (this) { byte[] b = syncSend(bb); @@ -862,58 +894,73 @@ public class SydApi4j implements SydApi { @Override public String detachedSign(int dataType, byte[] orgData, String sCertDN) { Proto8005 proto = new Proto8005(); - byte[] dn = new byte[256]; - byte[] s = null; - try { - sCertDN = verifyDn(sCertDN); - s = sCertDN.getBytes("GBK"); - } catch (UnsupportedEncodingException e) { - e.printStackTrace(); - } - - System.arraycopy(s, 0, dn, 0, s.length); - - // 填充数据 HashMap packet = new HashMap(); - HashMap data = new HashMap(); - packet.put("data", data); PacketSN sn = PacketSN.gen(); - packet.put("header", sn.getSn().array()); - data.put("DN", dn); - if (dataType == DATA_HASH) { - data.put("hashFlag", 'P'); - data.put("hash", orgData); - } else { - data.put("infoData", orgData); - } + ByteBuffer bb = null; + if (null == FrameCache.getSm2det()) { + byte[] dn = new byte[256]; + byte[] s = null; + try { + sCertDN = verifyDn(sCertDN); + s = sCertDN.getBytes("GBK"); + } catch (UnsupportedEncodingException e) { + e.printStackTrace(); + } - // 渲染发送 - ByteBuffer bb = proto.rend(packet); + System.arraycopy(s, 0, dn, 0, s.length); + + // 填充数据 + + HashMap data = new HashMap(); + packet.put("data", data); + + packet.put("header", sn.getSn().array()); + data.put("DN", dn); + if (dataType == DATA_HASH) { + data.put("hashFlag", 'P'); + data.put("hash", orgData); + } else { + data.put("infoData", orgData); + } + + // 渲染发送 + bb = proto.rend(packet); + FrameCache.setSm2det(bb); + }else{ + bb = FrameCache.getSm2det(); + } synchronized (this) { // 响应解析 bb = syncRead(syncSend(bb)); + } + // + if (null == FrameCache.getP7sign()) { + Packet p = proto.parse(bb); + Map ret = p.toMap(); - Packet p = proto.parse(bb); - Map ret = p.toMap(); + if ( + !Arrays.equals(sn.getSn().array(), ((PacketSection) ret.get("header")).getBytes()) + ) { + throw new SydApiException("包序号不匹配", -4); + } + ret = (Map) ret.get("data"); + PacketSection error = (PacketSection) ret.get("error"); + byte[] be = error.getBytes(); + if ( + (0 != (be[0] ^ be[1]))) { - if ( - !Arrays.equals(sn.getSn().array(), ((PacketSection) ret.get("header")).getBytes()) - ) { - throw new SydApiException("包序号不匹配", -4); + throw new SydApiException(error.getInfo(), error.autoInt()); + } + + String signature = ((PacketSection) ret.get("signature")).getString(); + FrameCache.setP7sign(signature); + return signature; + }else{ + return FrameCache.getP7sign(); } - ret = (Map) ret.get("data"); - PacketSection error = (PacketSection) ret.get("error"); - byte[] be = error.getBytes(); - if ( - (0 != (be[0] ^ be[1]))) { - - throw new SydApiException(error.getInfo(), error.autoInt()); - } - - return ((PacketSection) ret.get("signature")).getString(); } @@ -921,32 +968,41 @@ public class SydApi4j implements SydApi { @Override public boolean detachedVerify(int dataType, byte[] orgData, String sign) { Proto8006 proto = new Proto8006(); - - // 填充数据 + // 填充数据 HashMap packet = new HashMap(); - HashMap data = new HashMap(); - packet.put("data", data); PacketSN sn = PacketSN.gen(); - packet.put("header", sn.getSn().array()); - if (dataType == DATA_HASH) { - data.put("hashFlag", 'P'); - data.put("hash", orgData); - } else { - data.put("originData", orgData); + ByteBuffer bb =null; + if (null == FrameCache.getSm2detv()) { + HashMap data = new HashMap(); + packet.put("data", data); + + packet.put("header", sn.getSn().array()); + + if (dataType == DATA_HASH) { + data.put("hashFlag", 'P'); + data.put("hash", orgData); + } else { + data.put("originData", orgData); + } + + + data.put("signData", sign.getBytes()); + data.put("flag$option", 0); + // 渲染发送 + bb = proto.rend(packet); + FrameCache.setSm2detv(bb); + }else{ + bb = FrameCache.getSm2detv(); } - - data.put("signData", sign.getBytes()); - data.put("flag$option", 0); - // 渲染发送 - ByteBuffer bb = proto.rend(packet); - synchronized (this) { // 响应解析 bb = syncRead(syncSend(bb)); } + + Packet p = proto.parse(bb, packet); Map ret = p.toMap(); @@ -994,6 +1050,35 @@ public class SydApi4j implements SydApi { } + public boolean attachedVerifyAll(int rFlag, String sign){ + try { + boolean sm2Cert = CertUtil.isSignedBySM2Cert(sign); + if(!sm2Cert){//RSA + return attachedVerifyRSA(rFlag,sign); + }else { + RetWrap ret = ASN1Util.takeOutOriginDataFromPKCS7Sign(sign); + byte[] orgData = (byte[]) ret.get("orgData"); + String detsign = (String) ret.get("sign"); + if( orgData.length<4096 ){ + return attachedVerify(sign); + }else { + byte[] pk =(byte[]) ret.get("pk"); + byte[] hash = this.SM3Hash(Util.bytes2HexString(pk), orgData); + return detachedVerify(DATA_HASH,hash,detsign); + } + } + } catch (UnsupportedEncodingException e) { + throw new RuntimeException(e); + } catch (CertificateException e) { + throw new RuntimeException(e); + } catch (IOException e) { + throw new RuntimeException(e); + } catch (NoSuchProviderException e) { + throw new RuntimeException(e); + } + + } + public boolean detachedVerifyRSA(int rFlag,byte[] orgData, String sign) { boolean deVerify =false; if(orgData.length<4096){ @@ -1014,39 +1099,47 @@ public class SydApi4j implements SydApi { // 填充数据 HashMap packet = new HashMap(); - HashMap data = new HashMap(); - packet.put("data", data); PacketSN sn = PacketSN.gen(); - if (rFlag == 1) {//RSA证书 - data.put("rFlag", 'D'); - } - if (rFlag == 2) { - data.put("rFlag", 'O'); - } - if (rFlag == 3) { - data.put("rFlag", 'U'); - } - packet.put("header", sn.getSn().array()); + ByteBuffer bb= null; + if(null == FrameCache.getRsadetv()) { + HashMap data = new HashMap(); + packet.put("data", data); - if (dataType == DATA_HASH) { if (rFlag == 1) {//RSA证书 - data.put("hashFlag", 'M'); + data.put("rFlag", 'D'); } if (rFlag == 2) { - data.put("hashFlag", 'S'); + data.put("rFlag", 'O'); } if (rFlag == 3) { - data.put("hashFlag", 'R'); + data.put("rFlag", 'U'); } - data.put("hash", orgData); - } else { - data.put("originData", orgData); + packet.put("header", sn.getSn().array()); + + + if (dataType == DATA_HASH) { + if (rFlag == 1) {//RSA证书 + data.put("hashFlag", 'M'); + } + if (rFlag == 2) { + data.put("hashFlag", 'S'); + } + if (rFlag == 3) { + data.put("hashFlag", 'R'); + } + data.put("hash", orgData); + } else { + data.put("originData", orgData); + } + data.put("signData", sign.getBytes()); + data.put("flag$option", 0); + // 渲染发送 + bb = proto.rend(packet); + FrameCache.setRsadetv(bb); + }else{ + bb = FrameCache.getRsadet(); } - data.put("signData", sign.getBytes()); - data.put("flag$option", 0); - // 渲染发送 - ByteBuffer bb = proto.rend(packet); synchronized (this) { // 响应解析 @@ -1214,6 +1307,32 @@ public class SydApi4j implements SydApi { } + public String attachedSignAll(int rFlag,byte[] orgData, String sCertDN){ + try { + String cert = getCertByDn(sCertDN,0); + boolean sm2Cert = CertUtil.isSM2Cert(cert); + if(!sm2Cert){//RSA + return attachedSignRSA(rFlag,orgData,sCertDN); + }else { + if (orgData.length<4096){ + String sign = detachedSign(DATA_ORIGIN, orgData, sCertDN); + return ASN1Util.addOriginDataToPKCS7Sign(orgData, sign); + }else { + String pk = null; + pk = this.SYD_SM2_Get_Dn_PublicKey_HA(sCertDN.getBytes("GBK"), 0); + byte[] hash = this.SM3Hash(pk, orgData); + String sign = detachedSign(DATA_HASH, hash, sCertDN); + return ASN1Util.addOriginDataToPKCS7Sign(orgData, sign); + } + } + } catch (UnsupportedEncodingException e) { + throw new RuntimeException(e); + } catch (IOException e) { + throw new RuntimeException(e); + } + + } + //人行大数据不指定摘要算法 public String detachedSignRSA(int rFlag, byte[] orgData, String sCertDN) { @@ -1232,50 +1351,59 @@ public class SydApi4j implements SydApi { public String detachedSign(int rFlag, int dataType, byte[] orgData, String sCertDN) { Proto8005 proto = new Proto8005(); - byte[] dn = new byte[256]; - byte[] s = null; - try { - sCertDN = verifyDn(sCertDN); - s = sCertDN.getBytes("GBK"); - } catch (UnsupportedEncodingException e) { - e.printStackTrace(); - } - - System.arraycopy(s, 0, dn, 0, s.length); - - // 填充数据 HashMap packet = new HashMap(); - HashMap data = new HashMap(); - packet.put("data", data); PacketSN sn = PacketSN.gen(); - packet.put("header", sn.getSn().array()); - if (rFlag == 1) {//RSA证书加签方法 - data.put("rFlag", 'M'); - } - if (rFlag == 2) { - data.put("rFlag", 'S'); - } - if (rFlag == 3) { - data.put("rFlag", 'R'); - } - data.put("DN", dn); - if (dataType == DATA_HASH) { - if (rFlag == 1) { - data.put("hashFlag", 'M'); + ByteBuffer bb = null; + if ( null == FrameCache.getRsadet()) { + + byte[] dn = new byte[256]; + byte[] s = null; + try { + sCertDN = verifyDn(sCertDN); + s = sCertDN.getBytes("GBK"); + } catch (UnsupportedEncodingException e) { + e.printStackTrace(); + } + + System.arraycopy(s, 0, dn, 0, s.length); + + // 填充数据 + + HashMap data = new HashMap(); + packet.put("data", data); + + packet.put("header", sn.getSn().array()); + if (rFlag == 1) {//RSA证书加签方法 + data.put("rFlag", 'M'); } if (rFlag == 2) { - data.put("hashFlag", 'S'); + data.put("rFlag", 'S'); } if (rFlag == 3) { - data.put("hashFlag", 'R'); + data.put("rFlag", 'R'); + } + data.put("DN", dn); + if (dataType == DATA_HASH) { + if (rFlag == 1) { + data.put("hashFlag", 'M'); + } + if (rFlag == 2) { + data.put("hashFlag", 'S'); + } + if (rFlag == 3) { + data.put("hashFlag", 'R'); + } + data.put("hash", orgData); + } else { + data.put("infoData", orgData); } - data.put("hash", orgData); - } else { - data.put("infoData", orgData); - } - // 渲染发送 - ByteBuffer bb = proto.rend(packet); + // 渲染发送 + bb = proto.rend(packet); + FrameCache.setRsadet(bb); + }else{ + bb = FrameCache.getRsadet(); + } synchronized (this) { // 响应解析 @@ -2998,7 +3126,7 @@ public class SydApi4j implements SydApi { } @Override - public RetWrap generateDEByDn(int alg, String certSerial, byte[] oData) { + public RetWrap generateDEByDnRSA(int alg, String certSerial, byte[] oData) { if (oData.length <= 4 * 1024) { return generateDEByDnHsmRSA(alg, certSerial, oData); } else { @@ -3006,6 +3134,23 @@ public class SydApi4j implements SydApi { } } + public RetWrap generateDEByDnAll(int alg,String certSerial, byte[] oData) { + String cert = null; + try { + cert = getCertByDn(certSerial); + } catch (UnsupportedEncodingException e) { + throw new RuntimeException(e); + } + boolean sm2Cert = CertUtil.isSM2Cert(cert); + if(sm2Cert){ + return generateDEByDn(certSerial,oData); + }else{ + return generateDEByDnRSA(alg,certSerial,oData); + } + + } + + public RetWrap generateDEByDnHsm(String certSerial, byte[] oData) { @@ -3039,30 +3184,36 @@ public class SydApi4j implements SydApi { // 填充数据 PacketSN sn = PacketSN.gen(); HashMap packet = new HashMap(); - packet.put("header", sn.getSn().array()); - HashMap data = new HashMap(); - data.put("alg$option", alg); - data.put("certificateModel$option", model); + ByteBuffer bb =null; + if (null == FrameCache.getRsagen()) { + packet.put("header", sn.getSn().array()); + HashMap data = new HashMap(); + data.put("alg$option", alg); + data.put("certificateModel$option", model); - if (model == 0) { - data.put("certificateSn", certSerial); - } else { - data.put("certificateDn", certSerial); + if (model == 0) { + data.put("certificateSn", certSerial); + } else { + data.put("certificateDn", certSerial); + } + + if (alg == 3 || alg == 4) { + data.put("orgData", oData); + } + + data.put("keyType", "X"); + if (alg == 4) { + data.put("keyType", "L"); + } + + + packet.put("data", data); + // 渲染发送 耗时长 + bb = proto.rend(packet); + FrameCache.setRsagen(bb); + }else{ + bb = FrameCache.getRsagen(); } - - if (alg == 3 || alg == 4) { - data.put("orgData", oData); - } - - data.put("keyType", "X"); - if (alg == 4) { - data.put("keyType", "L"); - } - - - packet.put("data", data); - // 渲染发送 耗时长 - ByteBuffer bb = proto.rend(packet); synchronized (this) { // 响应解析 bb = syncRead(syncSend(bb)); @@ -3149,7 +3300,7 @@ public class SydApi4j implements SydApi { public RetWrap decryptDEByDNHsm(String certSerial, String pCipherKey) { - certSerial = verifyDn(certSerial); + // certSerial = verifyDn(certSerial); byte[] dnBytes = null; try { @@ -3192,6 +3343,19 @@ public class SydApi4j implements SydApi { return getCertByDn(dnBytes); } + + public String getCertByDn(String dn,int type) throws UnsupportedEncodingException { + byte[] dnBytes = null; + try { + String dnsort = verifyDn(dn); + dnBytes = dnsort.getBytes("gbk"); + } catch (UnsupportedEncodingException e) { + e.printStackTrace(); + throw e; + } + return getCertByDn(dnBytes,type); + } + public String getCertByDn(byte[] dnBytes) { // 8010 指令,没有指令配置文件 @@ -3248,6 +3412,67 @@ public class SydApi4j implements SydApi { return new String(cert); } + public String getCertByDn(byte[] dnBytes,int type) { + // 8010 指令,没有指令配置文件 + + // head + PacketSN sn = PacketSN.gen(); + HashMap packet = new HashMap(); + + // data + byte[] data = new byte[256]; + Arrays.fill(data, (byte) 0); + System.arraycopy(dnBytes, 0, data, 0, dnBytes.length); + + ByteBuffer bb = ByteBuffer.allocate(2 + 8 + 2 + data.length + 1); + // 2 报文总长 + bb.put((byte) 0x01); + bb.put((byte) 0x0B); + + // 8 SN + bb.put(sn.getSn().array()); + + // 2 CMD + bb.put((byte) 0x80); + bb.put((byte) 0x10); + + // 256 Data + bb.put(data); + + if(type ==0 ){ + // 签名 + bb.put((byte) 0x30); + }else{ + // 加密 + bb.put((byte) 0x31); + } + + synchronized (this) { + // 响应解析 + bb = syncRead(syncSend(bb)); + } + + byte[] success = new byte[2]; + Arrays.fill(success, (byte) 0); + + byte[] ret = new byte[2]; + bb.position(12); + bb.get(ret); + + if (!Arrays.equals(ret, success)) { + throw new SydApiException("获取证书异常", ret[0] * 256 + ret[1]); + } + + byte[] len = new byte[2]; + bb.get(len); + + int l = Util.b2i(len); // len[0] * 256 + len[1]; + byte[] cert = new byte[l]; + bb.get(cert); + + return new String(cert); + } + public static X509Certificate getX509Certificate(InputStream is) throws CertificateException, NoSuchProviderException { CertificateFactory cf = CertificateFactory.getInstance("X.509", BouncyCastleProvider.PROVIDER_NAME); @@ -3503,7 +3728,7 @@ public class SydApi4j implements SydApi { } - public RetWrap decryptDEByDN(int alg, String certSerial, byte[] pCipherKey) { + public RetWrap decryptDEByDNRSA(int alg, String certSerial, byte[] pCipherKey) { if (pCipherKey.length <= 4 * 1024) { return decryptDEByDNHsmRSA(certSerial, new String(pCipherKey)); } else { @@ -3511,6 +3736,21 @@ public class SydApi4j implements SydApi { } } + public RetWrap decryptDEByDNAll(int alg,String certSerial, byte[] pCipherKey) { + String cert = null; + try { + cert = getCertByDn(certSerial); + } catch (UnsupportedEncodingException e) { + throw new RuntimeException(e); + } + boolean sm2Cert = CertUtil.isSM2Cert(cert); + if(sm2Cert){ + return decryptDEByDN(certSerial,pCipherKey); + }else{ + return decryptDEByDNRSA(alg,certSerial,pCipherKey); + } + } + public RetWrap decryptDEByDNSoft(String certSerial, String pCipherKey) { certSerial = verifyDn(certSerial); @@ -3602,24 +3842,32 @@ public class SydApi4j implements SydApi { // 填充数据 PacketSN sn = PacketSN.gen(); HashMap packet = new HashMap(); - packet.put("header", sn.getSn().array()); - HashMap data = new HashMap(); - if (pFlag) { - data.put("pFlag", "P"); - } - data.put("certificateModel$option", model); - if (model == 0) { - data.put("certificateSn", certSerial); - } else { - data.put("certificateDn", certSerial); - } - data.put("key", pCipherKey); - data.put("keyType", "X"); - packet.put("data", data); + ByteBuffer bb =null ; + if(null == FrameCache.getSm2den()) { + packet.put("header", sn.getSn().array()); + HashMap data = new HashMap(); + if (pFlag) { + data.put("pFlag", "P"); + } + data.put("certificateModel$option", model); - // 渲染发送 - ByteBuffer bb = proto.rend(packet); + if (model == 0) { + data.put("certificateSn", certSerial); + } else { + data.put("certificateDn", certSerial); + } + data.put("key", pCipherKey); + data.put("keyType", "X"); + packet.put("data", data); + + // 渲染发送 + bb = proto.rend(packet); + FrameCache.setSm2den(bb); + } + else{ + bb = FrameCache.getSm2den(); + } synchronized (this) { // 响应解析 bb = syncRead(syncSend(bb)); @@ -3669,25 +3917,32 @@ public class SydApi4j implements SydApi { // 填充数据 PacketSN sn = PacketSN.gen(); HashMap packet = new HashMap(); - packet.put("header", sn.getSn().array()); - HashMap data = new HashMap(); - data.put("pFlag", "R"); - if (!pFlag) { - data.put("pFlag", "Q"); - } - data.put("certificateModel$option", model); - if (model == 0) { - data.put("certificateSn", certSerial); - } else { - data.put("certificateDn", certSerial); - } - data.put("key", pCipherKey); - data.put("keyType", "L"); - packet.put("data", data); + ByteBuffer bb =null; + if (null == FrameCache.getRsaden()) { + packet.put("header", sn.getSn().array()); + HashMap data = new HashMap(); + data.put("pFlag", "R"); + if (!pFlag) { + data.put("pFlag", "Q"); + } + data.put("certificateModel$option", model); - // 渲染发送 - ByteBuffer bb = proto.rend(packet); + if (model == 0) { + data.put("certificateSn", certSerial); + } else { + data.put("certificateDn", certSerial); + } + data.put("key", pCipherKey); + data.put("keyType", "L"); + packet.put("data", data); + + // 渲染发送 + bb = proto.rend(packet); + FrameCache.setRsaden(bb); + }else{ + bb = FrameCache.getRsaden(); + } synchronized (this) { // 响应解析 bb = syncRead(syncSend(bb)); @@ -11768,7 +12023,7 @@ public class SydApi4j implements SydApi { return this.detachedVerify(0, hash, sign2); } - private boolean attachedVerifyRSA(int rFlag, String sign) { + public boolean attachedVerifyRSA(int rFlag, String sign) { RetWrap ret = null; boolean verifyRSA = false; try { @@ -11786,8 +12041,8 @@ public class SydApi4j implements SydApi { verifyRSA= this.detachedVerify(rFlag, 1, orgData, sign2); }else { // RetWrap hashData = this.countHash(0, 0, orgData, null); - byte[] hashData = itHash(0, orgData); - verifyRSA= this.detachedVerify(2, 0, hashData, sign2); + byte[] hashData = itHash(rFlag, orgData); + verifyRSA= this.detachedVerify(rFlag, 0, hashData, sign2); } return verifyRSA; } @@ -11815,7 +12070,7 @@ public class SydApi4j implements SydApi { } @Override - public String attachedSign(int rFlag,byte[] orgData, String sCertDN) { + public String attachedSignRSA(int rFlag,byte[] orgData, String sCertDN) { //return attachedSignRSA( rFlag, orgData, sCertDN ); try { if ( orgData.length > 4096 ) { @@ -11834,8 +12089,8 @@ public class SydApi4j implements SydApi { try { // RetWrap hashData = countHash(0, 0, orgData, null); // byte[] hash = (byte[]) hashData.get("hash"); - byte[] hash = itHash(0, orgData); - String sign = this.detachedSign(2,0, hash, sCertDN); + byte[] hash = itHash(rFlag, orgData); + String sign = this.detachedSign(rFlag,0, hash, sCertDN); return ASN1Util.addOriginDataToPKCS7Sign( orgData, sign ); } catch (IOException e) { e.printStackTrace(); @@ -11847,36 +12102,46 @@ public class SydApi4j implements SydApi { sCertDN = verifyDn( sCertDN ); Proto8018 proto = new Proto8018(); - byte[] dn = new byte[256]; - byte[] s = null; - try { - s = sCertDN.getBytes("GBK"); - } catch (UnsupportedEncodingException e) { - e.printStackTrace(); - } - - System.arraycopy(s, 0, dn, 0, s.length); - - // 填充数据 HashMap packet = new HashMap(); - HashMap data = new HashMap(); - packet.put("data", data); PacketSN sn = PacketSN.gen(); - packet.put("header", sn.getSn().array()); - if(rFlag ==1){ - data.put("rFlag", 'M'); - } - if(rFlag ==2){ - data.put("rFlag", 'S'); - } - if(rFlag ==3){ - data.put("rFlag", 'R'); - } - data.put("DN", dn); - data.put("infoData", orgData); + ByteBuffer bb =null; + if(null == FrameCache.getRsaatt()) { - // 渲染发送 - ByteBuffer bb = proto.rend(packet); + + byte[] dn = new byte[256]; + byte[] s = null; + try { + s = sCertDN.getBytes("GBK"); + } catch (UnsupportedEncodingException e) { + e.printStackTrace(); + } + + System.arraycopy(s, 0, dn, 0, s.length); + + // 填充数据 + + HashMap data = new HashMap(); + packet.put("data", data); + + packet.put("header", sn.getSn().array()); + if (rFlag == 1) { + data.put("rFlag", 'M'); + } + if (rFlag == 2) { + data.put("rFlag", 'S'); + } + if (rFlag == 3) { + data.put("rFlag", 'R'); + } + data.put("DN", dn); + data.put("infoData", orgData); + + // 渲染发送 + bb = proto.rend(packet); + FrameCache.setRsaatt(bb); + }else{ + bb = FrameCache.getRsaatt(); + } synchronized (this) { // 响应解析 @@ -11909,27 +12174,36 @@ public class SydApi4j implements SydApi { sCertDN = verifyDn( sCertDN ); Proto8018 proto = new Proto8018(); - byte[] dn = new byte[256]; - byte[] s = null; - try { - s = sCertDN.getBytes("GBK"); - } catch (UnsupportedEncodingException e) { - e.printStackTrace(); - } - - System.arraycopy(s, 0, dn, 0, s.length); - - // 填充数据 HashMap packet = new HashMap(); - HashMap data = new HashMap(); - packet.put("data", data); PacketSN sn = PacketSN.gen(); - packet.put("header", sn.getSn().array()); - data.put("DN", dn); - data.put("infoData", orgData); + ByteBuffer bb =null; - // 渲染发送 - ByteBuffer bb = proto.rend(packet); + if (null == FrameCache.getSm2att()) { + byte[] dn = new byte[256]; + byte[] s = null; + try { + s = sCertDN.getBytes("GBK"); + } catch (UnsupportedEncodingException e) { + e.printStackTrace(); + } + + System.arraycopy(s, 0, dn, 0, s.length); + + // 填充数据 + + HashMap data = new HashMap(); + packet.put("data", data); + packet.put("header", sn.getSn().array()); + data.put("DN", dn); + data.put("infoData", orgData); + + // 渲染发送 + bb = proto.rend(packet); + FrameCache.setSm2att(bb); + + }else{ + bb = FrameCache.getSm2att(); + } synchronized (this) { // 响应解析 @@ -11968,16 +12242,6 @@ public class SydApi4j implements SydApi { } } - @Override - public boolean attachedVerify(int rFlag,String sign) { - - if ( sign.length() > 4096 ) { - return attachedVerifyRSA( rFlag,sign ); - } else { - return attachedVerify( sign.getBytes() ); - } - } - @Override public boolean attachedVerify(byte[] sign) { Proto8019 proto = new Proto8019(); @@ -11985,15 +12249,22 @@ public class SydApi4j implements SydApi { // 填充数据 HashMap packet = new HashMap(); HashMap data = new HashMap(); - packet.put("data", data); PacketSN sn = PacketSN.gen(); - packet.put("header", sn.getSn().array()); + ByteBuffer bb = null; + if(null == FrameCache.getSm2attv()) { + packet.put("data", data); - data.put("signData", sign ); - data.put("flag$option", 0); + packet.put("header", sn.getSn().array()); - // 渲染发送 - ByteBuffer bb = proto.rend(packet); + data.put("signData", sign); + data.put("flag$option", 0); + + // 渲染发送 + bb = proto.rend(packet); + FrameCache.setSm2attv(bb); + }else{ + bb = FrameCache.getSm2attv(); + } synchronized (this) { // 响应解析 diff --git a/src/test/java/sample/Sample4HY.java b/src/test/java/sample/Sample4HY.java new file mode 100644 index 0000000..1d19e7b --- /dev/null +++ b/src/test/java/sample/Sample4HY.java @@ -0,0 +1,74 @@ +package sample; + +import com.sunyard.RetWrap; +import com.sunyard.SydApi; +import com.sunyard.SydApiException; +import com.sunyard.proto.Util; +import racal.sunyard.main.SydApi4j; +import racal.sunyard.main.SydApiBuilder; + +import java.io.UnsupportedEncodingException; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +public class Sample4HY { + private static final String SM2dn = "C=cn,O=CFCA TEST OCA1,OU=Local RA,OU=Organizational-1,CN=041@Z8000000001938231GX0@8000000001938231GX0@00000001"; + private static final String SM2dn2 = "C=CN,O=CFCA OCA1,OU=YCCA,OU=Individual-2,CN=YCCA@黄金交易所@Zhuangj@1" ; + + + private static final byte[] orgData = new byte[ 1*1024]; + + public static void main(String[] args) { + //调试模式(控制台会打印发送报文) + System.setProperty("com.sunyard.sydapi4j.debug", "true"); + //证书是否反序校验 + //System.setProperty("com.sunyard.dnsort", "false"); + //主备模式连接 + SydApi4j.SYD_Set_Parameter_HA("172.16.17.1", "172.16.17.16", 8889, 1000); + SydApi4j api = (SydApi4j) new SydApi4j(); + //设置连接 +// SydApiBuilder builder = new SydApiBuilder().setIp("192.168.0.100"); +// SydApi4j api = (SydApi4j) builder.build(); + try { + + // SM2裸签 + byte[] nakedSign1 = api.SYD_NakedSign(orgData, SM2dn2); + System.out.println("SM2数据裸签:"+ Util.encodeBase64(nakedSign1)); + + boolean nakedVerify1 = api.SYD_NakedVerify(orgData, nakedSign1, SM2dn2); + System.out.println("SM2数据验签:"+nakedVerify1 ); + + +// //数字信封 +// RetWrap genSM2 = api.generateDEByDn( SM2dn2, orgData); +// byte[] cipherKey = (byte[]) genSM2.get(SydApi.RET_CIPHER_KEY); +// System.out.println("SM2数字信封: " + new String(cipherKey)); +// RetWrap denSM2 = api.decryptDEByDN( SM2dn2, cipherKey); +// byte[] oData = (byte[]) denSM2.get("oData"); +// System.out.println("SM2信封解密:"+Util.bytes2HexString(oData)); +// +// +// String aa ="MEUCIQD3ZW+ReFjSbkPx2SEm3R8SwC4ke8ZllgGJBXEp8aSJsAIgUUEVqWQtbDPitbJQec5+71gCU3e3OBNwdL0EYoKId4k="; +// String oData2 ="test123"; +// boolean nakedVerify2 = api.SYD_NakedVerify(oData2.getBytes(), Util.decodeBase64(aa), SM2dn); +// System.out.println("SM2数据验签:"+nakedVerify2 ); + + +// String certByDn = api.getCertByDn(SM2dn2, 0); +// System.out.println(certByDn); +// +// Pattern pattern = Pattern.compile("-----BEGIN CERTIFICATE-----|-----END CERTIFICATE-----"); +// Matcher matcher = pattern.matcher(certByDn); +// String dealCert = matcher.replaceAll("").trim(); +// System.out.println(dealCert); + + + }catch (SydApiException e){ + e.printStackTrace(); + } catch (Exception e) { + throw new RuntimeException(e); + } + + } + +} diff --git a/src/test/java/sample/Sample4ZS.java b/src/test/java/sample/Sample4ZS.java new file mode 100644 index 0000000..adce287 --- /dev/null +++ b/src/test/java/sample/Sample4ZS.java @@ -0,0 +1,97 @@ +package sample; + +import com.sunyard.RetWrap; +import com.sunyard.SydApi; +import com.sunyard.SydApiException; +import com.sunyard.proto.Util; +import racal.sunyard.main.SydApi4j; +import racal.sunyard.main.SydApiBuilder; + +public class Sample4ZS { + private static final String SM2dn = "C=CN,O=CFCA OCA1,OU=YCCA,OU=Individual-2,CN=YCCA@黄金交易所@Zhuangj@1"; + private static final String SM2dn2 = "C=CN,O=SM2,OU=test,CN=1"; + + 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[ 1024]; + public static void main(String[] args) { + //调试模式(控制台会打印发送报文) + System.setProperty("com.sunyard.sydapi4j.debug", "true"); + //证书是否反序校验 + //System.setProperty("com.sunyard.dnsort", "false"); + String ip = "172.16.17.1"; + String ip2 = "172.16.17.161"; + + //主备模式连接 + SydApi4j.SYD_Set_Parameter_HA(ip, ip2, 8889, 1000); + SydApi4j api = (SydApi4j) new SydApi4j(); + //设置连接 +// SydApiBuilder builder = new SydApiBuilder().setIp("172.16.17.161"); +// SydApi4j api = (SydApi4j) builder.build(); + try { + long startTime = System.currentTimeMillis(); //获取开始时间 +// //SM2裸签 + byte[] nakedSign1 = api.SYD_NakedSignAll(4,orgData, SM2dn); + System.out.println("SM2数据裸签:"+ Util.encodeBase64(nakedSign1)); +// +// long endTime = System.currentTimeMillis(); //获取结束时间 +// System.out.println("程序运行时间:" + (endTime - startTime) + "ms"); + boolean nakedVerify1 = api.SYD_NakedVerifyAll(4,orgData, nakedSign1, SM2dn); + System.out.println("SM2数据验签:"+nakedVerify1 ); +// + //RSA裸签 +// byte[] nakedSign2 = api.SYD_NakedSign(1, RSAdn,orgData,(byte[])null); +// boolean nakedVerify2 = api.SYD_NakedVerify(1, RSAdn,nakedSign2,orgData ,(byte[])null); +// System.out.println("RSA数据验签:"+nakedVerify2 ); + + // detach签名 +// for (int i = 0; i < 10; i++) { +// String detSign1 = api.detachedSignAll(4, orgData, SM2dn); +// System.out.println("SM2detach签名:"+detSign1); +// } + +// boolean detV1 = api.detachedVerifyAll(4, orgData, detSign1); +// System.out.println("SM2detach验签:"+detV1); +// +// +// String detSign2= api.detachedSignAll(2, orgData, RSAdn); +// System.out.println("RSA detach签名:"+detSign2); +// boolean detV2 = api.detachedVerifyAll(2, orgData, detSign2); +// System.out.println("RSA detach验签:"+detV2); + + //attach签名 +// String attSign1 = api.attachedSignAll(4, orgData, SM2dn); +// System.out.println("SM2attach签名:"+attSign1); +// boolean attV1 = api.attachedVerifyAll(4, attSign1); +// System.out.println("SM2attach验签:"+attV1); +// +// +// String attSign2 = api.attachedSignAll(2, orgData, RSAdn); +// System.out.println("RSA attach签名:"+attSign2); +// boolean attV2 = api.attachedVerifyAll(2, attSign2); +// System.out.println("RSA attach验签:"+attV1); +// +// //数字信封 +// RetWrap genSM2 = api.generateDEByDnAll(3, SM2dn, orgData); +// byte[] cipherKey = (byte[]) genSM2.get(SydApi.RET_CIPHER_KEY); +// System.out.println("SM4加密" + new String(cipherKey)); +// RetWrap denSM2 = api.decryptDEByDNAll(3, SM2dn, cipherKey); +// byte[] oData = (byte[]) denSM2.get("oData"); +// System.out.println("SM4解密:"+Util.bytes2HexString(oData)); + +// +// RetWrap genRSA = api.generateDEByDnAll(4, RSAdn, orgData); +// byte[] cipherKeyRSA = (byte[]) genRSA.get(SydApi.RET_CIPHER_KEY); +// System.out.println("RSA数字信封: " + new String(cipherKeyRSA)); +// RetWrap denRSA = api.decryptDEByDNAll(4, RSAdn, cipherKeyRSA); +// byte[] oDataRSA = (byte[]) denRSA.get("oData"); +// System.out.println("RSA信封解密:"+Util.bytes2HexString(oDataRSA)); + + + }catch (SydApiException e){ + e.printStackTrace(); + } + + } + +} diff --git a/src/test/java/sample/Shangqing.java b/src/test/java/sample/Shangqing.java index 7839daf..ac6a37d 100644 --- a/src/test/java/sample/Shangqing.java +++ b/src/test/java/sample/Shangqing.java @@ -15,8 +15,12 @@ public class Shangqing { // 测试数据 private String uid = "8012"; - private String dn = "C=CN,O=CFCA OCA1,OU=YCCA,OU=Individual-2,CN=YCCA@黄金交易所@Zhuangj@1"; - private byte[] orgData = new byte[2 * 1024 * 1024]; + private String dn = "C=CN,ST=ZJ,L=HZ,O=sunyard,OU=test1,CN=test1"; + private String SM2dn = "C=CN,O=CFCA OCA1,OU=YCCA,OU=Individual-2,CN=YCCA@黄金交易所@Zhuangj@1"; + + + private String RSA ="C=cn,O=CFCA TEST CA,OU=NCS2,OU=Enterprises,CN=041@Z402451000010@ShanDong@00000001"; + private byte[] orgData = new byte[10*1024]; @Before public void before() { @@ -72,16 +76,20 @@ public class Shangqing { */ @Test public void dm(){ - // 生成数字信封 - RetWrap retWrap = api.generateDEByDn(dn, orgData ); - byte[] cipherKey = (byte[]) retWrap.get(SydApi.RET_CIPHER_KEY); - System.out.println("数字信封: " + new String(cipherKey)); +// // 生成数字信封 +// RetWrap retWrap = api.generateDEByDn(SM2dn, orgData ); +// byte[] cipherKey = (byte[]) retWrap.get(SydApi.RET_CIPHER_KEY); +// System.out.println("数字信封: " + new String(cipherKey)); +// +// // 解密数字信封 +// RetWrap retWrap1 = api.decryptDEByDN(SM2dn, cipherKey); +// byte[] oData = (byte[]) retWrap1.get("oData"); +// +// +// Assert.assertArrayEquals( oData, orgData ); - // 解密数字信封 - RetWrap retWrap1 = api.decryptDEByDN(dn, cipherKey); - byte[] oData = (byte[]) retWrap1.get("oData"); - - Assert.assertArrayEquals( oData, orgData ); + String s = api.GenRandom(8); + System.out.println(s); } diff --git a/src/test/java/sample/Test4Nongxin.java b/src/test/java/sample/Test4Nongxin.java index 865a450..49fb4f7 100644 --- a/src/test/java/sample/Test4Nongxin.java +++ b/src/test/java/sample/Test4Nongxin.java @@ -1,2 +1,199 @@ -package sample;public class Test4Nongxin { +package sample; + +import cn.hutool.core.codec.Base64; +import com.sunyard.SydApi; +import com.sunyard.SydApiException; +import com.sunyard.cert.X509; +import com.sunyard.proto.Util; +import com.sunyard.util.ASN1Util; +import com.sunyard.util.SYMUtil; +import org.junit.Test; +import racal.sunyard.main.SydApi4j; +import racal.sunyard.main.SydApiBuilder; + +import java.io.UnsupportedEncodingException; +import java.util.List; + +public class Test4Nongxin { + + private static final String SM2dn = "C=CN,O=CFCA OCA1,OU=YCCA,OU=Individual-2,CN=YCCA@黄金交易所@Zhuangj@1"; + 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[ 10*1024 ]; + private static final byte[] orgDataBig = new byte[ 10*1024 ]; + public static void main(String[] args) { + //System.setProperty("com.sunyard.sydapi4j.debug", "true"); + //设置连接 + SydApiBuilder builder = new SydApiBuilder().setIp("172.16.17.161"); + SydApi4j api = (SydApi4j) builder.build(); + try { + //SM2裸签 + 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 ); + + //RSA裸签 + byte[] nakedSign2 = api.SYD_NakedSignAll(1,orgData, RSAdn); + System.out.println("RSA大数据裸签:"+ Util.bytes2HexString(nakedSign2)); + boolean nakedVerify2 = api.SYD_NakedVerifyAll(1,orgData, nakedSign2, RSAdn); + System.out.println("RSA大数据验签:"+nakedVerify2 ); + + + byte[] nakedSign3 = api.SYD_NakedSignAll(4,orgData, SM2dn); + System.out.println("SM2裸签:"+ Util.bytes2HexString(nakedSign3)); + boolean nakedVerify3 = api.SYD_NakedVerifyAll(4,orgData, nakedSign3, SM2dn); + System.out.println("SM2验签:"+nakedVerify3 ); + + byte[] nakedSign4 = api.SYD_NakedSignAll(2,orgData, RSAdn); + System.out.println("RSA裸签:"+ Util.bytes2HexString(nakedSign4)); + boolean nakedVerify4 = api.SYD_NakedVerifyAll(2,orgData, nakedSign4, RSAdn); + System.out.println("RSA验签:"+nakedVerify4 ); + + + String s = api.detachedSignAll(4, orgData, SM2dn); + System.out.println("SM2detach签名:"+s); + boolean b = api.detachedVerifyAll(4, orgData, s); + System.out.println("SM2detach验签:"+b); + + + String sde = api.detachedSignAll(4, orgDataBig, SM2dn); + System.out.println("SM2detach签名:"+sde); + boolean bde = api.detachedVerifyAll(4, orgDataBig, sde); + System.out.println("SM2detach验签:"+bde); + + + String rsa = api.detachedSignAll(2, orgData, RSAdn); + System.out.println("RSA detach签名:"+rsa); + boolean br = api.detachedVerifyAll(2, orgData, rsa); + System.out.println("RSA detach验签:"+br); + + + String det = api.detachedSignAll(3, orgDataBig, RSAdn); + System.out.println("RSA大数据detach签名:"+det); + boolean boo = api.detachedVerifyAll(3, orgDataBig, det); + System.out.println("RSA大数据detach验签:"+boo); + + + } catch (SydApiException e) { + throw new RuntimeException(e); + } finally { + api.disconnect(); + } + + } + + @Test + public void testDetach() throws UnsupportedEncodingException { + System.setProperty("com.sunyard.sydapi4j.debug", "true"); + //设置连接 + SydApiBuilder builder = new SydApiBuilder().setIp("172.16.17.161").setPort(8889).setTimeout(3000); + SydApi4j api = (SydApi4j) builder.build(); + String dnn="C=CN,O=CFCA OCA1,OU=TPC-S3,OU=Organizational-2,CN=ARCU54H100000024"; + + String plain="tran/acctTran62177883001300140426200548800010650170测试60001"; + + String signed = "MIIHYwYJKoZIhvcNAQcCoIIHVDCCB1ACAQExDzANBglghkgBZQMEAgEFADCCAa8GCSqGSIb3DQEHAaCCAaAEggGcPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48U2lnbkRhdGE+PFRyYWRlVHlwZSBhdXRoTGV2ZWw9IjAiIG5hbWU9IumTtuihjOi0puWPt+i9rOi0piI+dHJhbi9hY2N0VHJhbjwvVHJhZGVUeXBlPjxGaWVsZHM+PFBBWUVSX0FDQ1RfTk8gbmFtZT0i5LuY5qy+6LSm5Y+377yaIj42MjE3Nzg4MzAwMTMwMDE0MDQyPC9QQVlFUl9BQ0NUX05PPjxSQ1ZfQUNDVF9OTyBuYW1lPSLmlLbmrL7otKblj7fvvJoiPjYyMDA1NDg4MDAwMTA2NTAxNzA8L1JDVl9BQ0NUX05PPjxSQ1ZfQUNDVF9OQU1FIG5hbWU9IuaUtuasvuaWuei0puaIt+WQjeensO+8miI+5rWL6K+VPC9SQ1ZfQUNDVF9OQU1FPjxUUkFOX0FNVCBuYW1lPSLovazotKbph5Hpop3vvJoiPjYwMDAxPC9UUkFOX0FNVD48L0ZpZWxkcz48L1NpZ25EYXRhPqCCA/UwggPxMIIC2aADAgECAgUQVgMZAjANBgkqhkiG9w0BAQUFADBYMQswCQYDVQQGEwJDTjEwMC4GA1UEChMnQ2hpbmEgRmluYW5jaWFsIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MRcwFQYDVQQDEw5DRkNBIFRFU1QgT0NBMTAeFw0yMzA0MDYwODE1MDZaFw0yMzA3MDYwODE1MDZaMGQxCzAJBgNVBAYTAkNOMRIwEAYDVQQKEwlDRkNBIE9DQTExDzANBgNVBAsTBlRQQy1TMzEVMBMGA1UECxMMSW5kaXZpZHVhbC0xMRkwFwYDVQQDExBBUkNVNUIyMTAwMDAwMDQ5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAk2V1C+HV+aXhkNVF6S0cxQDWpnxScupP0IJJRNOJ8jeJcld9LD0aOe22ox0G1zYmoeyqOo1gUNwOOV9qesGzGY4Zrs4VdxmlT4LmhiDKPMf635RdAW0bP/Qcg3FRW8aNjJRz66+oE25rpAfAcr+uSVWWG+OYcUWq6z61cfUjUTalN5crmADWmRTOkhAlwjkdmUon+jMGyzQmetMNhGw2T66aGwfg2dZDwLF/bc4YtY4SEGbzA7v83BhELK8stCGifqyoZoPYSZuW37SiJ315nk1B4IYmuxGNmdBPAP2/ZA4Drw/oSyG65Fpu4uV6wS1SWbFDZKt9GafmHpx5oxLrjwIDAQABo4G1MIGyMB8GA1UdIwQYMBaAFM9wnWHrnXwuuPfLAkD3CZ3+M3SAMDkGA1UdHwQyMDAwLqAsoCqGKGh0dHA6Ly91Y3JsLmNmY2EuY29tLmNuL1JTQS9jcmw5NjA0Ny5jcmwwCwYDVR0PBAQDAgPoMB0GA1UdDgQWBBQRonmnaYyW0GynOardL7nKHlsiKDAoBgNVHSUEITAfBggrBgEFBQcDAgYIKwYBBQUHAwQGCSqGSIb3LwEBBTANBgkqhkiG9w0BAQUFAAOCAQEALRUezfLW2jLSzZ84BODOu09UPy149lFhcZEJc9yCyI8LIjGXkTWF8r5XWANbsqrhyAk1ewO5sXztClJMHipCtGv0tv20RiVGC5LdyqPW9VHp3WWFRxby7t3Gt9eWqhGUqjbD2oInadYZwyrefadAyDCT1uQFcik8MTlM/myHYknOphc5SDt20UZLxXgX89XYbwRQee6SG0CyIl+wBfyZh3X1kLjOwd7cdA39LhgZLJx5UDvViztqWWzafwz/M8TG+dCNiDdFQVpONXJJQDWtE61dFCOXhIS9IdlKzdKm+hdai6do5CSFsE1SC0FuiEGCVaySGf1RiW//Gd5KgS0Q6TGCAYwwggGIAgEBMGEwWDELMAkGA1UEBhMCQ04xMDAuBgNVBAoTJ0NoaW5hIEZpbmFuY2lhbCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEXMBUGA1UEAxMOQ0ZDQSBURVNUIE9DQTECBRBWAxkCMA0GCWCGSAFlAwQCAQUAMA0GCSqGSIb3DQEBAQUABIIBAHMLT4DLUIAixha4I6/QXt9dkuQgC5LtltUK1ZZXxzoIMsyPeiK0YSxWt4MK65ZN7nnG7DY66gcfRFP17eYHYl41KTjJWNIq3kGXnWXLioBvAzN+dj/GV3JnAECH0z8+AbqYZFF53/JKT6f1szBNVsIm/G14nzmsDrLGNXYTi8/qeIGWo7JEhfDDJJUG9iSgnLtVav38Dtl7zMvHq7YK5az5t0BLGGIIli8Bo5FQOfKHNgVPw0Ths2CNkz117xQx/EKyTp8xlND/Re/mTwqBMpAVVKG+fJx54qMyHhI5kkm3H4KdRPYTHDtu2cjImBEBMt9CE9PKHTbYMXoInVJAa8w="; + + boolean boo = api.detachedVerifyAll(3, plain.getBytes(), signed); + System.out.println("RSA大数据detach验签:"+boo); + plain.getBytes("UTF-8"); + + + } + + @Test + public void p1Test() throws UnsupportedEncodingException { + + // 调试模式 + // System.setProperty("com.sunyard.sydapi4j.debug", "true"); + // 建立连接 + String certDn ="C=CN,O=Sunyard,OU=8001,CN=8001"; + String DN = "C=CN,OU=eves,CN=jindiancloud"; + String Sm2DN="C=CN,O=CFCA OCA1,OU=YCCA,OU=Individual-2,CN=YCCA@黄金交易所@Zhuangj@1"; + //设置连接 + SydApiBuilder builder = new SydApiBuilder().setIp("172.16.17.161").setPort(8889).setTimeout(3000); + SydApi4j api = (SydApi4j) builder.build(); + byte[] oData = new byte[10]; + //p1签名 + byte[] sign = api.SYD_NakedSignAll(4,oData, Sm2DN); + // System.out.println("p1签名:"+ Util.bytes2HexString(sign)); + String base64Sign = Util.encodeBase64(sign); + System.out.println("p1签名:"+ base64Sign); + +// boolean pass = api.SYD_NakedVerifyAll(4,oData,sign, Sm2DN); +// System.out.println("验签结果 " + pass); +// +// String certByDn = api.getCertByDn(Sm2DN,0); +// X509 x509 = api.GetX509CertInfo(certByDn); +// byte[] pubKey = x509.getPubKey(); +// System.out.println("公钥:"+Util.bytes2HexString(pubKey)); +// +// String s = api.SYD_SM2_Sign_HA("8012", 1, pubKey, oData); +// System.out.println("公钥签名:"+s); +// +// hihi + + String sign2 ="svVyVaA6Og8QCWagGBdohDuIh/Lhb34Lv6Kc+3OE0GVVPdYxi9+zM6IBq6ZxEjuyIRPnxy1GCdye5I9hEOqZuQ=="; + byte[] bytes = SYMUtil.base64Sign2DerSign(sign2); + System.out.println(Util.bytes2HexString(bytes)); + //byte[] bytes2 = SYMUtil.base64SignAsDerSign(sign2); + byte[] bytes2 = SYMUtil.base64SignAsDerSign(Util.encodeBase64(bytes)); + System.out.println(Util.bytes2HexString(bytes2)); + + List allCert = api.getAllCert(); + System.out.println(allCert); + +// String Data= "\n" + +// " \n" + +// " 400027000000000202305300000000931\n" + +// " 2023-05-30T18:04:12\n" + +// " \n" + +// " 4000270000000002023053000000009312023-05-30T18:06:46400027日照德润建筑工程有限公司91371100773158280DDT02日照德润建筑工程有限公司803011301421013273000041816PS013300000009831853731346340004320230530000114152000000000001,00000200000020000.000.01
2023-05-30
BC02CC00
\n" + +// " 0\n" + +// " \n" + +// " 731346340004320230530000114152\n" + +// " 000000000001,000002000000\n" + +// " 20000.00\n" + +// " 0.01\n" + +// " \n" + +// " \n" + +// " ME02\n" + +// " AC02\n" + +// " CS03\n" + +// " 2023-05-30\n" + +// " 2023-05-31\n" + +// " \n" + +// "
"; +// +// String Data2 =""; +// String pk= "A0IABNTSZikiGRMscOVhIvGntbsvhz+fe8y/WqFSc10IwiAs6vuAYaN/RJ5/cFHDsC08I+vJOiiRFZPRe3vgAHad8Hs="; +// String sign2 ="MEYCIQDiIjaN/OXnEwHEIoTVR8ADB47FzEI4kb9VVIe0au1gVgIhAKNqfCeu6NAs9bFF1IrJvUDYvZTKRIM1OkKDQU8trSfY"; +// boolean verify_ha = api.SYD_SM2_Verify_HA(1, Util.decodeBase64(pk), Data.getBytes(), sign2); +// System.out.println("公钥验签2:"+verify_ha); + + + + + } + @Test + public void test4SLS() throws UnsupportedEncodingException { + System.setProperty("com.sunyard.sydapi4j.debug", "true"); + String DN = "C=CN,OU=eves,CN=jindiancloud"; + //设置连接 + SydApiBuilder builder = new SydApiBuilder().setIp("172.16.17.161").setPort(8889).setTimeout(3000); + SydApi4j api = (SydApi4j) builder.build(); + + String Data ="{\"head\":{\"SrcCode\":\"C00000000002\",\"SigCerNo\":\"0000000000000001\",\"ReqTime\":\"20221115175955\",\"TranCode\":\"T1001\",\"ReqSeqNo\":\"C1002003000120221103101855000001\",\"DesCode\":\"B00000000005\"},\"body\":{\"AccNo\":\"76690188000100128\",\"RequestCode\":\"B00000000005\",\"ReceiveCode\":\"C00000000002\",\"CurrCod\":\"CNY\",\"PushEves\":\"1\",\"VouDate\":\"20221012\",\"CallUrl\":\"192.44.2.97:31003\",\"IsStore\":\"1\",\"VouNo\":\"20221103031\",\"AntiTamperSign\":\"7e0ef4b1d7cac4c15b070af3fdbb574eed51e960b998a8c67db8287691d14e74\"}}"; + String base64Data="eyJoZWFkIjp7IlNyY0NvZGUiOiJDMDAwMDAwMDAwMDIiLCJTaWdDZXJObyI6IjAwMDAwMDAwMDAwMDAwMDEiLCJSZXFUaW1lIjoiMjAyMjExMTUxNzU5NTUiLCJUcmFuQ29kZSI6IlQxMDAxIiwiUmVxU2VxTm8iOiJDMTAwMjAwMzAwMDEyMDIyMTEwMzEwMTg1NTAwMDAwMSIsIkRlc0NvZGUiOiJCMDAwMDAwMDAwMDUifSwiYm9keSI6eyJBY2NObyI6Ijc2NjkwMTg4MDAwMTAwMTI4IiwiUmVxdWVzdENvZGUiOiJCMDAwMDAwMDAwMDUiLCJSZWNlaXZlQ29kZSI6IkMwMDAwMDAwMDAwMiIsIkN1cnJDb2QiOiJDTlkiLCJQdXNoRXZlcyI6IjEiLCJWb3VEYXRlIjoiMjAyMjEwMTIiLCJDYWxsVXJsIjoiMTkyLjQ0LjIuOTc6MzEwMDMiLCJJc1N0b3JlIjoiMSIsIlZvdU5vIjoiMjAyMjExMDMwMzEiLCJBbnRpVGFtcGVyU2lnbiI6IjdlMGVmNGIxZDdjYWM0YzE1YjA3MGFmM2ZkYmI1NzRlZWQ1MWU5NjBiOTk4YThjNjdkYjgyODc2OTFkMTRlNzQifX0="; + System.out.println("原数据base64:"+Util.encodeBase64(Data.getBytes())); + + String sign ="rNHjcF+QQezzrbtYRtBKSe7zyr304vtTBb+3rZHVYrzHHlW1DI6cDOdjyCdFkYQHiFsz/XfgrUIZqHA1kMgjUg=="; + byte[] decode64sign = SYMUtil.base64Sign2DerSign(sign); + + boolean pass = api.SYD_NakedVerifyAll(4,Data.getBytes() ,decode64sign, DN); + System.out.println("验签结果:"+pass); + + + + } } diff --git a/src/test/java/sample/Test4SLS.java b/src/test/java/sample/Test4SLS.java new file mode 100644 index 0000000..b70249a --- /dev/null +++ b/src/test/java/sample/Test4SLS.java @@ -0,0 +1,29 @@ +package sample; + +import com.sunyard.proto.Util; +import com.sunyard.util.SYMUtil; +import racal.sunyard.main.SydApi4j; +import racal.sunyard.main.SydApiBuilder; + +public class Test4SLS { + public static void main(String[] args) { + System.setProperty("com.sunyard.sydapi4j.debug", "true"); + String DN = "C=CN,OU=eves,CN=jindiancloud"; + //设置连接 + SydApiBuilder builder = new SydApiBuilder().setIp("172.16.17.161").setPort(8889).setTimeout(3000); + SydApi4j api = (SydApi4j) builder.build(); + + String Data ="{\"head\":{\"SrcCode\":\"C00000000002\",\"SigCerNo\":\"0000000000000001\",\"ReqTime\":\"20221115175955\",\"TranCode\":\"T1001\",\"ReqSeqNo\":\"C1002003000120221103101855000001\",\"DesCode\":\"B00000000005\"},\"body\":{\"AccNo\":\"76690188000100128\",\"RequestCode\":\"B00000000005\",\"ReceiveCode\":\"C00000000002\",\"CurrCod\":\"CNY\",\"PushEves\":\"1\",\"VouDate\":\"20221012\",\"CallUrl\":\"192.44.2.97:31003\",\"IsStore\":\"1\",\"VouNo\":\"20221103031\",\"AntiTamperSign\":\"7e0ef4b1d7cac4c15b070af3fdbb574eed51e960b998a8c67db8287691d14e74\"}}"; + String base64Data="eyJoZWFkIjp7IlNyY0NvZGUiOiJDMDAwMDAwMDAwMDIiLCJTaWdDZXJObyI6IjAwMDAwMDAwMDAwMDAwMDEiLCJSZXFUaW1lIjoiMjAyMjExMTUxNzU5NTUiLCJUcmFuQ29kZSI6IlQxMDAxIiwiUmVxU2VxTm8iOiJDMTAwMjAwMzAwMDEyMDIyMTEwMzEwMTg1NTAwMDAwMSIsIkRlc0NvZGUiOiJCMDAwMDAwMDAwMDUifSwiYm9keSI6eyJBY2NObyI6Ijc2NjkwMTg4MDAwMTAwMTI4IiwiUmVxdWVzdENvZGUiOiJCMDAwMDAwMDAwMDUiLCJSZWNlaXZlQ29kZSI6IkMwMDAwMDAwMDAwMiIsIkN1cnJDb2QiOiJDTlkiLCJQdXNoRXZlcyI6IjEiLCJWb3VEYXRlIjoiMjAyMjEwMTIiLCJDYWxsVXJsIjoiMTkyLjQ0LjIuOTc6MzEwMDMiLCJJc1N0b3JlIjoiMSIsIlZvdU5vIjoiMjAyMjExMDMwMzEiLCJBbnRpVGFtcGVyU2lnbiI6IjdlMGVmNGIxZDdjYWM0YzE1YjA3MGFmM2ZkYmI1NzRlZWQ1MWU5NjBiOTk4YThjNjdkYjgyODc2OTFkMTRlNzQifX0="; + System.out.println("原数据base64:"+Util.encodeBase64(Data.getBytes())); + + String sign ="rNHjcF+QQezzrbtYRtBKSe7zyr304vtTBb+3rZHVYrzHHlW1DI6cDOdjyCdFkYQHiFsz/XfgrUIZqHA1kMgjUg=="; + byte[] decode64sign = SYMUtil.base64Sign2DerSign(sign); + + boolean pass = api.SYD_NakedVerifyAll(4,Data.getBytes() ,decode64sign, DN); + System.out.println("验签结果:"+pass); + + } + + +} diff --git a/src/test/java/sample/TestDE.java b/src/test/java/sample/TestDE.java index 78db395..a95234b 100644 --- a/src/test/java/sample/TestDE.java +++ b/src/test/java/sample/TestDE.java @@ -28,17 +28,4 @@ public class TestDE { } } - @Test - public void de4K_rsa_aes() { - byte[] data = new byte[3 * 1024]; - RetWrap ret = api.generateDEByDn(0, rsa, data); - byte[] cipherKey = (byte[]) ret.get(SydApi.RET_CIPHER_KEY); - - System.out.println("cipherKey=" + new String(cipherKey)); - - ret = api.decryptDEByDN(0, rsa, cipherKey); - byte[] oData = (byte[]) ret.get("oData"); - - Assert.assertArrayEquals(data, oData); - } }