diff --git a/doc/java接口说明文档.docx b/doc/java接口说明文档.docx index 6f4fde7..9ed384b 100644 Binary files a/doc/java接口说明文档.docx and b/doc/java接口说明文档.docx differ diff --git a/pom.xml b/pom.xml index 8d91613..1036450 100644 --- a/pom.xml +++ b/pom.xml @@ -77,7 +77,7 @@ com.sunyard dproto - 1.0-20210526 + 1.0-20211220 diff --git a/src/main/java/com/sunyard/inf/SydSVApi.java b/src/main/java/com/sunyard/inf/SydSVApi.java index 3602c58..a74c5ec 100644 --- a/src/main/java/com/sunyard/inf/SydSVApi.java +++ b/src/main/java/com/sunyard/inf/SydSVApi.java @@ -228,6 +228,24 @@ interface SydDetachedSVApi { String publicKey, String sign); + /** + * 通过指定的私钥对指定的原始数据编制带公钥证书的数字签名(遵循PKCS#7) + * 待签名的原始数据将在接口内部进行不带公钥的 sm3 ,然后做 Detach 签名 + * @param orgData 待签名的原始数据 + * @param sCertDN 签名者证书 DN + * @return 签名数据 + */ + String sm3WithoutPKDetachedSign(byte[] orgData, String sCertDN); + + /** + * 对指定的原始数据核验其带公钥证书签名(PKCS#7) + * 原始数据将在接口内部进行无公钥的 sm3 ,然后做 Detach 验签 + * + * @param orgData 待签名的原始数据 + * @param sign 签名数据 + * @return 验签是否通过 + */ + boolean sm3WithoutPKDetachedVerify(byte[] orgData, String sign); /** diff --git a/src/main/java/racal/sunyard/main/SydApi4j.java b/src/main/java/racal/sunyard/main/SydApi4j.java index b7c5758..22cbb11 100644 --- a/src/main/java/racal/sunyard/main/SydApi4j.java +++ b/src/main/java/racal/sunyard/main/SydApi4j.java @@ -174,6 +174,7 @@ public class SydApi4j implements SydApi { data.put("privateKey", privateKey); data.put("publicKey", publicKey); data.put("infoData", orgData); + data.put("hashData", orgData); data.put("privateKeyTag", "999999999999999999999999999"); // 渲染发送 @@ -330,7 +331,7 @@ public class SydApi4j implements SydApi { //ProtocolRender render = pset.getProtocolReqRender("75"); Proto75 proto = new Proto75(); - byte[] sign = Util.decodeBase64(base64Sign); + byte[] sign = SYMUtil.base64SignAsDerSign(base64Sign); // 填充数据 HashMap packet = new HashMap(); @@ -597,6 +598,18 @@ public class SydApi4j implements SydApi { return detachedVerify(DATA_HASH, hash, sign); } + @Override + public String sm3WithoutPKDetachedSign(byte[] orgData, String sCertDN) { + byte[] hash = SM3Hash(orgData); + return detachedSign(DATA_HASH, hash, sCertDN); + } + + @Override + public boolean sm3WithoutPKDetachedVerify(byte[] orgData, String sign) { + byte[] hash = SM3Hash(orgData); + return detachedVerify(DATA_HASH, hash, sign); + } + // 测试通过 @Override public String detachedSign(int dataType, byte[] orgData, String sCertDN) { diff --git a/src/test/java/com/sunyard/sydapi/test/TestAllMethods.java b/src/test/java/com/sunyard/sydapi/test/TestAllMethods.java index d4d72b8..5030e01 100644 --- a/src/test/java/com/sunyard/sydapi/test/TestAllMethods.java +++ b/src/test/java/com/sunyard/sydapi/test/TestAllMethods.java @@ -12,6 +12,7 @@ import racal.sunyard.main.SydApi4j; import racal.sunyard.main.SydApiBuilder; import java.io.*; +import java.util.Base64; import static com.sunyard.sydapi.util.PrintUtil.printByteArray; import static com.sunyard.sydapi.util.PrintUtil.printRetWrap; @@ -29,7 +30,8 @@ public class TestAllMethods { public void before() { // 通过设置debug的属性开启debug,如果不设置则默认不打开 System.setProperty("com.sunyard.sydapi4j.debug", "true"); - api = (SydApi4j) new SydApi4j().connect("192.168.0.100", 8889, null, 1000); + api = (SydApi4j) new SydApi4j().connect("192.168.0.66", 8889, null, 1000); +// api = (SydApi4j) new SydApi4j().connect("192.168.0.100", 8889, null, 1000); // api = (SydApi4j) new SydApi4j().connect("172.16.17.162", 8889, null, 1000); // api = (SydApi4j) new SydApi4j().connect("192.168.1.7", 8889, null, 5000); } @@ -984,16 +986,20 @@ public class TestAllMethods { printRetWrap(retWrap1); } - // 74 - @Test - public void testSYD_SM2_Sign_HA() { - - } - // 75 @Test public void testSYD_SM2_Verify_HA() { + String orgData = "11111111111111"; + String pk="034200044BDBCE365B5DB87799EBBB78D871BEEA70A6B3BAAA2973FEDC4BF067F8F1D2A977D2BFA01562E9554F600FBBFCD0D04F50603FB225ABBEDE0DF346E5E4882F68"; + String sk="00010000B3A7643171ABFC00D30307025B2CC5826F20210F5112F5D4BE7A8E32C82067C00000000000000000000000000000000000000000000000000000000000000000"; + byte[] oData = api.SM3Hash(pk, Util.hexString2Bytes(orgData)); + String s = api.SYD_SM2_Sign_HA(SydApi.DATA_HASH, Util.hexString2Bytes(sk), Util.hexString2Bytes(pk), oData); + + System.out.println("decBase64:" + Util.bytes2HexString(Util.decodeBase64(s))); + System.out.println("decBase64-1:" + Util.bytes2HexString(SYMUtil.base64SignAsDerSign(s))); + boolean b = api.SYD_SM2_Verify_HA(SydApi.DATA_HASH, Util.hexString2Bytes(pk), Util.hexString2Bytes(orgData), s); + System.out.println("验签结果: " + b); } // 测试通过 @@ -1491,12 +1497,13 @@ public class TestAllMethods { @Test public void testSM2Verify3() { - String thisPublicKey = "0342000422C4FC907E0BEC600C2070D675EFB65EAE3A628260FF5461DD5F8133CF7CF98530EF392D016B6487BA6148E9AC27BDD4E8D7404A310CB09335F50AEF00ADB068"; + String thisPublicKey = "03420004C0D7FCD41C4A27B6B2DAC20B1332ED89202F2F85EF79929CAD1028F11AE0E8EFECA9C26A2145773F234631B2D2F1C7DAE5880C681122B28DA842509CEC8DF82D"; String thisOrgData = "FFFFFFFFFFFFFFFF"; - String s = api.SM2SignC(1, "111111111111114700000000001", Util.hexString2Bytes(thisPublicKey), thisOrgData.getBytes()); + String s = api.SM2SignC(1, "000000000000000100000000001", Util.hexString2Bytes(thisPublicKey), thisOrgData.getBytes()); System.out.println(s); + System.out.println("DecBase64:" + Util.bytes2HexString(Base64.getDecoder().decode(s))); boolean b = api.SM2Verify( Util.hexString2Bytes(thisPublicKey), thisOrgData.getBytes(), s); System.out.println(b); } @@ -1599,7 +1606,7 @@ public class TestAllMethods { String orgData = "3214312341243214"; String DN = "C=CN,O=Sunyard,OU=8001,CN=8001"; String sign = api.SYD_DetachedSign(orgData.getBytes(), DN); - System.out.println("签名结果" + sign); + System.out.println("签名结果: " + sign); boolean b = api.SYD_DetachedVerify(orgData.getBytes(), sign); System.out.println("验签结果:" + b); @@ -1649,11 +1656,12 @@ public class TestAllMethods { // 8005 @Test public void testDetachedSign() { - String publicKey = "0342000469DE3847DD6A66DA96DB8F2DCFA32E10E680FF2EF4A592079E7C3A44320BB15084E7CA9782A39B6E28F07C04FE00D68958A2605921E71712D56C1E4435A39FA5"; - String orgData = "FFFFFFFFFFFFFFFF"; + String publicKey = "034200043EDA3A107B7CC35CC005C7FBF0BB4E6B43A07EE14E360603D22ECA2A600B2D0FA03055D400D1240300F54648B849D13F50B330FF14351B5645B13686820A65BB"; + String orgData = "0101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101"; String testCertNo = "C=CN,O=Sunyard,OU=8001,CN=8001"; - byte[] hash = api.SM3Hash(publicKey, orgData.getBytes()); + byte[] hash = api.SM3Hash(publicKey, Util.hexString2Bytes(orgData)); + System.out.println("hash:" + hash); String sign = api.detachedSign( SydApi.DATA_HASH, @@ -1687,6 +1695,20 @@ public class TestAllMethods { System.out.println("验签结果:" + b); } + // 测试通过 + // 8005 + @Test + public void testSm3WithoutPKDetachedSign() { + String orgData = "FFFFFFFFFFFFFFFF"; + String testCertNo = "C=CN,O=Sunyard,OU=8001,CN=8001"; + + String sign = api.sm3WithoutPKDetachedSign(orgData.getBytes(), testCertNo); + System.out.println("签名结果: " + sign); + + boolean b = api.sm3WithoutPKDetachedVerify(orgData.getBytes(), sign); + System.out.println("验签结果:" + b); + } + // 8026 @Test public void testDetachedSignbysn() { diff --git a/src/test/java/com/sunyard/sydapi/test/TestLast.java b/src/test/java/com/sunyard/sydapi/test/TestLast.java index 886e53a..b3ba89c 100644 --- a/src/test/java/com/sunyard/sydapi/test/TestLast.java +++ b/src/test/java/com/sunyard/sydapi/test/TestLast.java @@ -618,9 +618,10 @@ public class TestLast { //16.6 SM2公钥验签(+)->pass (仅签名数据类型为原数据通过) @Test public void SYD_SM2_Verify_HA() { - RetWrap retWrap = api.SM2OrRSAGenKeyPair(1, "006", 256); + RetWrap retWrap = api.SM2OrRSAGenKeyPair(1, "007", 256); String s = api.SYD_SM2_Sign_HA(1, (byte[]) retWrap.get("PrivateKey"), (byte[]) retWrap.get("PublicKey"), key7.getBytes()); System.out.println(s); + System.out.println( Util.bytes2HexString( Util.decodeBase64(s) ) ); boolean b = api.SYD_SM2_Verify_HA(1, (byte[]) retWrap.get("PublicKey"), key7.getBytes(), s); System.out.println(b); }