diff --git a/DProto/8019.xml b/DProto/8019.xml index a613619..6e75df2 100644 --- a/DProto/8019.xml +++ b/DProto/8019.xml @@ -84,6 +84,14 @@ 若发送报文返回证书信息标志位为1,则返回CERT_INFO结构的证书数据 + + 签名的原始数据长度 + + + + 签名的原始数据 + + @@ -107,5 +115,13 @@ return Util.b2i( $final.getSection('data').getSection('infoLen') ) } + + function reODataLen() { + if (null == $final.data.oDataLen){ + return 0; + } + + return Util.b2i( $final.getSection('data').getSection('oDataLen') ) + } \ No newline at end of file diff --git a/doc/java接口说明文档.docx b/doc/java接口说明文档.docx index d247182..c83b974 100644 Binary files a/doc/java接口说明文档.docx and b/doc/java接口说明文档.docx differ diff --git a/pom.xml b/pom.xml index 4c76184..6bdfa06 100644 --- a/pom.xml +++ b/pom.xml @@ -33,12 +33,12 @@ test - - org.jetbrains.kotlin - kotlin-test - ${kotlin.version} - test - + + + + + + @@ -61,11 +61,11 @@ fastjson 1.2.39 - - org.jetbrains.kotlin - kotlin-stdlib-jdk8 - ${kotlin.version} - + + + + + @@ -194,35 +194,35 @@ - - org.jetbrains.kotlin - kotlin-maven-plugin - ${kotlin.version} - - - compile - compile - - compile - - - - src/main/java - - - - - test-compile - test-compile - - test-compile - - - - - 1.6 - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + org.apache.maven.plugins maven-compiler-plugin diff --git a/src/main/java/com/sunyard/inf/SydSVApi.java b/src/main/java/com/sunyard/inf/SydSVApi.java index f4677c2..910f176 100644 --- a/src/main/java/com/sunyard/inf/SydSVApi.java +++ b/src/main/java/com/sunyard/inf/SydSVApi.java @@ -188,6 +188,15 @@ interface SydAttachedSVApi { */ boolean attachedVerify(String sign); + /** + * 带公钥证书与原始数据的数字签名验签(遵循 PKCS#7) + * 对指定的原始数据核验其带公钥证书签名。如签名有效(含证书无效)且需返回签名者公钥证书信息时,同时返回签名者公钥证书信息。 + * + * @param sign 已签名数据 + * @return 成功返回签名的原数据,失败则报错 + */ + String attachedVerifyRD(String sign); + /** * 带公钥证书与原始数据的数字签名验签(遵循 PKCS#7) * 对指定的原始数据核验其带公钥证书签名。如签名有效(含证书无效)且需返回签名者公钥证书信息时,同时返回签名者公钥证书信息。 diff --git a/src/main/java/racal/sunyard/main/SydApi4j.java b/src/main/java/racal/sunyard/main/SydApi4j.java index 2fc4c3d..4a0dc28 100644 --- a/src/main/java/racal/sunyard/main/SydApi4j.java +++ b/src/main/java/racal/sunyard/main/SydApi4j.java @@ -9978,6 +9978,49 @@ public class SydApi4j implements SydApi { return true; } + @Override + public String attachedVerifyRD(String sign) { + Proto8019 proto = new Proto8019(); + + // 填充数据 + HashMap packet = new HashMap(); + HashMap data = new HashMap(); + packet.put("data", data); + PacketSN sn = PacketSN.gen(); + packet.put("header", sn.getSn().array()); + + data.put("signData", sign.getBytes()); + data.put("flag$option", 1); + + // 渲染发送 + 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 ((0 != (be[0] ^ be[1]))) { + throw new SydApiException(error.getInfo(), error.autoInt()); + } + + PacketSection info = (PacketSection) ret.get("oData"); + byte[] oData = info.getBytes(); + + return new String(oData); + } + /** * 带公钥证书与原始数据的数字签名验签(遵循 PKCS#7) * 对指定的原始数据核验其带公钥证书签名。如签名有效(含证书无效)且需返回签名者公钥证书信息时,同时返回签名者公钥证书信息。 diff --git a/src/test/java/com/sunyard/sydapi/test/ErrorCode.kt b/src/test/java/com/sunyard/sydapi/test/ErrorCode.kt deleted file mode 100644 index d768f11..0000000 --- a/src/test/java/com/sunyard/sydapi/test/ErrorCode.kt +++ /dev/null @@ -1,11 +0,0 @@ -package com.sunyard.sydapi.test - -fun main(args: Array) { - - var code = 32774 - - println( String.format("%X", code) ) - - System.setProperty("com.sunyard.sydapi4j.debug", "true") - -} \ No newline at end of file diff --git a/src/test/java/com/sunyard/sydapi/test/TestAllMethods.java b/src/test/java/com/sunyard/sydapi/test/TestAllMethods.java index 18f46dc..cb57407 100644 --- a/src/test/java/com/sunyard/sydapi/test/TestAllMethods.java +++ b/src/test/java/com/sunyard/sydapi/test/TestAllMethods.java @@ -37,8 +37,8 @@ public class TestAllMethods { public void before() { // 通过设置debug的属性开启debug,如果不设置则默认不打开 System.setProperty("com.sunyard.sydapi4j.debug", "true"); -// api = (SydApi4j) new SydApi4j().connect("172.16.18.59", 8889, null, 1000); - api = (SydApi4j) new SydApi4j().connect("192.168.0.119", 8889, null, 1000); + api = (SydApi4j) new SydApi4j().connect("172.16.18.59", 8889, null, 1000); +// api = (SydApi4j) new SydApi4j().connect("192.168.0.119", 8889, null, 1000); // api = (SydApi4j) new SydApi4j().connect("61.164.40.82", 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); @@ -1885,8 +1885,8 @@ public class TestAllMethods { @Test public void testSYD_SM2_Encrypt() { - String sk="00010000C5AA43F372B01220C25406046EECBDAFEBD2206A6E4C8401DB6C54FE35DD4D520000000000000000000000000000000000000000000000000000000000000000"; - String publicKey = "03420004C0D1A2FB87B51F22D490EA88301EB210BD6C9A6C21DA4D4BFF1ED2E70622909F58A6A3A55308D1CE46CF9A58090E6BA3BC34A6625D1765D87F9A0557CCFBC244"; + String sk="000100001C9588B521C2ECDDF0515D2829F3EFB26E5FE3E49CF96E3438FFEB7363845A110000000000000000000000000000000000000000000000000000000000000000"; + String publicKey = "03420004A8A03F380DDD8C414980FCA5C0A981E190A4528BF87C9FDAA30881CEE9EC83CC3DB93AE1B4FF529A0D0D9D42EDFDCEB46470D1046EAC5E4F32C31083C72C050F"; String orgData = "FFFFFFFFFFF1111111111FFFFF"; byte[] encData = api.SYD_SM2_Encrypt(Util.hexString2Bytes(publicKey), orgData.getBytes()); @@ -1896,6 +1896,22 @@ public class TestAllMethods { System.out.println("decData:" + new String(bytes)); } + // 测试通过 + // 78 + @Test + public void testSYD_SM2_Encrypt2() { + + String publicKey = "03420004A8A03F380DDD8C414980FCA5C0A981E190A4528BF87C9FDAA30881CEE9EC83CC3DB93AE1B4FF529A0D0D9D42EDFDCEB46470D1046EAC5E4F32C31083C72C050F"; + String orgData = "FFFFFFFFFFF1111111111FFFFF"; + String userId = "1111111111111148"; + + byte[] encData = api.SYD_SM2_Encrypt(Util.hexString2Bytes(publicKey), orgData.getBytes()); + System.out.println("加密后的数据: " + Util.bytes2HexString(encData)); + + byte[] bytes = api.decryptBySkC(1, userId, encData); + System.out.println("decData:" + new String(bytes)); + } + // 测试通过 // 78 @Test @@ -2367,6 +2383,34 @@ public class TestAllMethods { System.out.println("验签结果: " + verify); } + // 测试通过 + // 8018 + @Test + public void testAttachedSignAndVerifyC() { + String dn = "C=CN,O=Sunyard,OU=8001,CN=8001"; + String orgData = "111111213323143243243"; + String sign = api.attachedSign(orgData.getBytes(), dn); + System.out.println("签名结果: " + sign); + +// String sign = "MIICsgYKKoEcz1UGAQQCAqCCAqIwggKeAgEBMQwwCgYIKoEcz1UBgxEwIAYKKoEcz1UGAQQCAaASBBAzMjE0MzEyMzQxMjQzMjE0oIIByTCCAcUwggFooAMCAQICCDyTAAAAAAAlMAwGCCqBHM9VAYN1BQAwJjELMAkGA1UEBhMCQ04xFzAVBgNVBAMMDlN1bnlhcmRTTTJSb290MB4XDTE3MDUxNzAyNTI0NFoXDTIyMDcyNTAyNTI0NFowPTELMAkGA1UEBhMCQ04xEDAOBgNVBAoMB1N1bnlhcmQxDTALBgNVBAsMBDgwMDExDTALBgNVBAMMBDgwMDEwWTATBgcqhkjOPQIBBggqgRzPVQGCLQNCAAQ+2joQe3zDXMAFx/vwu05rQ6B+4U42BgPSLsoqYAstD6AwVdQA0SQDAPVGSLhJ0T9QszD/FDUbVkWxNoaCCmW7o2cwZTAOBgNVHQ8BAf8EBAMCAMAwEwYDVR0lBAwwCgYIKwYBBQUHAwEwHwYDVR0jBBgwFoAU93/arv8hxtk6eq2g+6z+AqVO1cEwHQYDVR0OBBYEFAMWZaY2AwaQTNiFLpsa0dyCzBZ6MAwGCCqBHM9VAYN1BQADSQAwRgIhAIl2ZHGfln5hedcousARzZ2yeUjUbxSFMmhMmr5t6Q6nAiEAvqYX/KpIcvnPyB/Yiil+oq6DFdVM6P3vDxBhU/8taXExgZswgZgCAQEwMjAmMQswCQYDVQQGEwJDTjEXMBUGA1UEAwwOU3VueWFyZFNNMlJvb3QCCDyTAAAAAAAlMAoGCCqBHM9VAYMRMAsGCSqBHM9VAYItAQRGMEQCIEons2hit2967ciJo3QipM4lJgd1K3QmwOp9O/n8Tl86AiB9V6Z7jQogZFtoIz6kwAI6OQVnjbtJlmO31bZxgYRwKg=="; + String verify = api.attachedVerifyRD(sign); + System.out.println("验签结果: " + verify); + } + + // 测试通过 + // 8018 + @Test + public void testAttachedSignAndVerify3() { + String dn = "C=CN,O=Sunyard,OU=8001,CN=8001"; + String orgData = "111111213323143243243"; + String sign = api.attachedSign(orgData.getBytes(), dn); + System.out.println("签名结果: " + sign); + +// String sign = "MIICsgYKKoEcz1UGAQQCAqCCAqIwggKeAgEBMQwwCgYIKoEcz1UBgxEwIAYKKoEcz1UGAQQCAaASBBAzMjE0MzEyMzQxMjQzMjE0oIIByTCCAcUwggFooAMCAQICCDyTAAAAAAAlMAwGCCqBHM9VAYN1BQAwJjELMAkGA1UEBhMCQ04xFzAVBgNVBAMMDlN1bnlhcmRTTTJSb290MB4XDTE3MDUxNzAyNTI0NFoXDTIyMDcyNTAyNTI0NFowPTELMAkGA1UEBhMCQ04xEDAOBgNVBAoMB1N1bnlhcmQxDTALBgNVBAsMBDgwMDExDTALBgNVBAMMBDgwMDEwWTATBgcqhkjOPQIBBggqgRzPVQGCLQNCAAQ+2joQe3zDXMAFx/vwu05rQ6B+4U42BgPSLsoqYAstD6AwVdQA0SQDAPVGSLhJ0T9QszD/FDUbVkWxNoaCCmW7o2cwZTAOBgNVHQ8BAf8EBAMCAMAwEwYDVR0lBAwwCgYIKwYBBQUHAwEwHwYDVR0jBBgwFoAU93/arv8hxtk6eq2g+6z+AqVO1cEwHQYDVR0OBBYEFAMWZaY2AwaQTNiFLpsa0dyCzBZ6MAwGCCqBHM9VAYN1BQADSQAwRgIhAIl2ZHGfln5hedcousARzZ2yeUjUbxSFMmhMmr5t6Q6nAiEAvqYX/KpIcvnPyB/Yiil+oq6DFdVM6P3vDxBhU/8taXExgZswgZgCAQEwMjAmMQswCQYDVQQGEwJDTjEXMBUGA1UEAwwOU3VueWFyZFNNMlJvb3QCCDyTAAAAAAAlMAoGCCqBHM9VAYMRMAsGCSqBHM9VAYItAQRGMEQCIEons2hit2967ciJo3QipM4lJgd1K3QmwOp9O/n8Tl86AiB9V6Z7jQogZFtoIz6kwAI6OQVnjbtJlmO31bZxgYRwKg=="; + X509 verify = api.attachedVerifyAndGetX509(sign); + System.out.println("验签结果: " + verify); + } + // 00883030303030303030 // 3938 // 30313232 diff --git a/src/test/java/com/sunyard/sydapi/test/TestHT.java b/src/test/java/com/sunyard/sydapi/test/TestHT.java index 4f0fcd5..a9e11b2 100644 --- a/src/test/java/com/sunyard/sydapi/test/TestHT.java +++ b/src/test/java/com/sunyard/sydapi/test/TestHT.java @@ -20,7 +20,7 @@ public class TestHT { public void before() { // 通过设置debug的属性开启debug,如果不设置则默认不打开 System.setProperty("com.sunyard.sydapi4j.debug", "true"); - api = (SydApi4j) new SydApi4j().connect("61.164.40.82", 8889, null, 1000); + api = (SydApi4j) new SydApi4j().connect("172.16.18.59", 8889, null, 1000); // api = (SydApi4j) new SydApi4j().connect("192.168.0.66", 8889, null, 1000); } @@ -56,8 +56,6 @@ public class TestHT { // 使用生成的对称密钥加密数据 byte[] dataEnc = api.SYMEncryptData(SydApi.NALG_SM4, sessionKey, data.getBytes()); - - // 解密数字信封 RetWrap retWrap1 = api.SM2ConfirmSessionKeyC(userId, cipherKey); printRetWrap(retWrap1); @@ -93,6 +91,28 @@ public class TestHT { System.out.println("验签结果: " + Util.bytes2HexString(verify.getPubKey())); } + @Test + public void testAttachedSignAndVerifyRD() { + String dn = "C=CN,O=Sunyard,OU=8001,CN=8001"; + String orgData = "111111213323143243243"; + String sign = api.attachedSign(orgData.getBytes(), dn); + System.out.println("签名结果: " + sign); + + String verify = api.attachedVerifyRD(sign); + System.out.println("验签结果: " + verify); + } + + // 测试通过 + // 76 + @Test + public void testSM3Hash() { + String orgData = "FFFFFFFFFFFFFFFF"; + + byte[] hash = api.SM3Hash(orgData.getBytes()); + + System.out.println("hash:" + Util.bytes2HexString(hash)); + } + // =============================工具方法============================================== diff --git a/src/test/java/com/sunyard/sydapi/test/ora.kt b/src/test/java/com/sunyard/sydapi/test/ora.kt deleted file mode 100644 index cd7f860..0000000 --- a/src/test/java/com/sunyard/sydapi/test/ora.kt +++ /dev/null @@ -1,41 +0,0 @@ -package com.sunyard.sydapi.test - -import com.sunyard.proto.Util -import kotlin.experimental.xor - - -fun main(args: Array) { - -// val k1 = Util.hexString2Bytes(String(Util.hexString2Bytes("61613030313131313131313131313131"))) -// val k2 = Util.hexString2Bytes( String( Util.hexString2Bytes("33303435333533353331343133353338"))) -// -// -// println( String(k1) ) -// println( String(k2) ) -// -// -// val d = ByteArray(8) -// for ( i in 0..7 ){ -// d[i] = k1[i] xor k2[i] -// } -// -// println(Util.bytes2HexString(d) ) -// println( String(d) ) - - - val k1 = Util.hexString2Bytes("61613030313131313131313131313131") - val k2 = Util.hexString2Bytes("33303435333533353331343133353338") - - - println( String(k1) ) - println( String(k2) ) - - - val d = ByteArray(16) - for ( i in 0..15 ){ - d[i] = k1[i] xor k2[i] - } - - println( Util.bytes2HexString(d) ) - println( String(d) ) -} \ No newline at end of file