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