1、删除kotlin依赖。2、8019指令增加验签成功返回原数据的接口

This commit is contained in:
zhoubin 2022-04-02 09:00:52 +08:00
parent 3636ce7b5d
commit 4e42f354b5
9 changed files with 179 additions and 99 deletions

View File

@ -84,6 +84,14 @@
若发送报文返回证书信息标志位为1则返回CERT_INFO结构的证书数据
</info>
<oDataLen len="2" format="X" :if="0 != $packet.data.flag$option" cn="原始数据长度">
签名的原始数据长度
</oDataLen>
<oData :len="reODataLen()" :if="0 != $packet.data.flag$option" cn="原始数据">
签名的原始数据
</oData>
</data>
@ -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') )
}
</script>
</packet>

Binary file not shown.

80
pom.xml
View File

@ -33,12 +33,12 @@
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.jetbrains.kotlin</groupId>
<artifactId>kotlin-test</artifactId>
<version>${kotlin.version}</version>
<scope>test</scope>
</dependency>
<!-- <dependency>-->
<!-- <groupId>org.jetbrains.kotlin</groupId>-->
<!-- <artifactId>kotlin-test</artifactId>-->
<!-- <version>${kotlin.version}</version>-->
<!-- <scope>test</scope>-->
<!-- </dependency>-->
<!-- https://mvnrepository.com/artifact/dom4j/dom4j -->
@ -61,11 +61,11 @@
<artifactId>fastjson</artifactId>
<version>1.2.39</version>
</dependency>
<dependency>
<groupId>org.jetbrains.kotlin</groupId>
<artifactId>kotlin-stdlib-jdk8</artifactId>
<version>${kotlin.version}</version>
</dependency>
<!-- <dependency>-->
<!-- <groupId>org.jetbrains.kotlin</groupId>-->
<!-- <artifactId>kotlin-stdlib-jdk8</artifactId>-->
<!-- <version>${kotlin.version}</version>-->
<!-- </dependency>-->
<!--<dependency>-->
@ -194,35 +194,35 @@
</executions>
</plugin>
<plugin>
<groupId>org.jetbrains.kotlin</groupId>
<artifactId>kotlin-maven-plugin</artifactId>
<version>${kotlin.version}</version>
<executions>
<execution>
<id>compile</id>
<phase>compile</phase>
<goals>
<goal>compile</goal>
</goals>
<configuration>
<sourceDirs>
<source>src/main/java</source>
</sourceDirs>
</configuration>
</execution>
<execution>
<id>test-compile</id>
<phase>test-compile</phase>
<goals>
<goal>test-compile</goal>
</goals>
</execution>
</executions>
<configuration>
<jvmTarget>1.6</jvmTarget>
</configuration>
</plugin>
<!-- <plugin>-->
<!-- <groupId>org.jetbrains.kotlin</groupId>-->
<!-- <artifactId>kotlin-maven-plugin</artifactId>-->
<!-- <version>${kotlin.version}</version>-->
<!-- <executions>-->
<!-- <execution>-->
<!-- <id>compile</id>-->
<!-- <phase>compile</phase>-->
<!-- <goals>-->
<!-- <goal>compile</goal>-->
<!-- </goals>-->
<!-- <configuration>-->
<!-- <sourceDirs>-->
<!-- <source>src/main/java</source>-->
<!-- </sourceDirs>-->
<!-- </configuration>-->
<!-- </execution>-->
<!-- <execution>-->
<!-- <id>test-compile</id>-->
<!-- <phase>test-compile</phase>-->
<!-- <goals>-->
<!-- <goal>test-compile</goal>-->
<!-- </goals>-->
<!-- </execution>-->
<!-- </executions>-->
<!-- <configuration>-->
<!-- <jvmTarget>1.6</jvmTarget>-->
<!-- </configuration>-->
<!-- </plugin>-->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>

View File

@ -188,6 +188,15 @@ interface SydAttachedSVApi {
*/
boolean attachedVerify(String sign);
/**
* 带公钥证书与原始数据的数字签名验签遵循 PKCS#7
* 对指定的原始数据核验其带公钥证书签名如签名有效含证书无效且需返回签名者公钥证书信息时同时返回签名者公钥证书信息
*
* @param sign 已签名数据
* @return 成功返回签名的原数据失败则报错
*/
String attachedVerifyRD(String sign);
/**
* 带公钥证书与原始数据的数字签名验签遵循 PKCS#7
* 对指定的原始数据核验其带公钥证书签名如签名有效含证书无效且需返回签名者公钥证书信息时同时返回签名者公钥证书信息

View File

@ -9978,6 +9978,49 @@ public class SydApi4j implements SydApi {
return true;
}
@Override
public String attachedVerifyRD(String sign) {
Proto8019 proto = new Proto8019();
// 填充数据
HashMap<String, Object> packet = new HashMap<String, Object>();
HashMap<String, Object> data = new HashMap<String, Object>();
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<String, Object> ret = p.toMap();
if (
!Arrays.equals(sn.getSn().array(), ((PacketSection) ret.get("header")).getBytes())
) {
throw new SydApiException("包序号不匹配", -4);
}
ret = (Map<String, Object>) 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
* 对指定的原始数据核验其带公钥证书签名如签名有效含证书无效且需返回签名者公钥证书信息时同时返回签名者公钥证书信息

View File

@ -1,11 +0,0 @@
package com.sunyard.sydapi.test
fun main(args: Array<String>) {
var code = 32774
println( String.format("%X", code) )
System.setProperty("com.sunyard.sydapi4j.debug", "true")
}

View File

@ -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

View File

@ -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));
}
// =============================工具方法==============================================

View File

@ -1,41 +0,0 @@
package com.sunyard.sydapi.test
import com.sunyard.proto.Util
import kotlin.experimental.xor
fun main(args: Array<String>) {
// 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) )
}