功能实现
This commit is contained in:
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -1,48 +1,70 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
|
||||||
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|
||||||
<groupId>com.sunyard.sge.database</groupId>
|
<groupId>com.sunyard.sge.database</groupId>
|
||||||
<artifactId>sydapi-database</artifactId>
|
<artifactId>sydapi-database</artifactId>
|
||||||
<version>1.0</version>
|
<version>1.0</version>
|
||||||
|
|
||||||
<name>sydapi-database</name>
|
<name>sydapi-database</name>
|
||||||
|
|
||||||
<properties>
|
<properties>
|
||||||
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||||
<maven.compiler.source>1.7</maven.compiler.source>
|
<maven.compiler.source>1.8</maven.compiler.source>
|
||||||
<maven.compiler.target>1.7</maven.compiler.target>
|
<maven.compiler.target>1.8</maven.compiler.target>
|
||||||
</properties>
|
<log.version>2.17.0</log.version>
|
||||||
|
</properties>
|
||||||
|
|
||||||
<dependencies>
|
<dependencies>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>junit</groupId>
|
<groupId>junit</groupId>
|
||||||
<artifactId>junit</artifactId>
|
<artifactId>junit</artifactId>
|
||||||
<version>4.11</version>
|
<version>4.11</version>
|
||||||
<scope>test</scope>
|
<scope>test</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>com.sunyard</groupId>
|
<groupId>com.sunyard</groupId>
|
||||||
<artifactId>sydapi4j</artifactId>
|
<artifactId>sydapi4j</artifactId>
|
||||||
<version>1.0.20220712</version>
|
<version>1.0.20220712</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
</dependencies>
|
<dependency>
|
||||||
|
<groupId>org.apache.logging.log4j</groupId>
|
||||||
|
<artifactId>log4j-api</artifactId>
|
||||||
|
<version>${log.version}</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.apache.logging.log4j</groupId>
|
||||||
|
<artifactId>log4j-core</artifactId>
|
||||||
|
<version>${log.version}</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency> <!-- 桥接:告诉Slf4j使用Log4j2 -->
|
||||||
|
<groupId>org.apache.logging.log4j</groupId>
|
||||||
|
<artifactId>log4j-slf4j-impl</artifactId>
|
||||||
|
<version>${log.version}</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency> <!-- 桥接:告诉commons logging使用Log4j2 -->
|
||||||
|
<groupId>org.apache.logging.log4j</groupId>
|
||||||
|
<artifactId>log4j-jcl</artifactId>
|
||||||
|
<version>${log.version}</version>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
<build>
|
</dependencies>
|
||||||
|
|
||||||
<plugins>
|
<build>
|
||||||
<plugin>
|
|
||||||
<groupId>org.apache.maven.plugins</groupId>
|
<plugins>
|
||||||
<artifactId>maven-compiler-plugin</artifactId>
|
<plugin>
|
||||||
<configuration>
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
<source>8</source>
|
<artifactId>maven-compiler-plugin</artifactId>
|
||||||
<target>8</target>
|
<configuration>
|
||||||
</configuration>
|
<source>8</source>
|
||||||
</plugin>
|
<target>8</target>
|
||||||
</plugins>
|
</configuration>
|
||||||
</build>
|
</plugin>
|
||||||
|
</plugins>
|
||||||
|
</build>
|
||||||
</project>
|
</project>
|
||||||
|
|||||||
@@ -3,4 +3,17 @@ package com.sunyard.sge.database;
|
|||||||
public class Consts {
|
public class Consts {
|
||||||
public static final int ECB_DEC = 0;
|
public static final int ECB_DEC = 0;
|
||||||
public static final int ECB_ENC = 1;
|
public static final int ECB_ENC = 1;
|
||||||
|
|
||||||
|
|
||||||
|
// 唯一包
|
||||||
|
public static final int PkgNumAll = 0;
|
||||||
|
|
||||||
|
// 首包
|
||||||
|
public static final int PkgNumHead = 1;
|
||||||
|
|
||||||
|
// 中间包
|
||||||
|
public static final int PkgNumMiddle = 2;
|
||||||
|
|
||||||
|
// 结束包
|
||||||
|
public static final int PkgNumTail = 3;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,4 +1,20 @@
|
|||||||
package com.sunyard.sge.database;
|
package com.sunyard.sge.database;
|
||||||
|
|
||||||
public class LongDataReturn<T, T1> {
|
public class LongDataReturn<T1, T2> {
|
||||||
|
|
||||||
|
private T1 procData;
|
||||||
|
private T2 data;
|
||||||
|
|
||||||
|
public LongDataReturn(T1 procData, T2 data) {
|
||||||
|
this.procData = procData;
|
||||||
|
this.data = data;
|
||||||
|
}
|
||||||
|
|
||||||
|
public T1 getProcData() {
|
||||||
|
return procData;
|
||||||
|
}
|
||||||
|
|
||||||
|
public T2 getData() {
|
||||||
|
return data;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -7,8 +7,23 @@ import java.util.List;
|
|||||||
*/
|
*/
|
||||||
public interface SydApi {
|
public interface SydApi {
|
||||||
|
|
||||||
void warmUpMode(boolean use);
|
/**
|
||||||
|
* 设置全局日志相应的配置
|
||||||
|
*
|
||||||
|
*@param pcLogPath: 输入。日志存储路径
|
||||||
|
*@param iLogLevel: 输入。日志级别设置
|
||||||
|
* 0:不记录日志,
|
||||||
|
* 1:记录网络层错误日志,
|
||||||
|
* 2:记录接口错误日志及网络层错误日志,
|
||||||
|
* 3:记录正确日志及错误日志
|
||||||
|
*
|
||||||
|
* @return 无
|
||||||
|
**/
|
||||||
|
static void SYD_SetLogConfig(
|
||||||
|
String pcLogPath,
|
||||||
|
int iLogLevel) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 建立到指定地址和端口号的签名服务器的 TCP/IP 连接,返回 API 操作对象 SydApi。
|
* 建立到指定地址和端口号的签名服务器的 TCP/IP 连接,返回 API 操作对象 SydApi。
|
||||||
@@ -20,6 +35,7 @@ public interface SydApi {
|
|||||||
* @param iDealTimeOut 交易接口超时设定,单位毫秒(不超过10ms)。
|
* @param iDealTimeOut 交易接口超时设定,单位毫秒(不超过10ms)。
|
||||||
* @return SydApi 的对象,只要有设备可用则返回。
|
* @return SydApi 的对象,只要有设备可用则返回。
|
||||||
*/
|
*/
|
||||||
|
@Deprecated
|
||||||
SydApi SYD_Connect_Ex(
|
SydApi SYD_Connect_Ex(
|
||||||
String[] pcIpList,
|
String[] pcIpList,
|
||||||
int[] iPortList,
|
int[] iPortList,
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
package com.sunyard.sge.database;
|
package com.sunyard.sge.database;
|
||||||
|
|
||||||
import com.sunyard.SydApiException;
|
import com.sunyard.SydApiException;
|
||||||
|
import com.sunyard.proto.Util;
|
||||||
import com.sunyard.util.SYMUtil;
|
import com.sunyard.util.SYMUtil;
|
||||||
import racal.sunyard.main.SydApi4j;
|
import racal.sunyard.main.SydApi4j;
|
||||||
|
|
||||||
@@ -8,136 +9,355 @@ import java.util.List;
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* 上海黄金交易所 - 数据库加密方案
|
* 上海黄金交易所 - 数据库加密方案
|
||||||
*
|
|
||||||
*/
|
*/
|
||||||
public class SydApi4Database implements SydApi
|
public class SydApi4Database implements SydApi {
|
||||||
{
|
|
||||||
|
|
||||||
// public static void SYD_SetLogConfig (
|
private SydApi4j[] hsms = null;
|
||||||
// String pcLogPath,
|
|
||||||
// int iLogLevel) {
|
|
||||||
// }
|
|
||||||
|
|
||||||
private SydApi4j api4j = null;
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void warmUpMode(boolean use) {
|
|
||||||
this.api4j.warmUpMode( use );
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public SydApi SYD_Connect_Ex(String[] pcIpList, int[] iPortList, int iConnectTimeOut, int iDealTimeOut) {
|
public SydApi SYD_Connect_Ex(String[] pcIpList, int[] iPortList, int iConnectTimeOut, int iDealTimeOut) {
|
||||||
|
SydApi4j api = (SydApi4j) new SydApi4j().connect(pcIpList[0], iPortList[0], null, iConnectTimeOut);
|
||||||
|
hsms = new SydApi4j[]{ api };
|
||||||
if ( null == pcIpList &&
|
|
||||||
null == iPortList &&
|
|
||||||
pcIpList.length != iPortList.length ) {
|
|
||||||
throw new IllegalArgumentException("入参错误");
|
|
||||||
}
|
|
||||||
if ( null != api4j ) {
|
|
||||||
this.SYD_Disconnect_Ex();
|
|
||||||
}
|
|
||||||
|
|
||||||
api4j = (SydApi4j) new SydApi4j().connect( pcIpList[0], iPortList[0], null, iConnectTimeOut, iDealTimeOut);
|
|
||||||
|
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void SYD_Disconnect_Ex() {
|
public void SYD_Disconnect_Ex() {
|
||||||
if ( null != this.api4j ) {
|
// 配合链接池,不再需要释放。
|
||||||
try {
|
// if ( null != api ) {
|
||||||
this.api4j.disconnect();
|
// try {
|
||||||
}catch ( Exception e ){
|
// api.disconnect();
|
||||||
}
|
// }catch ( Exception e ){
|
||||||
}
|
// }
|
||||||
this.api4j = null;
|
// }
|
||||||
|
// api = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String SYD_SM3_Hash_ShortData(byte[] pcData) {
|
public String SYD_SM3_Hash_ShortData(byte[] pcData) {
|
||||||
return null;
|
if (null == this.hsms || this.hsms.length < 1) {
|
||||||
|
throw new SydApiException(-1);
|
||||||
|
}
|
||||||
|
|
||||||
|
SydApiException le = null;
|
||||||
|
for (SydApi4j api : this.hsms) {
|
||||||
|
try {
|
||||||
|
byte[] hash = api.SYD_SM3_LongData(pcData, null, 0);
|
||||||
|
return Util.bytes2HexString(hash);
|
||||||
|
} catch (SydApiException e) {
|
||||||
|
le = e;
|
||||||
|
if (e.getRetCode() < 0) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
throw e;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
throw le;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public LongDataReturn<String, String> SYD_SM3_Hash_LongData(byte[] pcData, int iPkgNum, String pcProcData) {
|
public LongDataReturn<String, String> SYD_SM3_Hash_LongData(byte[] pcData, int iPkgNum, String pcProcData) {
|
||||||
return null;
|
if (null == this.hsms || this.hsms.length < 1) {
|
||||||
|
throw new SydApiException(-1);
|
||||||
|
}
|
||||||
|
|
||||||
|
byte[] procData = null;
|
||||||
|
if (2 == iPkgNum || 3 == iPkgNum) {
|
||||||
|
procData = Util.hexString2Bytes(pcProcData);
|
||||||
|
}
|
||||||
|
SydApiException le = null;
|
||||||
|
for (SydApi4j api : this.hsms) {
|
||||||
|
try {
|
||||||
|
byte[] hash = api.SYD_SM3_LongData(pcData, procData, iPkgNum);
|
||||||
|
|
||||||
|
if (0 == iPkgNum || 3 == iPkgNum) {
|
||||||
|
return new LongDataReturn<String, String>(null, Util.bytes2HexString(hash));
|
||||||
|
} else {
|
||||||
|
return new LongDataReturn<String, String>(Util.bytes2HexString(hash), null);
|
||||||
|
}
|
||||||
|
} catch (SydApiException e) {
|
||||||
|
le = e;
|
||||||
|
if (e.getRetCode() < 0) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
throw e;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
throw le;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public byte[] SYD_SM4_ShortData(int iKeyIndex, byte[] pcData, int iFlag) {
|
public byte[] SYD_SM4_ShortData(int iKeyIndex, byte[] pcData, int iFlag) {
|
||||||
|
|
||||||
if ( null == this.api4j ) {
|
if (null == this.hsms || this.hsms.length < 1) {
|
||||||
|
throw new SydApiException(-1);
|
||||||
|
}
|
||||||
|
|
||||||
|
String keyIndex = String.format("%08d", iKeyIndex);
|
||||||
|
SydApiException le = null;
|
||||||
|
for (SydApi4j api : this.hsms) {
|
||||||
|
try {
|
||||||
|
|
||||||
|
if (Consts.ECB_ENC == iFlag) {
|
||||||
|
return api.SYMEncryptData(
|
||||||
|
com.sunyard.SydApi.NALG_SM4,
|
||||||
|
"SK" + SYMUtil.genPrivateKeyMark("000000", "00A", keyIndex),
|
||||||
|
1,
|
||||||
|
pcData);
|
||||||
|
} else {
|
||||||
|
return api.SYMDecryptData(
|
||||||
|
com.sunyard.SydApi.NALG_SM4,
|
||||||
|
"SK" + SYMUtil.genPrivateKeyMark("000000", "00A", keyIndex),
|
||||||
|
1,
|
||||||
|
pcData);
|
||||||
|
}
|
||||||
|
} catch (SydApiException e) {
|
||||||
|
le = e;
|
||||||
|
if (e.getRetCode() < 0) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
throw e;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
throw le;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<byte[]> SYD_SM4_BatchData(int[] iKeyIndex, List<byte[]> pcData, int iFlag) {
|
||||||
|
if (null == this.hsms || this.hsms.length < 1) {
|
||||||
|
throw new SydApiException(-1);
|
||||||
|
}
|
||||||
|
|
||||||
|
String[] keys = new String[iKeyIndex.length];
|
||||||
|
for (int i = 0; i < iKeyIndex.length; i++) {
|
||||||
|
keys[i] = "SK" + SYMUtil.genPrivateKeyMark("000000", "00A", String.format("%08d", iKeyIndex[i]));
|
||||||
|
}
|
||||||
|
|
||||||
|
SydApiException le = null;
|
||||||
|
for (SydApi4j api : this.hsms) {
|
||||||
|
try {
|
||||||
|
if (Consts.ECB_ENC == iFlag) {
|
||||||
|
return api.SYMEncryptDecryptBatchData(8, 1, null, keys, 1, pcData);
|
||||||
|
} else {
|
||||||
|
return api.SYMEncryptDecryptBatchData(9, 1, null, keys, 1, pcData);
|
||||||
|
}
|
||||||
|
} catch (SydApiException e) {
|
||||||
|
le = e;
|
||||||
|
if (e.getRetCode() < 0) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
throw e;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
throw le;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public byte[] SYD_SM4_LongData(int iKeyIndex, byte[] pcData, int iPkgNum, int iFlag) {
|
||||||
|
if (null == this.hsms || this.hsms.length < 1) {
|
||||||
throw new SydApiException(-1);
|
throw new SydApiException(-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
String keyIndex = String.format("%08d", iKeyIndex);
|
String keyIndex = String.format("%08d", iKeyIndex);
|
||||||
|
|
||||||
if ( Consts.ECB_ENC == iFlag ) {
|
SydApiException le = null;
|
||||||
return this.api4j.SYMEncryptData(
|
for (SydApi4j api : this.hsms) {
|
||||||
com.sunyard.SydApi.NALG_SM4,
|
try {
|
||||||
"SK" + SYMUtil.genPrivateKeyMark("000000", "00A", keyIndex),
|
if (Consts.ECB_ENC == iFlag) {
|
||||||
1,
|
return api.SYD_SM4_LongData(
|
||||||
pcData );
|
8,
|
||||||
} else {
|
1, null,
|
||||||
return this.api4j.SYMDecryptData(
|
"SK" + SYMUtil.genPrivateKeyMark("000000", "00A", keyIndex),
|
||||||
com.sunyard.SydApi.NALG_SM4,
|
1,
|
||||||
"SK" + SYMUtil.genPrivateKeyMark("000000", "00A", keyIndex),
|
pcData, iPkgNum);
|
||||||
1,
|
} else {
|
||||||
pcData );
|
return api.SYD_SM4_LongData(
|
||||||
}
|
9,
|
||||||
}
|
1, null,
|
||||||
|
"SK" + SYMUtil.genPrivateKeyMark("000000", "00A", keyIndex),
|
||||||
|
1,
|
||||||
|
pcData, iPkgNum);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
} catch (SydApiException e) {
|
||||||
public List<byte[]> SYD_SM4_BatchData(int[] iKeyIndex, List<byte[]> pcData, int iFlag) {
|
le = e;
|
||||||
if ( null == this.api4j ) {
|
if (e.getRetCode() < 0) {
|
||||||
throw new SydApiException(-1);
|
continue;
|
||||||
|
}
|
||||||
|
throw e;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
throw le;
|
||||||
String[] keys = new String[ iKeyIndex.length ];
|
|
||||||
for ( int i = 0 ; i < iKeyIndex.length ; i++ ) {
|
|
||||||
keys[i] = "SK" + SYMUtil.genPrivateKeyMark("000000", "00A", String.format("%08d", iKeyIndex[i] ));
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( Consts.ECB_ENC == iFlag ) {
|
|
||||||
return this.api4j.SYMEncryptDecryptBatchData(8, keys, 1, pcData);
|
|
||||||
} else {
|
|
||||||
return this.api4j.SYMEncryptDecryptBatchData(9, keys, 1, pcData);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public byte[] SYD_SM4_LongData(int iKeyIndex, byte[] pcData, int iPkgNum, int iFlag) {
|
|
||||||
return new byte[0];
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String[] SYD_SM4Mac_BatchData(int[] iKeyIndex, List<byte[]> pcData) {
|
public String[] SYD_SM4Mac_BatchData(int[] iKeyIndex, List<byte[]> pcData) {
|
||||||
return new String[0];
|
if (null == this.hsms || this.hsms.length < 1) {
|
||||||
|
throw new SydApiException(-1);
|
||||||
|
}
|
||||||
|
|
||||||
|
String[] keys = new String[iKeyIndex.length];
|
||||||
|
for (int i = 0; i < iKeyIndex.length; i++) {
|
||||||
|
keys[i] = "SK" + SYMUtil.genPrivateKeyMark("000000", "00A", String.format("%08d", iKeyIndex[i]));
|
||||||
|
}
|
||||||
|
SydApiException le = null;
|
||||||
|
for (SydApi4j api : this.hsms) {
|
||||||
|
try {
|
||||||
|
List<byte[]> list = api.SYMEncryptDecryptBatchData(8, 2, null, keys, 1, pcData);
|
||||||
|
String[] ret = new String[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(buff);
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
} catch (SydApiException e) {
|
||||||
|
le = e;
|
||||||
|
if (e.getRetCode() < 0) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
throw e;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
throw le;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean[] SYD_SM4Mac_BatchData(int[] iKeyIndex, List<byte[]> pcData, String[] pcMac) {
|
public boolean[] SYD_SM4Mac_BatchData(int[] iKeyIndex, List<byte[]> pcData, String[] pcMac) {
|
||||||
return new boolean[0];
|
if (null == this.hsms || this.hsms.length < 1) {
|
||||||
|
throw new SydApiException(-1);
|
||||||
|
}
|
||||||
|
|
||||||
|
String[] keys = new String[iKeyIndex.length];
|
||||||
|
for (int i = 0; i < iKeyIndex.length; i++) {
|
||||||
|
keys[i] = "SK" + SYMUtil.genPrivateKeyMark("000000", "00A", String.format("%08d", iKeyIndex[i]));
|
||||||
|
}
|
||||||
|
SydApiException le = null;
|
||||||
|
for (SydApi4j api : this.hsms) {
|
||||||
|
try {
|
||||||
|
|
||||||
|
List<byte[]> list = api.SYMEncryptDecryptBatchData(8, 2, null, keys, 1, pcData);
|
||||||
|
boolean[] ret = new boolean[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] = pcMac[i].equals(Util.bytes2HexString(buff));
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
} catch (SydApiException e) {
|
||||||
|
le = e;
|
||||||
|
if (e.getRetCode() < 0) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
throw e;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
throw le;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public LongDataReturn<String, String> SYD_SM4Mac_LongData(int iKeyIndex, byte[] pcData, int iPkgNum, String pcProcData) {
|
public LongDataReturn<String, String> SYD_SM4Mac_LongData(int iKeyIndex, byte[] pcData, int iPkgNum, String pcProcData) {
|
||||||
return null;
|
if (null == this.hsms || this.hsms.length < 1) {
|
||||||
|
throw new SydApiException(-1);
|
||||||
|
}
|
||||||
|
|
||||||
|
String keyIndex = String.format("%08d", iKeyIndex);
|
||||||
|
|
||||||
|
byte[] iv = null;
|
||||||
|
|
||||||
|
// 仅一包 和 第一包 忽略 pcProcData 参数
|
||||||
|
if (Consts.PkgNumAll != iPkgNum && Consts.PkgNumHead != iPkgNum) {
|
||||||
|
iv = pcProcData.getBytes();
|
||||||
|
}
|
||||||
|
|
||||||
|
SydApiException le = null;
|
||||||
|
for (SydApi4j api : this.hsms) {
|
||||||
|
try {
|
||||||
|
byte[] ret = api.SYD_SM4_LongData(
|
||||||
|
8,
|
||||||
|
2, iv,
|
||||||
|
"SK" + SYMUtil.genPrivateKeyMark("000000", "00A", keyIndex),
|
||||||
|
1,
|
||||||
|
pcData, iPkgNum);
|
||||||
|
|
||||||
|
byte[] mac = new byte[16];
|
||||||
|
System.arraycopy(ret, ret.length - 16, mac, 0, 16);
|
||||||
|
|
||||||
|
// 仅一包 和 尾包 返回最终结果
|
||||||
|
if (Consts.PkgNumAll == iPkgNum || Consts.PkgNumTail == iPkgNum) {
|
||||||
|
return new LongDataReturn<>(null, Util.bytes2HexString(mac));
|
||||||
|
} else {
|
||||||
|
// 返回中间值
|
||||||
|
return new LongDataReturn<>(Util.bytes2HexString(mac), null);
|
||||||
|
}
|
||||||
|
|
||||||
|
} catch (SydApiException e) {
|
||||||
|
le = e;
|
||||||
|
if (e.getRetCode() < 0) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
throw e;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
throw le;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public LongDataReturn<String, Boolean> SYD_SM4Mac_LongData(int iKeyIndex, byte[] pcData, int iPkgNum, String pcProcData, String pcMac) {
|
public LongDataReturn<String, Boolean> SYD_SM4Mac_LongData(int iKeyIndex, byte[] pcData, int iPkgNum, String pcProcData, String pcMac) {
|
||||||
return null;
|
|
||||||
|
LongDataReturn<String, String> ret = SYD_SM4Mac_LongData(iKeyIndex, pcData, iPkgNum, pcProcData);
|
||||||
|
|
||||||
|
// 仅一包 和 尾包 返回最终结果
|
||||||
|
if (Consts.PkgNumAll == iPkgNum || Consts.PkgNumTail == iPkgNum) {
|
||||||
|
return new LongDataReturn<>(null, pcMac.equals(ret.getData()));
|
||||||
|
} else {
|
||||||
|
// 返回中间值
|
||||||
|
return new LongDataReturn<>(ret.getProcData(), false);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String SYD_SM4Mac_ShortData(int iKeyIndex, byte[] pcData) {
|
public String SYD_SM4Mac_ShortData(int iKeyIndex, byte[] pcData) {
|
||||||
return null;
|
|
||||||
|
if (null == this.hsms || this.hsms.length < 1) {
|
||||||
|
throw new SydApiException(-1);
|
||||||
|
}
|
||||||
|
|
||||||
|
String keyIndex = "SK" + SYMUtil.genPrivateKeyMark("000000", "00A", String.format("%08d", iKeyIndex));
|
||||||
|
|
||||||
|
SydApiException le = null;
|
||||||
|
for (SydApi4j api : this.hsms) {
|
||||||
|
try {
|
||||||
|
|
||||||
|
return api.SYD_SM4Mac_ShortData(keyIndex, pcData);
|
||||||
|
|
||||||
|
} catch (SydApiException e) {
|
||||||
|
le = e;
|
||||||
|
if (e.getRetCode() < 0) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
throw e;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
throw le;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean SYD_SM4Mac_ShortData(int iKeyIndex, byte[] pcData, String pcMac) {
|
public boolean SYD_SM4Mac_ShortData(int iKeyIndex, byte[] pcData, String pcMac) {
|
||||||
return false;
|
if (null == this.hsms || this.hsms.length < 1) {
|
||||||
|
throw new SydApiException(-1);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (null == pcMac) {
|
||||||
|
throw new IllegalArgumentException();
|
||||||
|
}
|
||||||
|
|
||||||
|
String mac = this.SYD_SM4Mac_ShortData(iKeyIndex, pcData);
|
||||||
|
|
||||||
|
return pcMac.equals(mac);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,65 @@
|
|||||||
|
package com.sunyard.sge.database;
|
||||||
|
|
||||||
|
import com.sunyard.sge.database.pool.HsmLinkInfo;
|
||||||
|
import com.sunyard.sge.database.pool.SydApiPool;
|
||||||
|
import com.sunyard.sge.log.LogFactory;
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
|
||||||
|
|
||||||
|
public class SydApiBuilder {
|
||||||
|
|
||||||
|
private SydApiPool pool;
|
||||||
|
|
||||||
|
public SydApiBuilder(
|
||||||
|
String[] pcIpList,
|
||||||
|
int[] iPortList,
|
||||||
|
int iConnectTimeOut,
|
||||||
|
int iDealTimeOut
|
||||||
|
) {
|
||||||
|
Logger log = LogFactory.getLogger();
|
||||||
|
log.debug("创建链接");
|
||||||
|
|
||||||
|
HsmLinkInfo[] linkInfo = HsmLinkInfo.mutiHsmLinkInfo(pcIpList, iPortList, iConnectTimeOut, iDealTimeOut);
|
||||||
|
this.pool = new SydApiPool(linkInfo);
|
||||||
|
|
||||||
|
warmUp( pcIpList, iPortList, iConnectTimeOut, iDealTimeOut );
|
||||||
|
}
|
||||||
|
|
||||||
|
public SydApi build() {
|
||||||
|
return pool.get();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private void warmUp(String[] pcIpList,
|
||||||
|
int[] iPortList,
|
||||||
|
int iConnectTimeOut,
|
||||||
|
int iDealTimeOut){
|
||||||
|
SydApi api = null;
|
||||||
|
try {
|
||||||
|
api = new SydApi4Database();
|
||||||
|
api.SYD_Connect_Ex( pcIpList, iPortList, iConnectTimeOut, iDealTimeOut );
|
||||||
|
|
||||||
|
try {
|
||||||
|
|
||||||
|
api.SYD_SM3_Hash_ShortData( new byte[8] );
|
||||||
|
|
||||||
|
}catch ( Exception e) {
|
||||||
|
// 忽略
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
|
||||||
|
api.SYD_SM4_ShortData( 0 , new byte[16], Consts.ECB_ENC );
|
||||||
|
|
||||||
|
}catch ( Exception e) {
|
||||||
|
// 忽略
|
||||||
|
}
|
||||||
|
} catch ( Exception e ){
|
||||||
|
// 忽略预热失败
|
||||||
|
} finally {
|
||||||
|
if ( null != api ) {
|
||||||
|
api.SYD_Disconnect_Ex();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,17 @@
|
|||||||
|
package com.sunyard.sge.database;
|
||||||
|
/**
|
||||||
|
* 日志配置接口
|
||||||
|
* */
|
||||||
|
public class SydApiConfig {
|
||||||
|
|
||||||
|
// 数据包长度
|
||||||
|
private final int MaxDataLenEachPack = 4064;
|
||||||
|
|
||||||
|
// 批量数据包,单包数据长度
|
||||||
|
// 加密
|
||||||
|
private final int MaxDataLenEachBatchPackEn = 1024;
|
||||||
|
// 解密
|
||||||
|
private final int MaxDataLenEachBatchPackDe = 1040;
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
@@ -1,24 +0,0 @@
|
|||||||
package com.sunyard.sge.database;
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
* 日志配置接口
|
|
||||||
* */
|
|
||||||
public interface SydConfigApi {
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 设置日志相应的配置
|
|
||||||
*
|
|
||||||
*@param pcLogPath: 输入。日志存储路径
|
|
||||||
*@param iLogPathLen: 输入。日志路径长度。
|
|
||||||
*@param iLogLevel: 输入。日志级别设置 0:不记录日志,1:记录网络层错误日志,2:记录接口错误日志及网络层错误日志,3:记录正确日志及错误日志
|
|
||||||
*
|
|
||||||
* @return null
|
|
||||||
* */
|
|
||||||
|
|
||||||
static void SYD_SetLogConfig(
|
|
||||||
String pcLogPath,
|
|
||||||
int iLogPathLen,
|
|
||||||
int iLogLevel) {
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -0,0 +1,69 @@
|
|||||||
|
package com.sunyard.sge.database.pool;
|
||||||
|
|
||||||
|
|
||||||
|
import com.sunyard.sge.log.LogFactory;
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 到加密机的链接信息
|
||||||
|
*/
|
||||||
|
public class HsmLinkInfo {
|
||||||
|
|
||||||
|
private String pcIp;
|
||||||
|
private int iPort;
|
||||||
|
private int iConnectTimeOut;
|
||||||
|
private int iDealTimeOut;
|
||||||
|
|
||||||
|
|
||||||
|
public HsmLinkInfo(String pcIp, int iPort, int iConnectTimeOut, int iDealTimeOut) {
|
||||||
|
this.pcIp = pcIp;
|
||||||
|
this.iPort = iPort;
|
||||||
|
this.iConnectTimeOut = iConnectTimeOut;
|
||||||
|
this.iDealTimeOut = iDealTimeOut;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static HsmLinkInfo[] mutiHsmLinkInfo(String[] pcIpList, int[] iPortList, int iConnectTimeOut, int iAllDealTimeOut) {
|
||||||
|
Logger log = LogFactory.getLogger();
|
||||||
|
log.debug("链接参数整理");
|
||||||
|
|
||||||
|
if (null == pcIpList &&
|
||||||
|
null == iPortList &&
|
||||||
|
pcIpList.length != iPortList.length) {
|
||||||
|
log.error("加密机配置 ip 和 port 数量错误");
|
||||||
|
throw new IllegalArgumentException("入参错误");
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( iAllDealTimeOut < pcIpList.length) {
|
||||||
|
log.error("加密机配置交易时间过短");
|
||||||
|
throw new IllegalArgumentException("入参错误");
|
||||||
|
}
|
||||||
|
|
||||||
|
// 交易时间进行处理
|
||||||
|
int iDealTimeOut = iAllDealTimeOut / pcIpList.length;
|
||||||
|
|
||||||
|
|
||||||
|
HsmLinkInfo[]hsms = new HsmLinkInfo[ pcIpList.length ];
|
||||||
|
for ( int i = 0 ; i < pcIpList.length ; i++ ) {
|
||||||
|
hsms[ i ] = new HsmLinkInfo( pcIpList[i], iPortList[i], iConnectTimeOut, iDealTimeOut );
|
||||||
|
}
|
||||||
|
|
||||||
|
return hsms;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public String getPcIp() {
|
||||||
|
return pcIp;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getiPort() {
|
||||||
|
return iPort;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getiConnectTimeOut() {
|
||||||
|
return iConnectTimeOut;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getiDealTimeOut() {
|
||||||
|
return iDealTimeOut;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,51 @@
|
|||||||
|
package com.sunyard.sge.database.pool;
|
||||||
|
|
||||||
|
import com.sunyard.sge.database.SydApi;
|
||||||
|
import com.sunyard.sge.pool.ThreadBasedConnectPool;
|
||||||
|
import racal.sunyard.main.SydApi4j;
|
||||||
|
|
||||||
|
public class SydApiPool extends ThreadBasedConnectPool<SydApi> {
|
||||||
|
|
||||||
|
private HsmLinkInfo[] linkInfos;
|
||||||
|
|
||||||
|
public SydApiPool(HsmLinkInfo[] linkInfos) {
|
||||||
|
super();
|
||||||
|
this.linkInfos = linkInfos;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 继承 初始化
|
||||||
|
protected SydApi initialValue() {
|
||||||
|
|
||||||
|
// 所有加密机一次性链接
|
||||||
|
SydApi4j[] apis = new SydApi4j[ linkInfos.length ];
|
||||||
|
|
||||||
|
// 只有所有都不好,才报错。
|
||||||
|
boolean connected = false;
|
||||||
|
|
||||||
|
for ( int i = 0; i < apis.length; i ++ ) {
|
||||||
|
HsmLinkInfo info = linkInfos[i];
|
||||||
|
try {
|
||||||
|
apis[ i ] = (SydApi4j) new SydApi4j().connect(info.getPcIp(), info.getiPort(),
|
||||||
|
null,
|
||||||
|
info.getiConnectTimeOut(),
|
||||||
|
info.getiDealTimeOut()
|
||||||
|
);
|
||||||
|
connected = true;
|
||||||
|
} catch ( Exception e ) {
|
||||||
|
// 忽略单个错误
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 保活接口
|
||||||
|
protected boolean check(SydApi o) {
|
||||||
|
return null != o;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 释放
|
||||||
|
protected void free(SydApi o) {
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,115 @@
|
|||||||
|
package com.sunyard.sge.log;
|
||||||
|
|
||||||
|
import org.apache.logging.log4j.Level;
|
||||||
|
import org.apache.logging.log4j.LogManager;
|
||||||
|
import org.apache.logging.log4j.core.Appender;
|
||||||
|
import org.apache.logging.log4j.core.Layout;
|
||||||
|
import org.apache.logging.log4j.core.LoggerContext;
|
||||||
|
import org.apache.logging.log4j.core.appender.FileAppender;
|
||||||
|
import org.apache.logging.log4j.core.appender.rolling.SizeBasedTriggeringPolicy;
|
||||||
|
import org.apache.logging.log4j.core.appender.rolling.TriggeringPolicy;
|
||||||
|
import org.apache.logging.log4j.core.config.AppenderRef;
|
||||||
|
import org.apache.logging.log4j.core.config.Configuration;
|
||||||
|
import org.apache.logging.log4j.core.config.LoggerConfig;
|
||||||
|
import org.apache.logging.log4j.core.layout.PatternLayout;
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
|
import java.text.SimpleDateFormat;
|
||||||
|
import java.util.Date;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 金交所定制日志
|
||||||
|
*/
|
||||||
|
public class LogFactory {
|
||||||
|
|
||||||
|
// 金交所定制日志
|
||||||
|
public static final String logName = "sge-hsm-sydapi-log";
|
||||||
|
|
||||||
|
// 日志级别
|
||||||
|
public static final int LogLevelOFF = 0;
|
||||||
|
public static final int LogLevelError = 1;
|
||||||
|
public static final int LogLevelInfo = 2;
|
||||||
|
public static final int LogLevelDebug = 3;
|
||||||
|
public static int iLogLevel = LogLevelDebug;
|
||||||
|
|
||||||
|
// Levels
|
||||||
|
public static final Level[] levels = new Level[]{ Level.OFF, Level.ERROR, Level.INFO, Level.DEBUG };
|
||||||
|
|
||||||
|
// 日志目录
|
||||||
|
public static String pcLogPath = "./sydapi-logs/";
|
||||||
|
|
||||||
|
// 日期格式
|
||||||
|
private static SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
|
||||||
|
|
||||||
|
private LogFactory() {
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void start() {
|
||||||
|
// 上下文
|
||||||
|
final LoggerContext ctx = (LoggerContext) LogManager.getContext(false);
|
||||||
|
final Configuration config = ctx.getConfiguration();
|
||||||
|
|
||||||
|
// 创建一个展示的样式
|
||||||
|
Layout layout = PatternLayout.createLayout(
|
||||||
|
"[%level{DEBUG=3, INFO=2, ERROR=1, OFF=0}: %d{ISO8601} <%thread>] %message%n%throwable%n",
|
||||||
|
null,
|
||||||
|
config, null, null, true, false, null, null);
|
||||||
|
|
||||||
|
|
||||||
|
TriggeringPolicy tp = SizeBasedTriggeringPolicy.createPolicy("10MB");
|
||||||
|
|
||||||
|
// Appender appender = RollingFileAppender.createAppender(String.format("logs/test/syncshows-job-%s.log", jobID),
|
||||||
|
// "/logs/test/" + jobID + "/syncshows-job-" + jobID + ".log.gz",
|
||||||
|
// "true", jobID, null, null, null, tp, null, layout, null,
|
||||||
|
// null, null, null, config);
|
||||||
|
|
||||||
|
// 日志打印方式——输出为文件
|
||||||
|
Appender appender = FileAppender.createAppender(
|
||||||
|
String.format( pcLogPath + getToday() + ".log"),
|
||||||
|
"true", "false",
|
||||||
|
logName, null, "true", "true", null, layout, null, null, null, config);
|
||||||
|
|
||||||
|
appender.start();
|
||||||
|
config.addAppender(appender);
|
||||||
|
AppenderRef ref = AppenderRef.createAppenderRef( logName, levels[ iLogLevel ], null);
|
||||||
|
AppenderRef[] refs = new AppenderRef[]{ref};
|
||||||
|
LoggerConfig loggerConfig = LoggerConfig.createLogger("false", levels[ iLogLevel ], logName,
|
||||||
|
"true", refs, null, config, null);
|
||||||
|
loggerConfig.addAppender(appender, levels[ iLogLevel ], null);
|
||||||
|
config.addLogger( logName, loggerConfig);
|
||||||
|
ctx.updateLoggers();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public static void stop() {
|
||||||
|
final LoggerContext ctx = (LoggerContext) LogManager.getContext(false);
|
||||||
|
final Configuration config = ctx.getConfiguration();
|
||||||
|
config.getAppender( logName ).stop();
|
||||||
|
config.getLoggerConfig(logName).removeAppender( logName);
|
||||||
|
config.removeLogger(logName);
|
||||||
|
ctx.updateLoggers();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public static String getToday(){
|
||||||
|
return format.format( new Date());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 创建 Logger
|
||||||
|
* @return Logger
|
||||||
|
*/
|
||||||
|
public static Logger createLogger() {
|
||||||
|
start();
|
||||||
|
return LoggerFactory.getLogger( logName );
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取 Logger
|
||||||
|
* @return Logger
|
||||||
|
*/
|
||||||
|
public static Logger getLogger() {
|
||||||
|
return LoggerFactory.getLogger( logName );
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,24 @@
|
|||||||
|
package com.sunyard.sge.pool;
|
||||||
|
|
||||||
|
public class ObjectInPool<T> {
|
||||||
|
|
||||||
|
private T object;
|
||||||
|
private long lasUseAt = System.currentTimeMillis();
|
||||||
|
|
||||||
|
public ObjectInPool(T object) {
|
||||||
|
this.object = object;
|
||||||
|
}
|
||||||
|
|
||||||
|
public T getObjectForCheck() {
|
||||||
|
return object;
|
||||||
|
}
|
||||||
|
|
||||||
|
public T getObject() {
|
||||||
|
this.lasUseAt = System.currentTimeMillis();
|
||||||
|
return object;
|
||||||
|
}
|
||||||
|
|
||||||
|
public long getLasUseAt() {
|
||||||
|
return lasUseAt;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,26 @@
|
|||||||
|
package com.sunyard.sge.pool;
|
||||||
|
|
||||||
|
public class PoolConfig {
|
||||||
|
|
||||||
|
// 最大空闲时间
|
||||||
|
private long maxIdle = 5 * 3600 * 1000; // 5 分钟
|
||||||
|
|
||||||
|
// 最大无用时间
|
||||||
|
private long maxUseless = 30 * 3600 * 1000; // 30 分钟
|
||||||
|
|
||||||
|
public long getMaxIdle() {
|
||||||
|
return maxIdle;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setMaxIdle(long maxIdle) {
|
||||||
|
this.maxIdle = maxIdle;
|
||||||
|
}
|
||||||
|
|
||||||
|
public long getMaxUseless() {
|
||||||
|
return maxUseless;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setMaxUseless(long maxUseless) {
|
||||||
|
this.maxUseless = maxUseless;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,128 @@
|
|||||||
|
package com.sunyard.sge.pool;
|
||||||
|
|
||||||
|
import com.sunyard.sge.log.LogFactory;
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Iterator;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.concurrent.Executors;
|
||||||
|
import java.util.concurrent.ScheduledExecutorService;
|
||||||
|
import java.util.concurrent.TimeUnit;
|
||||||
|
|
||||||
|
public class ThreadBasedConnectPool<T> {
|
||||||
|
|
||||||
|
// ThreadLocal
|
||||||
|
private final Map<Thread, ObjectInPool<T>> map = new HashMap<>();
|
||||||
|
|
||||||
|
// 守护
|
||||||
|
private final ScheduledExecutorService threadPool = Executors.newScheduledThreadPool(1);
|
||||||
|
|
||||||
|
// 配置
|
||||||
|
private PoolConfig config;
|
||||||
|
|
||||||
|
public ThreadBasedConnectPool(PoolConfig config) {
|
||||||
|
this.config = config;
|
||||||
|
threadPool.scheduleAtFixedRate(new Runnable() {
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
Logger log = LogFactory.getLogger();
|
||||||
|
log.debug("连接池检测进程开始执行");
|
||||||
|
log.debug("共有链接 {} 个", map.size());
|
||||||
|
|
||||||
|
// 检测和回收逻辑
|
||||||
|
Iterator<Map.Entry<Thread, ObjectInPool<T>>> it = map.entrySet().iterator();
|
||||||
|
while (it.hasNext()) {
|
||||||
|
Map.Entry<Thread, ObjectInPool<T>> entry = it.next();
|
||||||
|
ObjectInPool<T> oip = entry.getValue();
|
||||||
|
|
||||||
|
if (System.currentTimeMillis() - oip.getLasUseAt() < config.getMaxIdle()) {
|
||||||
|
// 空闲时间不足,免检。
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (System.currentTimeMillis() - oip.getLasUseAt() > config.getMaxUseless()) {
|
||||||
|
// 长时间未使用,回收链接
|
||||||
|
log.debug("回收一个链接");
|
||||||
|
|
||||||
|
it.remove();
|
||||||
|
|
||||||
|
try {
|
||||||
|
free(oip.getObject());
|
||||||
|
} catch (Exception e) {
|
||||||
|
}
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
boolean checkRet = false;
|
||||||
|
try {
|
||||||
|
checkRet = check(entry.getValue().getObject());
|
||||||
|
} catch (Exception e) {
|
||||||
|
checkRet = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (checkRet) {
|
||||||
|
log.debug("一个链接检查未通过");
|
||||||
|
// 检查未通过
|
||||||
|
it.remove();
|
||||||
|
|
||||||
|
try {
|
||||||
|
free(oip.getObject());
|
||||||
|
} catch (Exception e) {
|
||||||
|
}
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
log.debug("连接池检测进程执行结束");
|
||||||
|
}
|
||||||
|
}, config.getMaxIdle(), config.getMaxIdle(), TimeUnit.MILLISECONDS);
|
||||||
|
}
|
||||||
|
|
||||||
|
public ThreadBasedConnectPool() {
|
||||||
|
this(new PoolConfig());
|
||||||
|
}
|
||||||
|
|
||||||
|
// 继承 初始化
|
||||||
|
protected T initialValue() {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// 保活接口
|
||||||
|
protected boolean check(T o) {
|
||||||
|
return null != o;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 释放
|
||||||
|
protected void free(T o) {
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// 获取
|
||||||
|
public T get() {
|
||||||
|
ObjectInPool<T> o = map.get(Thread.currentThread());
|
||||||
|
if (null != o) {
|
||||||
|
return o.getObject();
|
||||||
|
}
|
||||||
|
|
||||||
|
return setInitialValue();
|
||||||
|
}
|
||||||
|
|
||||||
|
// 设置
|
||||||
|
public void set(T o) {
|
||||||
|
map.put(Thread.currentThread(), new ObjectInPool<>(o));
|
||||||
|
}
|
||||||
|
|
||||||
|
// 清除
|
||||||
|
public void remove() {
|
||||||
|
map.remove(Thread.currentThread());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private T setInitialValue() {
|
||||||
|
T value = initialValue();
|
||||||
|
map.put(Thread.currentThread(), new ObjectInPool<>(value));
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,11 +1,11 @@
|
|||||||
package sample;
|
package sample;
|
||||||
|
|
||||||
import com.sunyard.proto.Util;
|
import com.sunyard.proto.Util;
|
||||||
|
import com.sunyard.sge.database.*;
|
||||||
import com.sunyard.sge.database.Consts;
|
import com.sunyard.sge.database.Consts;
|
||||||
import com.sunyard.sge.database.SydApi;
|
|
||||||
import com.sunyard.sge.database.SydApi4Database;
|
|
||||||
import org.junit.Assert;
|
import org.junit.Assert;
|
||||||
|
|
||||||
|
import java.nio.ByteBuffer;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
@@ -13,7 +13,7 @@ public class Sample
|
|||||||
{
|
{
|
||||||
public static void main(String[] args) {
|
public static void main(String[] args) {
|
||||||
|
|
||||||
// System.setProperty("com.sunyard.sydapi4j.debug", "true");
|
System.setProperty("com.sunyard.sydapi4j.debug", "true");
|
||||||
|
|
||||||
SydApi api = new SydApi4Database();
|
SydApi api = new SydApi4Database();
|
||||||
try {
|
try {
|
||||||
@@ -25,12 +25,29 @@ public class Sample
|
|||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
// 短数据
|
// 短数据加密解密
|
||||||
shortData( api );
|
shortEndeData( api );
|
||||||
|
|
||||||
|
// 批量加密解密
|
||||||
|
batchEndeData( api );
|
||||||
|
|
||||||
// 批量
|
// 长数据加密解密
|
||||||
batchData( api );
|
longDataEnde( api );
|
||||||
|
|
||||||
|
// 短数据 MAC
|
||||||
|
shortMAC( api );
|
||||||
|
|
||||||
|
// 批量 MAC
|
||||||
|
batchMACData( api );
|
||||||
|
|
||||||
|
// 长数据 MAC
|
||||||
|
longMAC( api );
|
||||||
|
|
||||||
|
// 短数据 SM3
|
||||||
|
shortSM3( api );
|
||||||
|
|
||||||
|
// 长数据 SM3
|
||||||
|
longSM3( api );
|
||||||
|
|
||||||
|
|
||||||
} finally {
|
} finally {
|
||||||
@@ -40,7 +57,300 @@ public class Sample
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void shortData(SydApi api){
|
public static void longDataEnde(SydApi api){
|
||||||
|
|
||||||
|
// 密钥索引
|
||||||
|
int keyIdx = 0;
|
||||||
|
// 测试数据
|
||||||
|
byte[] data = new byte[16 * 3 + 8];
|
||||||
|
// 每包大小
|
||||||
|
int pack = 16;
|
||||||
|
|
||||||
|
// 测试数据 > 每包大小需要分包
|
||||||
|
|
||||||
|
// 密文数据
|
||||||
|
ByteBuffer enDataBuff = ByteBuffer.allocate( data.length + 16 );
|
||||||
|
|
||||||
|
// 分包加密
|
||||||
|
{
|
||||||
|
int n = data.length / pack;
|
||||||
|
int remainder = data.length % pack;
|
||||||
|
if ( remainder > 0 ) {
|
||||||
|
n += 1;
|
||||||
|
} else {
|
||||||
|
remainder = pack;
|
||||||
|
}
|
||||||
|
|
||||||
|
for ( int i = 0 ; i < n ; i ++ ) {
|
||||||
|
byte[] buff = new byte[ pack ];
|
||||||
|
|
||||||
|
// 首包
|
||||||
|
if ( 0 == i ) {
|
||||||
|
System.arraycopy( data, i * pack, buff, 0, pack );
|
||||||
|
byte[] recv = api.SYD_SM4_LongData( keyIdx , buff, Consts.PkgNumHead, Consts.ECB_ENC);
|
||||||
|
enDataBuff.put( recv );
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 尾包
|
||||||
|
if ( i == (n-1) ){
|
||||||
|
buff = new byte[ remainder ];
|
||||||
|
System.arraycopy( data, i * pack, buff, 0, remainder );
|
||||||
|
byte[] recv = api.SYD_SM4_LongData( keyIdx , buff, Consts.PkgNumTail, Consts.ECB_ENC);
|
||||||
|
enDataBuff.put( recv );
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 中间包
|
||||||
|
System.arraycopy( data, i * pack, buff, 0, pack );
|
||||||
|
byte[] recv = api.SYD_SM4_LongData( keyIdx , buff, Consts.PkgNumMiddle, Consts.ECB_ENC);
|
||||||
|
enDataBuff.put( recv );
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
byte[] enData = new byte[ enDataBuff.position() ];
|
||||||
|
System.arraycopy( enDataBuff.array(), 0, enData, 0, enData.length );
|
||||||
|
System.out.println( "EnData HEX=" + Util.bytes2HexString( enData ));
|
||||||
|
|
||||||
|
|
||||||
|
// 分包解密
|
||||||
|
// 密文数据
|
||||||
|
ByteBuffer deDataBuff = ByteBuffer.allocate( data.length + 16 );
|
||||||
|
{
|
||||||
|
int n = enData.length / pack;
|
||||||
|
int remainder = enData.length % pack;
|
||||||
|
if ( remainder > 0 ) {
|
||||||
|
n += 1;
|
||||||
|
} else {
|
||||||
|
remainder = pack;
|
||||||
|
}
|
||||||
|
|
||||||
|
for ( int i = 0 ; i < n ; i ++ ) {
|
||||||
|
byte[] buff = new byte[ pack ];
|
||||||
|
|
||||||
|
// 首包
|
||||||
|
if ( 0 == i ) {
|
||||||
|
System.arraycopy( enData, i * pack, buff, 0, pack );
|
||||||
|
byte[] recv = api.SYD_SM4_LongData( keyIdx , buff, Consts.PkgNumHead, Consts.ECB_DEC);
|
||||||
|
deDataBuff.put( recv );
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 尾包
|
||||||
|
if ( i == (n-1) ){
|
||||||
|
buff = new byte[ remainder ];
|
||||||
|
System.arraycopy( enData, i * pack, buff, 0, remainder );
|
||||||
|
byte[] recv = api.SYD_SM4_LongData( keyIdx , buff, Consts.PkgNumTail, Consts.ECB_DEC);
|
||||||
|
deDataBuff.put( recv );
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 中间包
|
||||||
|
System.arraycopy( enData, i * pack, buff, 0, pack );
|
||||||
|
byte[] recv = api.SYD_SM4_LongData( keyIdx , buff, Consts.PkgNumMiddle, Consts.ECB_DEC);
|
||||||
|
deDataBuff.put( recv );
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
byte[] deData = new byte[ deDataBuff.position() ];
|
||||||
|
System.arraycopy( deDataBuff.array(), 0, deData, 0, deData.length );
|
||||||
|
System.out.println( "DeData HEX=" + Util.bytes2HexString( deData ));
|
||||||
|
|
||||||
|
// 断言解密后和原文相同
|
||||||
|
Assert.assertArrayEquals( deData, data );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public static void longMAC(SydApi api){
|
||||||
|
|
||||||
|
// 密钥索引
|
||||||
|
int keyIdx = 0;
|
||||||
|
// 测试数据
|
||||||
|
byte[] data = new byte[16 * 3 + 8];
|
||||||
|
// 每包大小
|
||||||
|
int pack = 16;
|
||||||
|
|
||||||
|
// 测试数据 > 每包大小需要分包
|
||||||
|
|
||||||
|
LongDataReturn<String, String> recv = null;
|
||||||
|
// 分包 MAC
|
||||||
|
{
|
||||||
|
int n = data.length / pack;
|
||||||
|
int remainder = data.length % pack;
|
||||||
|
if ( remainder > 0 ) {
|
||||||
|
n += 1;
|
||||||
|
} else {
|
||||||
|
remainder = pack;
|
||||||
|
}
|
||||||
|
|
||||||
|
for ( int i = 0 ; i < n ; i ++ ) {
|
||||||
|
byte[] buff = new byte[ pack ];
|
||||||
|
|
||||||
|
// 首包
|
||||||
|
if ( 0 == i ) {
|
||||||
|
System.arraycopy( data, i * pack, buff, 0, pack );
|
||||||
|
recv = api.SYD_SM4Mac_LongData( keyIdx , buff, Consts.PkgNumHead, null);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 尾包
|
||||||
|
if ( i == (n-1) ){
|
||||||
|
// 尾包大小可能不同
|
||||||
|
buff = new byte[ remainder ];
|
||||||
|
System.arraycopy( data, i * pack, buff, 0, remainder );
|
||||||
|
recv = api.SYD_SM4Mac_LongData( keyIdx , buff, Consts.PkgNumTail, recv.getProcData() );
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 中间包
|
||||||
|
System.arraycopy( data, i * pack, buff, 0, pack );
|
||||||
|
recv = api.SYD_SM4Mac_LongData( keyIdx , buff, Consts.PkgNumMiddle, recv.getProcData() );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
String mac = recv.getData();
|
||||||
|
System.out.println( "MAC=" + mac);
|
||||||
|
|
||||||
|
|
||||||
|
// 分包校验 MAC
|
||||||
|
LongDataReturn<String, Boolean> check = null;
|
||||||
|
ByteBuffer deDataBuff = ByteBuffer.allocate( data.length + 16 );
|
||||||
|
{
|
||||||
|
int n = data.length / pack;
|
||||||
|
int remainder = data.length % pack;
|
||||||
|
if ( remainder > 0 ) {
|
||||||
|
n += 1;
|
||||||
|
} else {
|
||||||
|
remainder = pack;
|
||||||
|
}
|
||||||
|
|
||||||
|
for ( int i = 0 ; i < n ; i ++ ) {
|
||||||
|
byte[] buff = new byte[ pack ];
|
||||||
|
|
||||||
|
// 首包
|
||||||
|
if ( 0 == i ) {
|
||||||
|
System.arraycopy( data, i * pack, buff, 0, pack );
|
||||||
|
check = api.SYD_SM4Mac_LongData( keyIdx , buff, Consts.PkgNumHead, null, mac);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 尾包
|
||||||
|
if ( i == (n-1) ){
|
||||||
|
// 尾包大小可能不同
|
||||||
|
buff = new byte[ remainder ];
|
||||||
|
System.arraycopy( data, i * pack, buff, 0, remainder );
|
||||||
|
check = api.SYD_SM4Mac_LongData( keyIdx , buff, Consts.PkgNumTail, check.getProcData() , mac);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 中间包
|
||||||
|
System.arraycopy( data, i * pack, buff, 0, pack );
|
||||||
|
check = api.SYD_SM4Mac_LongData( keyIdx , buff, Consts.PkgNumMiddle, check.getProcData() , mac);
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 断言 MAC 校验通过
|
||||||
|
Assert.assertTrue( check.getData() );
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void shortSM3(SydApi api){
|
||||||
|
// 测试数据
|
||||||
|
byte[] data = new byte[16];
|
||||||
|
String macData = api.SYD_SM3_Hash_ShortData( data );
|
||||||
|
System.out.println( "SM3=" + macData );
|
||||||
|
Assert.assertEquals( macData , "106E34A2B8C7BB13156CFDD0D91379DCC47543DCF9787C68AE5EB582620AE6E8");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public static void longSM3(SydApi api){
|
||||||
|
|
||||||
|
// 密钥索引
|
||||||
|
int keyIdx = 0;
|
||||||
|
// 测试数据
|
||||||
|
byte[] data = new byte[16 * 3 + 8];
|
||||||
|
// 每包大小
|
||||||
|
int pack = 16;
|
||||||
|
|
||||||
|
// 测试数据 > 每包大小需要分包
|
||||||
|
|
||||||
|
LongDataReturn<String, String> recv = null;
|
||||||
|
// 分包 MAC
|
||||||
|
{
|
||||||
|
int n = data.length / pack;
|
||||||
|
int remainder = data.length % pack;
|
||||||
|
if ( remainder > 0 ) {
|
||||||
|
n += 1;
|
||||||
|
} else {
|
||||||
|
remainder = pack;
|
||||||
|
}
|
||||||
|
|
||||||
|
for ( int i = 0 ; i < n ; i ++ ) {
|
||||||
|
byte[] buff = new byte[ pack ];
|
||||||
|
|
||||||
|
// 首包
|
||||||
|
if ( 0 == i ) {
|
||||||
|
System.arraycopy( data, i * pack, buff, 0, pack );
|
||||||
|
recv = api.SYD_SM3_Hash_LongData( buff, Consts.PkgNumHead, null);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 尾包
|
||||||
|
if ( i == (n-1) ){
|
||||||
|
// 尾包大小可能不同
|
||||||
|
buff = new byte[ remainder ];
|
||||||
|
System.arraycopy( data, i * pack, buff, 0, remainder );
|
||||||
|
recv = api.SYD_SM3_Hash_LongData( buff, Consts.PkgNumTail, recv.getProcData() );
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 中间包
|
||||||
|
System.arraycopy( data, i * pack, buff, 0, pack );
|
||||||
|
recv = api.SYD_SM3_Hash_LongData( buff, Consts.PkgNumMiddle, recv.getProcData() );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
String mac = recv.getData();
|
||||||
|
System.out.println( "SM3=" + mac);
|
||||||
|
|
||||||
|
// 断言
|
||||||
|
Assert.assertEquals( mac, "87B81AF2B2B22CBDF268E211D012D604892D3C948FF298D61D6C942EEE847F86");
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void shortMAC(SydApi api){
|
||||||
|
// 密钥索引
|
||||||
|
int keyIdx = 0;
|
||||||
|
// 测试数据
|
||||||
|
byte[] data = new byte[16];
|
||||||
|
String macData = api.SYD_SM4Mac_ShortData( keyIdx , data );
|
||||||
|
System.out.println( "MAC=" + macData );
|
||||||
|
boolean ret = api.SYD_SM4Mac_ShortData( keyIdx , data, macData );
|
||||||
|
Assert.assertTrue( ret );
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void batchMACData(SydApi api){
|
||||||
|
// 密钥索引
|
||||||
|
int[] keyIdx = new int[]{ 0, 1, 2 };
|
||||||
|
// 测试数据
|
||||||
|
List<byte[]> data = new ArrayList<>();
|
||||||
|
data.add( new byte[8] );
|
||||||
|
data.add( new byte[16] );
|
||||||
|
data.add( new byte[1024] );
|
||||||
|
|
||||||
|
String[] macs = api.SYD_SM4Mac_BatchData( keyIdx , data);
|
||||||
|
boolean[] checks = api.SYD_SM4Mac_BatchData( keyIdx , data, macs );
|
||||||
|
|
||||||
|
for ( int i = 0 ; i < data.size() ; i++ ) {
|
||||||
|
System.out.println( "MAC["+ i +"]=" + macs[i] );
|
||||||
|
Assert.assertTrue( checks[i] );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public static void shortEndeData(SydApi api){
|
||||||
// 密钥索引
|
// 密钥索引
|
||||||
int keyIdx = 0;
|
int keyIdx = 0;
|
||||||
// 测试数据
|
// 测试数据
|
||||||
@@ -51,7 +361,7 @@ public class Sample
|
|||||||
Assert.assertArrayEquals( orgData, data );
|
Assert.assertArrayEquals( orgData, data );
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void batchData(SydApi api){
|
public static void batchEndeData(SydApi api){
|
||||||
// 密钥索引
|
// 密钥索引
|
||||||
int[] keyIdx = new int[]{ 0, 1, 2 };
|
int[] keyIdx = new int[]{ 0, 1, 2 };
|
||||||
// 测试数据
|
// 测试数据
|
||||||
|
|||||||
@@ -0,0 +1,32 @@
|
|||||||
|
package test;
|
||||||
|
|
||||||
|
import com.sunyard.sge.database.SydApi;
|
||||||
|
import com.sunyard.sge.database.SydApiBuilder;
|
||||||
|
import org.junit.Before;
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 功能确认
|
||||||
|
*/
|
||||||
|
public class FuncTest {
|
||||||
|
|
||||||
|
private SydApi api;
|
||||||
|
|
||||||
|
@Before
|
||||||
|
public void init(){
|
||||||
|
SydApiBuilder builder = new SydApiBuilder(
|
||||||
|
new String[]{ "192.168.0.200" },
|
||||||
|
new int[]{ 8889 },
|
||||||
|
10,
|
||||||
|
15
|
||||||
|
);
|
||||||
|
|
||||||
|
api = builder.build();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void sm3(){
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,15 @@
|
|||||||
|
package test;
|
||||||
|
|
||||||
|
import com.sunyard.sge.log.LogFactory;
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
|
||||||
|
public class LogTest {
|
||||||
|
public static void main(String[] args) {
|
||||||
|
|
||||||
|
Logger log = LogFactory.createLogger();
|
||||||
|
log.error("error");
|
||||||
|
log.info("info");
|
||||||
|
log.debug("debug");
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -9,7 +9,7 @@ import org.junit.Assert;
|
|||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
public class Pref
|
public class PrefTest
|
||||||
{
|
{
|
||||||
public static void main(String[] args) throws InterruptedException {
|
public static void main(String[] args) throws InterruptedException {
|
||||||
|
|
||||||
@@ -30,14 +30,18 @@ public class Pref
|
|||||||
// 预热
|
// 预热
|
||||||
final int max = 1;
|
final int max = 1;
|
||||||
for (int i = 0; i < max; i ++) {
|
for (int i = 0; i < max; i ++) {
|
||||||
shortData( api );
|
// shortData( api );
|
||||||
// batchData( api );
|
// batchData( api );
|
||||||
|
try {
|
||||||
|
api.SYD_SM4_ShortData( 0 , new byte[16], Consts.ECB_ENC );
|
||||||
|
// api.SYD_SM4_ShortData( 0 , new byte[16], Consts.ECB_DEC );
|
||||||
|
} catch ( Exception e ){
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Thread t = new Thread(new Runnable() {
|
Thread t = new Thread(new Runnable() {
|
||||||
@Override
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
Reference in New Issue
Block a user