添加8018,8019两个指令所对应的接口。
This commit is contained in:
parent
c3236d3547
commit
f06bb2a10c
@ -1,7 +1,6 @@
|
||||
<?xml version="1.0" encoding="UTF-8" ?>
|
||||
<packet extend="base">
|
||||
<req>
|
||||
|
||||
<command>
|
||||
<bin>8018</bin>
|
||||
</command>
|
||||
@ -11,7 +10,7 @@
|
||||
X509证书序号
|
||||
</DN>
|
||||
|
||||
<dataLen len="4" :value="dataLength()" cn="数据长度">
|
||||
<dataLen len="2" :value="dataLength()" cn="数据长度">
|
||||
数据长度
|
||||
</dataLen>
|
||||
|
||||
@ -20,14 +19,12 @@
|
||||
</infoData>
|
||||
|
||||
</data>
|
||||
|
||||
|
||||
|
||||
</req>
|
||||
<res>
|
||||
|
||||
|
||||
<res>
|
||||
<command>
|
||||
<bin>8006</bin>
|
||||
<bin>8019</bin>
|
||||
</command>
|
||||
<data>
|
||||
<error len="2" cn="错误码" format="X" :catch="catchError('%s')">
|
||||
@ -71,7 +68,7 @@
|
||||
</options>
|
||||
</error>
|
||||
|
||||
<signatureLen len="2" cn="签名的字节长度">
|
||||
<signatureLen len="2" format="X" cn="签名的字节长度">
|
||||
签名的字节长度
|
||||
</signatureLen>
|
||||
|
||||
@ -80,14 +77,22 @@
|
||||
</signature>
|
||||
|
||||
</data>
|
||||
|
||||
|
||||
|
||||
</res>
|
||||
<script>function dataLength(){
|
||||
return $packet.data.infoData.length;
|
||||
}
|
||||
function signatureLen() {
|
||||
return Util.a2i( $final.getSection('data').getSection('signatureLen') )
|
||||
} </script>
|
||||
|
||||
|
||||
<script>
|
||||
<![CDATA[
|
||||
function dataLength() {
|
||||
def len = $packet.data.infoData.length;
|
||||
def data = new byte[2];
|
||||
data[0] = (byte)(len >> 8 & 0xFF)
|
||||
data[1] = (byte)(len & 0xFF)
|
||||
|
||||
return data;
|
||||
}
|
||||
]]>
|
||||
function signatureLen() {
|
||||
return Util.b2i( $final.getSection('data').getSection('signatureLen') )
|
||||
}
|
||||
</script>
|
||||
</packet>
|
||||
@ -1,23 +1,18 @@
|
||||
<?xml version="1.0" encoding="UTF-8" ?>
|
||||
<packet extend="base">
|
||||
<req>
|
||||
|
||||
<command>
|
||||
<bin>8019</bin>
|
||||
</command>
|
||||
<data extend="data">
|
||||
|
||||
<DN len="256" cn="证书 DN">
|
||||
X509证书序号
|
||||
</DN>
|
||||
|
||||
<dataLen len="2" :value="dataLength()" cn="数据长度">
|
||||
已签名数据长度
|
||||
</dataLen>
|
||||
|
||||
<infoData cn="已签名数据">
|
||||
<signData cn="已签名数据">
|
||||
已签名数据
|
||||
</infoData>
|
||||
</signData>
|
||||
|
||||
<flag len="2" cn="标记">
|
||||
<options>
|
||||
@ -31,14 +26,12 @@
|
||||
</flag>
|
||||
|
||||
</data>
|
||||
|
||||
|
||||
|
||||
</req>
|
||||
<res>
|
||||
|
||||
|
||||
<res>
|
||||
<command>
|
||||
<bin>8007</bin>
|
||||
<bin>8020</bin>
|
||||
</command>
|
||||
<data>
|
||||
<error len="2" cn="错误码" format="X" :catch="catchError('%s')">
|
||||
@ -82,11 +75,11 @@
|
||||
</options>
|
||||
</error>
|
||||
|
||||
<infoLen len="2" cn="信息长度">
|
||||
<infoLen len="2" format="X" :if="0 != $packet.data.flag$option" cn="信息长度">
|
||||
信息长度
|
||||
</infoLen>
|
||||
|
||||
<info :len="infoLen()" cn="信息">
|
||||
<info :len="reInfoLen()" :if="0 != $packet.data.flag$option" cn="信息">
|
||||
若发送报文返回证书信息标志位为0,则返回已签名数据,
|
||||
若发送报文返回证书信息标志位为1,则返回CERT_INFO结构的证书数据
|
||||
</info>
|
||||
@ -94,12 +87,25 @@
|
||||
</data>
|
||||
|
||||
|
||||
|
||||
</res>
|
||||
<script>function dataLength(){
|
||||
return $packet.data.infoData.length;
|
||||
}
|
||||
function infoLen() {
|
||||
return Util.a2i( $final.data.infoLen )
|
||||
} </script>
|
||||
<script>
|
||||
<![CDATA[
|
||||
function dataLength() {
|
||||
def len = $packet.data.signData.length;
|
||||
def data = new byte[2];
|
||||
data[0] = (byte)(len >> 8 & 0xFF)
|
||||
data[1] = (byte)(len & 0xFF)
|
||||
|
||||
return data;
|
||||
}
|
||||
]]>
|
||||
|
||||
function reInfoLen() {
|
||||
if (null == $final.data.infoLen){
|
||||
return 0;
|
||||
}
|
||||
|
||||
return Util.b2i( $final.getSection('data').getSection('infoLen') )
|
||||
}
|
||||
</script>
|
||||
</packet>
|
||||
Binary file not shown.
@ -167,6 +167,28 @@ interface SydAttachedSVApi {
|
||||
byte[] orgData,
|
||||
String sign
|
||||
);
|
||||
|
||||
/**
|
||||
* 带公钥证书与原始数据的数字签名(遵循 PKCS#7)
|
||||
* 使用指定的证书 DN,从加密设备获取对应的私钥证书,对指定的原始数据编制带公钥证书的数字签名(遵循 PKCS#7)。
|
||||
*
|
||||
* @param orgData 待签名数据
|
||||
* @param sCertDN 证书DN
|
||||
* @return
|
||||
* 符合PKCS7标准的签名结果
|
||||
*/
|
||||
String attachedSign(byte[] orgData, String sCertDN);
|
||||
|
||||
/**
|
||||
* 带公钥证书与原始数据的数字签名验签(遵循 PKCS#7)
|
||||
* 对指定的原始数据核验其带公钥证书签名。如签名有效(含证书无效)且需返回签名者公钥证书信息时,同时返回签名者公钥证书信息。
|
||||
*
|
||||
* @param sign 已签名数据
|
||||
* @return
|
||||
* 若发送报文返回证书信息标志位为0,则返回已签名数据,
|
||||
* 若发送报文返回证书信息标志位为1,则返回CERT_INFO结构的证书数据
|
||||
*/
|
||||
X509 attachedVerify(String sign);
|
||||
}
|
||||
|
||||
|
||||
|
||||
@ -9668,6 +9668,121 @@ public class SydApi4j implements SydApi {
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 带公钥证书与原始数据的数字签名(遵循 PKCS#7)
|
||||
* 使用指定的证书 DN,从加密设备获取对应的私钥证书,对指定的原始数据编制带公钥证书的数字签名(遵循 PKCS#7)。
|
||||
*
|
||||
* @param orgData 待签名数据
|
||||
* @param sCertDN 证书DN
|
||||
* @return
|
||||
* 符合PKCS7标准的签名结果
|
||||
*/
|
||||
@Override
|
||||
public String attachedSign(byte[] orgData, String sCertDN) {
|
||||
Proto8018 proto = new Proto8018(); //pset.getProtocolReqRender("75");
|
||||
byte[] dn = new byte[256];
|
||||
byte[] s = null;
|
||||
try {
|
||||
s = sCertDN.getBytes("GBK");
|
||||
} catch (UnsupportedEncodingException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
||||
System.arraycopy(s, 0, dn, 0, s.length);
|
||||
|
||||
// 填充数据
|
||||
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("DN", dn);
|
||||
data.put("infoData", orgData);
|
||||
|
||||
// 渲染发送
|
||||
ByteBuffer bb = proto.rend(packet);
|
||||
|
||||
synchronized (this) {
|
||||
// 响应解析
|
||||
bb = syncRead(syncSend(bb));
|
||||
}
|
||||
|
||||
Packet p = proto.parse(bb);
|
||||
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());
|
||||
}
|
||||
|
||||
return ((PacketSection) ret.get("signature")).getString();
|
||||
}
|
||||
|
||||
/**
|
||||
* 带公钥证书与原始数据的数字签名验签(遵循 PKCS#7)
|
||||
* 对指定的原始数据核验其带公钥证书签名。如签名有效(含证书无效)且需返回签名者公钥证书信息时,同时返回签名者公钥证书信息。
|
||||
*
|
||||
* @param sign 已签名数据
|
||||
* @return
|
||||
* 返回CERT_INFO结构的证书数据
|
||||
*/
|
||||
@Override
|
||||
public X509 attachedVerify(String sign) {
|
||||
Proto8019 proto = new Proto8019(); //pset.getProtocolReqRender("75");
|
||||
|
||||
// 填充数据
|
||||
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]))) {
|
||||
return null;
|
||||
}
|
||||
|
||||
PacketSection info = (PacketSection) ret.get("info");
|
||||
byte[] pCertInfo = info.getBytes();
|
||||
|
||||
String certInfo = new String(pCertInfo);
|
||||
int index = certInfo.indexOf("-----BEGIN CERTIFICATE-----");
|
||||
certInfo = certInfo.substring(index);
|
||||
// System.out.println("证书信息: " + certInfo);
|
||||
X509 x509 = GetX509CertInfo(certInfo);
|
||||
return x509;
|
||||
}
|
||||
|
||||
|
||||
// ------------------------中移指令接口--------------------------------
|
||||
|
||||
/**
|
||||
|
||||
@ -30,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.66", 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);
|
||||
// api = (SydApi4j) new SydApi4j().connect("192.168.0.99", 8889, null, 1000);
|
||||
// api = (SydApi4j) new SydApi4j().connect("172.16.17.162", 8889, null, 1000);
|
||||
@ -2088,6 +2089,20 @@ public class TestAllMethods {
|
||||
System.out.println(s);
|
||||
}
|
||||
|
||||
// todo: 需要测试
|
||||
// 8018
|
||||
@Test
|
||||
public void testAttachedSignAndVerify() {
|
||||
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.attachedVerify(sign);
|
||||
System.out.println("验签结果: " + Util.bytes2HexString(verify.getPubKey()));
|
||||
}
|
||||
|
||||
// 00883030303030303030
|
||||
// 3938
|
||||
// 30313232
|
||||
|
||||
Loading…
Reference in New Issue
Block a user