diff --git a/src/main/java/com/sunyard/inf/SydCryptionApi.java b/src/main/java/com/sunyard/inf/SydCryptionApi.java index 9bcce0c..2ee413b 100644 --- a/src/main/java/com/sunyard/inf/SydCryptionApi.java +++ b/src/main/java/com/sunyard/inf/SydCryptionApi.java @@ -202,7 +202,7 @@ interface SydSYMApi { /** * 用输入的会话密钥,对指定报文数据进行加密处理。填充模式为1 * - * @param nAlg 算法标识., 1:DES,2:AES256,3:SM4。 + * @param nAlg 算法标识., 0x00:3DES,0x01:SM4。 * @param seesionKey 本地LMK 加密的会话密钥,HEX 格式 * @param pINdata 要加密的报文明文。必须是 8 或16 的倍数。 * @return 输出的报文密文, 长度为报文明文 + 16 @@ -234,7 +234,7 @@ interface SydSYMApi { /** * 用输入的会话密钥,对指定报文数据进行解密处理。填充模式为1 * - * @param nAlg  算法标识.1:DES,2:AES256,3:SM4。 + * @param nAlg  算法标识.0x00:3DES,0x01:SM4。 * @param seesionKey 本地LMK 加密的会话密钥,HEX 格式 * @param pINdata 要解密的报文密文。长度必须是8 或16 的倍数。 * @return 输出的报文明文。 diff --git a/src/main/java/racal/sunyard/main/SydApi4j.java b/src/main/java/racal/sunyard/main/SydApi4j.java index f6af4c9..b7c5758 100644 --- a/src/main/java/racal/sunyard/main/SydApi4j.java +++ b/src/main/java/racal/sunyard/main/SydApi4j.java @@ -2362,6 +2362,7 @@ public class SydApi4j implements SydApi { data.put("certificateModel$option", 0); data.put("certificateSn", pCertSerial); data.put("inData", pOrgData); + data.put("dataFlag", 'P'); packet.put("data", data); // 渲染发送 @@ -2413,6 +2414,7 @@ public class SydApi4j implements SydApi { data.put("certificateSn", pCertSerial); data.put("inData", pOrgData); data.put("sign", pSignData); + data.put("dataFlag", 'P'); packet.put("data", data); // 渲染发送 diff --git a/src/test/java/com/sunyard/sydapi/test/TestAllMethods.java b/src/test/java/com/sunyard/sydapi/test/TestAllMethods.java index 20199c9..d4d72b8 100644 --- a/src/test/java/com/sunyard/sydapi/test/TestAllMethods.java +++ b/src/test/java/com/sunyard/sydapi/test/TestAllMethods.java @@ -912,7 +912,17 @@ public class TestAllMethods { // E2 @Test public void testSM2OrRSAGenKeyPair() { - String index = "1111111111111123"; + // 000 +// String index = "1111111111111147"; +// // 0342000422C4FC907E0BEC600C2070D675EFB65EAE3A628260FF5461DD5F8133CF7CF98530EF392D016B6487BA6148E9AC27BDD4E8D7404A310CB09335F50AEF00ADB068 + + // 001 +// String index = "1111111111111148"; + // 0342000450420312F4ABAD98AA8EFC1F8F8204BD9E2F752C59C25A4025E675EDA5FB2337A449E00241EFA4A2F76A6C58D9834D6F0AB1164652E9C588E0EBD539C8ECB9EF + + // 1111111111111149 000 00000001 + String index = "1111111111111149"; + // 03420004080589A33A4DB304A3C48355761AC216B8BB5493966996E532B664A5B9CD8F1374F0DAACBF3F6D1F0E48E10DAA91889DB632FF4BE19D903502680D1AB56584D5 // SM2 RetWrap retWrap = api.SM2OrRSAGenKeyPair(1, index, 0); @@ -1225,10 +1235,9 @@ public class TestAllMethods { @Test public void testDecryptDE2() { String sn = "1004282452"; - RetWrap retWrap = api.generateDE(sn, (byte) 0x30); - String sessionKey = (String) retWrap.get("SessionKey"); + RetWrap retWrap = api.generateDE(sn, SydApi.ALG_SM4); String CipherKey = (String) retWrap.get("CipherKey"); - String KCV = (String) retWrap.get("KCV"); + printRetWrap(retWrap); RetWrap retWrap1 = api.decryptDE(sn, CipherKey); printRetWrap(retWrap1); @@ -1482,10 +1491,10 @@ public class TestAllMethods { @Test public void testSM2Verify3() { - String thisPublicKey = "034200045AC5014ED6A2CA0F9F79F3A34ADF4B8B92383F09E2D2F2F5B56F3D6C05B3EE43A3D65E57D3979C6CE9F6CEC5E0E30DC564416BFCB9A3E2D071559098B6B6BEF6"; + String thisPublicKey = "0342000422C4FC907E0BEC600C2070D675EFB65EAE3A628260FF5461DD5F8133CF7CF98530EF392D016B6487BA6148E9AC27BDD4E8D7404A310CB09335F50AEF00ADB068"; String thisOrgData = "FFFFFFFFFFFFFFFF"; - String s = api.SM2SignC(1, "111111111111111700000000001", Util.hexString2Bytes(thisPublicKey), thisOrgData.getBytes()); + String s = api.SM2SignC(1, "111111111111114700000000001", Util.hexString2Bytes(thisPublicKey), thisOrgData.getBytes()); System.out.println(s); boolean b = api.SM2Verify( Util.hexString2Bytes(thisPublicKey), thisOrgData.getBytes(), s); @@ -1497,9 +1506,9 @@ public class TestAllMethods { @Test public void testSM2Verify() { - String userId = "1111111111111113"; + String userId = "1111111111111149"; String certNo = "1234567812345678"; - String thisPublicKey = "03420004549B6A1A09A5D0D9432C6829D443F85ED8785340FC1AB14118BB7637830C808F7A888DF0C4F988EA6FF2EE6C76ECD00C4B7CEC92CC8EA365F8EA291041CAB231"; + String thisPublicKey = "03420004080589A33A4DB304A3C48355761AC216B8BB5493966996E532B664A5B9CD8F1374F0DAACBF3F6D1F0E48E10DAA91889DB632FF4BE19D903502680D1AB56584D5"; String thisOrgData = "FFFFFFFFFFFFFFFF"; String s = api.SM2SignC(userId, certNo, 1, Util.hexString2Bytes(thisPublicKey), thisOrgData.getBytes()); @@ -1533,7 +1542,8 @@ public class TestAllMethods { // QQ @Test public void testSM2GetPublicKeyC() { - String s = api.SM2GetPublicKeyC("0000000011111111", 0); + String s = api.SM2GetPublicKeyC("0000000000000001", 0); + System.out.println("获取到的公钥: " + s); } // 测试通过 diff --git a/src/test/java/com/sunyard/sydapi/test/TestXJ.java b/src/test/java/com/sunyard/sydapi/test/TestXJ.java new file mode 100644 index 0000000..7dc0181 --- /dev/null +++ b/src/test/java/com/sunyard/sydapi/test/TestXJ.java @@ -0,0 +1,457 @@ +package com.sunyard.sydapi.test; + +import com.sunyard.RetWrap; +import com.sunyard.SydApi; +import com.sunyard.cert.X509; +import com.sunyard.proto.Util; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; +import racal.sunyard.main.SydApi4j; + +import java.io.BufferedInputStream; +import java.io.FileInputStream; +import java.io.IOException; + +/** + * 新疆联通政务云 + */ +public class TestXJ { + + SydApi4j api; + + @Before + public void before() { + // 通过设置debug的属性开启debug,如果不设置则默认不打开 + System.setProperty("com.sunyard.sydapi4j.debug", "true"); + api = (SydApi4j) new SydApi4j().connect("192.168.0.100", 8889, null, 1000); + } + + @After + public void after() { + try { + this.api.disconnect(); + } catch (Exception e) { + e.printStackTrace(); + } + } + + // 测试通过 + // 8003 + @Test + public void testSYD_NakedSign() { + String dn = "C=CN,O=Sunyard,OU=8001,CN=8001"; + byte[] bytes = api.SYD_NakedSign("111".getBytes(), dn); + System.out.println(Util.bytes2HexString(bytes)); + } + + // 测试通过 + // 8004 + @Test + public void testSYD_NakedVerify() { + String dn = "C=CN,O=Sunyard,OU=8001,CN=8001"; + String orgData = "111"; + byte[] bytes = api.SYD_NakedSign(orgData.getBytes(), dn); + String sign = Util.bytes2HexString(bytes); + System.out.println(sign); + + boolean b = api.SYD_NakedVerify(orgData.getBytes(), bytes, dn); + System.out.println(b); + } + + // 测试通过 + // 6C + @Test + public void testNetSign() { + String sn = "1004282451"; + String s = api.netSign(sn, "111".getBytes()); + System.out.println(s); + } + + // 测试通过 + // 6D + @Test + public void testNetVerify() { + String sn = "1004282451"; + String data = "111"; + String s = api.netSign(sn, data.getBytes()); + + boolean b = api.netVerify(sn, data.getBytes(), s); + System.out.println(b); + } + + // 测试通过 + // 80 + @Test + public void testSM2SignCustomized() { + String sn = "1004282452"; + String s = api.SM2SignCustomized(sn, "111".getBytes()); + System.out.println(s); + } + + // 测试通过 + // 81 + @Test + public void testSM2VerifyCustomized() { + String sn = "1004282451"; + String data = "111"; + String s = api.SM2SignCustomized(sn, data.getBytes()); + + boolean b = api.SM2VerifyCustomized(sn, data.getBytes(), s); + System.out.println(b); + } + + // 测试通过 + // 74 + @Test + public void testSM2SignC() { + String userId = "1111111111111113"; + String certNo = "1234567812345678"; + String thisPublicKey = "03420004549B6A1A09A5D0D9432C6829D443F85ED8785340FC1AB14118BB7637830C808F7A888DF0C4F988EA6FF2EE6C76ECD00C4B7CEC92CC8EA365F8EA291041CAB231"; + String thisOrgData = "FFFFFFFFFFFFFFFF"; + + String s = api.SM2SignC(userId, certNo, 1, Util.hexString2Bytes(thisPublicKey), thisOrgData.getBytes()); + System.out.println(s); + } + + // 测试通过 + // 75 + @Test + public void testSM2Verify() { + + String userId = "1111111111111113"; + String certNo = "1234567812345678"; + String thisPublicKey = "03420004549B6A1A09A5D0D9432C6829D443F85ED8785340FC1AB14118BB7637830C808F7A888DF0C4F988EA6FF2EE6C76ECD00C4B7CEC92CC8EA365F8EA291041CAB231"; + String thisOrgData = "FFFFFFFFFFFFFFFF"; + + String s = api.SM2SignC(userId, certNo, 1, Util.hexString2Bytes(thisPublicKey), thisOrgData.getBytes()); + + System.out.println(s); + boolean b = api.SM2Verify(certNo, 1, Util.hexString2Bytes(thisPublicKey), thisOrgData.getBytes(), s); + System.out.println(b); + } + + // 测试通过 + // 8005 + @Test + public void testSYD_DetachedSign() { + + String orgData = "3214312341243214"; + String DN = "C=CN,O=Sunyard,OU=8001,CN=8001"; + String s = api.SYD_DetachedSign(orgData.getBytes(), DN); + System.out.println(s); + } + + // 测试通过 + // 8006 + @Test + public void testSYD_DetachedVerify() { + String orgData = "3214312341243214"; + String DN = "C=CN,O=Sunyard,OU=8001,CN=8001"; + String sign = api.SYD_DetachedSign(orgData.getBytes(), DN); + System.out.println("签名结果" + sign); + + boolean b = api.SYD_DetachedVerify(orgData.getBytes(), sign); + System.out.println("验签结果:" + b); + } + + // 测试通过 + // 8005 + @Test + public void testSm3AndDetachedSign() { + String publicKey = "0342000469DE3847DD6A66DA96DB8F2DCFA32E10E680FF2EF4A592079E7C3A44320BB15084E7CA9782A39B6E28F07C04FE00D68958A2605921E71712D56C1E4435A39FA5"; + String orgData = "FFFFFFFFFFFFFFFF"; + String testCertNo = "C=CN,O=Sunyard,OU=8001,CN=8001"; + + String sign = api.sm3AndDetachedSign(orgData.getBytes(), publicKey, testCertNo); + System.out.println("签名结果: " + sign); + + boolean b = api.sm3AndDetachedVerify(orgData.getBytes(), publicKey, sign); + System.out.println("验签结果:" + b); + } + + + // 测试通过 + // 8005 + @Test + public void testDetachedSign() { + String publicKey = "0342000469DE3847DD6A66DA96DB8F2DCFA32E10E680FF2EF4A592079E7C3A44320BB15084E7CA9782A39B6E28F07C04FE00D68958A2605921E71712D56C1E4435A39FA5"; + String orgData = "FFFFFFFFFFFFFFFF"; + String testCertNo = "C=CN,O=Sunyard,OU=8001,CN=8001"; + + byte[] hash = api.SM3Hash(publicKey, orgData.getBytes()); + + String sign = api.detachedSign( + SydApi.DATA_HASH, + hash, + testCertNo + ); + + System.out.println("\t签名结果: " + sign); + + boolean verify = api.detachedVerify( + SydApi.DATA_HASH, + hash, + sign + ); + + System.out.println("\t验签结果: " + verify); + } + + // 测试通过 + // 72 + @Test + public void testSM2GenSessionKey() { + + String pk="034200041CD47354867E12B9D138F098413C47D42EDEB2AD402EAB431C0C7AC2FE2D6DE9C67273C643C709F2A749188941B7FA7F9FF14F8E7D19316936DB4D4954FF3819"; + + RetWrap retWrap = api.SM2GenSessionKey(pk); + printRetWrap(retWrap); + } + + // 测试通过 + // 73 + @Test + public void testSM2ConfirmSessionKeyC() { + + String userId = "1111111111111147"; + + String pk="0342000422C4FC907E0BEC600C2070D675EFB65EAE3A628260FF5461DD5F8133CF7CF98530EF392D016B6487BA6148E9AC27BDD4E8D7404A310CB09335F50AEF00ADB068"; + + RetWrap retWrap = api.SM2GenSessionKey(pk); + printRetWrap(retWrap); + + String cipherKey = (String) retWrap.get("CipherKey"); + + RetWrap retWrap1 = api.SM2ConfirmSessionKeyC(userId, cipherKey); + printRetWrap(retWrap1); + } + + // 测试通过 + // E0 + @Test + public void testSYMEncryptData() { + String sessionKey = "XF356BCBA3204F6E6F356BCBA3204F6E6"; + String pInData = "1111111111111111"; + + byte[] bytes = api.SYMEncryptData(3,sessionKey, pInData.getBytes()); + byte[] bytes1 = api.SYMDecryptData(3, sessionKey, bytes); + System.out.println(new String(bytes1)); + } + + // 测试通过 + // E0 + @Test + public void testEncDecData() { + + String msg = "1111111111111111111111"; + + String key = "X3C9003C47A13379011733681ABB4A4D0"; + + byte[] bytes = api.SYMEncryptDataCBC(1, key, msg.getBytes()); + + System.out.println("输出为: " + Util.bytes2HexString(bytes)); + + byte[] bytes1 = api.SYMDecryptDataCBC(1, key, bytes); + System.out.println("明文:" + new String(bytes1)); + } + + // 测试通过 + // 6B + @Test + public void testDecryptDE() { + String sn = "1004282452"; + RetWrap retWrap = api.generateDE(sn, (byte) 0x30); + String sessionKey = (String) retWrap.get("SessionKey"); + String CipherKey = (String) retWrap.get("CipherKey"); + String KCV = (String) retWrap.get("KCV"); + + RetWrap retWrap1 = api.decryptDE(sn, CipherKey); + printRetWrap(retWrap1); + } + + // 测试通过 + // 7E + @Test + public void testSYD_SM2_Get_Dn_PublicKey_HA() { + String dn = "C=CN,O=Sunyard,OU=8001,CN=8001"; + String s = api.SYD_SM2_Get_Dn_PublicKey_HA(dn.getBytes(), 0); + System.out.println(s); + } + + // 测试通过 + // 6E + @Test + public void testGetX509SN() { + String dn = "C=CN,ST=ZJ,L=HZ,O=SUNYARD,OU=123456,CN=111"; + String s = api.getX509SN(0, dn.getBytes()); + System.out.println(s); + } + + // 测试通过 + // 7E + @Test + public void testGetDNPublicKey() { + String dn = "C=CN,O=Sunyard,OU=8001,CN=8001"; + String s = api.GetDNPublicKey(0, dn.getBytes()); + System.out.println(s); + } + + // 测试通过 + // QQ + @Test + public void testSM2GetPublicKeyC() { + String userId = "1111111111111117"; + + String s = api.SM2GetPublicKeyC(userId, 0); + System.out.println(s); + } + + // 测试通过 + // 8016 + @Test + public void testGetX509CertInfo() { + + String pCert = "-----BEGIN CERTIFICATE-----\u0007MIIC1jCCAnqgAwIBAgIFQAKAAXQwDAYIKoEcz1UBg3UFADBhMQswCQYDVQQGEwJD\u0007TjEwMC4GA1UECgwnQ2hpbmEgRmluYW5jaWFsIENlcnRpZmljYXRpb24gQXV0aG9y\u0007aXR5MSAwHgYDVQQDDBdDRkNBIEFDUyBURVNUIFNNMiBPQ0EzMTAeFw0xNzExMTYw\u0007NjU0NDVaFw0yMjExMTYwNjU0NDVaMIGDMQswCQYDVQQGEwJDTjEcMBoGA1UECgwT\u0007Q0ZDQSBURVNUIFNNMiBPQ0EzMTEOMAwGA1UECwwFU0hDUEUxGTAXBgNVBAsMEE9y\u0007Z2FuaXphdGlvbmFsLTExKzApBgNVBAMMIjA1MUDkuIrmtbfnpajmja7kuqTmmJPm\u0007iYBAQUFBQUFBQDgwWTATBgcqhkjOPQIBBggqgRzPVQGCLQNCAARg8D1RBEv9lpOE\u0007Q3SdzdLCQ4fDiE8Ncb2Fl4qIGc12GA/LUS1fgzLZuk0WlgyZDSe+QlQziqkmsXsx\u0007KoTCzqsto4H5MIH2MD8GCCsGAQUFBwEBBDMwMTAvBggrBgEFBQcwAYYjaHR0cDov\u0007L29jc3B0ZXN0LmNmY2EuY29tLmNuOjgwL29jc3AwHwYDVR0jBBgwFoAUBMe8+VkB\u0007aT6MNDYgYhg83ry1uwwwDAYDVR0TAQH/BAIwADA2BgNVHR8ELzAtMCugKaAnhiVo\u0007dHRwOi8vMjEwLjc0LjQyLjMvT0NBMzEvU00yL2NybDEuY3JsMA4GA1UdDwEB/wQE\u0007AwIGwDAdBgNVHQ4EFgQUomdLtdhENYb16pe1LNRlcr4N7b8wHQYDVR0lBBYwFAYI\u0007KwYBBQUHAwIGCCsGAQUFBwMEMAwGCCqBHM9VAYN1BQADSAAwRQIgZpJGhpRKmgfi\u0007Vbdq3UAGW6I3AUMfbWMd6webLQXmCOoCIQDSxTKRb0TfoXepD3VgO9qxCDwSc4yn\u0007WJ2GC3qmr81QBg==\u0007-----END CERTIFICATE-----\u0007"; + X509 x509 = api.GetX509CertInfo(pCert); + + String path = "E:\\work\\sunyard\\证书\\sm2.q\\sm2.q.enc.crt.pem"; + X509 x509_1 = api.GetX509CertInfo(getCertStr(path)); + } + + // 测试通过 + // 8017 + @Test + public void testGetX509CertFileC() { + String userId = "8001"; + + String s = api.GetX509CertFileC(userId, 0); + System.out.println(s); + } + + // 测试通过 + // E2 + @Test + public void testSM2GenKeyPair() { + RetWrap retWrap = api.SM2GenKeyPair(); + printRetWrap(retWrap, true); + } + + // 测试通过 + // QN + @Test + public void testSYD_SM2GenKeyPair() { + RetWrap retWrap = api.SYD_SM2GenKeyPair(); + printRetWrap(retWrap); + } + + // 测试通过 + // 77 + @Test + public void testSM2Encrypt() { + String publicKey = "03420004C51A40A094B6A14500B2980603D68CA263FF1BA238AFB17BB8B791C5F444465A749B68B4584C83E7BEF66DE2446177E14DBE0F32691F54B1636CC73334A1A94D"; + String orgData = "FFFFFFFFFFFFFFFF"; + String s = api.SM2Encrypt(Util.hexString2Bytes(publicKey), orgData.getBytes()); + + System.out.println("encData: " + s); + } + + // 测试通过 + // 78 + @Test + public void testSM2DecryptC() { + String certId = "1111111111111122"; + String publicKey = "0342000469DE3847DD6A66DA96DB8F2DCFA32E10E680FF2EF4A592079E7C3A44320BB15084E7CA9782A39B6E28F07C04FE00D68958A2605921E71712D56C1E4435A39FA5"; + String orgData = "FFFFFFFFFFFFFFFF"; + String s = api.SM2Encrypt(Util.hexString2Bytes(publicKey), orgData.getBytes()); + + byte[] bytes = api.SM2DecryptC(certId, s); + + System.out.println("decData:" + new String(bytes)); + } + + // 测试通过 + // 76 + // 带公钥 + @Test + public void testSM3Hash() { + String publicKey = "0342000469DE3847DD6A66DA96DB8F2DCFA32E10E680FF2EF4A592079E7C3A44320BB15084E7CA9782A39B6E28F07C04FE00D68958A2605921E71712D56C1E4435A39FA5"; + String orgData = "FFFFFFFFFFFFFFFF"; + + byte[] hash = api.SM3Hash(publicKey, orgData.getBytes()); + + System.out.println("hash:" + Util.bytes2HexString(hash)); + } + + // 测试通过 + // 76 + // 不带公钥 + @Test + public void testSM3Hash2() { + String orgData = "FFFFFFFFFFFFFFFF"; + + byte[] hash = api.SM3Hash(orgData.getBytes()); + + System.out.println("hash:" + Util.bytes2HexString(hash)); + } + + // 工具方法 + // ========================================== + + public static void printRetWrap(RetWrap rw) { + printRetWrap(rw, false); + } + + /** + * 输出 + * @param rw + */ + public static void printRetWrap(RetWrap rw, boolean flag) { + for (String s : rw.keySet()) { + + Object o = rw.get(s); + if (o instanceof String) { + System.out.println(s + ":" + o); + } else if (o instanceof byte[]) { + if (flag) { + System.out.println(s + ": " + Util.bytes2HexString((byte[]) o)); + } else { + System.out.println(s + ": " + new String(Util.hexString2Bytes(Util.bytes2HexString((byte[]) o)))); + } + } else { + System.out.println(s + ":" + o); + } + } + } + + // 获取证书 + public String getCertStr(String path) { + + BufferedInputStream bis = null; + try { + bis = new BufferedInputStream(new FileInputStream(path)); + + StringBuilder str = new StringBuilder(); + + int len = 0; + + while ((len = bis.read()) != -1) { + str.append((char) len); + } + + return str.toString(); + } catch (IOException e) { + e.printStackTrace(); + } finally { + if (bis != null) { + try { + bis.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + + return null; + } +}