diff --git a/config.properties b/config.properties index 5084357..244c4fb 100644 --- a/config.properties +++ b/config.properties @@ -3,5 +3,4 @@ debug=true # 地址列表 (格式: addX=ip:port) -addr1=172.1.41.129:8889 -addr2=172.1.41.129:8889 +addr1=baishe.fullstack.club:18889 diff --git a/config2.properties b/config2.properties new file mode 100644 index 0000000..5084357 --- /dev/null +++ b/config2.properties @@ -0,0 +1,7 @@ +# 应用配置 +# 调试模式 (true/false) +debug=true + +# 地址列表 (格式: addX=ip:port) +addr1=172.1.41.129:8889 +addr2=172.1.41.129:8889 diff --git a/pom.xml b/pom.xml index 2cceca6..2f98ab1 100644 --- a/pom.xml +++ b/pom.xml @@ -37,7 +37,7 @@ com.sunyard sydapi4j - 1.15.20250701 + 1.15.20250709 org.apache.logging.log4j @@ -50,9 +50,25 @@ ${log.version} + + net.java.dev.jna + jna + 5.13.0 + + + + + src/main/resources + + **/*.so + + false + + + diff --git a/src/main/java/com/sunyard/sge/bytes/BytesUtil.java b/src/main/java/com/sunyard/sge/bytes/BytesUtil.java new file mode 100644 index 0000000..42c3e2a --- /dev/null +++ b/src/main/java/com/sunyard/sge/bytes/BytesUtil.java @@ -0,0 +1,20 @@ +package com.sunyard.sge.bytes; + +public class BytesUtil { + private static final int BLOCK_SIZE = 16; + /** + * 计算填充后的长度 + * @param originalLen 原始长度 + * @return 16字节对齐后的长度 + */ + public static int calculatePaddedLength(int originalLen) { + if (originalLen <= 0) { + return BLOCK_SIZE; + } + // 如果已经是16的倍数(包括0),则补一个完整的块(16字节) + // 否则补足到下一个16的倍数 + return (originalLen % BLOCK_SIZE == 0) + ? originalLen + BLOCK_SIZE + : ((originalLen / BLOCK_SIZE) + 1) * BLOCK_SIZE; + } +} diff --git a/src/main/java/com/sunyard/sge/database/DataAndMac.java b/src/main/java/com/sunyard/sge/database/DataAndMac.java index 2ea21fc..2d94470 100644 --- a/src/main/java/com/sunyard/sge/database/DataAndMac.java +++ b/src/main/java/com/sunyard/sge/database/DataAndMac.java @@ -2,9 +2,9 @@ package com.sunyard.sge.database; public class DataAndMac { private byte[] data; - private String mac; + private byte[] mac; - public DataAndMac(byte[] data, String mac) { + public DataAndMac(byte[] data, byte[] mac) { this.data = data; this.mac = mac; } @@ -17,11 +17,11 @@ public class DataAndMac { this.data = data; } - public String getMac() { + public byte[] getMac() { return mac; } - public void setMac(String mac) { + public void setMac(byte[] mac) { this.mac = mac; } } diff --git a/src/main/java/com/sunyard/sge/database/SydApi.java b/src/main/java/com/sunyard/sge/database/SydApi.java index 1c026db..854f25a 100644 --- a/src/main/java/com/sunyard/sge/database/SydApi.java +++ b/src/main/java/com/sunyard/sge/database/SydApi.java @@ -177,10 +177,7 @@ public interface SydApi { * @return String[] 数组,长度等于 pcData List 的长度。 * String[] 数组中的每个值为 mac值(固定长度16字节)的 HEX字符串。 */ - String[] SYD_SM4Mac_BatchData( - int[] iKeyIndex, - List pcData - ); + public List SYD_SM4Mac_BatchData(int[] iKeyIndex, List pcData); /** @@ -195,7 +192,7 @@ public interface SydApi { boolean[] SYD_SM4Mac_BatchData( int[] iKeyIndex, List pcData, - String[] pcMac + List pcMac ); @@ -251,7 +248,7 @@ public interface SydApi { * @param pcData: 输入。计算mac所需要的数据。 * @return mac值(固定长度16字节)转HEX 字符串格式 */ - String SYD_SM4Mac_ShortData( + byte[] SYD_SM4Mac_ShortData( int iKeyIndex, byte[] pcData ); @@ -268,7 +265,7 @@ public interface SydApi { boolean SYD_SM4Mac_ShortData( int iKeyIndex, byte[] pcData, - String pcMac + byte[] pcMac ); @@ -300,7 +297,7 @@ public interface SydApi { int iEncKeyIndex, int iMacKeyIndex, byte[] pcData, - String mac + byte[] mac ); diff --git a/src/main/java/com/sunyard/sge/database/SydApi4Database.java b/src/main/java/com/sunyard/sge/database/SydApi4Database.java index 7694c76..344c98e 100644 --- a/src/main/java/com/sunyard/sge/database/SydApi4Database.java +++ b/src/main/java/com/sunyard/sge/database/SydApi4Database.java @@ -83,7 +83,7 @@ public class SydApi4Database extends SydApiBaseFunction { } @Override - public String[] SYD_SM4Mac_BatchData(int[] iKeyIndex, List pcData) { + public List SYD_SM4Mac_BatchData(int[] iKeyIndex, List pcData) { if ( null == iKeyIndex || null == pcData ) { throw new IllegalArgumentException("批量输入数据为 null"); @@ -94,7 +94,7 @@ public class SydApi4Database extends SydApiBaseFunction { } if ( 0 == iKeyIndex.length ) { - return new String[0]; + return new ArrayList<>(); } // 将数据进行分组,防止超长。 @@ -132,16 +132,16 @@ public class SydApi4Database extends SydApiBaseFunction { keyGroups.add(curKeyGroup); // 排队处理 - List ret = new ArrayList<>(); + List ret = new ArrayList<>(); for (int i = 0; i < dataGroups.size(); i++) { - String[] macs = super.SYD_SM4Mac_BatchData(toIntArray(keyGroups.get(i)), dataGroups.get(i)); - ret.addAll(Arrays.asList(macs)); + List macs = super.SYD_SM4Mac_BatchData(toIntArray(keyGroups.get(i)), dataGroups.get(i)); + ret.addAll(macs); } - return ret.toArray(new String[0]); + return ret; } @Override - public boolean[] SYD_SM4Mac_BatchData(int[] iKeyIndex, List pcData, String[] pcMac) { + public boolean[] SYD_SM4Mac_BatchData(int[] iKeyIndex, List pcData, List pcMac) { if ( null == iKeyIndex || null == pcData ) { throw new IllegalArgumentException("批量输入数据为 null"); @@ -158,12 +158,12 @@ public class SydApi4Database extends SydApiBaseFunction { // 将数据进行分组,防止超长。 List> dataGroups = new ArrayList<>(); List> keyGroups = new ArrayList<>(); - List> macGroups = new ArrayList<>(); + List> macGroups = new ArrayList<>(); int totalLen = 0; List curDataGroup = new ArrayList<>(); List curKeyGroup = new ArrayList<>(); - List curMacGroup = new ArrayList<>(); + List curMacGroup = new ArrayList<>(); for (int i = 0; i < pcData.size(); i++) { byte[] data = pcData.get(i); @@ -188,7 +188,7 @@ public class SydApi4Database extends SydApiBaseFunction { curDataGroup.add(data); curKeyGroup.add(iKeyIndex[i]); - curMacGroup.add(pcMac[i]); + curMacGroup.add(pcMac.get(i)); totalLen += data.length; } @@ -203,7 +203,7 @@ public class SydApi4Database extends SydApiBaseFunction { boolean[] rets = super.SYD_SM4Mac_BatchData( toIntArray(keyGroups.get(i)), dataGroups.get(i), - macGroups.get(i).toArray(new String[0]) + macGroups.get(i) ); for (boolean r : rets) { ret.add(r); diff --git a/src/main/java/com/sunyard/sge/database/SydApiBaseFunction.java b/src/main/java/com/sunyard/sge/database/SydApiBaseFunction.java index d02c16c..25cdea6 100644 --- a/src/main/java/com/sunyard/sge/database/SydApiBaseFunction.java +++ b/src/main/java/com/sunyard/sge/database/SydApiBaseFunction.java @@ -515,14 +515,14 @@ public class SydApiBaseFunction implements SydApi { } @Override - public String[] SYD_SM4Mac_BatchData(int[] iKeyIndex, List pcData) { + public List SYD_SM4Mac_BatchData(int[] iKeyIndex, List pcData) { Logger log = LogFactory.getLogger(); if (LogFactory.iLogLevel == 3) { log.debug("SYD_SM4Mac_BatchData:iKeyIndex:{},pcData元素个数为:{}", iKeyIndex, pcData.size()); } if (pcData.isEmpty()) { - return new String[0]; + return new ArrayList<>(); } if (null == this.hsms || this.hsms.length < 1) { @@ -545,12 +545,12 @@ public class SydApiBaseFunction implements SydApi { if (isShortLinkMode) { try { List list = api.SYMEncryptDecryptBatchData(8, 2, null, keys, 1, pcData); - String[] ret = new String[list.size()]; + 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[i] = Util.bytes2HexString(mac); + ret.add( mac ); } return ret; @@ -566,12 +566,12 @@ public class SydApiBaseFunction implements SydApi { synchronized (api) { try { List list = api.SYMEncryptDecryptBatchData(8, 2, null, keys, 1, pcData); - String[] ret = new String[list.size()]; + 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[i] = Util.bytes2HexString(mac); + ret.add( mac ); } return ret; @@ -593,10 +593,10 @@ public class SydApiBaseFunction implements SydApi { } @Override - public boolean[] SYD_SM4Mac_BatchData(int[] iKeyIndex, List pcData, String[] pcMac) { + public boolean[] SYD_SM4Mac_BatchData(int[] iKeyIndex, List pcData, List pcMac) { Logger log = LogFactory.getLogger(); if (LogFactory.iLogLevel == 3) { - log.debug("SYD_SM4Mac_BatchData方法接收参数:iKeyIndex:{}, pcData元素个数为:{},pcMac:{}", iKeyIndex, pcData.size(), Arrays.toString(pcMac)); + log.debug("SYD_SM4Mac_BatchData 方法接收参数:iKeyIndex:{}, pcData元素个数为:{},pcMac:{}", iKeyIndex, pcData.size(), pcMac.size()); } if (pcData.isEmpty()) { @@ -626,7 +626,7 @@ public class SydApiBaseFunction implements SydApi { byte[] mac = new byte[16]; byte[] buff = list.get(i); System.arraycopy(buff, buff.length - 16, mac, 0, 16); - ret[i] = pcMac[i].equals(Util.bytes2HexString(mac)); + ret[i] = Arrays.equals(pcMac.get(i), mac); } return ret; @@ -647,7 +647,7 @@ public class SydApiBaseFunction implements SydApi { byte[] mac = new byte[16]; byte[] buff = list.get(i); System.arraycopy(buff, buff.length - 16, mac, 0, 16); - ret[i] = pcMac[i].equals(Util.bytes2HexString(mac)); + ret[i] = Arrays.equals(pcMac.get(i), mac); } return ret; @@ -777,11 +777,11 @@ public class SydApiBaseFunction implements SydApi { } @Override - public String SYD_SM4Mac_ShortData(int iKeyIndex, byte[] pcData) { + public byte[] SYD_SM4Mac_ShortData(int iKeyIndex, byte[] pcData) { return SYD_SM4Mac_ShortData(iKeyIndex, pcData, 1024); } - public String SYD_SM4Mac_ShortData(int iKeyIndex, byte[] pcData, int limitDataLen) { + public byte[] SYD_SM4Mac_ShortData(int iKeyIndex, byte[] pcData, int limitDataLen) { Logger log = LogFactory.getLogger(); if (LogFactory.iLogLevel == 3) { log.debug("SYD_SM4Mac_ShortData方法接收参数:iKeyIndex:{},pcData:{},iFlag:{}", iKeyIndex, Arrays.toString(pcData)); @@ -843,15 +843,15 @@ public class SydApiBaseFunction implements SydApi { } @Override - public boolean SYD_SM4Mac_ShortData(int iKeyIndex, byte[] pcData, String pcMac) { + public boolean SYD_SM4Mac_ShortData(int iKeyIndex, byte[] pcData, byte[] pcMac) { return SYD_SM4Mac_ShortData(iKeyIndex, pcData, 1024, pcMac); } - public boolean SYD_SM4Mac_ShortData(int iKeyIndex, byte[] pcData, int limitDataLen, String pcMac) { + public boolean SYD_SM4Mac_ShortData(int iKeyIndex, byte[] pcData, int limitDataLen, byte[] pcMac) { Logger log = LogFactory.getLogger(); if (LogFactory.iLogLevel == 3) { - log.debug("SYD_SM4Mac_ShortData方法接收参数:{}", iKeyIndex, Arrays.toString(pcData), pcMac); + log.debug("SYD_SM4Mac_ShortData 方法接收参数:{}", iKeyIndex, Util.bytes2HexString(pcData), Util.bytes2HexString(pcMac)); } if ( null == pcData || pcData.length > limitDataLen ) { @@ -866,7 +866,7 @@ public class SydApiBaseFunction implements SydApi { throw new IllegalArgumentException(); } updateLastUseTime(); - String mac = this.SYD_SM4Mac_ShortData(iKeyIndex, pcData, limitDataLen); + byte[] mac = this.SYD_SM4Mac_ShortData(iKeyIndex, pcData, limitDataLen); log.debug(this + ".SYD_SM4Mac_ShortData方法返回值:{}", mac); return pcMac.equals(mac); } @@ -888,14 +888,14 @@ public class SydApiBaseFunction implements SydApi { // 参数检查在函数内部 byte[] enData = SYD_SM4_ShortData(iEncKeyIndex, pcData, Consts.ECB_ENC); // mac 长度放宽到 1024,因为密文填充 - String mac = SYD_SM4Mac_ShortData(iMacKeyIndex, enData, 1040); + byte[] mac = SYD_SM4Mac_ShortData(iMacKeyIndex, enData, 1040); return new DataAndMac(enData, mac); } @Override - public DataAndMacCheck SYD_SM4_CheckMacAndDecrypt_ShortData(int iEncKeyIndex, int iMacKeyIndex, byte[] pcData, String mac) { + public DataAndMacCheck SYD_SM4_CheckMacAndDecrypt_ShortData(int iEncKeyIndex, int iMacKeyIndex, byte[] pcData, byte[] mac) { Logger log = LogFactory.getLogger(); if (LogFactory.iLogLevel == 3) { log.debug("SYD_SM4_CheckMacAndDecrypt_ShortData:k1={} k2={}", iEncKeyIndex, iMacKeyIndex); @@ -933,10 +933,10 @@ public class SydApiBaseFunction implements SydApi { } List enDatas = SYD_SM4_BatchData(iEncKeyIndex, pcData, Consts.ECB_ENC); - String[] macs = SYD_SM4Mac_BatchData(iMacKeyIndex, enDatas); + List macs = 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[i]); + DataAndMac dam = new DataAndMac(enDatas.get(i), macs.get(i)); ret.add(dam); } return ret; @@ -961,10 +961,10 @@ public class SydApiBaseFunction implements SydApi { throw new SydApiException("密钥长度和数据长度不对应", 0x01000001); } - String[] macs = new String[pcData.size()]; + List macs = new ArrayList<>(pcData.size()); Listdatas = new ArrayList<>(pcData.size()); - for ( int i=0 ; i task = builder.getLongLinkWorks().fTask(new Callable() { + public byte[] SYD_SM4Mac_ShortData(int iKeyIndex, byte[] pcData) { + FutureTask task = builder.getLongLinkWorks().fTask(new Callable() { @Override - public String call() throws Exception { + public byte[] call() throws Exception { return builder.get().SYD_SM4Mac_ShortData(iKeyIndex, pcData); } }); try { return task.get(); } catch (Exception e) { + if ( e.getCause() instanceof SydApiException) { + throw (SydApiException) e.getCause(); + } throw new SydApiException("并行任务执行失败", 0xC101, e); } } @Override - public boolean SYD_SM4Mac_ShortData(int iKeyIndex, byte[] pcData, String pcMac) { + public boolean SYD_SM4Mac_ShortData(int iKeyIndex, byte[] pcData, byte[] pcMac) { FutureTask task = builder.getLongLinkWorks().fTask(new Callable() { @Override public Boolean call() throws Exception { @@ -151,6 +177,9 @@ public class SydApiLongLinkWrap implements SydApi { try { return task.get(); } catch (Exception e) { + if ( e.getCause() instanceof SydApiException) { + throw (SydApiException) e.getCause(); + } throw new SydApiException("并行任务执行失败", 0xC101, e); } } @@ -166,16 +195,19 @@ public class SydApiLongLinkWrap implements SydApi { byte[] enData = taskEnc.get(); - FutureTask taskMac = builder.getLongLinkWorks().fTask(new Callable() { + FutureTask taskMac = builder.getLongLinkWorks().fTask(new Callable() { @Override - public String call() throws Exception { + public byte[] call() throws Exception { return builder.get().SYD_SM4Mac_ShortData(iMacKeyIndex, enData); } }); - String mac = taskMac.get(); + byte[] mac = taskMac.get(); return new DataAndMac(enData, mac); } catch (Exception e) { + if ( e.getCause() instanceof SydApiException) { + throw (SydApiException) e.getCause(); + } throw new SydApiException("并行任务执行失败", 0xC101, e); } } @@ -183,8 +215,40 @@ public class SydApiLongLinkWrap implements SydApi { @Override public DataAndMac SYD_SM4_EncryptAndMac_ShortData(int iEncKeyIndex, int iMacKeyIndex, byte[] pcData) { try { + if ( ! ConnectHandlerManager.isInited() ) { + throw new SydApiException(-1); + } - return SYD_SM4_AllInOne(iEncKeyIndex, iMacKeyIndex, pcData); + int enLen = BytesUtil.calculatePaddedLength(pcData.length); + byte[] encData = new byte[enLen]; + byte[] mac = new byte[16]; + IntByReference encDataLen = new IntByReference(encData.length); + + int i = SydLibrary.INSTANCE.SYD_SM4_Encrypt_Mac_ShortData( + ConnectHandlerManager.getHandler(), + iEncKeyIndex, + iMacKeyIndex, + pcData, + pcData.length, + encData, + encDataLen, + mac + ); + + if ( 0 == i ){ + byte[] data = new byte[encDataLen.getValue()]; + if( data.length == encData.length ) { + data = encData; + } else { + System.arraycopy(encData, 0, data, 0, data.length); + } + + return new DataAndMac(data, mac); + } else { + throw new SydApiException(i); + } + +// return SYD_SM4_AllInOne(iEncKeyIndex, iMacKeyIndex, pcData); // // 线程池忙, 使用单线程计算 // if( builder.getLongLinkWorks().threadPoolIsBusy() ) { @@ -245,53 +309,203 @@ public class SydApiLongLinkWrap implements SydApi { // // return new DataAndMac(enData, mac.getData()); } catch (Exception e) { + if ( e.getCause() instanceof SydApiException) { + throw (SydApiException) e.getCause(); + } throw new SydApiException("并行任务执行失败", 0xC101, e); } } @Override - public DataAndMacCheck SYD_SM4_CheckMacAndDecrypt_ShortData(int iEncKeyIndex, int iMacKeyIndex, byte[] pcData, String mac) { - FutureTask task = builder.getLongLinkWorks().fTask(new Callable() { - @Override - public DataAndMacCheck call() throws Exception { - return builder.get().SYD_SM4_CheckMacAndDecrypt_ShortData(iEncKeyIndex, iMacKeyIndex, pcData, mac); - } - }); + public DataAndMacCheck SYD_SM4_CheckMacAndDecrypt_ShortData(int iEncKeyIndex, int iMacKeyIndex, byte[] pcData, byte[] macs) { + try { - return task.get(); + if ( ! ConnectHandlerManager.isInited() ) { + throw new SydApiException(-1); + } + + byte[] decryptedData = new byte[pcData.length]; + IntByReference decryptedDataLen = new IntByReference(decryptedData.length); + + + int i = SydLibrary.INSTANCE.SYD_SM4_Decrypt_Mac_ShortData( + ConnectHandlerManager.getHandler(), + iEncKeyIndex, + iMacKeyIndex, + pcData, + pcData.length, + macs, + decryptedData, + decryptedDataLen + ); + + byte[] data = new byte[decryptedDataLen.getValue()]; + System.arraycopy(decryptedData, 0, data, 0, data.length); + System.out.println("outlen=" + data.length); + + if ( 0 == i ){ + return new DataAndMacCheck(data, true); + } if (0x01000010 == i) { + return new DataAndMacCheck(data, false); + } else { + throw new SydApiException(i); + } } catch (Exception e) { + if ( e instanceof SydApiException) { + throw e; + } throw new SydApiException("并行任务执行失败", 0xC101, e); } + + + // FutureTask task = builder.getLongLinkWorks().fTask(new Callable() { +// @Override +// public DataAndMacCheck call() throws Exception { +// return builder.get().SYD_SM4_CheckMacAndDecrypt_ShortData(iEncKeyIndex, iMacKeyIndex, pcData, mac); +// } +// }); +// try { +// return task.get(); +// } catch (Exception e) { +// throw new SydApiException("并行任务执行失败", 0xC101, e); +// } } @Override public List SYD_SM4_EncryptAndMac_BatchData(int[] iEncKeyIndex, int[] iMacKeyIndex, List pcData) { - FutureTask> task = builder.getLongLinkWorks().fTask(new Callable>() { - @Override - public List call() throws Exception { - return builder.get().SYD_SM4_EncryptAndMac_BatchData(iEncKeyIndex, iMacKeyIndex, pcData); - } - }); + if ( ! ConnectHandlerManager.isInited() ) { + throw new SydApiException(-1); + } + try { - return task.get(); + int size = pcData.size(); + + // 准备输入参数 - 直接使用 byte[][] + byte[][] pcDataArray = pcData.toArray(new byte[0][]); + int[] iDataLen = pcData.stream() + .mapToInt(bytes -> bytes.length) + .toArray(); + + // 准备输出缓冲区 + byte[][] pcEncData = new byte[size][]; + int[] iEncDataLen = new int[size]; + for (int i = 0; i < size; i++) { + int maxEncLen = ((pcData.get(i).length + 15) / 16 * 16); + pcEncData[i] = new byte[maxEncLen]; + iEncDataLen[i] = maxEncLen; + } + + byte[] pcMac = new byte[16]; + + // 调用加密函数 + int result = SydLibrary.INSTANCE.SYD_SM4_Encrypt_Mac_BatchData( + ConnectHandlerManager.getHandler(), + iEncKeyIndex, + iMacKeyIndex, + pcDataArray, + iDataLen, + size, + pcEncData, + iEncDataLen, + pcMac); + + if (0 == result) { + // 转换结果为Java风格的对象列表 + List results = new ArrayList<>(); + for (int i = 0; i < size; i++) { + results.add(new DataAndMac(pcEncData[i], pcMac)); + } + + return results; + } else { + throw new SydApiException(result); + } } catch (Exception e) { + if ( e.getCause() instanceof SydApiException) { + throw (SydApiException) e.getCause(); + } throw new SydApiException("并行任务执行失败", 0xC101, e); } + +// FutureTask> task = builder.getLongLinkWorks().fTask(new Callable>() { +// @Override +// public List call() throws Exception { +// return builder.get().SYD_SM4_EncryptAndMac_BatchData(iEncKeyIndex, iMacKeyIndex, pcData); +// } +// }); +// try { +// return task.get(); +// } catch (Exception e) { +// throw new SydApiException("并行任务执行失败", 0xC101, e); +// } + } @Override public List SYD_SM4_CheckMacAndDecrypt_BatchData(int[] iEncKeyIndex, int[] iMacKeyIndex, List pcData) { - FutureTask> task = builder.getLongLinkWorks().fTask(new Callable>() { - @Override - public List call() throws Exception { - return builder.get().SYD_SM4_CheckMacAndDecrypt_BatchData(iEncKeyIndex, iMacKeyIndex, pcData); - } - }); - try { - return task.get(); - } catch (Exception e) { - throw new SydApiException("并行任务执行失败", 0xC101, e); + + int size = pcData.size(); + + // 准备输入参数 + byte[][] pcEncData = pcData.stream() + .map(DataAndMac::getData) + .toArray(byte[][]::new); + + int[] iEncDataLen = pcData.stream() + .mapToInt(d -> d.getData().length) + .toArray(); + + byte[][] pcMac = pcData.stream() + .map(d -> d.getMac()) + .toArray(byte[][]::new); + + // 准备输出缓冲区 + byte[][] pcOutData = new byte[size][]; + int[] iOutDataLen = new int[size]; + for (int i = 0; i < size; i++) { + int maxOutLen = pcData.get(i).getData().length; + pcOutData[i] = new byte[maxOutLen]; + iOutDataLen[i] = maxOutLen; } + + int[] iCheckRet = new int[size]; + + // 调用解密函数 + int result = SydLibrary.INSTANCE.SYD_SM4_Decrypt_Mac_BatchData( + ConnectHandlerManager.getHandler(), + iEncKeyIndex, + iMacKeyIndex, + pcEncData, + iEncDataLen, + pcMac, + size, + pcOutData, + iOutDataLen, + iCheckRet); + + if (0 == result) { + // 转换结果为Java风格的对象列表 + List results = new ArrayList<>(); + for (int i = 0; i < size; i++) { + results.add(new DataAndMacCheck(pcOutData[i], iCheckRet[i] == 0)); + } + + return results; + } else { + throw new SydApiException(result); + } + + // FutureTask> task = builder.getLongLinkWorks().fTask(new Callable>() { +// @Override +// public List call() throws Exception { +// return builder.get().SYD_SM4_CheckMacAndDecrypt_BatchData(iEncKeyIndex, iMacKeyIndex, pcData); +// } +// }); +// try { +// return task.get(); +// } catch (Exception e) { +// throw new SydApiException("并行任务执行失败", 0xC101, e); +// } } @Override @@ -395,7 +609,7 @@ public class SydApiLongLinkWrap implements SydApi { } @Override - public String[] SYD_SM4Mac_BatchData(int[] iKeyIndex, List pcData) { + public List SYD_SM4Mac_BatchData(int[] iKeyIndex, List pcData) { if ( null == iKeyIndex || null == pcData ) { throw new IllegalArgumentException("批量输入数据为 null"); } @@ -405,7 +619,7 @@ public class SydApiLongLinkWrap implements SydApi { } if ( 0 == iKeyIndex.length ) { - return new String[0]; + return new ArrayList<>(); } // 将数据进行分组,防止超长。 List> dataGroups = new ArrayList<>(); @@ -442,13 +656,13 @@ public class SydApiLongLinkWrap implements SydApi { keyGroups.add(curKeyGroup); // 并发处理 - List> tasks = new ArrayList<>(); + List>> tasks = new ArrayList<>(); for (int i = 0; i < dataGroups.size(); i++) { int finalI = i; - FutureTask task = builder.getLongLinkWorks().fTask(new Callable() { + FutureTask> task = builder.getLongLinkWorks().fTask(new Callable>() { @Override - public String[] call() throws Exception { + public List call() throws Exception { SydApi api = builder.get(); return api.SYD_SM4Mac_BatchData(toIntArray(keyGroups.get(finalI)), dataGroups.get(finalI)); } @@ -457,20 +671,23 @@ public class SydApiLongLinkWrap implements SydApi { } try { - List ret = new ArrayList<>(); - for (FutureTask t : tasks) { - String[] macs = t.get(); - ret.addAll(Arrays.asList(macs)); + List ret = new ArrayList<>(); + for (FutureTask> t : tasks) { + List macs = t.get(); + ret.addAll(macs); } - return ret.toArray(new String[0]); + return ret; } catch (Exception e) { + if ( e.getCause() instanceof SydApiException) { + throw (SydApiException) e.getCause(); + } throw new SydApiException("并行任务执行失败", 0xC101, e); } } @Override - public boolean[] SYD_SM4Mac_BatchData(int[] iKeyIndex, List pcData, String[] pcMac) { + public boolean[] SYD_SM4Mac_BatchData(int[] iKeyIndex, List pcData, List pcMac) { if ( null == iKeyIndex || null == pcData ) { throw new IllegalArgumentException("批量输入数据为 null"); } @@ -486,12 +703,12 @@ public class SydApiLongLinkWrap implements SydApi { // 将数据进行分组,防止超长。 List> dataGroups = new ArrayList<>(); List> keyGroups = new ArrayList<>(); - List> macGroups = new ArrayList<>(); + List> macGroups = new ArrayList<>(); int totalLen = 0; List curDataGroup = new ArrayList<>(); List curKeyGroup = new ArrayList<>(); - List curMacGroup = new ArrayList<>(); + List curMacGroup = new ArrayList<>(); for (int i = 0; i < pcData.size(); i++) { byte[] data = pcData.get(i); @@ -516,7 +733,7 @@ public class SydApiLongLinkWrap implements SydApi { curDataGroup.add(data); curKeyGroup.add(iKeyIndex[i]); - curMacGroup.add(pcMac[i]); + curMacGroup.add(pcMac.get(i)); totalLen += data.length; } @@ -536,7 +753,7 @@ public class SydApiLongLinkWrap implements SydApi { return api.SYD_SM4Mac_BatchData( toIntArray(keyGroups.get(finalI)), dataGroups.get(finalI), - macGroups.get(finalI).toArray(new String[0]) + macGroups.get(finalI) ); } }); @@ -554,6 +771,9 @@ public class SydApiLongLinkWrap implements SydApi { return toBoolArray(ret); } catch (Exception e) { + if ( e.getCause() instanceof SydApiException) { + throw (SydApiException) e.getCause(); + } throw new SydApiException("并行任务执行失败", 0xC101, e); } } diff --git a/src/main/java/com/sunyard/sge/plus/ConnectHandlerManager.java b/src/main/java/com/sunyard/sge/plus/ConnectHandlerManager.java new file mode 100644 index 0000000..c495b11 --- /dev/null +++ b/src/main/java/com/sunyard/sge/plus/ConnectHandlerManager.java @@ -0,0 +1,50 @@ +package com.sunyard.sge.plus; + +import com.sun.jna.Pointer; +import com.sun.jna.ptr.PointerByReference; + +/** + * JNA 部分, C 接口的长链接维护。 + */ +public class ConnectHandlerManager { + + private static PointerByReference phHandle = new PointerByReference(); + private static Boolean inited = false; + + /** + * 初始化链接 + * @param pcIpList + * @param iPortList + * @param iConnectTimeOut + * @param iDealTimeOut + * @return + */ + public static int init(String[] pcIpList, + int[] iPortList, + int iConnectTimeOut, + int iDealTimeOut){ + + int connectResult = SydLibrary.INSTANCE.SYD_Connect_Ex( + pcIpList, + iPortList, + pcIpList.length, + iConnectTimeOut, + iDealTimeOut, + 16, + phHandle); + + if ( 0 == connectResult ){ + inited = true; + } + + return connectResult; + } + + public static boolean isInited(){ + return inited; + } + + public static Pointer getHandler(){ + return phHandle.getValue(); + } +} diff --git a/src/main/resources/linux-x86-64/libsunyard.so b/src/main/resources/linux-x86-64/libsunyard.so new file mode 100644 index 0000000..cb6fa8b Binary files /dev/null and b/src/main/resources/linux-x86-64/libsunyard.so differ diff --git a/src/test/java/sample/Sample.java b/src/test/java/sample/Sample.java index 997e9da..2edee5e 100644 --- a/src/test/java/sample/Sample.java +++ b/src/test/java/sample/Sample.java @@ -331,7 +331,7 @@ public class Sample int keyIdx = 0; // 测试数据 byte[] data = new byte[16]; - String macData = api.SYD_SM4Mac_ShortData( keyIdx , data ); + byte[] macData = api.SYD_SM4Mac_ShortData( keyIdx , data ); boolean ret = api.SYD_SM4Mac_ShortData( keyIdx , data, macData ); Assert.assertTrue( ret ); } @@ -345,7 +345,7 @@ public class Sample data.add( new byte[16] ); data.add( new byte[1024] ); - String[] macs = api.SYD_SM4Mac_BatchData( keyIdx , data); + List macs = api.SYD_SM4Mac_BatchData( keyIdx , data); boolean[] checks = api.SYD_SM4Mac_BatchData( keyIdx , data, macs ); for ( int i = 0 ; i < data.size() ; i++ ) { diff --git a/src/test/java/test/BatchDataTest.java b/src/test/java/test/BatchDataTest.java index c44c26c..0f17960 100644 --- a/src/test/java/test/BatchDataTest.java +++ b/src/test/java/test/BatchDataTest.java @@ -177,7 +177,7 @@ public class BatchDataTest { data.add(new byte[16]); data.add(new byte[1024]); - String[] macs = api.SYD_SM4Mac_BatchData(keyIdx, data); + List macs = api.SYD_SM4Mac_BatchData(keyIdx, data); boolean[] checks = api.SYD_SM4Mac_BatchData(keyIdx, data, macs); for (int i = 0; i < data.size(); i++) { @@ -204,7 +204,7 @@ public class BatchDataTest { data.add(new byte[1024]); data.add(new byte[1024]); - String[] macs = api.SYD_SM4Mac_BatchData(keyIdx, data); + List macs = api.SYD_SM4Mac_BatchData(keyIdx, data); boolean[] checks = api.SYD_SM4Mac_BatchData(keyIdx, data, macs); for (int i = 0; i < data.size(); i++) { @@ -231,7 +231,7 @@ public class BatchDataTest { data.add(new byte[1024]); data.add(new byte[1024]); - String[] macs = api.SYD_SM4Mac_BatchData(keyIdx, data); + List macs = api.SYD_SM4Mac_BatchData(keyIdx, data); boolean[] checks = api.SYD_SM4Mac_BatchData(keyIdx, data, macs); for (int i = 0; i < data.size(); i++) { @@ -244,7 +244,7 @@ public class BatchDataTest { // 测试数据 RandomTestData data = new RandomTestData(); - String[] macs = api.SYD_SM4Mac_BatchData(data.getKeyIdx(), data.getData()); + List macs = api.SYD_SM4Mac_BatchData(data.getKeyIdx(), data.getData()); boolean[] checks = api.SYD_SM4Mac_BatchData(data.getKeyIdx(), data.getData(), macs); for (int i = 0; i < data.getSize(); i++) { @@ -258,7 +258,7 @@ public class BatchDataTest { // 测试数据 RandomTestData data = new RandomTestData(0); - String[] macs = api.SYD_SM4Mac_BatchData(data.getKeyIdx(), data.getData()); + List macs = api.SYD_SM4Mac_BatchData(data.getKeyIdx(), data.getData()); boolean[] checks = api.SYD_SM4Mac_BatchData(data.getKeyIdx(), data.getData(), macs); for (int i = 0; i < data.getSize(); i++) { diff --git a/src/test/java/test/FuncTest.java b/src/test/java/test/FuncTest.java index 4a8b137..82a7763 100644 --- a/src/test/java/test/FuncTest.java +++ b/src/test/java/test/FuncTest.java @@ -1,94 +1,591 @@ package test; +import com.sunyard.SydApiException; +import com.sunyard.proto.Util; import com.sunyard.sge.database.*; import com.sunyard.sge.log.LogFactory; +import com.sunyard.sge.plus.ConnectHandlerManager; import org.apache.logging.log4j.Logger; import org.junit.Before; import org.junit.Test; +import java.util.ArrayList; import java.util.Arrays; +import java.util.List; /** * 功能确认 */ public class FuncTest { - private SydApi api; - @Before - public void init(){ + public static final int ECB_DEC = 0; + public static final int ECB_ENC = 1; + private Config config; + + private boolean isShortLink = false; + private int connectTimeout = 1000; + private int dealTimeout = 2000; + + public FuncTest(Config config){ + this.config = config; } - @Test - public void syd_Short_Connect_Ex(){ - String[] pcipList = {"192.168.1.129", "192.168.1.129" }; - int[] iportList ={8889,8889}; - SydApi api = new SydApi4Database(); + + + public SydApi connect(){ + if ( isShortLink ) { + + SydApi api = new SydApi4Database(); + api.SYD_Short_Connect_Ex(config.getIps(), config.getPorts(), connectTimeout, dealTimeout); + return api; + } + + else { + SydApiBuilder builder = new SydApiBuilder( + config.getIps(), + config.getPorts(), + connectTimeout, + dealTimeout + ); + SydApi api = builder.build(); + return api; + } + } + + + public void connectFunc() { + isShortLink = true; + System.out.println("-------- 切换到短连模式 --------"); + } + + public void longConnectFunc() { + System.out.println("-------- 设置长连接参数与获取长连接功能测试开始 --------"); +SydApi api = connect(); + System.out.println("设置长连接参数与获取长连接成功"); + + System.out.println("-------- 设置长连接参数与获取长连接功能测试结束 --------\n"); + } + + public void sm3ShortFunc() { + System.out.println("-------- SM3短数据功能测试开始 --------"); + +SydApi api = connect(); + + String res1 = api.SYD_SM3_Hash_ShortData(new byte[1024]); + String res2 = api.SYD_SM3_Hash_ShortData(new byte[0]); + + if (res1.equals(CalcRes.SM3_SHORT_RESULT1) && res2.equals(CalcRes.SM3_SHORT_RESULT2)) { + System.out.println("SM3短数据测试成功"); + } else { + System.out.println("SM3短数据测试失败"); + System.out.println("计算结果:" + res1); + System.out.println("预期结果:" + CalcRes.SM3_SHORT_RESULT1); + System.out.println("计算结果:" + res2); + System.out.println("预期结果:" + CalcRes.SM3_SHORT_RESULT2); + } + try { - api.SYD_Short_Connect_Ex(pcipList,iportList,10,10); - } finally { - if ( null != api ) { - api.SYD_Disconnect_Ex(); + api.SYD_SM3_Hash_ShortData(new byte[4096]); + System.out.println("SM3短数据超出测试失败"); + } catch (SydApiException e) { + System.out.println("SM3短数据超出错误检测成功"); + } + + + System.out.println("-------- SM3短数据功能测试结束 --------\n"); + } + + public void sm3LongFunc() { + System.out.println("-------- SM3长数据功能测试开始 --------"); +SydApi api = connect(); + + ISM3 sm3 = api.initSM3(); + byte[] data = new byte[4064]; + for (int i = 0; i < 10; i++) { + sm3.update(data); + } + String res1 = sm3.digest(); + + data = new byte[0]; + sm3 = api.initSM3(); + for (int i = 0; i < 10; i++) { + sm3.update(data); + } + + String res2 = sm3.digest(); + + if (res1.equals(CalcRes.SM3_LONG_RESULT1) && res2.equals(CalcRes.SM3_LONG_RESULT2)) { + System.out.println("SM3长数据测试成功"); + } else { + System.out.println("SM3长数据测试失败"); + System.out.println("计算结果:" + res1); + System.out.println("预期结果:" + CalcRes.SM3_LONG_RESULT1); + System.out.println("计算结果:" + res2); + System.out.println("预期结果:" + CalcRes.SM3_LONG_RESULT2); + } + + System.out.println("-------- SM3长数据功能测试结束 --------\n"); + } + + public void sm4ShortFunc() { + System.out.println("-------- SM4短数据加解密功能测试开始 --------"); +SydApi api = connect(); + int key = 0; + + byte[] enc1 = api.SYD_SM4_ShortData(key, new byte[1024], ECB_ENC); + byte[] dec1 = api.SYD_SM4_ShortData(key, enc1, ECB_DEC); + + byte[] enc2 = api.SYD_SM4_ShortData(key, new byte[0], ECB_ENC); + byte[] dec2 = api.SYD_SM4_ShortData(key, enc2, ECB_DEC); + + String res1 = Util.bytes2HexString(enc1); + String res2 = Util.bytes2HexString(enc2); + + if (res1.equals(CalcRes.SM4_SHORT_RESULT1) && res2.equals(CalcRes.SM4_SHORT_RESULT2) + && Arrays.equals(dec1, new byte[1024]) && Arrays.equals(dec2, new byte[0])) { + System.out.println("SM4短数据测试成功"); + } else { + System.out.println("SM4短数据测试失败"); + System.out.println("加密计算结果:" + res1); + System.out.println("加密预期结果:" + CalcRes.SM4_SHORT_RESULT1); + System.out.println("解密计算结果:" + Util.bytes2HexString(dec1)); + System.out.println("解密预期结果:" + Util.bytes2HexString(new byte[1024])); + System.out.println("加密计算结果:" + res2); + System.out.println("加密预期结果:" + CalcRes.SM4_SHORT_RESULT2); + System.out.println("解密计算结果:" + Util.bytes2HexString(dec2)); + System.out.println("解密预期结果:" + Util.bytes2HexString(new byte[0])); + } + + try { + enc1 = api.SYD_SM4_ShortData(key, new byte[1025], ECB_ENC); + dec1 = api.SYD_SM4_ShortData(key, enc1, ECB_DEC); + System.out.println("SM4短数据长度超出测试失败"); + } catch (SydApiException e) { + System.out.println("SM4短数据长度超出测试成功"); + } + + System.out.println("-------- SM4短数据加解密功能测试结束 --------\n"); + } + + public void sm4LongFunc() { + System.out.println("-------- SM4长数据加解密功能测试开始 --------"); +SydApi api = connect(); + boolean ret = LongDataTest.case1(api); + if ( ! ret ){ + System.out.println("-------- SM4长数据加解密功能测试失败 --------\n"); + } else { + System.out.println("-------- SM4长数据加解密功能测试结束 --------\n"); + } + + } + + public void sm4macShortFunc() { + System.out.println("-------- SM4MAC短数据功能测试开始 --------"); + SydApi api = connect(); + + int key = 0; + byte[] data1 = new byte[1024]; + byte[] data2 = new byte[0]; + + byte[] res1 = api.SYD_SM4Mac_ShortData(key, data1); + boolean check1 = api.SYD_SM4Mac_ShortData(key, data1, res1); + + byte[] res2 = api.SYD_SM4Mac_ShortData(key, data2); + boolean check2 = api.SYD_SM4Mac_ShortData(key, data2, res2); + + if (res1.equals(CalcRes.SM4MAC_SHORT_RESULT1) && res2.equals(CalcRes.SM4MAC_SHORT_RESULT2) + && check1 && check2) { + System.out.println("SM4MAC短数据测试成功"); + } else { + System.out.println("SM4MAC短数据测试失败"); + System.out.println("计算结果:" + res1); + System.out.println("预期结果:" + CalcRes.SM4MAC_SHORT_RESULT1); + System.out.println("计算结果:" + res2); + System.out.println("预期结果:" + CalcRes.SM4MAC_SHORT_RESULT2); + } + + try { + res1 = api.SYD_SM4Mac_ShortData(key, new byte[1025]); + check1 = api.SYD_SM4Mac_ShortData(key, new byte[1025], res1); + System.out.println("SM4MAC短数据长度超出测试失败"); + } catch (SydApiException e) { + System.out.println("SM4MAC短数据长度超出测试成功"); + } + + System.out.println("-------- SM4MAC短数据功能测试结束 --------\n"); + } + + public void sm4macLongFunc() { + System.out.println("-------- SM4MAC长数据功能测试开始 --------"); +SydApi api = connect(); + + byte[] data1 = new byte[4064]; + int key = 0; + ISM4Mac sm4mac = api.initSM4Mac(key); + for (int i = 0; i < 10; i++) { + sm4mac.update(data1); + } + String res1 = sm4mac.digest(); + + byte[] data2 = new byte[16]; + sm4mac = api.initSM4Mac(key); + for (int i = 0; i < 10; i++) { + sm4mac.update(data2); + } + String res2 = sm4mac.digest(); + +// c = opt.check(hexStringTobytes(SM4MAC_LONG_RESULT1)) +// s = opt.hexcheck(SM4MAC_LONG_RESULT1) +// +// c2 = opt2.check(hexStringTobytes(SM4MAC_LONG_RESULT2)) +// s2 = opt2.hexcheck(SM4MAC_LONG_RESULT2) + + if (res1.equals(CalcRes.SM4MAC_LONG_RESULT1) && res2.equals(CalcRes.SM4MAC_LONG_RESULT2)) { + System.out.println("SM4MAC长数据测试成功"); + } else { + System.out.println("SM4MAC长数据测试失败"); + System.out.println("计算结果:" + res1); + System.out.println("预期结果:" + CalcRes.SM4MAC_LONG_RESULT1); + System.out.println("计算结果:" + res2); + System.out.println("预期结果:" + CalcRes.SM4MAC_LONG_RESULT2); + } + + +// try: +// input = bytes(4080) +// opt2 = conn.sm4_mac_init(0) +// for _ in range(10): +// opt2.update(input) +// res2 = opt2.digest() +// System.out.println('SM4MAC长数据长度超出测试失败') +// except SmxApiException as e: +// System.out.println('SM4MAC长数据长度超出测试成功') +// +// try: +// input = bytes(17) +// opt2 = conn.sm4_mac_init(0) +// for _ in range(10): +// opt2.update(input) +// res2 = opt2.digest() +// System.out.println('SM4MAC长数据16字节未对齐测试失败') +// except SmxApiException as e: +// System.out.println('SM4MAC长数据16字节未对齐测试成功') +// +// System.out.println('-------- SM4MAC长数据功能测试结束 --------\n') + } + + public void sm4BatchFunc() { + System.out.println("-------- SM4批量数据加解密功能测试开始 --------"); +SydApi api = connect(); + + List data = new ArrayList<>(); + data.add(new byte[1024]); + data.add(new byte[1024]); + data.add(new byte[1024]); + data.add(new byte[1024]); + data.add(new byte[1024]); + data.add(new byte[1024]); + data.add(new byte[1024]); + int[] key = new int[]{0, 0, 0, 0, 0, 0, 0}; + + + List en_data = api.SYD_SM4_BatchData(key, data, ECB_ENC); + + List de_data = api.SYD_SM4_BatchData(key, en_data, ECB_DEC); + + if (en_data.equals(CalcRes.SM4_BATCH_RESULT) && data.equals(de_data)) { + System.out.println("SM4批量数据加解密测试成功"); + } else { + System.out.println("SM4批量数据加解密测试失败"); +// System.out.println("加密计算结果:" + en_data); + System.out.println("加密预期结果:" + CalcRes.SM4_BATCH_RESULT); +// System.out.println("解密计算结果:" + de_data); +// System.out.println("解密预期结果:" + data); + } + + System.out.println("-------- SM4批量数据加解密功能测试结束 --------\n"); + } + + public void sm4macBatchFunc() { + System.out.println("-------- SM4MAC批量数据功能测试开始 --------"); +SydApi api = connect(); + + List data = new ArrayList<>(); + data.add(new byte[1024]); + data.add(new byte[1024]); + data.add(new byte[1024]); + data.add(new byte[1024]); + int[] keyIdx = new int[]{0, 0, 0, 0}; + + List s = api.SYD_SM4Mac_BatchData(keyIdx, data); + + boolean[] check = api.SYD_SM4Mac_BatchData(keyIdx, data, s); + + boolean flag = true; + if ( null != s) { + for (int i = 0; i < check.length; i++) { + if (!check[i]) { + flag = false; + break; + } + } + if (flag) { + System.out.println("SM4MAC批量数据测试成功"); + } else { + System.out.println("SM4MAC批量数据测试失败"); + System.out.println("计算结果:" + check); + System.out.println("预期结果:" + new boolean[]{true, true, true, true, true, true, true}); + } + } else { + System.out.println("SM4MAC批量数据测试失败"); + System.out.println("计算结果:" + s); + System.out.println("预期结果:" + CalcRes.SM4MAC_BATCH_RESULT); + } + + System.out.println("-------- SM4MAC批量数据功能测试结束 --------\n"); + } + + public void sm4ShortMacFunc() { + System.out.println("-------- 短数据加密计算MAC,校验MAC解密功能测试开始 --------"); + SydApi api = connect(); + + int keyEnc = 0; + int keyMac = 0; + byte[] data1 = new byte[1024]; + byte[] data2 = new byte[0]; + System.out.println("step1"); + DataAndMac en_data1 = api.SYD_SM4_EncryptAndMac_ShortData(keyEnc, keyMac, data1); + System.out.println("step2"); + DataAndMacCheck de_data1 = api.SYD_SM4_CheckMacAndDecrypt_ShortData(keyEnc, keyMac, en_data1.getData(), en_data1.getMac()); + System.out.println("step3"); + + + try { + DataAndMac en_data2 = api.SYD_SM4_EncryptAndMac_ShortData(keyEnc, keyMac, data2); + System.out.println("step4"); + }catch ( SydApiException e) { + if ( e.getRetCode() == 0x1000001 ) { + System.out.println("SYD_SM4_EncryptAndMac_ShortData 不支持数据长度为 0, 测试通过"); + } else { + System.out.println("SYD_SM4_EncryptAndMac_ShortData 不支持数据长度为 0, 测试失败"); + } + } + + try { + DataAndMacCheck de_data2 = api.SYD_SM4_CheckMacAndDecrypt_ShortData(keyEnc, keyMac, new byte[15], new byte[0]); + System.out.println("step5"); + }catch ( SydApiException e) { + if ( e.getRetCode() == 0x1000001 ) { + System.out.println("SYD_SM4_CheckMacAndDecrypt_ShortData 不支持数据长度为非 16 字节, 测试通过"); + } else { + System.out.println("SYD_SM4_CheckMacAndDecrypt_ShortData 不支持数据长度为非 16 字节, 测试失败"); + } + } + + + try { + data1 = new byte[1025]; + api.SYD_SM4_EncryptAndMac_ShortData(keyEnc, keyMac, data1); + System.out.println("短数据加密计算MAC,校验MAC解密长度超出测试失败"); + } catch (SydApiException e) { + System.out.println("短数据加密计算MAC,校验MAC解密长度超出测试成功"); + } + + System.out.println("-------- 短数据加密计算MAC,校验MAC解密功能测试结束 --------\n"); + } + + public void sm4BatchMacFunc() { + System.out.println("-------- 批量数据加密计算MAC,校验MAC解密功能测试开始 --------"); + SydApi api = connect(); + + List data = new ArrayList<>(); + data.add(new byte[1024]); + data.add(new byte[1024]); + data.add(new byte[1024]); + data.add(new byte[1024]); + data.add(new byte[1024]); + data.add(new byte[1024]); + data.add(new byte[1024]); + int[] keyEnc = new int[]{0, 0, 0, 0, 0, 0, 0}; + int[] keyMac = new int[]{0, 0, 0, 0, 0, 0, 0}; + + List en_data = api.SYD_SM4_EncryptAndMac_BatchData(keyEnc, keyMac, data); + List de_data = api.SYD_SM4_CheckMacAndDecrypt_BatchData(keyEnc, keyMac, en_data); + + boolean flag = true; + for (int i = 0; i < de_data.size(); i++) { + flag = flag & de_data.get(i).getMacCheck(); + } + + if (flag) { + System.out.println("批量数据加密计算MAC,校验MAC解密测试成功"); + } else { + System.out.println("批量数据加密计算MAC,校验MAC解密测试失败"); + System.out.println("加密计算结果:" + en_data); + System.out.println("加密预期结果:" + CalcRes.SM4ANDMAC_BATCH_RESULT); + } + + + try { + data = new ArrayList<>(); + data.add(new byte[1024]); + data.add(new byte[1024]); + data.add(new byte[1024]); + data.add(new byte[1024]); + data.add(new byte[1024]); + data.add(new byte[1024]); + data.add(new byte[1024]); + data.add(new byte[1024]); + keyEnc = new int[]{0, 1, 0, 1, 1, 1, 1, 0}; + keyMac = new int[]{1, 0, 1, 0, 0, 0, 0, 0}; + + en_data = api.SYD_SM4_EncryptAndMac_BatchData(keyEnc, keyMac, data); + de_data = api.SYD_SM4_CheckMacAndDecrypt_BatchData(keyEnc, keyMac, en_data); + System.out.println("批量数据加密计算MAC,校验MAC解密长度超出测试失败"); + } catch (SydApiException e) { + System.out.println("批量数据加密计算MAC,校验MAC解密长度超出测试成功"); + } + + System.out.println("-------- 批量数据加密计算MAC,校验MAC解密功能测试结束 --------\n"); + } + + + public void loggerFunc() { + System.out.println("-------- 设置日志配置功能测试开始 --------"); + SydApi.SYD_SetLogConfig("./logs", 3); + System.out.println("日志配置成功,存储路径./logs,级别3"); + System.out.println("-------- 设置日志配置功能测试结束 --------\n"); + } + + + public void funcAll() { + this.loggerFunc(); + this.connectFunc(); + this.longConnectFunc(); + + this.sm3ShortFunc(); + + + this.sm4ShortFunc(); + this.sm4BatchFunc(); + + + this.sm4macShortFunc(); + this.sm4macBatchFunc(); + + + this.sm4ShortMacFunc(); + this.sm4BatchMacFunc(); + + + this.sm4LongFunc(); + this.sm4macLongFunc(); + this.sm3LongFunc(); + + } + + public void funcMenu(Config config, Choise choise, FuncTest test) throws Exception{ + + boolean flag = true; + SydApi.SYD_SetLogConfig("./logs", 3); + while (flag) { + System.out.println("请选择测试项:"); + System.out.println("1. 日志测试"); + System.out.println("2. 短链接测试"); + System.out.println("3. 长链接测试"); + + System.out.println("4. SM3短数据"); + + + System.out.println("5. SM4 短数据加解密"); + System.out.println("6. SM4 批量数据加解密"); + System.out.println("7. SM4MAC 短数据"); + System.out.println("8. SM4MAC 批量数据"); + + System.out.println("9. SM4短数据加密后生成MAC,解密验证MAC"); + System.out.println("10. SM4批量数据加密后生成MAC,验证MAC解密"); + + + System.out.println("11. SM4长数据加解密"); + System.out.println("12. SM4长数据MAC"); + + + System.out.println("13. SM3长数据"); + System.out.println("-1.退出"); + + switch (choise.getAsInt()) { + case 1: + test.loggerFunc(); + break; + case 2: + test.connectFunc(); + break; + case 3: + test.longConnectFunc(); + break; + case 4: + test.sm3ShortFunc(); + break; + + case 5: + test.sm4ShortFunc(); + break; + case 6: + test.sm4BatchFunc(); + break; + + case 7: + test.sm4macShortFunc(); + break; + case 8: { + test.sm4macBatchFunc(); + break; + } + case 9: { + test.sm4ShortMacFunc(); + break; + } + case 10: { + test.sm4BatchMacFunc(); + break; + } + case 11: + test.sm4macLongFunc(); + break; + case 12: + test.sm4LongFunc(); + break; + case 13: + test.sm3LongFunc(); + break; + case -1: + flag = false; + break; } } } - @Test - public void sm3(){ - SydApiBuilder builder = new SydApiBuilder( - new String[]{ "192.168.1.129" }, - new int[]{ 8889 }, - 10, - 15 - ); - - api = builder.build(); - byte[] bytes = api.SYD_SM4_LongData(1, new byte[16], 0, 1); - String s = Arrays.toString(bytes); - System.out.println(s); - } - - @Test - public void originLong() throws Exception { - SydApiBuilder builder = new SydApiBuilder(new String[]{"192.168.1.129"}, new int[]{8889}, 10, 15); - SydApi.SYD_SetLogConfig("./logs/",3); - for (int i = 0; i < 1000; i++) { - int tmp = i; - new Thread(() -> { - SydApi api = builder.build(); - for (int j = 0; j < 20; j++) { - byte[] bytes = api.SYD_SM4_ShortData(0, (tmp + "t" + j).getBytes(), Consts.ECB_ENC); - byte[] result = api.SYD_SM4_ShortData(0, bytes, Consts.ECB_DEC); - } - }, i + "t").start(); - } - } - @Test - public void originShort() throws Exception { - SydApi.SYD_SetLogConfig("./logs/",3); - Logger log = LogFactory.getLogger(); - String[] pcipList = {"192.168.1.129", "192.168.1.129" }; - int[] iportList ={8080,8889}; - for (int i = 0; i < 1000; i++) { - int tmp = i; - new Thread(() -> { - SydApi api = new SydApi4Database(); - try { - for (int j = 0; j < 20; j++) { - api.SYD_Short_Connect_Ex(pcipList,iportList,50,15); - byte[] bytes = api.SYD_SM4_ShortData(0, (tmp + "t" + j).getBytes(), Consts.ECB_ENC); - byte[] result = api.SYD_SM4_ShortData(0, bytes, Consts.ECB_DEC); - } - } - finally { - if ( null != api ) { - api.SYD_Disconnect_Ex(); - } - } } , i + "t").start(); + public static void main(String[] args) throws Exception { + Config config = config = Config.loadConfig(); + if (config == null || config.isDebug()) { + System.setProperty("com.sunyard.sydapi4j.debug", "true"); } + + System.out.println("ips=" + Arrays.toString(config.getIps())); + System.out.println("ports=" + Arrays.toString(config.getPorts())); + System.out.println("debug=" + config.isDebug()); + + Choise choise = new Choise(args); + + FuncTest funcTest = new FuncTest(config); + SydApi.SYD_SetLogConfig("./logs", 3); + funcTest.funcMenu(config, choise, funcTest); + } + } diff --git a/src/test/java/test/ShortBatchDataTest.java b/src/test/java/test/ShortBatchDataTest.java index 8df1ca4..64ccd2d 100644 --- a/src/test/java/test/ShortBatchDataTest.java +++ b/src/test/java/test/ShortBatchDataTest.java @@ -174,7 +174,7 @@ public class ShortBatchDataTest { data.add(new byte[16]); data.add(new byte[1024]); - String[] macs = api.SYD_SM4Mac_BatchData(keyIdx, data); + List macs = api.SYD_SM4Mac_BatchData(keyIdx, data); boolean[] checks = api.SYD_SM4Mac_BatchData(keyIdx, data, macs); for (int i = 0; i < data.size(); i++) { @@ -201,7 +201,7 @@ public class ShortBatchDataTest { data.add(new byte[1024]); data.add(new byte[1024]); - String[] macs = api.SYD_SM4Mac_BatchData(keyIdx, data); + List macs = api.SYD_SM4Mac_BatchData(keyIdx, data); boolean[] checks = api.SYD_SM4Mac_BatchData(keyIdx, data, macs); for (int i = 0; i < data.size(); i++) { @@ -228,7 +228,7 @@ public class ShortBatchDataTest { data.add(new byte[1024]); data.add(new byte[1024]); - String[] macs = api.SYD_SM4Mac_BatchData(keyIdx, data); + List macs = api.SYD_SM4Mac_BatchData(keyIdx, data); boolean[] checks = api.SYD_SM4Mac_BatchData(keyIdx, data, macs); for (int i = 0; i < data.size(); i++) { @@ -241,7 +241,7 @@ public class ShortBatchDataTest { // 测试数据 ShortBatchDataTest.RandomTestData data = new ShortBatchDataTest.RandomTestData(); - String[] macs = api.SYD_SM4Mac_BatchData(data.getKeyIdx(), data.getData()); + List macs = api.SYD_SM4Mac_BatchData(data.getKeyIdx(), data.getData()); boolean[] checks = api.SYD_SM4Mac_BatchData(data.getKeyIdx(), data.getData(), macs); for (int i = 0; i < data.getSize(); i++) { @@ -255,7 +255,7 @@ public class ShortBatchDataTest { // 测试数据 ShortBatchDataTest.RandomTestData data = new ShortBatchDataTest.RandomTestData(0); - String[] macs = api.SYD_SM4Mac_BatchData(data.getKeyIdx(), data.getData()); + List macs = api.SYD_SM4Mac_BatchData(data.getKeyIdx(), data.getData()); boolean[] checks = api.SYD_SM4Mac_BatchData(data.getKeyIdx(), data.getData(), macs); for (int i = 0; i < data.getSize(); i++) { diff --git a/src/test/java/test/TestAll.java b/src/test/java/test/TestAll.java index f7c67cc..0c6c3db 100644 --- a/src/test/java/test/TestAll.java +++ b/src/test/java/test/TestAll.java @@ -33,6 +33,7 @@ public class TestAll { } + private static void startPerformanceFile() { try (FileWriter fw = new FileWriter(PERF_RESULT_FILE, true); BufferedWriter bw = new BufferedWriter(fw)) { @@ -98,6 +99,7 @@ public class TestAll { public static void menu1(Config config, Choise choise, TestAll test) throws Exception { + FuncTest funcTest = new FuncTest(config); while ( true ) { @@ -112,16 +114,17 @@ public class TestAll { switch (choise.getAsInt()) { case 1: SydApi.SYD_SetLogConfig("./logs", 3); - funcMenu(config, choise, test); + funcTest.funcMenu(config, choise, funcTest); break; case 2: - test.funcAll(); + funcTest.funcAll(); break; case 3: SydApi.SYD_SetLogConfig("./logs", 0); perfMenu(config, choise, test); break; case 4: + SydApi.SYD_SetLogConfig("./logs", 0); startPerformanceFile(); test.perfAll(); stopPerformanceFile(); @@ -375,7 +378,7 @@ public class TestAll { for (int i = 0; i < totalRequest; i++) { poolEnc.submit(() -> { SydApi api = Api.get(); - String[] s = api.SYD_SM4Mac_BatchData(keyIdx, data); + List s = api.SYD_SM4Mac_BatchData(keyIdx, data); }); } poolEnc.shutdown(); @@ -723,574 +726,6 @@ public class TestAll { System.out.println("-------- SM3长数据性能测试结束 --------"); } - public void loggerFunc() { - System.out.println("-------- 设置日志配置功能测试开始 --------"); - SydApi.SYD_SetLogConfig("./logs", 3); - System.out.println("日志配置成功,存储路径./logs,级别3"); - System.out.println("-------- 设置日志配置功能测试结束 --------\n"); - } - - public void connectFunc() { - System.out.println("-------- 短连接建立与关闭功能测试开始 --------"); - - System.out.println("-------- 短连接建立与关闭功能测试结束 --------\n"); - } - - public void longConnectFunc() { - System.out.println("-------- 设置长连接参数与获取长连接功能测试开始 --------"); - SydApiBuilder builder = new SydApiBuilder( - config.getIps(), - config.getPorts(), - 1000, - 2000 - ); - SydApi api = builder.build(); - System.out.println("设置长连接参数与获取长连接成功"); - - System.out.println("-------- 设置长连接参数与获取长连接功能测试结束 --------\n"); - } - - public void sm3ShortFunc() { - System.out.println("-------- SM3短数据功能测试开始 --------"); - - SydApiBuilder builder = new SydApiBuilder( - config.getIps(), - config.getPorts(), - 1000, - 2000 - ); - SydApi api = builder.build(); - - String res1 = api.SYD_SM3_Hash_ShortData(new byte[1024]); - String res2 = api.SYD_SM3_Hash_ShortData(new byte[0]); - - if (res1.equals(CalcRes.SM3_SHORT_RESULT1) && res2.equals(CalcRes.SM3_SHORT_RESULT2)) { - System.out.println("SM3短数据测试成功"); - } else { - System.out.println("SM3短数据测试失败"); - System.out.println("计算结果:" + res1); - System.out.println("预期结果:" + CalcRes.SM3_SHORT_RESULT1); - System.out.println("计算结果:" + res2); - System.out.println("预期结果:" + CalcRes.SM3_SHORT_RESULT2); - } - - try { - api.SYD_SM3_Hash_ShortData(new byte[4096]); - System.out.println("SM3短数据超出测试失败"); - } catch (SydApiException e) { - System.out.println("SM3短数据超出错误检测成功"); - } - - - System.out.println("-------- SM3短数据功能测试结束 --------\n"); - } - - public void sm3LongFunc() { - System.out.println("-------- SM3长数据功能测试开始 --------"); - SydApiBuilder builder = new SydApiBuilder( - config.getIps(), - config.getPorts(), - 1000, - 2000 - ); - SydApi api = builder.build(); - - ISM3 sm3 = api.initSM3(); - byte[] data = new byte[4064]; - for (int i = 0; i < 10; i++) { - sm3.update(data); - } - String res1 = sm3.digest(); - - data = new byte[0]; - sm3 = api.initSM3(); - for (int i = 0; i < 10; i++) { - sm3.update(data); - } - - String res2 = sm3.digest(); - - if (res1.equals(CalcRes.SM3_LONG_RESULT1) && res2.equals(CalcRes.SM3_LONG_RESULT2)) { - System.out.println("SM3长数据测试成功"); - } else { - System.out.println("SM3长数据测试失败"); - System.out.println("计算结果:" + res1); - System.out.println("预期结果:" + CalcRes.SM3_LONG_RESULT1); - System.out.println("计算结果:" + res2); - System.out.println("预期结果:" + CalcRes.SM3_LONG_RESULT2); - } - - System.out.println("-------- SM3长数据功能测试结束 --------\n"); - } - - public void sm4ShortFunc() { - System.out.println("-------- SM4短数据加解密功能测试开始 --------"); - SydApiBuilder builder = new SydApiBuilder( - config.getIps(), - config.getPorts(), - 1000, - 2000 - ); - SydApi api = builder.build(); - int key = 0; - - byte[] enc1 = api.SYD_SM4_ShortData(key, new byte[1024], ECB_ENC); - byte[] dec1 = api.SYD_SM4_ShortData(key, enc1, ECB_DEC); - - byte[] enc2 = api.SYD_SM4_ShortData(key, new byte[0], ECB_ENC); - byte[] dec2 = api.SYD_SM4_ShortData(key, enc2, ECB_DEC); - - String res1 = Util.bytes2HexString(enc1); - String res2 = Util.bytes2HexString(enc2); - - if (res1.equals(CalcRes.SM4_SHORT_RESULT1) && res2.equals(CalcRes.SM4_SHORT_RESULT2) - && Arrays.equals(dec1, new byte[1024]) && Arrays.equals(dec2, new byte[0])) { - System.out.println("SM4短数据测试成功"); - } else { - System.out.println("SM4短数据测试失败"); - System.out.println("加密计算结果:" + res1); - System.out.println("加密预期结果:" + CalcRes.SM4_SHORT_RESULT1); - System.out.println("解密计算结果:" + Util.bytes2HexString(dec1)); - System.out.println("解密预期结果:" + Util.bytes2HexString(new byte[1024])); - System.out.println("加密计算结果:" + res2); - System.out.println("加密预期结果:" + CalcRes.SM4_SHORT_RESULT2); - System.out.println("解密计算结果:" + Util.bytes2HexString(dec2)); - System.out.println("解密预期结果:" + Util.bytes2HexString(new byte[0])); - } - - try { - enc1 = api.SYD_SM4_ShortData(key, new byte[1025], ECB_ENC); - dec1 = api.SYD_SM4_ShortData(key, enc1, ECB_DEC); - System.out.println("SM4短数据长度超出测试失败"); - } catch (SydApiException e) { - System.out.println("SM4短数据长度超出测试成功"); - } - - System.out.println("-------- SM4短数据加解密功能测试结束 --------\n"); - } - - public void sm4LongFunc() { - System.out.println("-------- SM4长数据加解密功能测试开始 --------"); - SydApiBuilder builder = new SydApiBuilder( - config.getIps(), - config.getPorts(), - 1000, - 2000 - ); - SydApi api = builder.build(); - boolean ret = LongDataTest.case1(api); - if ( ! ret ){ - System.out.println("-------- SM4长数据加解密功能测试失败 --------\n"); - } else { - System.out.println("-------- SM4长数据加解密功能测试结束 --------\n"); - } - - } - - public void sm4macShortFunc() { - System.out.println("-------- SM4MAC短数据功能测试开始 --------"); - SydApiBuilder builder = new SydApiBuilder( - config.getIps(), - config.getPorts(), - 1000, - 2000 - ); - SydApi api = builder.build(); - - int key = 0; - byte[] data1 = new byte[1024]; - byte[] data2 = new byte[0]; - - String res1 = api.SYD_SM4Mac_ShortData(key, data1); - boolean check1 = api.SYD_SM4Mac_ShortData(key, data1, res1); - - String res2 = api.SYD_SM4Mac_ShortData(key, data2); - boolean check2 = api.SYD_SM4Mac_ShortData(key, data2, res2); - - if (res1.equals(CalcRes.SM4MAC_SHORT_RESULT1) && res2.equals(CalcRes.SM4MAC_SHORT_RESULT2) - && check1 && check2) { - System.out.println("SM4MAC短数据测试成功"); - } else { - System.out.println("SM4MAC短数据测试失败"); - System.out.println("计算结果:" + res1); - System.out.println("预期结果:" + CalcRes.SM4MAC_SHORT_RESULT1); - System.out.println("计算结果:" + res2); - System.out.println("预期结果:" + CalcRes.SM4MAC_SHORT_RESULT2); - } - - try { - res1 = api.SYD_SM4Mac_ShortData(key, new byte[1025]); - check1 = api.SYD_SM4Mac_ShortData(key, new byte[1025], res1); - System.out.println("SM4MAC短数据长度超出测试失败"); - } catch (SydApiException e) { - System.out.println("SM4MAC短数据长度超出测试成功"); - } - - System.out.println("-------- SM4MAC短数据功能测试结束 --------\n"); - } - - public void sm4macLongFunc() { - System.out.println("-------- SM4MAC长数据功能测试开始 --------"); - SydApiBuilder builder = new SydApiBuilder( - config.getIps(), - config.getPorts(), - 1000, - 2000 - ); - SydApi api = builder.build(); - - byte[] data1 = new byte[4064]; - int key = 0; - ISM4Mac sm4mac = api.initSM4Mac(key); - for (int i = 0; i < 10; i++) { - sm4mac.update(data1); - } - String res1 = sm4mac.digest(); - - byte[] data2 = new byte[16]; - sm4mac = api.initSM4Mac(key); - for (int i = 0; i < 10; i++) { - sm4mac.update(data2); - } - String res2 = sm4mac.digest(); - -// c = opt.check(hexStringTobytes(SM4MAC_LONG_RESULT1)) -// s = opt.hexcheck(SM4MAC_LONG_RESULT1) -// -// c2 = opt2.check(hexStringTobytes(SM4MAC_LONG_RESULT2)) -// s2 = opt2.hexcheck(SM4MAC_LONG_RESULT2) - - if (res1.equals(CalcRes.SM4MAC_LONG_RESULT1) && res2.equals(CalcRes.SM4MAC_LONG_RESULT2)) { - System.out.println("SM4MAC长数据测试成功"); - } else { - System.out.println("SM4MAC长数据测试失败"); - System.out.println("计算结果:" + res1); - System.out.println("预期结果:" + CalcRes.SM4MAC_LONG_RESULT1); - System.out.println("计算结果:" + res2); - System.out.println("预期结果:" + CalcRes.SM4MAC_LONG_RESULT2); - } - - -// try: -// input = bytes(4080) -// opt2 = conn.sm4_mac_init(0) -// for _ in range(10): -// opt2.update(input) -// res2 = opt2.digest() -// System.out.println('SM4MAC长数据长度超出测试失败') -// except SmxApiException as e: -// System.out.println('SM4MAC长数据长度超出测试成功') -// -// try: -// input = bytes(17) -// opt2 = conn.sm4_mac_init(0) -// for _ in range(10): -// opt2.update(input) -// res2 = opt2.digest() -// System.out.println('SM4MAC长数据16字节未对齐测试失败') -// except SmxApiException as e: -// System.out.println('SM4MAC长数据16字节未对齐测试成功') -// -// System.out.println('-------- SM4MAC长数据功能测试结束 --------\n') - } - - public void sm4BatchFunc() { - System.out.println("-------- SM4批量数据加解密功能测试开始 --------"); - SydApiBuilder builder = new SydApiBuilder( - config.getIps(), - config.getPorts(), - 1000, - 2000 - ); - SydApi api = builder.build(); - - List data = new ArrayList<>(); - data.add(new byte[1024]); - data.add(new byte[1024]); - data.add(new byte[1024]); - data.add(new byte[1024]); - data.add(new byte[1024]); - data.add(new byte[1024]); - data.add(new byte[1024]); - int[] key = new int[]{0, 0, 0, 0, 0, 0, 0}; - - - List en_data = api.SYD_SM4_BatchData(key, data, ECB_ENC); - - List de_data = api.SYD_SM4_BatchData(key, en_data, ECB_DEC); - - if (en_data.equals(CalcRes.SM4_BATCH_RESULT) && data.equals(de_data)) { - System.out.println("SM4批量数据加解密测试成功"); - } else { - System.out.println("SM4批量数据加解密测试失败"); -// System.out.println("加密计算结果:" + en_data); - System.out.println("加密预期结果:" + CalcRes.SM4_BATCH_RESULT); -// System.out.println("解密计算结果:" + de_data); -// System.out.println("解密预期结果:" + data); - } - - System.out.println("-------- SM4批量数据加解密功能测试结束 --------\n"); - } - - public void sm4macBatchFunc() { - System.out.println("-------- SM4MAC批量数据功能测试开始 --------"); - SydApiBuilder builder = new SydApiBuilder( - config.getIps(), - config.getPorts(), - 1000, - 2000 - ); - SydApi api = builder.build(); - - List data = new ArrayList<>(); - data.add(new byte[1024]); - data.add(new byte[1024]); - data.add(new byte[1024]); - data.add(new byte[1024]); - int[] keyIdx = new int[]{0, 0, 0, 0}; - - String[] s = api.SYD_SM4Mac_BatchData(keyIdx, data); - - boolean[] check = api.SYD_SM4Mac_BatchData(keyIdx, data, s); - - boolean flag = true; - if (Arrays.equals(s, CalcRes.SM4MAC_BATCH_RESULT)) { - for (int i = 0; i < check.length; i++) { - if (!check[i]) { - flag = false; - break; - } - } - if (flag) { - System.out.println("SM4MAC批量数据测试成功"); - } else { - System.out.println("SM4MAC批量数据测试失败"); - System.out.println("计算结果:" + check); - System.out.println("预期结果:" + new boolean[]{true, true, true, true, true, true, true}); - } - } else { - System.out.println("SM4MAC批量数据测试失败"); - System.out.println("计算结果:" + s); - System.out.println("预期结果:" + CalcRes.SM4MAC_BATCH_RESULT); - } - - System.out.println("-------- SM4MAC批量数据功能测试结束 --------\n"); - } - - public void sm4ShortMacFunc() { - System.out.println("-------- 短数据加密计算MAC,校验MAC解密功能测试开始 --------"); - SydApiBuilder builder = new SydApiBuilder( - config.getIps(), - config.getPorts(), - 1000, - 2000 - ); - SydApi api = builder.build(); - - int keyEnc = 0; - int keyMac = 0; - byte[] data1 = new byte[1024]; - byte[] data2 = new byte[0]; - DataAndMac en_data1 = api.SYD_SM4_EncryptAndMac_ShortData(keyEnc, keyMac, data1); - DataAndMacCheck de_data1 = api.SYD_SM4_CheckMacAndDecrypt_ShortData(keyEnc, keyMac, en_data1.getData(), en_data1.getMac()); - - DataAndMac en_data2 = api.SYD_SM4_EncryptAndMac_ShortData(keyEnc, keyMac, data2); - DataAndMacCheck de_data2 = api.SYD_SM4_CheckMacAndDecrypt_ShortData(keyEnc, keyMac, en_data2.getData(), en_data2.getMac()); - - if ( - de_data2.getMacCheck() - ) { - System.out.println("短数据加密计算MAC,校验MAC解密测试成功"); - } else { - System.out.println("短数据加密计算MAC,校验MAC解密测试失败"); - System.out.println("加密计算结果:" + en_data1); - System.out.println("加密预期结果:" + CalcRes.SM4ANDMAC_SHORT_RESULT1); - System.out.println("解密计算结果:" + de_data1); - System.out.println("解密预期结果:" + data1); - System.out.println("加密计算结果:" + en_data2); - System.out.println("加密预期结果:" + CalcRes.SM4ANDMAC_SHORT_RESULT2); - System.out.println("解密计算结果:" + de_data2); - System.out.println("解密预期结果:" + data2); - } - - try { - data1 = new byte[1025]; - api.SYD_SM4_EncryptAndMac_ShortData(keyEnc, keyMac, data1); - System.out.println("短数据加密计算MAC,校验MAC解密长度超出测试失败"); - } catch (SydApiException e) { - System.out.println("短数据加密计算MAC,校验MAC解密长度超出测试成功"); - } - - System.out.println("-------- 短数据加密计算MAC,校验MAC解密功能测试结束 --------\n"); - } - - public void sm4BatchMacFunc() { - System.out.println("-------- 批量数据加密计算MAC,校验MAC解密功能测试开始 --------"); - SydApiBuilder builder = new SydApiBuilder( - config.getIps(), - config.getPorts(), - 1000, - 2000 - ); - SydApi api = builder.build(); - - List data = new ArrayList<>(); - data.add(new byte[1024]); - data.add(new byte[1024]); - data.add(new byte[1024]); - data.add(new byte[1024]); - data.add(new byte[1024]); - data.add(new byte[1024]); - data.add(new byte[1024]); - int[] keyEnc = new int[]{0, 0, 0, 0, 0, 0, 0}; - int[] keyMac = new int[]{0, 0, 0, 0, 0, 0, 0}; - - List en_data = api.SYD_SM4_EncryptAndMac_BatchData(keyEnc, keyMac, data); - List de_data = api.SYD_SM4_CheckMacAndDecrypt_BatchData(keyEnc, keyMac, en_data); - - boolean flag = true; - for (int i = 0; i < de_data.size(); i++) { - flag = flag & de_data.get(i).getMacCheck(); - } - - if (flag) { - System.out.println("批量数据加密计算MAC,校验MAC解密测试成功"); - } else { - System.out.println("批量数据加密计算MAC,校验MAC解密测试失败"); - System.out.println("加密计算结果:" + en_data); - System.out.println("加密预期结果:" + CalcRes.SM4ANDMAC_BATCH_RESULT); - } - - - try { - data = new ArrayList<>(); - data.add(new byte[1024]); - data.add(new byte[1024]); - data.add(new byte[1024]); - data.add(new byte[1024]); - data.add(new byte[1024]); - data.add(new byte[1024]); - data.add(new byte[1024]); - data.add(new byte[1024]); - keyEnc = new int[]{0, 1, 0, 1, 1, 1, 1, 0}; - keyMac = new int[]{1, 0, 1, 0, 0, 0, 0, 0}; - - en_data = api.SYD_SM4_EncryptAndMac_BatchData(keyEnc, keyMac, data); - de_data = api.SYD_SM4_CheckMacAndDecrypt_BatchData(keyEnc, keyMac, en_data); - System.out.println("批量数据加密计算MAC,校验MAC解密长度超出测试失败"); - } catch (SydApiException e) { - System.out.println("批量数据加密计算MAC,校验MAC解密长度超出测试成功"); - } - - System.out.println("-------- 批量数据加密计算MAC,校验MAC解密功能测试结束 --------\n"); - } - - public void funcAll() { - this.loggerFunc(); - this.connectFunc(); - this.longConnectFunc(); - - this.sm3ShortFunc(); - - - this.sm4ShortFunc(); - this.sm4BatchFunc(); - - - this.sm4macShortFunc(); - this.sm4macBatchFunc(); - - - this.sm4ShortMacFunc(); - this.sm4BatchMacFunc(); - - - this.sm4LongFunc(); - this.sm4macLongFunc(); - this.sm3LongFunc(); - - } - - public static void funcMenu(Config config, Choise choise, TestAll test) throws Exception{ - - boolean flag = true; - SydApi.SYD_SetLogConfig("./logs", 3); - while (flag) { - System.out.println("请选择测试项:"); - System.out.println("1. 日志测试"); - System.out.println("2. 短链接测试"); - System.out.println("3. 长链接测试"); - - System.out.println("4. SM3短数据"); - - - System.out.println("5. SM4 短数据加解密"); - System.out.println("6. SM4 批量数据加解密"); - System.out.println("7. SM4MAC 短数据"); - System.out.println("8. SM4MAC 批量数据"); - - System.out.println("9. SM4短数据加密后生成MAC,解密验证MAC"); - System.out.println("10. SM4批量数据加密后生成MAC,验证MAC解密"); - - - System.out.println("11. SM4长数据加解密"); - System.out.println("12. SM4长数据MAC"); - - - System.out.println("13. SM3长数据"); - System.out.println("-1.退出"); - - switch (choise.getAsInt()) { - case 1: - test.loggerFunc(); - break; - case 2: - test.connectFunc(); - break; - case 3: - test.longConnectFunc(); - break; - case 4: - test.sm3ShortFunc(); - break; - - case 5: - test.sm4ShortFunc(); - break; - case 6: - test.sm4BatchFunc(); - break; - - case 7: - test.sm4macShortFunc(); - break; - case 8: { - test.sm4macBatchFunc(); - break; - } - case 9: { - test.sm4ShortMacFunc(); - break; - } - case 10: { - test.sm4BatchMacFunc(); - break; - } - case 11: - test.sm4macLongFunc(); - break; - case 12: - test.sm4LongFunc(); - break; - case 13: - test.sm3LongFunc(); - break; - case -1: - flag = false; - break; - } - } - } @@ -1400,9 +835,4 @@ public class TestAll { } - void testComm(){ - String hex = "0436000000000000000E453030383130534B303030303030303030303030303030303030413030303030303030303031303030303234303000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"; - - } - } diff --git a/说明.txt b/说明.txt index c96dca2..9db3a3c 100644 --- a/说明.txt +++ b/说明.txt @@ -1,15 +1,14 @@ +#Readme + + +## 主要类说明 SydApi - 接口 -SydApiBaseFunction - 主要用于长连接,由 Pool 创建。 -SydApi4Database - 主要用于短连接,继承自 SydApiBaseFunction - - - - -sydapi4j-1.0.20220906.jar -性能改动查看 - +SydApiBaseFunction - 通用功能。 +SydApiLongLinkWrap - 用于长连接,包装自 SydApiBaseFunction。 +SydApi4Database - 主要用于短连接,继承自 SydApiBaseFunction。 +## 发布包格式 - doc 文档 - sample 示例代码 - jar @@ -22,7 +21,13 @@ sydapi4j-1.0.20220906.jar - sydapi4j-1.0.20220805.jar 加密机通信包 +## 二期需求 +加密带MAC 复合接口长连接四个都是封装自 C。 + + + +## 测试环境 linux测试服务器 电口:172.1.10.245 光口:192.168.100.245