diff --git a/DProto/90.xml b/DProto/90.xml index 1061fa2..9f0fd14 100644 --- a/DProto/90.xml +++ b/DProto/90.xml @@ -14,7 +14,7 @@ 设备型号 - + 设备密钥私钥长度 @@ -22,15 +22,15 @@ 设备密钥私钥 - + 设备密钥公钥长度 - + 设备密钥公钥 - + - + 厂商公钥长度 diff --git a/DProto/91.xml b/DProto/91.xml index 1e0e491..93c252d 100644 --- a/DProto/91.xml +++ b/DProto/91.xml @@ -6,7 +6,7 @@ 91 - + 设备密钥私钥长度 @@ -14,13 +14,13 @@ 设备密钥私钥 - + 设备密钥公钥长度 - + 设备密钥公钥 - + 授权签名 diff --git a/doc/java接口说明文档.docx b/doc/java接口说明文档.docx index b1a8d2a..fcb5409 100644 Binary files a/doc/java接口说明文档.docx and b/doc/java接口说明文档.docx differ diff --git a/src/main/java/com/sunyard/inf/SydGenApi.java b/src/main/java/com/sunyard/inf/SydGenApi.java index 00e419a..f96fed7 100644 --- a/src/main/java/com/sunyard/inf/SydGenApi.java +++ b/src/main/java/com/sunyard/inf/SydGenApi.java @@ -208,12 +208,13 @@ public interface SydGenApi { * @param dn 对*方 X509 证书DN。 * @param alg 算法标识,0:AES,1:SM4 + * @param model 证书模式,0:证书序号,1:证书 DN * @return RetWrap 包含 CipherKey SessionKey KCV * CipherKey 公钥加密的会话密钥 ,BASE64 编码 * SessionKey 本地LMK 加密的会话密钥,HEX 格式, 本地 LMK 加密的会话密钥长度,HEX 格式(不包括第 1 个字符),一般为 33 个 Bytes。默认输入值为缓冲区的大小。 * KCV 会话密钥的检验值,HEX 格式,长度为 32H。 */ - RetWrap generateDEByDn(byte[] dn, int alg) throws Exception; + RetWrap generateDEByDn(byte[] dn, int alg, int model) throws Exception; /** * 产生对称密钥,通过公钥加密生成网联格式的数字信封。 diff --git a/src/main/java/racal/sunyard/main/SydApi4j.java b/src/main/java/racal/sunyard/main/SydApi4j.java index 6135006..d41d546 100644 --- a/src/main/java/racal/sunyard/main/SydApi4j.java +++ b/src/main/java/racal/sunyard/main/SydApi4j.java @@ -2047,8 +2047,10 @@ public class SydApi4j implements SydApi { return repackEncrypt(packet); } + // 当证书模式为证书序号时,测试成功 + // 测试通过 @Override - public RetWrap generateDEByDn(byte[] dn, int alg) { + public RetWrap generateDEByDn(byte[] dn, int alg, int model) { Proto6A proto = new Proto6A(); // 填充数据 PacketSN sn = PacketSN.gen(); @@ -2056,9 +2058,15 @@ public class SydApi4j implements SydApi { packet.put("header", sn.getSn().array()); HashMap data = new HashMap(); data.put("alg$option", alg); - data.put("certificateModel$option", 1); - data.put("certificateDn", dn); + data.put("certificateModel$option", model); + + if (model == 0) { + data.put("certificateSn", dn); + } else { + data.put("certificateDn", dn); + } data.put("keyType", "X"); + packet.put("data", data); // 渲染发送 耗时长 ByteBuffer bb = proto.rend(packet); @@ -2137,6 +2145,7 @@ public class SydApi4j implements SydApi { return rw; } + // 测试通过 @Override public RetWrap decryptDE(String certSerial, String pCipherKey) { // 获取协议 @@ -2221,6 +2230,7 @@ public class SydApi4j implements SydApi { return ((PacketSection) ret.get("random")).getString(); } + // 测试通过 @Override public String netSign(String pCertSerial, byte[] pOrgData) { @@ -2263,6 +2273,7 @@ public class SydApi4j implements SydApi { return ((PacketSection) ret.get("sign")).getString(); } + // 测试通过 @Override public boolean netVerify(String pCertSerial, byte[] pOrgData, String pSignData) { // 获取协议 @@ -2990,6 +3001,7 @@ public class SydApi4j implements SydApi { } + // 测试通过 @Override public String SM2SignCustomized(String certNo, byte[] orgData) { @@ -3125,7 +3137,7 @@ public class SydApi4j implements SydApi { return Util.encodeBase64(s); } - + // 测试通过 @Override public boolean SM2VerifyCustomized(String certNo, byte[] orgData, String base64Sign) { @@ -4320,6 +4332,7 @@ public class SydApi4j implements SydApi { * @param vector 初始向量数据,可选项,当加密模式为CBC,CFB或OFB时才显示此项 * @return infoData: 密文数据 */ + // 测试通过 public byte[] Encrypt_Data(int alg, int roundModel, int fullMode, String DEK, byte[] infoData, byte[] vector) { ProtoQ1 proto = new ProtoQ1(); @@ -4387,10 +4400,11 @@ public class SydApi4j implements SydApi { * @param roundModel 密钥解密模式,1:ECB,2:CBC,3:CFB,4:OFB * @param fullMode 填充模式,0:数据刚好是8的整数倍,不填充;1:在数据后面填充0x00,0x00…;2:在数据后填充0x80,0x00 … * @param DEK DEK秘钥,如果源密钥为外部送入,则为LMK加密,否则为HSM用户密钥存储区。 - * @param infoData 数据 + * @param infoData 数据密文 * @param vector 初始向量数据,可选项,当加密模式为CBC,CFB或OFB时才显示此项 * @return 解密后的明文数据 */ + // 测试通过 public byte[] Decrypt_Data(int alg, int roundModel, int fullMode, String DEK, byte[] infoData, byte[] vector) { ProtoQ2 proto = new ProtoQ2(); @@ -5103,7 +5117,7 @@ public class SydApi4j implements SydApi { return true; } - + // 测试通过 @Override public RetWrap getStatus() { ProtoHI proto = new ProtoHI(); @@ -8390,7 +8404,7 @@ public class SydApi4j implements SydApi { return msg_all_de; } - + // 测试通过 @Override public boolean setDevCert(String equipType, String equipNo, byte[] equipSk, byte[] equipPk, byte[] manuPk, byte[] authSign) { Proto90 proto = new Proto90(); @@ -8427,7 +8441,7 @@ public class SydApi4j implements SydApi { } } - + // 测试通过 @Override public boolean changeDevCert(byte[] equipSk, byte[] equipPk, byte[] authSign) { Proto91 proto = new Proto91(); @@ -8470,6 +8484,7 @@ public class SydApi4j implements SydApi { * equipPk: 设备密钥公钥 * authSign: 授权签名 */ + // 测试通过 @Override public RetWrap getDeviceCertiInfo() { Proto92 proto = new Proto92(); @@ -8514,7 +8529,7 @@ public class SydApi4j implements SydApi { } } - + // 测试通过 @Override public String deviceSignC(byte[] orgData) { Proto97 proto = new Proto97(); diff --git a/src/test/java/com/sunyard/sydapi/test/TestAllMethods.java b/src/test/java/com/sunyard/sydapi/test/TestAllMethods.java index cee7c1d..97a91f6 100644 --- a/src/test/java/com/sunyard/sydapi/test/TestAllMethods.java +++ b/src/test/java/com/sunyard/sydapi/test/TestAllMethods.java @@ -21,7 +21,7 @@ public class TestAllMethods { public void before() { System.setProperty("com.sunyard.sydapi4j.debug", "true"); // api = (SydApi4j) new SydApi4j().connect("172.16.17.163", 8889, null, 1000); - api = (SydApi4j) new SydApi4j().connect("192.168.1.7", 8889, null, 1000); + api = (SydApi4j) new SydApi4j().connect("192.168.1.7", 8889, null, 5000); // api = (SydApi4j) new SydApi4j().connect("192.168.0.66", 8889, null, 1000); } @@ -751,14 +751,27 @@ public class TestAllMethods { System.out.println(s); } + // 测试通过 // 80 @Test public void testSM2SignCustomized() { - String sn = "3C93000000000025"; + String sn = "1004282452"; String s = api.SM2SignCustomized(sn, "111".getBytes()); System.out.println(s); } + // 测试通过 + // 81 + @Test + public void testSM2VerifyCustomized() { + String sn = "1004282452"; + String data = "111"; + String s = api.SM2SignCustomized(sn, data.getBytes()); + + boolean b = api.SM2VerifyCustomized(sn, data.getBytes(), s); + System.out.println(b); + } + // 测试通过 // E2 @Test @@ -855,7 +868,6 @@ public class TestAllMethods { printRetWrap(retWrap, true); } - // 测试通过 // 60 @Test public void testGetTransmissionKey() { @@ -983,15 +995,75 @@ public class TestAllMethods { System.out.println(Util.bytes2HexString(bytes)); } + // 001B3030303030303030 + // 3641 + // 30 + // 30 + // 30303130 + // 31303034323832343532 + // 58 + + // 测试通过 // 6A @Test public void testGenerateDEByDn() { - String dn = "C=CN,ST=ZJ,L=HZ,O=SUNYARD,OU=123456,CN=111"; + String dn = "1004282452"; - RetWrap retWrap = api.generateDEByDn(dn.getBytes(), 1); + RetWrap retWrap = api.generateDEByDn(dn.getBytes(), 0, 0); printRetWrap(retWrap); } + // 01210000000000000000 + // 3642 + // 3030 + // 30313932 + // 4D49474D416945417058426D4C43545A4D54543247454A677A576658634555645770376D64466E5A5A344F4972556E326E5145434948766C2F674534707448476D4748737739464844566D3357334F6E636B764D71325044766C38374657667742434250347175466B346243715A48735177585258614E712B576E6C664234634C6859762F59766D6777496F7541516A56685551545578666C50464C783357734D56703362426A6658567539426278796F6A2B6D4937686D774A665178416B3D + // 4C4246373430343745463846384343353532463039313838363233373639343241424637343034374546384638434335353246303931383836323337363934324132303034443039344339433336334445 + + // 00DE0000000000000001 + // 3642 + // 3030 + // 30 + // 31 + // 3031303034323832343532 + // 30313932 + // 4D49474D4169454167746A6D2F3364654C44754D5A6A5446454C44564D7A6A77336F4A527354772F4E37594A54536151517A63434944524A30317053787A346D7864364464504848337639726E617075564B4B6668664E6557576E4530324F354243414748696241702F2F64373538574D77574E78356A6E4B3458564E536F4D4C724A3271757056734747707677516A6F357969655A5A76624368354B6B4662494942642F426A3133436631504C556C5952614D4F416442633973744A35413D58 + + // 测试通过 + // 6B + @Test + public void testDecryptDE() { + String sn = "1004282452"; + RetWrap retWrap = api.generateDEByDn(sn.getBytes(), 0, 0); + 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); + } + + // 测试通过 + // 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); + } + // 测试通过 // 6E @Test @@ -1011,10 +1083,12 @@ public class TestAllMethods { System.out.println(s); } + // 测试通过 // HI @Test public void testGetStatus() { RetWrap status = api.getStatus(); + printRetWrap(status); } @@ -1289,13 +1363,30 @@ public class TestAllMethods { printRetWrap(retWrap); } + // 测试通过 // Q1 @Test public void testEncrypt_Data() { - byte[] bytes = api.Encrypt_Data(2, 1, 0, "XK333333333333333300A33333333", "11111111".getBytes(), "122345678".getBytes()); + byte[] bytes = api.Encrypt_Data(2, 1, 0, "XK123456212145212200A00000001", "1111111111111111".getBytes(), "122345678".getBytes()); System.out.println(Util.bytes2HexString(bytes)); } + // 测试通过 + // Q2 + @Test + public void testDecrypt_Data() { + String dek = "XK123456212145212200A00000001"; + String infoData = "1111111111111111"; + String vector = "122345678"; + + + byte[] bytes = api.Encrypt_Data(2, 1, 0, dek, infoData.getBytes(), vector.getBytes()); + System.out.println(Util.bytes2HexString(bytes)); + + byte[] bytes1 = api.Decrypt_Data(2, 1, 0, dek, bytes, vector.getBytes()); + System.out.println(Util.bytes2HexString(bytes1)); + } + // YA @Test @@ -1327,11 +1418,110 @@ public class TestAllMethods { System.out.println(s); } + // 011E3030303030303030 + // 3930 + // 31313131313131313131313131313131 + // 32323232323232323232323232323232 + // 30303332 + // F9CC9E2B67C61043B87552E61F9F50120902EA5462FC65A29695FC8F5E0FF7AF + // 30303638 + // 03420004CAFC8EC6782D9DE8F834B7D47B9D9057A0F21DAB402694EC580723879CC221A1730977F0DE947A0D5390858EE1FD827A3BE2F07E5671131BF3BE1868D3333029 + // 30303638 + // 0342000424A686E34777690C732D2C04F707DAE37AAA346461AACFABDF00982D84BB27B9DEB717FCEF55BA7C288FC935C637FD0681028E69584BFDA7A38BDB4557E1551C + // 0FBE0F3D6BAB184A20A235BA8DF2494C8FFC0826F60C22D3E4D89776CBD203E03707D2D530232EFE8600282A6EF171816E83AFA20A7991BBF2AD30DC59C71E76 + + // 设备型号 + private String equipType = "1111111111111111"; + // 设备序号 + private String equipNo = "2222222222222222"; + // 设备密钥私钥 + private String equipSk = "F9CC9E2B67C61043B87552E61F9F50120902EA5462FC65A29695FC8F5E0FF7AF"; + // 设备密钥公钥 + private String equipPk = "03420004CAFC8EC6782D9DE8F834B7D47B9D9057A0F21DAB402694EC580723879CC221A1730977F0DE947A0D5390858EE1FD827A3BE2F07E5671131BF3BE1868D3333029"; + // 厂商公钥 + private String manuPk = "0342000424A686E34777690C732D2C04F707DAE37AAA346461AACFABDF00982D84BB27B9DEB717FCEF55BA7C288FC935C637FD0681028E69584BFDA7A38BDB4557E1551C"; + // 授权签名 + private String authSign = "0FBE0F3D6BAB184A20A235BA8DF2494C8FFC0826F60C22D3E4D89776CBD203E03707D2D530232EFE8600282A6EF171816E83AFA20A7991BBF2AD30DC59C71E76"; + + // 测试通过 + // 90 + @Test + public void testSetDevCert() { + + boolean b = api.setDevCert(equipType, equipNo, Util.hexString2Bytes(equipSk), Util.hexString2Bytes(equipPk), + Util.hexString2Bytes(manuPk), Util.hexString2Bytes(authSign)); + System.out.println(b); + } + + // 00B63030303030303030 + // 3931 + // 30303332 + // F9CC9E2B67C61043B87552E61F9F50120902EA5462FC65A29695FC8F5E0FF7AF + // 30303638 + // 03420004CAFC8EC6782D9DE8F834B7D47B9D9057A0F21DAB402694EC580723879CC221A1730977F0DE947A0D5390858EE1FD827A3BE2F07E5671131BF3BE1868D3333029 + // 0FBE0F3D6BAB184A20A235BA8DF2494C8FFC0826F60C22D3E4D89776CBD203E03707D2D530232EFE8600282A6EF171816E83AFA20A7991BBF2AD30DC59C71E76 + + // 测试通过 + // 91 + @Test + public void testChangeDevCert() { + boolean b = api.changeDevCert(Util.hexString2Bytes(equipSk), Util.hexString2Bytes(equipPk), Util.hexString2Bytes(authSign)); + System.out.println(b); + } + + // 测试通过 // 92 @Test public void testGetDeviceCertiInfo() { RetWrap deviceCertiInfo = api.getDeviceCertiInfo(); - printRetWrap(deviceCertiInfo); + printRetWrap(deviceCertiInfo, true); + } + + // 测试通过 + // 97 + @Test + public void testDeviceSignC() { + String hash = "11111111111111111111111111111111"; + String s = api.deviceSignC(hash.getBytes()); + System.out.println(s); + } + + // 00883030303030303030 + // 3938 + // 30313232 + // 3078022017665B26FD20D2BE19CBCF275C43D7ECF95BBEEC2C2D1A79DF5068629D6FDDB302204A76974ADD337B5F3EAA0191AF6C7ADEE6BA86B30B828B7B32948B8DB0FF3E1A04204E4A371B154D42CC2536033F8EE8854FE0EF4BC79CB78A7CEA0C335147C7DF5B0410CF8690DC1D9ECD1951E86B6AE26A94DB + + // 00880000000000000000 + // 3938 + // 30313232 + // 3078022017665B26FD20D2BE19CBCF275C43D7ECF95BBEEC2C2D1A79DF5068629D6FDDB302204A76974ADD337B5F3EAA0191AF6C7ADEE6BA86B30B828B7B32948B8DB0FF3E1A04204E4A371B154D42CC2536033F8EE8854FE0EF4BC79CB78A7CEA0C335147C7DF5B0410CF8690DC1D9ECD1951E86B6AE26A94DB + + // 98 + @Test + public void testSetToken() { + + String tocken = "3078022017665B26FD20D2BE19CBCF275C43D7ECF95BBEEC2C2D1A79DF5068629D6FDDB302204A76974ADD337B5F3EAA0191AF6C7ADEE6BA86B30B828B7B32948B8DB0FF3E1A04204E4A371B154D42CC2536033F8EE8854FE0EF4BC79CB78A7CEA0C335147C7DF5B0410CF8690DC1D9ECD1951E86B6AE26A94DB"; + boolean b = api.setToken(Util.hexString2Bytes(tocken)); + System.out.println(b); + + } + + // 00223030303030303030 + // 3939 + // 30303230 + // 3333333333333333333333333333333333333333 + + // 00220000000000000000 + // 3939 + // 30303230 + // 3333333333333333333333333333333333333333 + + // 99 + @Test + public void testCalcAuthHead() { + String info = "33333333333333333333"; + byte[] bytes = api.calcAuthHead(info.getBytes()); + System.out.println(Util.bytes2HexString(bytes)); } /**