diff --git a/src/main/java/com/sunyard/SydApiException.java b/src/main/java/com/sunyard/SydApiException.java index 107ea47..f7ee1b9 100644 --- a/src/main/java/com/sunyard/SydApiException.java +++ b/src/main/java/com/sunyard/SydApiException.java @@ -107,6 +107,12 @@ public class SydApiException extends RuntimeException{ transMsg(); } + public SydApiException(int retCode, Exception e) { + super("SydApiException(" + "code = "+String.format("%04x", retCode) + ")" , e); + this.retCode = retCode; + transMsg(); + } + public SydApiException(String msg, int retCode){ super("SydApiException(" + String.format(" %04X", retCode) + ":" + ( null == msg ? transMsg(retCode) : msg ) + ")" ); diff --git a/src/main/java/racal/sunyard/main/SydApi4j.java b/src/main/java/racal/sunyard/main/SydApi4j.java index 0c9f28e..cd23e34 100644 --- a/src/main/java/racal/sunyard/main/SydApi4j.java +++ b/src/main/java/racal/sunyard/main/SydApi4j.java @@ -1310,7 +1310,7 @@ public class SydApi4j implements SydApi { while (bb.limit() - bb.position() >= 128) { byte[] cert = new byte[128]; bb.get(cert); - certs.add(new String(cert, "GBK")); + certs.add(new String(cert, "GBK").trim()); } // r.put("certDNs",certs.toArray(new String[0]) ); @@ -1333,10 +1333,9 @@ public class SydApi4j implements SydApi { PacketSN sn = PacketSN.gen(); packet.put("header", sn.getSn().array()); - data.put("dataFlag$option", dataFlag); + data.put("dataFlag",Util.slenBytes(dataFlag,4)); - String sqlite3 = "1 = 1 "; - data.put("sqlite3", sqlite3); + data.put("sqlite3", sqlite); // 渲染发送 ByteBuffer bb = proto.rend(packet); @@ -1365,24 +1364,29 @@ public class SydApi4j implements SydApi { RetWrap r = new RetWrap(); PacketSection resDataFlag = (PacketSection) ret.get("dataFlag"); - r.put("dataFlag", (int) resDataFlag.getBytes()[0]); PacketSection certAllNum = (PacketSection) ret.get("certAllNum"); - r.put("certAllNum", (int) certAllNum.getBytes()[0]); - PacketSection realCertNum = (PacketSection) ret.get("realCertNum"); - r.put("realCertNum", (int) realCertNum.getBytes()[0]); PacketSection dataAttrFlag = (PacketSection) ret.get("dataAttrFlag"); - r.put("dataAttrFlag", (int) dataAttrFlag.getBytes()[0]); + PacketSection realCertNum = (PacketSection) ret.get("realCertNum"); + try { + r.put("dataFlag",Util.smallLen(resDataFlag.getBytes()) ); + r.put("certAllNum", Util.smallLen(certAllNum.getBytes())); + r.put("dataAttrFlag", Util.smallLen(dataAttrFlag.getBytes())); + r.put("realCertNum", Util.smallLen(realCertNum.getBytes())); + } catch (Exception e) { + e.printStackTrace(); + } r.put("certLenMax", Integer.parseInt(Util.bytes2HexString(Util.toArray(bb)).substring(60, 62), 16)); List certs = new ArrayList(); while (bb.limit() - bb.position() >= 128) { byte[] cert = new byte[128]; bb.get(cert); - certs.add(new String(cert, "GBK")); + certs.add(new String(cert, "GBK").trim()); } - r.put("certDNs", certs.toArray(new String[0])); - r.put("certDNlist", certs); +// r.put("certDNs",certs.toArray(new String[0]) ); + + r.put("certDNs",certs); return r; } @@ -1760,7 +1764,7 @@ public class SydApi4j implements SydApi { } socket.setSoTimeout(timeout); } catch (Exception e) { - socket = reConnect(new SydApiException(-2)); + socket = reConnect(new SydApiException(-2, e)); } diff --git a/src/test/java/com/sunyard/sydapi/test/CertTest.java b/src/test/java/com/sunyard/sydapi/test/CertTest.java index 611947c..f9989d2 100644 --- a/src/test/java/com/sunyard/sydapi/test/CertTest.java +++ b/src/test/java/com/sunyard/sydapi/test/CertTest.java @@ -10,6 +10,8 @@ import org.junit.Test; import racal.sunyard.main.SydApi4j; import java.io.UnsupportedEncodingException; +import java.util.ArrayList; +import java.util.List; import static com.sunyard.sydapi.util.PrintUtil.printRetWrap; @@ -17,12 +19,30 @@ public class CertTest { public static void main(String[] args) { - System.setProperty("com.sunyard.sydapi4j.debug", "true"); + //System.setProperty("com.sunyard.sydapi4j.debug", "true"); - SydApi4j api = (SydApi4j) new SydApi4j().connect("192.168.1.129", 8889, null, 1000); + SydApi4j api = (SydApi4j) new SydApi4j().connect("192.168.0.200", 8889, null, 1000); try{ + String sql=" certtype in (0,2) "; //签名解密 + String sql2=" certtype in (1,3) "; //验签加密 + + ArrayList m_certs =new ArrayList(); + //查出证书总数,一次次的拿出来 RetWrap allCert = api.getAllCert(0); printRetWrap(allCert); + Integer allnum =(Integer) allCert.get("certAllNum");//总数 + List certs = (List)allCert.get("certDNs");//部分证书列表 + System.out.println(certs.toString()); + m_certs.addAll(certs); + int loop = allnum%16;//循环次数 + for (int i = 1; i < loop; i++) { + RetWrap partCert= api.getAllCert(16*i); + List partcerts = (List)partCert.get("certDNs"); + m_certs.addAll(partcerts); + } + System.out.println("证书:"+m_certs); + System.out.println("aa"+m_certs.get(20)); + }catch (Exception e){ e.printStackTrace(); diff --git a/src/test/java/sample/Shanghairenhang.java b/src/test/java/sample/Shanghairenhang.java index 9cca2f9..3dd7d4d 100644 --- a/src/test/java/sample/Shanghairenhang.java +++ b/src/test/java/sample/Shanghairenhang.java @@ -21,17 +21,18 @@ import java.util.List; import static com.sunyard.sydapi.util.PrintUtil.printRetWrap; public class Shanghairenhang { - private static final byte[] orgData2k = new byte[ 100 ]; + private static final byte[] orgData2k = new byte[ 1*1024 ]; private static final String pcDnEN = "C=CN,O=CFCA OCA1,OU=YCCA,OU=Individual-2,CN=YCCA@黄金交易所@Zhuangj@1"; private static final String RSA = "C=cn,O=CFCA TEST CA,OU=NCS2,OU=Enterprises,CN=041@Z402451000010@ShanDong@00000001"; public static void main(String[] args) throws UnsupportedEncodingException, CertificateException, NoSuchProviderException { - //System.setProperty("com.sunyard.sydapi4j.debug", "true"); + // System.setProperty("com.sunyard.sydapi4j.debug", "true"); long startTime = System.currentTimeMillis(); //获取开始时间 SydApiBuilder builder = new SydApiBuilder().setIp("192.168.0.200"); SydApi4j api = (SydApi4j) builder.build(); try { + String orgData = "123456"; @@ -41,7 +42,20 @@ public class Shanghairenhang { * @param pcData: 明文数据。 * @return RetWrap: 数字信封 */ - RetWrap signData = api.generateDEByDn(4,RSA, orgData2k); + + + // 获取加密证书 +// String cert = api.getCertByDn(pcDnEN); +// +// System.out.println("cert=" + cert); + RetWrap status = api.getStatus(); + String mem =(String) status.get("MEM"); + String cpu =(String) status.get("CPU"); + String disk =(String) status.get("DISK"); + System.out.println(mem+cpu+disk); + + + RetWrap signData = api.generateDEByDn(pcDnEN, orgData.getBytes()); byte[] cpkey2 = (byte[]) signData.get("CipherKey"); System.out.println("加密信封:" + new String(cpkey2)); @@ -51,14 +65,10 @@ public class Shanghairenhang { * @param cpkey: 数字信封。 * @return preData: 原数据 */ - RetWrap oDataWrap = api.decryptDEByDN(4,RSA, cpkey2); + RetWrap oDataWrap = api.decryptDEByDN(pcDnEN,cpkey2 ); byte[] preData = (byte[]) oDataWrap.get("oData"); System.out.println("解密信封:" + Util.bytes2HexString(preData)); - - -// - } catch (Exception e) { e.printStackTrace(); } finally { @@ -66,49 +76,20 @@ public class Shanghairenhang { System.out.println("程序运行时间:" + (endTime - startTime) + "ms"); //输出程序运行时间 } - - - - - - - -// String [] certDNs =(String []) allCert.get("certDNs"); -// System.out.println(certDNs); - - - - - - - } @Test - public void testRenhang(){ - System.setProperty("com.sunyard.sydapi4j.debug", "true"); + public void testRenhang() throws UnsupportedEncodingException { + //System.setProperty("com.sunyard.sydapi4j.debug", "true"); SydApiBuilder builder = new SydApiBuilder().setIp("192.168.0.200"); SydApi4j api = (SydApi4j) builder.build(); - String attachedSign = api.attachedSign(2,orgData2k, RSA); - System.out.println(attachedSign); - boolean attachedVerify = api.attachedVerify(2,attachedSign); - System.out.println(attachedVerify); - } - - @Test - public void getCerts() throws UnsupportedEncodingException { - System.setProperty("com.sunyard.sydapi4j.debug", "true"); - SydApiBuilder builder = new SydApiBuilder().setIp("192.168.1.129"); - SydApi4j api = (SydApi4j) builder.build(); - RetWrap allCert = api.getAllCert(0,""); - printRetWrap(allCert); - String[] certDNs =(String[]) allCert.get("certDNs"); - ArrayList certlist = new ArrayList(); - Collections.addAll(certlist, certDNs); - System.out.println("aaa:"+certDNs[0]); - - +// String attachedSign = api.attachedSign(2,orgData2k, RSA); +// System.out.println(attachedSign); +// boolean attachedVerify = api.attachedVerify(2,attachedSign); +// System.out.println(attachedVerify); + byte[] bytes = api.SYD_NakedSign(orgData2k, pcDnEN); + System.out.println(Util.bytes2HexString(bytes)); } } \ No newline at end of file diff --git a/src/test/java/sample/ShangqingXingye.java b/src/test/java/sample/ShangqingXingye.java index 8db9328..ff887c5 100644 --- a/src/test/java/sample/ShangqingXingye.java +++ b/src/test/java/sample/ShangqingXingye.java @@ -26,112 +26,77 @@ public class ShangqingXingye { private static final String RSA = "C=cn,O=CFCA TEST CA,OU=NCS2,OU=Enterprises,CN=041@Z402451000010@ShanDong@00000001"; public static void main(String[] args) throws UnsupportedEncodingException, CertificateException, NoSuchProviderException { - //System.setProperty("com.sunyard.sydapi4j.debug", "true"); + System.setProperty("com.sunyard.sydapi4j.debug", "true"); long startTime = System.currentTimeMillis(); //获取开始时间 SydApiBuilder builder = new SydApiBuilder().setIp("192.168.0.200"); SydApi4j api = (SydApi4j) builder.build(); try { String orgData = "123456"; -// String signData = null; -// String certByDn = api.getCertByDn(RSA); -// System.out.println(certByDn); -// boolean signedBySM2Cert = CertUtil.isSM2Cert(certByDn); -// System.out.println(signedBySM2Cert); -// signData= api.attachedSign(2,orgData.getBytes(),RSA); -// System.out.println("加签"+signData); -// RetWrap ret = ASN1Util.takeOutOriginDataFromPKCS7Sign(signData); -// String cert =(String)ret.get("cert"); // -// -// String cert_begin = "-----BEGIN CERTIFICATE-----\n"; -// String end_cert = "\n-----END CERTIFICATE-----"; -// String pemCert = cert_begin + cert + end_cert; -// System.out.println(pemCert); -// boolean signedBySM2Cert1 = CertUtil.isSM2Cert(pemCert); -// System.out.println(signedBySM2Cert1); -// -// boolean signedBySM2Cert2 = CertUtil.isSignedBySM2Cert(signData); -// System.out.println(signedBySM2Cert2); - - RetWrap retWrap = api.countHash(2,1, orgData.getBytes(),null); - // byte[] hashData = (byte[]) retWrap.get("hash"); - byte[] filterData = (byte[]) retWrap.get("filterData"); - System.out.println("过渡数据:"+Util.bytes2HexString(filterData)); - - RetWrap retWrap2 = api.countHash(2,3, orgData.getBytes(),filterData); - //byte[] filterData2 = (byte[]) retWrap2.get("filterData"); - byte[] finalhash = (byte[]) retWrap2.get("hash"); - //System.out.println("中间数据:"+Util.bytes2HexString(filterData2)); - System.out.println("最终数据:"+Util.bytes2HexString(finalhash)); - - + /** + * 产生对称密钥,通过公钥加密生成数字信封,。 + * @param pcDnEN: 清算所的公钥证书 + * @param pcData: 明文数据。 + * @return RetWrap: 数字信封 + */ + RetWrap signData = api.generateDEByDn(pcDnEN, orgData2k); + byte[] cpkey2 = (byte[]) signData.get("CipherKey"); + System.out.println("加密信封:" + new String(cpkey2)); + /** + * 接收用私钥解密数字信封,还原原文。。 + * @param pcDnEN: 清算所的公钥证书 + * @param cpkey: 数字信封。 + * @return preData: 原数据 + */ + RetWrap oDataWrap = api.decryptDEByDN(pcDnEN, cpkey2); + byte[] preData = (byte[]) oDataWrap.get("oData"); + System.out.println("解密信封:" + Util.bytes2HexString(preData)); // // /** -// * 产生对称密钥,通过公钥加密生成数字信封,。 -// * @param pcDnEN: 清算所的公钥证书 -// * @param pcData: 明文数据。 -// * @return RetWrap: 数字信封 +// * 通过指定的私钥对指定的原始数据编制带公钥证书的数字签名(遵循PKCS#7), +// * @param orgData: 待签名的原始数据 +// * @param pcDnEN: 签名者证书 DN +// * @return signsData: 签名数据 // */ -// RetWrap signData = api.generateDEByDn(pcDnEN, orgData2k); -// byte[] cpkey2 = (byte[]) signData.get("CipherKey"); -// System.out.println("加密信封:" + new String(cpkey2)); -// -// /** -// * 接收用私钥解密数字信封,还原原文。。 -// * @param pcDnEN: 清算所的公钥证书 -// * @param cpkey: 数字信封。 -// * @return preData: 原数据 -// */ -// RetWrap oDataWrap = api.decryptDEByDN(pcDnEN, cpkey2); -// byte[] preData = (byte[]) oDataWrap.get("oData"); -// System.out.println("解密信封:" + Util.bytes2HexString(preData)); -// -//// -//// /** -//// * 通过指定的私钥对指定的原始数据编制带公钥证书的数字签名(遵循PKCS#7), -//// * @param orgData: 待签名的原始数据 -//// * @param pcDnEN: 签名者证书 DN -//// * @return signsData: 签名数据 -//// */ -//// String signsData = api.SYD_SM2_DetachedSign_HA(orgData2k, pcDnEN); -//// System.out.println("签名数据:" + signsData); -//// -//// /** -//// * 利用清算所的公钥证书对签名数据进行验签。 -//// * @param dataType: 数据模式, 0:输入的数据为 HASH 后的数据, 1:输入的数据为原始数据库(本次传入1) -//// * @param orgData: 待签名的原始数据 -//// * @param sign: 签名数据。 -//// */ -//// boolean result = api.detachedVerify(1, orgData2k, signsData); -//// System.out.println("验签结果:" + result); -//// -// -// /** -// * 产生对称密钥,通过清算所公钥证书加密生成数字信封。 -// * 利用会员的私钥证书对数据进行签名 -// * 上清所 SYD_SignDzigitalEnvelope (String pcDnEN, String pcDnSign, byte[] pcData); -// * @param pcDnEN: 清算所的公钥证书 -// * @param pcDnSign:会员的私钥证书 -// * @param pcData: 明文数据。 -// * @return pcSignData: 签名数字信封 -// */ -// String pcSignData = api.SYD_SignDigitalEnvelope(pcDnEN, pcDnEN, orgData2k); -// System.out.println("签名数字信封:" + pcSignData); -// -// /** -// * 利用清算所公钥证书对签名数据进行验签。接收用会员的私钥证书解密数字信封,还原原文。 -// * 上清所 byte[] SYD_VerifyDigitalEnveloe(String pcDnDe, String pcDnVerify, String pcSignData ); -// * @param pcDnDe: 会员的私钥证书 -// * @param pcDnVerify: 清算所公钥证书 -// * @param pcSignData: 签名数字信封数据。 -// * @return pcData:原数据 -// */ -// -// byte[] oData = api.SYD_VerifyDigitalEnveloe(pcDnEN, pcDnEN, pcSignData); -// System.out.println("原数据:" + Util.bytes2HexString(oData)); + String signsData = api.SYD_SM2_DetachedSign_HA(orgData2k, pcDnEN); + System.out.println("签名数据:" + signsData); + + /** + * 利用清算所的公钥证书对签名数据进行验签。 + * @param dataType: 数据模式, 0:输入的数据为 HASH 后的数据, 1:输入的数据为原始数据库(本次传入1) + * @param orgData: 待签名的原始数据 + * @param sign: 签名数据。 + */ + boolean result = api.detachedVerify(1, orgData2k, signsData); + System.out.println("验签结果:" + result); + + + /** + * 产生对称密钥,通过清算所公钥证书加密生成数字信封。 + * 利用会员的私钥证书对数据进行签名 + * 上清所 SYD_SignDzigitalEnvelope (String pcDnEN, String pcDnSign, byte[] pcData); + * @param pcDnEN: 清算所的公钥证书 + * @param pcDnSign:会员的私钥证书 + * @param pcData: 明文数据。 + * @return pcSignData: 签名数字信封 + */ + String pcSignData = api.SYD_SignDigitalEnvelope(pcDnEN, pcDnEN, orgData2k); + System.out.println("签名数字信封:" + pcSignData); + + /** + * 利用清算所公钥证书对签名数据进行验签。接收用会员的私钥证书解密数字信封,还原原文。 + * 上清所 byte[] SYD_VerifyDigitalEnveloe(String pcDnDe, String pcDnVerify, String pcSignData ); + * @param pcDnDe: 会员的私钥证书 + * @param pcDnVerify: 清算所公钥证书 + * @param pcSignData: 签名数字信封数据。 + * @return pcData:原数据 + */ + + byte[] oData = api.SYD_VerifyDigitalEnveloe(pcDnEN, pcDnEN, pcSignData); + System.out.println("原数据:" + Util.bytes2HexString(oData)); } catch (Exception e) { @@ -141,38 +106,6 @@ public class ShangqingXingye { System.out.println("程序运行时间:" + (endTime - startTime) + "ms"); //输出程序运行时间 } - - RetWrap allCert = api.getAllCert(0); - printRetWrap(allCert); - String[] certDNs =(String[]) allCert.get("certDNs"); - System.out.println(certDNs[1]); - ArrayList certlist = new ArrayList(); - Collections.addAll(certlist, certDNs); - System.out.println("1111"+certlist.get(2)); - - - String certByDn = api.getCertByDn(RSA); - System.out.println(certByDn); - X509 certInfo = api.GetX509CertInfo(certByDn); - System.out.println(certInfo.getSubject()); - boolean sm2Cert = CertUtil.isSM2Cert(certByDn); - System.out.println(sm2Cert); - - - - - - - -// String [] certDNs =(String []) allCert.get("certDNs"); -// System.out.println(certDNs); - - - - - - - } } \ No newline at end of file