6C、6D指令添加接口,通过外部公钥做hash

This commit is contained in:
zhoubin 2021-12-29 10:34:26 +08:00
parent 564c98aca0
commit 91a824101d
4 changed files with 130 additions and 3 deletions

View File

@ -15,7 +15,7 @@ public interface SydQNUCApi {
* @param pOrgData 输入 待签名的原始数据
* @return 签名数据(BASE64 编码)
*/
public String netSign(String pCertSerial, byte[] pOrgData);
String netSign(String pCertSerial, byte[] pOrgData);
/**
@ -31,4 +31,24 @@ public interface SydQNUCApi {
String pSignData
);
/**
* 用指定的证书私钥对指定的数据进行数字签名
* 最大签名原始数据为8161byte
* @param publicKey 输入签名 X509 证书的公钥
* @param pCertSerial 输入签名 X509 证书的序列号
* @param pOrgData 输入 待签名的原始数据
* @return 签名数据(BASE64 编码)
*/
String netGSSign(String publicKey, String pCertSerial, byte[] pOrgData);
/**
* 用指定证书对指定的原始数据进行数字签名验证
* @param publicKey 输入签名 X509 证书的公钥
* @param pCertSerial 输入 签名 X509 证书的序列号
* @param pOrgData 输入 待签名的原始数据
* @param pSignData 输入 签名数据(BASE64 编码)
* @return true 表示验证正确false 表示失败
*/
boolean netGSVerify(String publicKey, String pCertSerial, byte[] pOrgData, String pSignData);
}

View File

@ -2453,11 +2453,19 @@ public class SydApi4j implements SydApi {
return true;
}
public String netGSSign(String publicKey, String pCertSerial, byte[] pOrgData) {
byte[] hash = SM3Hash(publicKey, pOrgData);
return _netSign(pCertSerial, hash);
}
public boolean netGSVerify(String publicKey, String pCertSerial, byte[] pOrgData, String pSignData) {
byte[] hash = SM3Hash(publicKey, pOrgData);
return _netVerify(pCertSerial, hash, pSignData);
}
// 测试通过
private String _netSign(String pCertSerial, byte[] pOrgData) {
// 获取协议
//ProtocolRender render = pset.getProtocolReqRender("6C");
Proto6C proto = new Proto6C();

View File

@ -1297,6 +1297,55 @@ public class TestAllMethods {
System.out.println(b);
}
// 测试通过
// 6D
@Test
public void testNetGSSign() {
String sn = "1004282451";
String data = "111";
/**
* 通过证书序号 sn 获取的 X509 证书文件
* @param sn sn证书序号
* @param nCertType 证书类型0:签名证书, 1:加密证书
* @return base64 编码的证书
*/
String s = api.GetX509CertFileBySN(sn, 0);
System.out.println(s);
/**
* 输入 X509 格式的证书获取证书信息
* @param pCert base64 编码的证书
* @return 证书信息类
* 证书信息类包含颁发者DN 证书序列号 证书主题证书有效期的起始时间证书有效期的终止时间DER编码的公钥
*/
X509 x509 = api.GetX509CertInfo(s);
byte[] pubKey = x509.getPubKey();
/**
* 用指定的证书私钥对指定的数据进行数字签名
* 最大签名原始数据为8161byte
* @param publicKey 输入签名 X509 证书的公钥
* @param pCertSerial 输入签名 X509 证书的序列号
* @param pOrgData 输入 待签名的原始数据
* @return 签名数据(BASE64 编码)
*/
String sign = api.netGSSign(Util.bytes2HexString(pubKey), sn, data.getBytes());
System.out.println("签名: " + sign);
/**
* 用指定证书对指定的原始数据进行数字签名验证
* @param publicKey 输入签名 X509 证书的公钥
* @param pCertSerial 输入 签名 X509 证书的序列号
* @param pOrgData 输入 待签名的原始数据
* @param pSignData 输入 签名数据(BASE64 编码)
* @return true 表示验证正确false 表示失败
*/
boolean b = api.netGSVerify(Util.bytes2HexString(pubKey), sn, data.getBytes(), sign);
System.out.println(b);
}
// 测试通过
// 6D
@Test
@ -1436,7 +1485,8 @@ public class TestAllMethods {
String pUserId = "1572127378000000";
String publicKey = "03420004C51A40A094B6A14500B2980603D68CA263FF1BA238AFB17BB8B791C5F444465A749B68B4584C83E7BEF66DE2446177E14DBE0F32691F54B1636CC73334A1A94D";
String publicKey = "03420004C51A40A094B6A14500B2980603D68CA263FF1BA238AFB17BB8B791C5F444465A7" +
"49B68B4584C83E7BEF66DE2446177E14DBE0F32691F54B1636CC73334A1A94D";
String orgData = "FFFFFFFFFFFFFFFF";
String certId = "0000000011111112";

View File

@ -221,4 +221,53 @@ public class TestGSYH {
}
// 签名验签流程
@Test
public void testNetGSSign() {
String sn = "1004282451";
String data = "111";
/**
* 通过证书序号 sn 获取的 X509 证书文件
* @param sn sn证书序号
* @param nCertType 证书类型0:签名证书, 1:加密证书
* @return base64 编码的证书
*/
String s = api.GetX509CertFileBySN(sn, 0);
System.out.println("证书信息为: " + s);
/**
* 输入 X509 格式的证书获取证书信息
* @param pCert base64 编码的证书
* @return 证书信息类
* 证书信息类包含颁发者DN 证书序列号 证书主题证书有效期的起始时间证书有效期的终止时间DER编码的公钥
*/
X509 x509 = api.GetX509CertInfo(s);
byte[] pubKey = x509.getPubKey();
/**
* 用指定的证书私钥对指定的数据进行数字签名
* 最大签名原始数据为8161byte
* @param publicKey 输入公钥
* @param pCertSerial 输入签名 X509 证书的序列号
* @param pOrgData 输入 待签名的原始数据
* @return 签名数据(BASE64 编码)
*/
String sign = api.netGSSign(Util.bytes2HexString(pubKey), sn, data.getBytes());
System.out.println("签名结果: " + sign);
/**
* 用指定证书对指定的原始数据进行数字签名验证
* @param publicKey 输入公钥
* @param pCertSerial 输入 签名 X509 证书的序列号
* @param pOrgData 输入 待签名的原始数据
* @param pSignData 输入 签名数据(BASE64 编码)
* @return true 表示验证正确false 表示失败
*/
boolean b = api.netGSVerify(Util.bytes2HexString(pubKey), sn, data.getBytes(), sign);
System.out.println("验签结果: " + b);
}
}