diff --git a/DProto/8011.xml b/DProto/8011.xml new file mode 100644 index 0000000..4317421 --- /dev/null +++ b/DProto/8011.xml @@ -0,0 +1,64 @@ + + + + + + 8011 + + + + + + + + + + + + 8012 + + + + + + + + + + + + + + + + + + + + + diff --git a/src/main/java/com/sunyard/inf/SydNakedSVApi.java b/src/main/java/com/sunyard/inf/SydNakedSVApi.java index 94bf623..5773ef1 100644 --- a/src/main/java/com/sunyard/inf/SydNakedSVApi.java +++ b/src/main/java/com/sunyard/inf/SydNakedSVApi.java @@ -1,5 +1,7 @@ package com.sunyard.inf; +import com.sunyard.SydApiException; + /** * 不经过 CA 授信 * 直接使用公私钥对签名验签 @@ -92,6 +94,27 @@ interface SydNakedSVApi { byte[] sign, String sCertDN ); + + /** + * 使用指定的证书 DN,对指定的原始数据编制裸验签(遵循PKCS#1) 安徽农信定制接口 + * @param cert 上传证书 + * @param rFlag 摘要算法 1—DIGEST_ALGO_MD5 M + * * 2—DIGEST_ALGO_SHA1 S + * * 3—DIGEST_ALGO_SHA256 R + * 4-SM2 国密证书,SM3算法 + * * S代表RSA-SHA1进行签名,如果为R代表RSA-SHA256进行签名,如果为M代表RSA-MD5进行签名 + * @param orgData 待签名的原始数据 + * @param sign 签名数据 + * @param sCertDN 签名者证书 DN + * @return 验签是否通过 + */ + public boolean SYD_NakedVerifyAll4NX ( + String cert, + int rFlag, + byte[] orgData, + byte[] sign, + String sCertDN + ) ; } diff --git a/src/main/java/racal/sunyard/main/SydApi4j.java b/src/main/java/racal/sunyard/main/SydApi4j.java index 5203f61..ee8ad80 100644 --- a/src/main/java/racal/sunyard/main/SydApi4j.java +++ b/src/main/java/racal/sunyard/main/SydApi4j.java @@ -522,6 +522,25 @@ public class SydApi4j implements SydApi { } + public boolean SYD_NakedVerifyAll4NX(String cert,int rFlag,byte[] orgData,byte[] sign, String sCertDN){ + boolean verify = false; + try { + //先导入证书 + importCert(cert.getBytes(),null); + if( rFlag == 4 ){//SM2 国密算法 + verify = SYD_NakedVerify(orgData,sign,sCertDN); + }else { + verify = SYD_NakedVerify(rFlag,orgData,sign,sCertDN); + } + //删除导入的证书 + deleteCert(sCertDN); + return verify; + } catch ( SydApiException e) { + throw e; + } + + } + public byte[] SYD_NakedSign(byte[] orgData, String sCertDN) { if (orgData == null) { throw new IllegalArgumentException("输入数据为 null"); @@ -812,14 +831,14 @@ public class SydApi4j implements SydApi { ) { 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]))) { - SydApiException e = new SydApiException(error.getInfo(), error.autoInt()); - println("验签失败=" + e.toString()); - return false; + throw new SydApiException(error.getInfo(), error.autoInt()); } + return true; } @@ -1749,7 +1768,47 @@ public class SydApi4j implements SydApi { @Override public boolean deleteCert(String dn) { - return false; + Proto8011 proto = new Proto8011(); + + // 填充数据 + HashMap packet = new HashMap(); + + HashMap data = new HashMap(); + packet.put("data", data); + + PacketSN sn = PacketSN.gen(); + packet.put("header", sn.getSn().array()); + data.put("certDn", dn); + + + + // 渲染发送 + ByteBuffer bb = proto.rend(packet); + + + synchronized (this) { + // 响应解析 + bb = syncRead(syncSend(bb)); + } + + 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); + } + ret = (Map) ret.get("data"); + PacketSection error = (PacketSection) ret.get("error"); + byte[] be = error.getBytes(); + if ((be[0] ^ be[1]) != 0) { + SydApiException e = new SydApiException(error.getInfo(), error.autoInt()); + println("删除失败=" + e.toString()); + return false; + } else { + return true; + } } // 测试通过 diff --git a/src/test/java/sample/Sample4ZS.java b/src/test/java/sample/Sample4ZS.java index 57f64c1..3524934 100644 --- a/src/test/java/sample/Sample4ZS.java +++ b/src/test/java/sample/Sample4ZS.java @@ -118,6 +118,10 @@ public class Sample4ZS { // List allCert = api.getAllCert(); // System.out.println(allCert); + api.GetX509CertInfo("MIICxjCCAmqgAwIBAgIFIGZACVcwDAYIKoEcz1UBg3UFADBdMQswCQYDVQQGEwJDTjEwMC4GA1UECgwnQ2hpbmEgRmluYW5jaWFsIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MRwwGgYDVQQDDBNDRkNBIFRFU1QgU00yIE9DQTExMB4XDTIzMDYwNjA5MDIzNFoXDTI1MDYwNjE1NTk1OVowfDELMAkGA1UEBhMCY24xFTATBgNVBAoMDENGQ0EgVEVTVCBDQTEOMAwGA1UECwwFQ05BUFMxFDASBgNVBAsMC0VudGVycHJpc2VzMTAwLgYDVQQDDCcwNDFAWjMxMzIwNTA1NzgzMEAzMTMyMDUwNTc4MzBAMDAwMDAwMDgwWTATBgcqhkjOPQIBBggqgRzPVQGCLQNCAAQzwB2NYu5u0YaSEpnH4rsDh1OOhiHD"); + + + } diff --git a/src/test/java/sample/SamplePKCS7.java b/src/test/java/sample/SamplePKCS7.java index e5b72e2..7cb4602 100644 --- a/src/test/java/sample/SamplePKCS7.java +++ b/src/test/java/sample/SamplePKCS7.java @@ -2,6 +2,7 @@ package sample; import com.sunyard.SydApi; +import com.sunyard.proto.Util; import racal.sunyard.main.SydApi4j; diff --git a/src/test/java/sample/Test4Nongxin.java b/src/test/java/sample/Test4Nongxin.java index f30ccb5..81845f9 100644 --- a/src/test/java/sample/Test4Nongxin.java +++ b/src/test/java/sample/Test4Nongxin.java @@ -1,6 +1,7 @@ package sample; import cn.hutool.core.codec.Base64; +import com.sunyard.RetWrap; import com.sunyard.SydApi; import com.sunyard.SydApiException; import com.sunyard.cert.X509; @@ -201,5 +202,49 @@ public class Test4Nongxin { + } + + @Test + public void test(){ + System.setProperty("com.sunyard.sydapi4j.debug", "true"); + + //设置连接 + SydApiBuilder builder = new SydApiBuilder().setIp("192.168.0.156"); + SydApi4j api = (SydApi4j) builder.build(); + + String cert = "-----BEGIN CERTIFICATE-----\n" + + "MIIDcTCCAlmgAwIBAgIFEEcHQmgwDQYJKoZIhvcNAQEFBQAwWDELMAkGA1UEBhMC\n" + + "Q04xMDAuBgNVBAoTJ0NoaW5hIEZpbmFuY2lhbCBDZXJ0aWZpY2F0aW9uIEF1dGhv\n" + + "cml0eTEXMBUGA1UEAxMOQ0ZDQSBURVNUIE9DQTEwHhcNMjExMjEwMDgyOTA0WhcN\n" + + "MjYxMjEwMDgyOTA0WjBoMQswCQYDVQQGEwJDTjESMBAGA1UEChMJQ0ZDQSBPQ0Ex\n" + + "MQ8wDQYDVQQLEwZUUEMtUzMxGTAXBgNVBAsTEE9yZ2FuaXphdGlvbmFsLTExGTAX\n" + + "BgNVBAMTEEFSQ1U1MjkxMDAwMDA3MDEwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJ\n" + + "AoGBAL+kPIjcWzRwQE6Q3ydtQsDaJGMxv0At2WrIQqb9ONEvqMbQZCd69qfBvsRj\n" + + "QI/UlG3btk6P/ZBGkNc99fX43VMqPtIlVjgRozLQcQJPFbiU5cT5PPqnrxo652RU\n" + + "KNFQhwmanPjAjmZd9woc2l0BnfF92QFDPDRprS1fWLFbKPTvAgMBAAGjgbUwgbIw\n" + + "HwYDVR0jBBgwFoAUz3CdYeudfC6498sCQPcJnf4zdIAwOQYDVR0fBDIwMDAuoCyg\n" + + "KoYoaHR0cDovL3VjcmwuY2ZjYS5jb20uY24vUlNBL2NybDgzMjA1LmNybDALBgNV\n" + + "HQ8EBAMCA+gwHQYDVR0OBBYEFGey5r5CdOUDaW3KRdZ0xg19n+dhMCgGA1UdJQQh\n" + + "MB8GCCsGAQUFBwMCBggrBgEFBQcDBAYJKoZIhvcvAQEFMA0GCSqGSIb3DQEBBQUA\n" + + "A4IBAQChyjTNJUkdspDa/6sPYuZdE0/yPFcbd0ag4wLWrSCiRyV0J5BhJPIApdRT\n" + + "3kCIem2jRbq3H/W1vUYi1JeGHcrvTOOMQb9yfgCzfQLvAdv0at4zupy1uXL6uE1S\n" + + "WL1v6Vub630tJ0A45KsVESB5Fb+UZ/cvdJIMHjcYYzPw+HHH6q9e3R0QUMz3Mxpl\n" + + "DCg66HQBL/jKSl/w13QTdRPL9dSDBtpzDqZH5JQK4rbZSdFnbC2TQs+ljsKd5TCg\n" + + "52HcC92peeCXCEsb3Zw0js5nTbX+1da8FgqDQTeKIItgXBvQIRJUeelKga6opRNM\n" + + "QM0Egoc/dBdM45jVnxzpreRKzsDQ\n" + + "-----END CERTIFICATE-----"; + String odata = "BankAcctTransfer1710469760912INNERDEBIT966229539600100010640王二类1566217788308301020599王二类1402/402361018886安徽农金00.001001"; + String signRsa = "0564FC7C0E3FDAF225295BBD0E32BF16081D561B4C262B5E095E04E828DC8AAC71723F849B615A41AA012FB9B532017D382919A498A93EAD35CB3AA80BA29510C174BF61B6E5DCEA78DF9AF7C3B80513BA82F82030347F463C03826C90CC9C207012BD456C21D9DF4E2C79EE042B8BE229EA3C40F232AF661BE63E61A07DC2A3"; + + try { + String rsaDn = "C=CN,O=CFCA OCA1,OU=TPC-S3,OU=Organizational-1,CN=ARCU529100000701"; + boolean nakedVerify2 = api.SYD_NakedVerifyAll4NX(cert,2,odata.getBytes(),Util.hexString2Bytes(signRsa),rsaDn); + System.out.println("RSA数据验签:"+nakedVerify2 ); + } catch (SydApiException e) { + e.printStackTrace(); + } + + + } } diff --git a/src/test/java/sample/sample4nx.java b/src/test/java/sample/sample4nx.java new file mode 100644 index 0000000..0e3af3e --- /dev/null +++ b/src/test/java/sample/sample4nx.java @@ -0,0 +1,52 @@ +package sample; + +import com.sunyard.SydApiException; +import com.sunyard.proto.Util; +import racal.sunyard.main.SydApi4j; +import racal.sunyard.main.SydApiBuilder; + +public class sample4nx { + public static void main(String[] args) { + //打印调试日志 + System.setProperty("com.sunyard.sydapi4j.debug", "true"); + + //设置连接 + SydApiBuilder builder = new SydApiBuilder().setIp("192.168.0.156"); + SydApi4j api = (SydApi4j) builder.build(); + + String cert = "-----BEGIN CERTIFICATE-----\n" + + "MIIDcTCCAlmgAwIBAgIFEEcHQmgwDQYJKoZIhvcNAQEFBQAwWDELMAkGA1UEBhMC\n" + + "Q04xMDAuBgNVBAoTJ0NoaW5hIEZpbmFuY2lhbCBDZXJ0aWZpY2F0aW9uIEF1dGhv\n" + + "cml0eTEXMBUGA1UEAxMOQ0ZDQSBURVNUIE9DQTEwHhcNMjExMjEwMDgyOTA0WhcN\n" + + "MjYxMjEwMDgyOTA0WjBoMQswCQYDVQQGEwJDTjESMBAGA1UEChMJQ0ZDQSBPQ0Ex\n" + + "MQ8wDQYDVQQLEwZUUEMtUzMxGTAXBgNVBAsTEE9yZ2FuaXphdGlvbmFsLTExGTAX\n" + + "BgNVBAMTEEFSQ1U1MjkxMDAwMDA3MDEwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJ\n" + + "AoGBAL+kPIjcWzRwQE6Q3ydtQsDaJGMxv0At2WrIQqb9ONEvqMbQZCd69qfBvsRj\n" + + "QI/UlG3btk6P/ZBGkNc99fX43VMqPtIlVjgRozLQcQJPFbiU5cT5PPqnrxo652RU\n" + + "KNFQhwmanPjAjmZd9woc2l0BnfF92QFDPDRprS1fWLFbKPTvAgMBAAGjgbUwgbIw\n" + + "HwYDVR0jBBgwFoAUz3CdYeudfC6498sCQPcJnf4zdIAwOQYDVR0fBDIwMDAuoCyg\n" + + "KoYoaHR0cDovL3VjcmwuY2ZjYS5jb20uY24vUlNBL2NybDgzMjA1LmNybDALBgNV\n" + + "HQ8EBAMCA+gwHQYDVR0OBBYEFGey5r5CdOUDaW3KRdZ0xg19n+dhMCgGA1UdJQQh\n" + + "MB8GCCsGAQUFBwMCBggrBgEFBQcDBAYJKoZIhvcvAQEFMA0GCSqGSIb3DQEBBQUA\n" + + "A4IBAQChyjTNJUkdspDa/6sPYuZdE0/yPFcbd0ag4wLWrSCiRyV0J5BhJPIApdRT\n" + + "3kCIem2jRbq3H/W1vUYi1JeGHcrvTOOMQb9yfgCzfQLvAdv0at4zupy1uXL6uE1S\n" + + "WL1v6Vub630tJ0A45KsVESB5Fb+UZ/cvdJIMHjcYYzPw+HHH6q9e3R0QUMz3Mxpl\n" + + "DCg66HQBL/jKSl/w13QTdRPL9dSDBtpzDqZH5JQK4rbZSdFnbC2TQs+ljsKd5TCg\n" + + "52HcC92peeCXCEsb3Zw0js5nTbX+1da8FgqDQTeKIItgXBvQIRJUeelKga6opRNM\n" + + "QM0Egoc/dBdM45jVnxzpreRKzsDQ\n" + + "-----END CERTIFICATE-----"; + String odata = "BankAcctTransfer1710469760912INNERDEBIT966229539600100010640王二类1566217788308301020599王二类1402/402361018886安徽农金00.001001"; + String signRsa = "0564FC7C0E3FDAF225295BBD0E32BF16081D561B4C262B5E095E04E828DC8AAC71723F849B615A41AA012FB9B532017D382919A498A93EAD35CB3AA80BA29510C174BF61B6E5DCEA78DF9AF7C3B80513BA82F82030347F463C03826C90CC9C207012BD456C21D9DF4E2C79EE042B8BE229EA3C40F232AF661BE63E61A07DC2A3"; + + try { + String rsaDn = "C=CN,O=CFCA OCA1,OU=TPC-S3,OU=Organizational-1,CN=ARCU529100000701"; + boolean nakedVerify2 = api.SYD_NakedVerifyAll4NX(cert,2,odata.getBytes(), Util.hexString2Bytes(signRsa),rsaDn); + System.out.println("RSA数据验签:"+nakedVerify2 ); + + + } catch (SydApiException e) { + e.printStackTrace(); + } + + } +}