From 4ad5250026130f9d8f098fcbbad6335166a3ba12 Mon Sep 17 00:00:00 2001 From: "jiangr.wu@sunyard.com" Date: Mon, 11 Aug 2025 18:18:36 +0800 Subject: [PATCH] =?UTF-8?q?=E9=94=99=E8=AF=AF=E7=A0=81=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 2 +- .../sunyard/sge/database/SydApi4Database.java | 2 +- .../sge/database/SydApiBaseFunction.java | 363 ++++++++++++++---- src/test/java/test/FuncTest.java | 98 ++--- src/test/java/test/TestAll.java | 74 +--- 5 files changed, 333 insertions(+), 206 deletions(-) diff --git a/pom.xml b/pom.xml index e1a1e14..7bf461d 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ com.sunyard.sge.database sydapi-database - 1.26 + 1.28 sydapi-database diff --git a/src/main/java/com/sunyard/sge/database/SydApi4Database.java b/src/main/java/com/sunyard/sge/database/SydApi4Database.java index b2e5d8f..480c661 100644 --- a/src/main/java/com/sunyard/sge/database/SydApi4Database.java +++ b/src/main/java/com/sunyard/sge/database/SydApi4Database.java @@ -152,7 +152,7 @@ public class SydApi4Database extends SydApiBaseFunction { } if ( iKeyIndex.length != pcData.size() ) { - throw new IllegalArgumentException("批量输入数据密钥和数据数量不等"); + throw new SydApiException("批量输入数据密钥和数据数量不等", 0x01000001); } if ( 0 == iKeyIndex.length ) { diff --git a/src/main/java/com/sunyard/sge/database/SydApiBaseFunction.java b/src/main/java/com/sunyard/sge/database/SydApiBaseFunction.java index eac85db..261c65b 100644 --- a/src/main/java/com/sunyard/sge/database/SydApiBaseFunction.java +++ b/src/main/java/com/sunyard/sge/database/SydApiBaseFunction.java @@ -20,6 +20,8 @@ import java.util.Arrays; import java.util.Collections; import java.util.List; +import static com.sunyard.sge.database.SydApiConfig.BATCH_SIZE; + /** * 上海黄金交易所 - 数据库加密方案 */ @@ -575,80 +577,7 @@ public class SydApiBaseFunction implements SydApi { @Override public List SYD_SM4Mac_BatchData(int[] iKeyIndex, List pcData) { - - if (log.isDebugEnabled()) { - log.debug("SYD_SM4Mac_BatchData:iKeyIndex:{},pcData元素个数为:{}", iKeyIndex, pcData.size()); - } - - if (pcData.isEmpty()) { - return new ArrayList<>(); - } - - if (null == this.hsms || this.hsms.length < 1) { - throw new SydApiException(-1); - } - - String[] keys = new String[iKeyIndex.length]; - updateLastUseTime(); - for (int i = 0; i < iKeyIndex.length; i++) { - if (iKeyIndex[i] < 0) { - throw new SydApiException(0x01000001); - } - keys[i] = "SK" + SYMUtil.genPrivateKeyMark("000000", "00A", String.format("%08d", iKeyIndex[i])); - } - SydApiException le = new SydApiException(-1); - for (SydApi4j api : this.hsms) { - if (null == api) { - continue; - } - if (isShortLinkMode) { - try { - List list = api.SYMEncryptDecryptBatchData(8, 2, null, keys, 1, pcData); - List ret = new ArrayList<>(list.size()); - for (int i = 0; i < list.size(); i++) { - byte[] mac = new byte[16]; - byte[] buff = list.get(i); - System.arraycopy(buff, buff.length - 16, mac, 0, 16); - ret.add(mac); - } - return ret; - - } catch (SydApiException e) { - le = e; - if (e.getRetCode() < 0) { - log.error("HA 重试"); - continue; - } - throw e; - } - } else { - synchronized (api) { - try { - List list = api.SYMEncryptDecryptBatchData(8, 2, null, keys, 1, pcData); - List ret = new ArrayList<>(list.size()); - for (int i = 0; i < list.size(); i++) { - byte[] mac = new byte[16]; - byte[] buff = list.get(i); - System.arraycopy(buff, buff.length - 16, mac, 0, 16); - ret.add(mac); - } - return ret; - - } catch (SydApiException e) { - le = e; - if (e.getRetCode() < 0) { - log.error("HA 重试"); - continue; - } - throw e; - } - } - } - } - if (!this.isShortLinkMode) { - this.oip.setError(); - } - throw le; + return sm4Mac_BatchData(iKeyIndex, pcData, true); } @Override @@ -662,6 +591,12 @@ public class SydApiBaseFunction implements SydApi { return new boolean[0]; } + for (byte[] pcdata : pcData) { + if (pcdata.length > 1040) { + throw new SydApiException("数据长度错误",0x01000001); + } + } + if (null == this.hsms || this.hsms.length < 1) { throw new SydApiException(-1); } @@ -1095,8 +1030,8 @@ public class SydApiBaseFunction implements SydApi { return new ArrayList<>(); } - List enDatas = SYD_SM4_BatchData(iEncKeyIndex, pcData, Consts.ECB_ENC); - List macs = SYD_SM4Mac_BatchData(iMacKeyIndex, enDatas); + List enDatas = my_SYD_SM4_BatchData(iEncKeyIndex, pcData, Consts.ECB_ENC); + List macs = my_SYD_SM4Mac_BatchData(iMacKeyIndex, enDatas); List ret = new ArrayList(); for (int i = 0; i < enDatas.size(); i++) { DataAndMac dam = new DataAndMac(enDatas.get(i), macs.get(i)); @@ -1105,6 +1040,278 @@ public class SydApiBaseFunction implements SydApi { return ret; } + private List my_SYD_SM4_BatchData(int[] iKeyIndex, List pcData, int iFlag) { + + if ( null == iKeyIndex || null == pcData ) { + throw new IllegalArgumentException("批量输入数据为 null"); + } + + if ( iKeyIndex.length != pcData.size() ) { + throw new SydApiException("批量输入数据密钥和数据数量不等", 0x01000001); + } + + if ( 0 == iKeyIndex.length ) { + return new ArrayList<>(); + } + + // 将数据进行分组,防止超长。 + List> dataGroups = new ArrayList<>(); + List> keyGroups = new ArrayList<>(); + int totalLen = 0; + + List curDataGroup = new ArrayList<>(); + List curKeyGroup = new ArrayList<>(); + + for (int i = 0; i < pcData.size(); i++) { + byte[] data = pcData.get(i); + if (null == data) { + data = new byte[0]; + } + if ( + curDataGroup.size() > 9 // 分组小于等于 9 个 + || (totalLen + data.length > BATCH_SIZE) // 总大小小于 BATCH_SIZE + ) { // 扩展包 + dataGroups.add(curDataGroup); + keyGroups.add(curKeyGroup); + + curDataGroup = new ArrayList<>(); + curKeyGroup = new ArrayList<>(); + totalLen = 0; + } + + + curDataGroup.add(data); + curKeyGroup.add(iKeyIndex[i]); + + totalLen += data.length; + + } + + dataGroups.add(curDataGroup); + keyGroups.add(curKeyGroup); + + // 排队处理 + List ret = new ArrayList<>(); + for (int i = 0; i < dataGroups.size(); i++) { + ret.addAll(SYD_SM4_BatchData(toIntArray(keyGroups.get(i)), dataGroups.get(i), iFlag)); + } + + return ret; + } + + private List my_SYD_SM4Mac_BatchData(int[] iKeyIndex, List pcData) { + + if ( null == iKeyIndex || null == pcData ) { + throw new IllegalArgumentException("批量输入数据为 null"); + } + + if ( iKeyIndex.length != pcData.size() ) { + throw new IllegalArgumentException("批量输入数据密钥和数据数量不等"); + } + + if ( 0 == iKeyIndex.length ) { + return new ArrayList<>(); + } + + // 将数据进行分组,防止超长。 + List> dataGroups = new ArrayList<>(); + List> keyGroups = new ArrayList<>(); + int totalLen = 0; + + List curDataGroup = new ArrayList<>(); + List curKeyGroup = new ArrayList<>(); + + for (int i = 0; i < pcData.size(); i++) { + byte[] data = pcData.get(i); + if (null == data) { + data = new byte[0]; + } + if ( + curDataGroup.size() > 9 // 分组小于等于 9 个 + || (totalLen + data.length > BATCH_SIZE) // 总大小小于 BATCH_SIZE + ) {// 扩展包 + dataGroups.add(curDataGroup); + keyGroups.add(curKeyGroup); + + curDataGroup = new ArrayList<>(); + curKeyGroup = new ArrayList<>(); + totalLen = 0; + } + + curDataGroup.add(data); + curKeyGroup.add(iKeyIndex[i]); + + totalLen += data.length; + } + + dataGroups.add(curDataGroup); + keyGroups.add(curKeyGroup); + + // 排队处理 + List ret = new ArrayList<>(); + for (int i = 0; i < dataGroups.size(); i++) { + List macs = sm4Mac_BatchData(toIntArray(keyGroups.get(i)), dataGroups.get(i), false); + ret.addAll(macs); + } + return ret; + } + + private boolean[] my_SYD_SM4Mac_BatchData(int[] iKeyIndex, List pcData, List pcMac) { + + if ( null == iKeyIndex || null == pcData ) { + throw new IllegalArgumentException("批量输入数据为 null"); + } + + if ( iKeyIndex.length != pcData.size() ) { + throw new IllegalArgumentException("批量输入数据密钥和数据数量不等"); + } + + if ( 0 == iKeyIndex.length ) { + return new boolean[0]; + } + + // 将数据进行分组,防止超长。 + List> dataGroups = new ArrayList<>(); + List> keyGroups = new ArrayList<>(); + List> macGroups = new ArrayList<>(); + int totalLen = 0; + + List curDataGroup = new ArrayList<>(); + List curKeyGroup = new ArrayList<>(); + List curMacGroup = new ArrayList<>(); + + for (int i = 0; i < pcData.size(); i++) { + byte[] data = pcData.get(i); + if (null == data) { + data = new byte[0]; + } + if ( + curDataGroup.size() > 9 // 分组小于等于 9 个 + || (totalLen + data.length > BATCH_SIZE) // 总大小小于 BATCH_SIZE + ) { + // 扩展包 + dataGroups.add(curDataGroup); + keyGroups.add(curKeyGroup); + macGroups.add(curMacGroup); + + curDataGroup = new ArrayList<>(); + curKeyGroup = new ArrayList<>(); + curMacGroup = new ArrayList<>(); + totalLen = 0; + } + + + curDataGroup.add(data); + curKeyGroup.add(iKeyIndex[i]); + curMacGroup.add(pcMac.get(i)); + totalLen += data.length; + } + + dataGroups.add(curDataGroup); + keyGroups.add(curKeyGroup); + macGroups.add(curMacGroup); + + // 排队处理 + List ret = new ArrayList<>(); + for (int i = 0; i < dataGroups.size(); i++) { + + boolean[] rets = SYD_SM4Mac_BatchData( + toIntArray(keyGroups.get(i)), + dataGroups.get(i), + macGroups.get(i) + ); + for (boolean r : rets) { + ret.add(r); + } + } + return toBoolArray(ret); + } + + private List sm4Mac_BatchData(int[] iKeyIndex, List pcData, boolean isLimit) { + if (log.isDebugEnabled()) { + log.debug("SYD_SM4Mac_BatchData:iKeyIndex:{},pcData元素个数为:{}", iKeyIndex, pcData.size()); + } + + if (pcData.isEmpty()) { + return new ArrayList<>(); + } + + //是否限制1024字节长度 + if(isLimit){ + for(byte[] data : pcData){ + if (data.length > 1024) { + throw new SydApiException("数据长度超过限制", 0x01000001); + } + } + } + + if (null == this.hsms || this.hsms.length < 1) { + throw new SydApiException(-1); + } + + String[] keys = new String[iKeyIndex.length]; + updateLastUseTime(); + for (int i = 0; i < iKeyIndex.length; i++) { + if (iKeyIndex[i] < 0) { + throw new SydApiException(0x01000001); + } + keys[i] = "SK" + SYMUtil.genPrivateKeyMark("000000", "00A", String.format("%08d", iKeyIndex[i])); + } + SydApiException le = new SydApiException(-1); + for (SydApi4j api : this.hsms) { + if (null == api) { + continue; + } + if (isShortLinkMode) { + try { + List list = api.SYMEncryptDecryptBatchData(8, 2, null, keys, 1, pcData); + List ret = new ArrayList<>(list.size()); + for (int i = 0; i < list.size(); i++) { + byte[] mac = new byte[16]; + byte[] buff = list.get(i); + System.arraycopy(buff, buff.length - 16, mac, 0, 16); + ret.add(mac); + } + return ret; + + } catch (SydApiException e) { + le = e; + if (e.getRetCode() < 0) { + log.error("HA 重试"); + continue; + } + throw e; + } + } else { + synchronized (api) { + try { + List list = api.SYMEncryptDecryptBatchData(8, 2, null, keys, 1, pcData); + List ret = new ArrayList<>(list.size()); + for (int i = 0; i < list.size(); i++) { + byte[] mac = new byte[16]; + byte[] buff = list.get(i); + System.arraycopy(buff, buff.length - 16, mac, 0, 16); + ret.add(mac); + } + return ret; + + } catch (SydApiException e) { + le = e; + if (e.getRetCode() < 0) { + log.error("HA 重试"); + continue; + } + throw e; + } + } + } + } + if (!this.isShortLinkMode) { + this.oip.setError(); + } + throw le; + } + @Override public List SYD_SM4_CheckMacAndDecrypt_BatchData(int[] iEncKeyIndex, int[] iMacKeyIndex, List pcData) { @@ -1142,7 +1349,7 @@ public class SydApiBaseFunction implements SydApi { // } // 批量执行MAC校验 - boolean[] macCheck = SYD_SM4Mac_BatchData(iMacKeyIndex, datas, macs); + boolean[] macCheck = my_SYD_SM4Mac_BatchData(iMacKeyIndex, datas, macs); // 分离通过和未通过MAC校验的数据 List validIndices = new ArrayList<>(); @@ -1167,7 +1374,7 @@ public class SydApiBaseFunction implements SydApi { .mapToInt(Integer::intValue) .toArray(); // 使用过滤后的密钥索引和数据 - decryptedData = SYD_SM4_BatchData(validKeysArray, validData, Consts.ECB_DEC); + decryptedData = my_SYD_SM4_BatchData(validKeysArray, validData, Consts.ECB_DEC); } // 构建结果集 diff --git a/src/test/java/test/FuncTest.java b/src/test/java/test/FuncTest.java index 9d6c0f7..4725b55 100644 --- a/src/test/java/test/FuncTest.java +++ b/src/test/java/test/FuncTest.java @@ -7,7 +7,6 @@ import com.sunyard.proto.Util; import com.sunyard.sge.database.*; import com.sunyard.sge.log.LogbackFactory; - import java.util.ArrayList; import java.util.Arrays; import java.util.List; @@ -1049,7 +1048,7 @@ public class FuncTest { } catch (SydApiException e){ printException("数据长度大于1024,校验失败", e); } catch (Exception e){ - System.out.println("数据长度大于1024 异常: " + e.getMessage()); + e.printStackTrace(); } printEnd(); @@ -1060,7 +1059,7 @@ public class FuncTest { } catch (SydApiException e){ printException("pcMac为空,校验失败", e); } catch (Exception e){ - System.out.println("pcMac为空 异常: " + e.getMessage()); + e.printStackTrace(); } printEnd(); @@ -1341,7 +1340,7 @@ public class FuncTest { } catch (SydApiException e){ printException("包序号为2时,pcProcData无输入,SM4MAC长数据校验失败",e); } catch (Exception e){ - System.out.println("包序号为2时,pcProcData无输入 异常: " + e.getMessage()); + e.printStackTrace(); } try{ @@ -1360,7 +1359,7 @@ public class FuncTest { } catch (SydApiException e){ printException("包序号为3时,pcProcData无输入,SM4MAC长数据校验失败",e); } catch (Exception e){ - System.out.println("包序号为3时,pcProcData无输入 异常: " + e.getMessage()); + e.printStackTrace(); } printEnd(); @@ -1445,7 +1444,7 @@ public class FuncTest { } catch (SydApiException e){ printException("输入包序号不为0-3,SM4MAC长数据计算失败",e); } catch (Exception e){ - System.out.println("输入包序号不为0-3 异常: " + e.getMessage()); + e.printStackTrace(); } printEnd(); @@ -1463,7 +1462,7 @@ public class FuncTest { } catch (SydApiException e){ printException("输入包序号不为0-3,SM4MAC长数据校验失败",e); } catch (Exception e){ - System.out.println("输入包序号不为0-3 异常: " + e.getMessage()); + e.printStackTrace(); } printEnd(); @@ -1476,7 +1475,7 @@ public class FuncTest { } catch (SydApiException e){ printException("输入大于4064的数据长度,SM4MAC长数据计算失败",e); } catch (Exception e){ - System.out.println("输入大于4064的数据长度 异常: " + e.getMessage()); + e.printStackTrace(); } printEnd(); @@ -1496,7 +1495,7 @@ public class FuncTest { } catch (SydApiException e){ printException("输入大于4064的数据长度,SM4MAC长数据校验失败",e); } catch (Exception e){ - System.out.println("输入大于4064的数据长度 异常: " + e.getMessage()); + e.printStackTrace(); } printEnd(); @@ -1985,7 +1984,7 @@ public class FuncTest { List s = api.SYD_SM4Mac_BatchData(keyIdx_insufficient, data); System.out.println("索引个数与明文个数不一致,mac计算成功"); } catch (Exception e){ - System.out.println("索引个数与明文个数不一致,mac计算 异常:" + e.getMessage()); + System.out.println("索引个数与明文个数不一致,mac计算失败 " + e.getMessage()); } printEnd(); @@ -2052,6 +2051,8 @@ public class FuncTest { } } catch (SydApiException e){ printException("输入正确入参,计算失败", e); + } catch (Exception e){ + e.printStackTrace(); } printEnd(); @@ -2325,23 +2326,24 @@ public class FuncTest { printBegin(); try{ - if(false){ - int max = 7; - List data_test = new ArrayList<>(); - int[] keytest = new int[max]; - for(int i=0; i en_test = api.SYD_SM4_EncryptAndMac_BatchData(keytest, keytest, data_test); - System.out.println("计算成功!!! " + en_test.size()); + int max = 1024; + List data_test = new ArrayList<>(); + int[] keytest = new int[max]; + for(int i=0; i en_data = api.SYD_SM4_EncryptAndMac_BatchData(keyEnc, keyMac, data); - List de_data = api.SYD_SM4_CheckMacAndDecrypt_BatchData(keyEnc, keyMac, en_data); + List en_data = api.SYD_SM4_EncryptAndMac_BatchData(keytest, keytest, data_test); + List de_data = api.SYD_SM4_CheckMacAndDecrypt_BatchData(keytest, keytest, en_data); for(int i=0; i data_test = new ArrayList<>(); + int[] keytest = new int[max]; + for(int i=0; i en_data = api.SYD_SM4_EncryptAndMac_BatchData(keyEnc, keyMac, data); - List de_data = api.SYD_SM4_CheckMacAndDecrypt_BatchData(keyEnc, keyMac, en_data); + List en_data = api.SYD_SM4_EncryptAndMac_BatchData(keytest, keytest, data_test); + List de_data = api.SYD_SM4_CheckMacAndDecrypt_BatchData(keytest, keytest, en_data); for(int i=0; i tests = Arrays.asList( - this::zc_sm3ShortFunc, - this::zc_sm3LongFunc, - this::zc_sm4ShortFunc, - this::zc_sm4LongFunc, - this::zc_sm4macShortFunc, - this::zc_sm4macLongFunc, - this::zc_sm4BatchFunc, - this::zc_sm4macBatchFunc, - this::zc_sm4ShortMacFunc, - this::zc_sm4BatchMacFunc, - this::zc_sm4ShortMacFunc_check, - this::zc_sm4BatchMacFunc_check, - this::zc_sm4macLongFunc_ISM4Mac, - this::zc_sm4LongFunc_ISM4, - this::zc_sm3LongFunc_ISM3 - ); - -// this.changeConnect(true); //设置成短连接把相关功能测试下 -// executeTestsWithIsolation(tests); - - this.changeConnect(false); //设置成长连接把相关功能测试下 - executeTestsWithIsolation(tests); - } - public void funcMenu(Config config, Choise choise, FuncTest test) throws Exception { boolean flag = true; diff --git a/src/test/java/test/TestAll.java b/src/test/java/test/TestAll.java index 44212db..5f80545 100644 --- a/src/test/java/test/TestAll.java +++ b/src/test/java/test/TestAll.java @@ -7,7 +7,10 @@ import java.io.FileWriter; import java.io.IOException; import java.text.SimpleDateFormat; import java.util.*; -import java.util.concurrent.*; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.ThreadFactory; +import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicInteger; public class TestAll { @@ -867,73 +870,6 @@ public class TestAll { } } - public static void perfMenu_wending(Config config, Choise choise, TestAll testAll){ - System.out.println("请输入想要运行的时间(小时)"); - int time = choise.getAsInt(); - System.out.println("请输入想要运行的线程数量"); - int numThread = choise.getAsInt(); - - System.out.println("-------- 稳定性测试开始 --------"); - - boolean isSuc = true; - for(int i=0; i<100000; i++){ - System.out.println("-------- 循环: --------" + i); - try { - FuncTest funcTest = new FuncTest(config); - funcTest.zc_funcAll(); - } catch (Exception e){ - //防止程序异常后运行结束 - e.printStackTrace(); - testAll.writeToPerformanceFile("Exception: " + e.getMessage()); - } - - try { - Thread.sleep(1000); - } catch (InterruptedException e) { - testAll.writeToPerformanceFile("Exception: " + e.getMessage()); - } - } - if(isSuc){ - System.out.println("-------- 稳定性测试结束 --------"); - return; - } - - - testAll.writeToPerformanceFile("time:" + time ); - - int num = 1; - long start = System.currentTimeMillis(); - while (true){ - testAll.writeToPerformanceFile("循环: " + (num++) + " " + testAll.getTime()); - - ExecutorService poolDec = Executors.newFixedThreadPool(numThread); - for (int i = 0; i < numThread; i++) { - poolDec.submit(() -> { - try { - FuncTest funcTest = new FuncTest(config); - funcTest.zc_funcAll(); - } catch (Exception e){ - //防止程序异常后运行结束 - testAll.writeToPerformanceFile("Exception: " + e.getMessage()); - } - }); - } - poolDec.shutdown(); - try { - poolDec.awaitTermination(Long.MAX_VALUE, TimeUnit.SECONDS); - } catch (InterruptedException e) { - testAll.writeToPerformanceFile("Exception: " + e.getMessage()); - } - - long end = System.currentTimeMillis(); - if( (end-start) > (time*60*60*1000) ){ - break; - } - } - - System.out.println("-------- 稳定性测试结束 --------"); - } - public void sm4ShortEndes1() throws InterruptedException { System.out.println("-------- SM4短数据加解密性能测试开始 --------"); sm4ShortEnde1(1, config.getTotal(), 1024); @@ -1606,7 +1542,7 @@ public class TestAll { private static final AtomicInteger successCount = new AtomicInteger(0); private static final AtomicInteger errorCount = new AtomicInteger(0); - private static final int MAX_ERRORS = 100; + private static final int MAX_ERRORS = 10; private static final long TEST_DURATION_HOURS = 72; public static void longLinkTestWD(TestAll test){