From 9c2cdb5214c736502f617a13da2d6b92ddaff100 Mon Sep 17 00:00:00 2001 From: yihzhou <468340218@qq.com> Date: Wed, 6 Dec 2023 15:25:13 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96E0=E6=8C=87=E4=BB=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/racal/sunyard/main/BytesList.java | 45 ++++++++++++++++++ .../java/racal/sunyard/main/SydApi4j.java | 47 ++++++++++++++----- src/test/java/sample/Sample4ZS.java | 40 +++++++++++++--- 3 files changed, 114 insertions(+), 18 deletions(-) create mode 100644 src/main/java/racal/sunyard/main/BytesList.java diff --git a/src/main/java/racal/sunyard/main/BytesList.java b/src/main/java/racal/sunyard/main/BytesList.java new file mode 100644 index 0000000..a7aae6a --- /dev/null +++ b/src/main/java/racal/sunyard/main/BytesList.java @@ -0,0 +1,45 @@ +package racal.sunyard.main; + +import java.util.ArrayList; +import java.util.List; + +public class BytesList { + private List bytes = new ArrayList(); + + public BytesList(){ + + } + + public BytesList(byte[] b){ + this.append( b ); + } + + public void append( byte[] b ) { + bytes.add( b ); + } + + public byte[] toBytes(){ + int len = 0; + + if(1== bytes.size()){ + return bytes.get(0); + } + + for ( byte[] b : bytes ) { + len += b.length; + } + + if ( 0 == len ) { + return new byte[0]; + } + + byte[] buff = new byte[ len ]; + int idx = 0; + for ( byte[] b : bytes ) { + System.arraycopy( b, 0, buff, idx, b.length ); + idx += b.length; + } + return buff; + } + +} diff --git a/src/main/java/racal/sunyard/main/SydApi4j.java b/src/main/java/racal/sunyard/main/SydApi4j.java index dd2458c..5203f61 100644 --- a/src/main/java/racal/sunyard/main/SydApi4j.java +++ b/src/main/java/racal/sunyard/main/SydApi4j.java @@ -1806,6 +1806,7 @@ public class SydApi4j implements SydApi { r.put("retCode", false); r.put("msg", error.getInfo() == null || "".equals(error.getInfo()) ? RetWrap.transMsg(error.autoInt()) : error.getInfo()); + throw new SydApiException(error.getInfo(), error.autoInt()); } return r; } @@ -1931,7 +1932,7 @@ public class SydApi4j implements SydApi { - //testSocket(); + testSocket(); try { socket.getOutputStream().write(buff); @@ -2057,8 +2058,8 @@ public class SydApi4j implements SydApi { CoderUtil.EBCDICToASCIIFIX(b, 10); } if(debug){ - print("EBCD 数据: \t"); - println(Util.bytes2HexString(bb.array())); +// print("EBCD 数据: \t"); +// println(Util.bytes2HexString(bb.array())); print("HEX数据: \t"); println(Util.bytes2HexString(bb.array())); } @@ -2510,19 +2511,41 @@ public class SydApi4j implements SydApi { // System.out.println("res_msh长度:"+res_msg.length); // println("\n\t res_msg=" + Util.bytes2HexString(res_msg)); //println("\n\t res_msg=" + Util.bytes2HexString(res_msg)); +// if (retWrap.containsKey("msg_all")) { +// byte[] msg_all = (byte[]) retWrap.get("msg_all"); +// +// byte[] result = new byte[res_msg.length + msg_all.length]; +// +// System.arraycopy(msg_all, 0, result, 0, msg_all.length); +// System.arraycopy(res_msg, 0, result, msg_all.length, res_msg.length); +// retWrap.put("msg_all", result); +//// println("\n\t msg_all=" + Util.bytes2HexString(result)); +// } else { +// retWrap.put("msg_all", res_msg); +// } +// +// cb.circle(packNo, packet, ret); +// } +// } + // msg_all 类型改 List, 当 唯一包、尾包时还原 byte[] 类型 if (retWrap.containsKey("msg_all")) { - byte[] msg_all = (byte[]) retWrap.get("msg_all"); - - byte[] result = new byte[res_msg.length + msg_all.length]; - - System.arraycopy(msg_all, 0, result, 0, msg_all.length); - System.arraycopy(res_msg, 0, result, msg_all.length, res_msg.length); - retWrap.put("msg_all", result); -// println("\n\t msg_all=" + Util.bytes2HexString(result)); + BytesList msg_all = (BytesList) retWrap.get("msg_all"); + msg_all.append( res_msg ); } else { - retWrap.put("msg_all", res_msg); + retWrap.put("msg_all", new BytesList(res_msg) ); } + if (0 == i) { + if (1 == loop) { + // 唯一包 + retWrap.put("msg_all", ((BytesList)retWrap.get("msg_all")).toBytes() ); + } + } else { + if (i == (loop - 1)) { + // 尾包 + retWrap.put("msg_all", ((BytesList)retWrap.get("msg_all")).toBytes() ); + } + } cb.circle(packNo, packet, ret); } } diff --git a/src/test/java/sample/Sample4ZS.java b/src/test/java/sample/Sample4ZS.java index 54fda1c..57f64c1 100644 --- a/src/test/java/sample/Sample4ZS.java +++ b/src/test/java/sample/Sample4ZS.java @@ -8,6 +8,9 @@ import org.junit.Test; import racal.sunyard.main.SydApi4j; import racal.sunyard.main.SydApiBuilder; +import java.io.UnsupportedEncodingException; +import java.util.List; + public class Sample4ZS { private static final String SM2dn = "C=CN,O=CFCA OCA1,OU=YCCA,OU=Individual-2,CN=YCCA@黄金交易所@Zhuangj@1"; private static final String SM2dn2 = "C=CN,O=SM2,OU=test,CN=1"; @@ -96,24 +99,49 @@ public class Sample4ZS { } @Test - public void importCert(){ + public void importCert() throws UnsupportedEncodingException { //调试模式(控制台会打印发送报文) System.setProperty("com.sunyard.sydapi4j.debug", "true"); //证书是否反序校验 //System.setProperty("com.sunyard.dnsort", "false"); - String ip = "172.16.17.1"; + String ip = "1"; String ip2 = "172.16.17.161"; //主备模式连接 - SydApi4j.SYD_Set_Parameter_HA(ip, ip2, 8889, 1000); - SydApi4j api = (SydApi4j) new SydApi4j(); + SydApiBuilder builder = new SydApiBuilder().setIp("172.16.17.161"); + SydApi4j api = (SydApi4j) builder.build(); //证书导入 - String cert = ""; + String cert = "MIICxjCCAmqgAwIBAgIFIGZACVcwDAYIKoEcz1UBg3UFADBdMQswCQYDVQQGEwJDTjEwMC4GA1UECgwnQ2hpbmEgRmluYW5jaWFsIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MRwwGgYDVQQDDBNDRkNBIFRFU1QgU00yIE9DQTExMB4XDTIzMDYwNjA5MDIzNFoXDTI1MDYwNjE1NTk1OVowfDELMAkGA1UEBhMCY24xFTATBgNVBAoMDENGQ0EgVEVTVCBDQTEOMAwGA1UECwwFQ05BUFMxFDASBgNVBAsMC0VudGVycHJpc2VzMTAwLgYDVQQDDCcwNDFAWjMxMzIwNTA1NzgzMEAzMTMyMDUwNTc4MzBAMDAwMDAwMDgwWTATBgcqhkjOPQIBBggqgRzPVQGCLQNCAAQzwB2NYu5u0YaSEpnH4rsDh1OOhiHD/h98RcVVYPLuUxjDeIv9f+PdOTVlh7+ZpBchOzpxJCza8F911Z0wvsgbo4H1MIHyMB8GA1UdIwQYMBaAFL6mfk09fI+gVebBLwkuLCBDs0J/MEgGA1UdIARBMD8wPQYIYIEchu8qAQIwMTAvBggrBgEFBQcCARYjaHR0cDovL3d3dy5jZmNhLmNvbS5jbi91cy91cy0xNS5odG0wOgYDVR0fBDMwMTAvoC2gK4YpaHR0cDovLzIxMC43NC40Mi4zL09DQTExL1NNMi9jcmwyNzQxMC5jcmwwCwYDVR0PBAQDAgPoMB0GA1UdDgQWBBQwhc8kqD51KvkUZ11+t6/ZLNupDzAdBgNVHSUEFjAUBggrBgEFBQcDAgYIKwYBBQUHAwQwDAYIKoEcz1UBg3UFAANIADBFAiBY1iY87PQr5UywvBtr1z5CrR7ET9F3refbJAlhkXprvwIhAPyhT8e3PD4g+ggWvU56puhLOFslChQlNr0aNfdz7EBo"; api.importCert(cert.getBytes(),null); +// List allCert = api.getAllCert(); +// System.out.println(allCert); + + + } + + @Test + public void sm4(){ + SydApiBuilder builder = new SydApiBuilder().setIp("192.168.0.166"); + SydApi4j api = (SydApi4j) builder.build(); + + String key = "S3DC3699ED73408EF9BB353F11EC2AC7C"; + + + RetWrap retWrap = api.SYMEnDeData(true, 1, key, 1, 0, orgData, null, 0); + byte[] enData = (byte[]) retWrap.get("msg_all"); + System.out.println("SM4-CBC-加密:"+ Util.bytes2HexString(enData)); + System.out.println("SM4-CBC-加密成功,加密数据长度"+orgData.length); + // logger.info(Thread.currentThread().getName()+"-SM4加密成功,加密数据长度"+orgData.length+"运行成功次数:"+x); + + // byte[] enData = Util.hexString2Bytes("3DA84F930F23C53F5278F974E52CBAAC94B1656F2405DF45FEBC575FB56E5CBB06C70EDEA1365BAF3BA7AEBF8E22548748BB0A751A7B264A7E0D5CBF7575FB20D7C1DF55C4A3EA3092CCFD104C156787B19B9F6647CA1AC5E2EC3F9029B85CC9AC74F0829D11F2704474AB2168E85B734367C0350F31777F2D714176430F8387053D89BE3E56705F41EB25C2A5A8C16816E37C75B13B519690B119080FFF970C75470D788560E3213706339FB5FE476DF85AFF1CE71D905CD36ECFA55BAA367619057B9FD721E123C395E97191306DB69A7A70F0BD8847547BCB60F7E2D0931EBDE11D7D89C9846CA38DC90ADA74E98AA5F7F3B5B667B300EAA6F5E597974B50DB409B997455F37214DD07B7B886E7D50D734DD5394ED0C941193955C32FAA0D225AADFE788CA8E5BA06FD24054834E24D530B99B859804762EFD69A81B4EFD8BB9B232DFDA8791B0039212D07DDD3B4474758FAC82E0E873F82FD520754C2911C8BD3259B704B6EF593B449703CFC7154F56DFCF051F3FB09005E129EDCFAB194EF346B31FA85D2CD42195BC5C8F456CFAB45F50CAD52E68F13AAE75879F9EB5981B941A73AC8C3634EA5DA7C7BCEC8B21DD37863AE568F540F6928D76632B505C976F2FA5D91E35F6FA998E8F8455A8F152FE8010DD59B3D66F42FAD021FCEE6EB23AA47F4A8E065CEAF7DB2F494CCDFF81741765C4C3016DDC14A38E0FF7CA694CC317A9C45461C5985501F4B0AA151831CCE5F9E58FFEAC7CD9B19435804453302EA0A1934174326819AAD5B001423F4CE400A17DCAECC76AF1E0D6E1CF12ACB4131A86061ECA5C4A572513AA58F232B0A69DB60535E954E89A010AA4537D8CFFA04AC1DC55809F6136908812D3EC7CDEB189D9C548DF99F74BA5B008450C3A2E044F975D7AFBE7E4901FFA4EB8D1E2F5EF0E66F581F9CE89201EA62B78451A2C530C257E840FAE98EC48E8D920F1F664147CBD70D08A8DEC16AF1D86C0B19A78F82B6B175D3A7FBC92F5DACE0AAB624A784BD63AA54BD291A5A2C794C3F0A2DE5465C13E66B42A8F3C721A5AA523EB912222C0EFFC6145FDE03545FF01DC1E488E78A9C11630776D716B48CE0154ACE79431D0D47D5302233975895F99A4991BC4AF670A730EB03BB1C6484B4D553DD2D79D9DE4B44E7E81D95F0C04B210B52119821E5B129E843BC61A95992ACADA34C84C548C5B2067B065370A9983B935DF788700E69D363B3CC73EC52EDB257633C3DA024F9BFD811A0FEF7B7157CDA7BC02F4DA0D73F79E1E12EB40DB22FA96AEB161EA9522981105D51A730B0C9B405C9F086961E210DCC6804C00AD396966A3494E377756AD64D3C7ACDE221C2DBAA32881F30B91667996FE202D603586534057207FA562914AA33DB40D0D653F2F47C3CF5880502A2C868AE4C8EE676428A8E9E5065E3314639141B46AEE2C6C8FFA5B46A2E989FDC0129F455844116D18AFC78BA13706C81506B05EEE92432F713FCA33AF38470CCE4EF29E4D060AC5B3DAD5FEC0B3E827DB1DFBA81FE7D78AEE8DAC86BEA3D0E0F4F6C79CE8BFFE66F8321F7189ADA04F6FA22FAE6B695D0E333FB83C115BE7F5BCCD30DECA1889210F8EA641E0982611959067847BCC5BDAA59E9D9FE1D158CFD41935C3D8E765BC7B836063830A19D3B001BB7D2CAEEA2FA21C0FE913275255B65A6CFA7D74620576A224D8055FE5EE31312FF5302EE74752ED930A5A2C2EA7C437287B7FA64EEEC4353CB73094015539DDCEBB56B06EE5D94B15A976D3E10AEE1A05D6742B98A957FB6920E443B9436C97406EC65686228001EF64FBEB82B7BF163B1A7E484F8B017566B7A59FBB44C7B491819957D74E551AA8DC3DCE3A8F7B7BD0AEC6B9D79791EA8D336C415C46A19EA97DB6FF7DA8844576224FF88FCE198CF8F8935553ECA590F0B06B982C4751C2F672412EB65D23BA3B5C6E7DED2A5169A8079881D0F17E79C83000CAF2350EBF67D58732EDB7248BBD2756EBEBC1BD59378D80A2D833B9A35509A563EAFAD404588252F6DB041F5DF3A41EFA0AD7BD19A0722B02B36DF16CEA4F732DD76DE4579A3EB1DCF3E4C5100CC59C798F3227C4D4F7E802B84A1F2FFE30BC54B1B71FF260C00E7E6F938214636D49A81262D99D8E24717A330F741D4803279005A3CC2760685AAF510E176255070857D6F5406311A568CA2F580A73DA47289AB12A6F8DCE3406146C4A1C87558837E5699755DB8BCB33EA24BB8EE5A04224A3A2C934052BB107B000ECF67C4D1D5CB9211A71CC2C14623394D9128726422CD369C0045DE44E112B509A83253D1EBA7300FBFE7634D39CF41B0C129E01AFFE9A6E1D933145A2F7A3DA586F63FEBDD3DBC4731590DAF068BA684E900AC02679E7135036ABEA606877048377C132BDC3F97128B775E76E8B62B3B77D68955735447BC475786695C156B5D5967F299FC9D95F39940CEA117B0352E265DDF5A7AFD8B9A06A674134DDDF80A29C58F10D864A168CADF7AD87BB977906856E3712B507CB2A66F2D7B4AEBFAF0B8CD04040ADFC846F1C207538A942BE48BE21F606CF45B822E82C52AEB8EEB0FCA28412F126BE0969D509175A2E0C04A57505A11449ACAF0DF879FF60549518D843C796F996DBBEAF84D952CFDC421EC467731EFDD500AC3D726AE9EF77060892817C612DF057CE01AB38FD19E91D892047B5787A7AFB05C1B885AC138E3C53989B16D6C04E6BC33F42E318D06C80B96B15D774FFC06F543C455DA99CED4F60E785E93BFD22E7512E3279DB63803D802999DE1C2B90EC8DC776CE4A84002E0F33844B64A6EF8294031B05205A3D1C9AB8CCB77A668808A25B4060E2D40A728D30EC953D10C7349C3B039C6A54BEF84649770FEA4573CDBFA1B04763EF3D3600328611A9D4327BDE3C840023B99D215D8C9B8A31024A130F1F10D84C34D8B55BBDF90FAE4BA8A2F7DD1518E0AFDE2B28C207AEE14384D51F57D7990C418C4DAD7F1779EFB2528870AEF0EF18D443C9A7F5FB55EC8DD999A87F4384CBF08BAB6555C0C2029EF456772A1654ED7A82A7414065ACC6E0BFCE70194EA5C34615607DDB0B1FF19C4F7DD76C6CC9A6C63F4D6C1BD9D4C750C4A405A09E75754131B8862E710D5ED2EC9EC185C66416BF116943391378E7B2F208A14DBF3710829835DF334E6FA33F63D4903A27BDD90783150D3E316898FEA1F9F179413FE6F929319E5E69869A6934AA8B426875178C5D02DD2A6F39534FBA7723F380CC805721EF64FC5A5D4C0B872C324D0D9CFFD48A2A1BFD46475241FB5538C2E08D840ED576D30EA73B494DFA68BB6B4623A2511CB889B5A7D45D44283541E767C73746C478847CAFEB053BC9856B08B0878C6BF7882C7E72BDBE7BBF8D1CFE76BD5BEE4AB27D7693C80DD62299FB7AD0160E69BF01DB7BBE19B86C92646F156D49E2715A97BCA7C6E651DBC3A10963677D0E709A429A58E4847C6C874DB992F3FAD1D9DC78F92EF953DCB38C4A493A8D6647FF027D6819DAB90C562B0179A5228A40A9442F18C76C64EBEDC69596AF83839FE205C3168737565C2E41248E72E6E5E7544A09E0855A4CD483CA352A7868DB58DC26FEA391533E60C7EFE3DB27A844D363471B563796F60DEB3344A76C77AADEEF8A7D2793E314E203B32ABD1FEBC75ED4BC549BE7B2CE07C5F2D99228EADBF805901306A3772A27C3C8A92E4BE7B1E0BF89991BDAE1C78B750F1C596C4948942EF08E0AB1245FE7AA73E44F26801C4D7DBC1864ACC30FD8D1282D392B75B47E7591955E424633E3941BAFAEEB613387C87171869B9E0F86B3C1775C567A41D1DB4B860206D5C38BE078947B841390D179DD85A6D26053D1E7A753E5F310598976C5C261A832195664FAAF596BD3A7CC75AD3A2808BCD9388C48C8B7D4A7F27ABD7AA9A025359FDE9C4272D17DD99C3C29330EE38BFB476E1D3F610C39718275CFE63D30205BF61595D5EF2BE222931BE638340688BC65A00D3B71F0A1BEFC76935C620D9C553F2A59067D60850D48B5F4E598E594D4BFAB5B37E7C085B9CD30C4DE88BA47AEC78144D8793E8D60907C924F8EFAE5A5A7B8CF82AC2D38C6FEEA2C1865F5C08973D7E49478925939FAC32866A46125EC6026319A2EFE1004F175AE57BAF2DF072986D1989FB57C50B245AD39DF53B71420C623F4DE6E2AA074EC1A0D70BF5365C6C9273C5C7CD27538ABAB11AA2A0A55E4A5CDA585B9EA07EBF005A3C6F718E6E809033C2AC6F1FD4351321DB602A58CDDCEF02925C4A9B5E932F1A7C44B16E963CA2FDE72032D735935CDA6B5A3D81306C5BFC7C9F0FA4A9CA2D7E58183C165ACF7623DF774B94F140E78E92B98D8D43AF428228E352898B170415E1E8BCACFCFD9C6EDBF0C0C5FB404AEADEAC5798DE91AE10672EB3D10C698050845075EF02B9F4CFB2A1154FC6CBF5B23B5063A5B20EA07C82B36AFD2BD9A86909C07FD46E3446D90B7F4AF7D79956ED988BEC932E6051AD817C10A35844AD8AA9BDC610F4D9EE49B16B089986DFD35FAA30942AF71EABC98D91B2600E1C0200F305BF30BC8E7D4B51410CC72AE00A8585B783A57BA6872CA5D3D466B5A8FA7FDC6588D2E1458F24BF863DC6DC34B3219EAD03D546468211B3E076E7527A7AA79B1DC358CC430E7A8E29587022293D78ED35847B7BDC36C94365FF4E6AD66DB83CB3AA5FD9CC8DA0DEC092DD07403778E211342A317E7D6AB95A0E057C006E27314B0013F1CEB66F8F1968B6E504912DFE6A3F1CDA7B63A1BF5D2EF25C9E24F2BA38B769CC2BAF6300D5A65651E62EA6AABF5198366C3DB1EE494B9074041313B88ABFE8961797CFFD0A124FDDC671234BEE2057A77DDC68CF915F99844BE1F3C1539C87A08BF2FABB9D1251ABD0FBA8B2FE13F5625CBED1CA5166FCE39B1A7AB8D6FC6A77EFACFC9A424227DE2C47A0A46C283C5174BB19709E8B8EE040078C3EE7850CBE6E8542A5D20CE445926DFB18E30BF5BAD2E37CE9E5C25B1D29F2D1DDABDAB2CD629DF463C77C2A835C1C2F58A19E80FBBF11870785B308C86C86642B0E7898644AD920ECF9DC561DF1672F4319D0C2105E9509E897AC4AAB0F4A12AF7DF3F63838EFCB78BE85BA10E63957962971CA1D0925C65700890F4B4D4DCBCAA652F3721B4E291A4EE809A2C44B943A726B5E765FC7E90C6E7FF894AC3B6B9C6C96E001D62E311E829FC6FF7EA4B1EE79E799F3C0EDF03E28039E9897A463F32755D9E3BB07F93BC59575565A7E24B0DD80BE51B6FA46124CFC5AC70732DFC035634C769F5916D3773EDDD5D127E3C3B48D2F7327AFA33290482E9CA7E4554351D7B5CB486FB0E0A8AEDD6F5C69E4D1A050790A551ADE946FFE435C8276742FFACB771DAC27EF4E46CC795F4053BCC5BBDE0C6E63869B9E0694673371282149A297AC4497E5742B90B00362017FCC920F2F2ECF60EADB206772AC857F325F2827CC6D3E46BABB9F8EE7201D43AD6923F0FCCC5D21A44EA6C5108C9631505E570B18947ECECE8561BBA516961617AAB31C363946DCD8B3F4EC82661FF69A4E6A0CEA382D1B4FCE9471AE5ACE2D60D2B57C8906BEF99E5A53D4DC194791827ABA44D1B5BE31257D9B744259365F2C6F84D91348EAB3D842B675CD6DE11C1D0493A674D29030B893427E784D15BA9E322154BA3AF732B162402A828739B4FF93C0F8732EF4E9CA4DB144B12D0537039DD85F192BE916C0AD38CAE6BB6A33D32D28735F7401F0F3B870C76D2E6C68CBC266ECDD26EDD731B4CD451C39ACBC5A309D645E"); + RetWrap retWrap1 = api.SYMEnDeData(false, 1, key, 1, 0, enData, null, 0); + byte[] data = (byte[]) retWrap1.get("msg_all"); + System.out.println("SM4-CBC-模式解密成功"); + System.out.println(Util.bytes2HexString(data)); + // logger.info(Thread.currentThread().getName()+"-SM4解密成功,运行次数:"+x); - api.SYD_NakedSign(SM2dn, orgData, (byte[])null); } }