From 91a824101dad2c4f1ab6f90d943d00e149b5ed52 Mon Sep 17 00:00:00 2001 From: zhoubin <2023106681@qq.com> Date: Wed, 29 Dec 2021 10:34:26 +0800 Subject: [PATCH] =?UTF-8?q?6C=E3=80=816D=E6=8C=87=E4=BB=A4=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0=E6=8E=A5=E5=8F=A3=EF=BC=8C=E9=80=9A=E8=BF=87=E5=A4=96?= =?UTF-8?q?=E9=83=A8=E5=85=AC=E9=92=A5=E5=81=9Ahash?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/sunyard/inf/customize/SydQNUCApi.java | 22 +++++++- .../java/racal/sunyard/main/SydApi4j.java | 10 +++- .../sunyard/sydapi/test/TestAllMethods.java | 52 ++++++++++++++++++- .../com/sunyard/sydapi/test/TestGSYH.java | 49 +++++++++++++++++ 4 files changed, 130 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/sunyard/inf/customize/SydQNUCApi.java b/src/main/java/com/sunyard/inf/customize/SydQNUCApi.java index 562db2f..a90f1f7 100644 --- a/src/main/java/com/sunyard/inf/customize/SydQNUCApi.java +++ b/src/main/java/com/sunyard/inf/customize/SydQNUCApi.java @@ -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); + } diff --git a/src/main/java/racal/sunyard/main/SydApi4j.java b/src/main/java/racal/sunyard/main/SydApi4j.java index 329ed9b..6f181f7 100644 --- a/src/main/java/racal/sunyard/main/SydApi4j.java +++ b/src/main/java/racal/sunyard/main/SydApi4j.java @@ -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(); diff --git a/src/test/java/com/sunyard/sydapi/test/TestAllMethods.java b/src/test/java/com/sunyard/sydapi/test/TestAllMethods.java index 13a60d4..4d156b3 100644 --- a/src/test/java/com/sunyard/sydapi/test/TestAllMethods.java +++ b/src/test/java/com/sunyard/sydapi/test/TestAllMethods.java @@ -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"; diff --git a/src/test/java/com/sunyard/sydapi/test/TestGSYH.java b/src/test/java/com/sunyard/sydapi/test/TestGSYH.java index daaecca..13eab58 100644 --- a/src/test/java/com/sunyard/sydapi/test/TestGSYH.java +++ b/src/test/java/com/sunyard/sydapi/test/TestGSYH.java @@ -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); + } + + }