三类模式写
This commit is contained in:
parent
ce43b10cc6
commit
c563ef91d3
@ -2,7 +2,6 @@ package com.sunyard.sge.database;
|
||||
|
||||
import com.sunyard.sge.log.LogFactory;
|
||||
import org.apache.logging.log4j.Logger;
|
||||
import racal.sunyard.main.SydApi4j;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
@ -272,9 +271,9 @@ public interface SydApi {
|
||||
);
|
||||
|
||||
|
||||
public SydApiSM4 initSM4(int iKeyIndex, int ende);
|
||||
public SydSM4 initSM4(int iKeyIndex, int ende);
|
||||
|
||||
public SydApiSM3 initSM3();
|
||||
public SydSM3 initSM3();
|
||||
|
||||
public SydSM4Mac initSM4Mac(int iKeyIndex);
|
||||
}
|
||||
|
||||
@ -15,7 +15,7 @@ import java.util.concurrent.FutureTask;
|
||||
/**
|
||||
* 主要用于短连接
|
||||
*/
|
||||
public class SydApi4Database extends SydApiShortLink {
|
||||
public class SydApi4Database extends SydApi4Function {
|
||||
private static final int BATCH_SIZE = 7680;
|
||||
// 长连接的所有处理
|
||||
private static final CommWorker longLinkWorks = new CommWorker();
|
||||
@ -229,25 +229,4 @@ public class SydApi4Database extends SydApiShortLink {
|
||||
}
|
||||
}
|
||||
|
||||
private static int[] toIntArray(List<Integer> list) {
|
||||
if (null == list || 0 == list.size()) {
|
||||
return new int[0];
|
||||
}
|
||||
int[] ia = new int[list.size()];
|
||||
for (int i = 0; i < ia.length; i++) {
|
||||
ia[i] = list.get(i);
|
||||
}
|
||||
return ia;
|
||||
}
|
||||
|
||||
private static boolean[] toBoolArray(List<Boolean> list) {
|
||||
if (null == list || 0 == list.size()) {
|
||||
return new boolean[0];
|
||||
}
|
||||
boolean[] ia = new boolean[list.size()];
|
||||
for (int i = 0; i < ia.length; i++) {
|
||||
ia[i] = list.get(i);
|
||||
}
|
||||
return ia;
|
||||
}
|
||||
}
|
||||
|
||||
@ -769,17 +769,42 @@ public class SydApi4Function implements SydApi {
|
||||
|
||||
|
||||
@Override
|
||||
public SydApiSM4 initSM4(int iKeyIndex, int ende) {
|
||||
public SydSM4 initSM4(int iKeyIndex, int ende) {
|
||||
|
||||
return new SydApiSM4(this,iKeyIndex,ende);
|
||||
return new SydSM4(this,iKeyIndex,ende);
|
||||
}
|
||||
public SydApiSM3 initSM3() {
|
||||
|
||||
return new SydApiSM3(this);
|
||||
@Override
|
||||
public SydSM3 initSM3() {
|
||||
return new SydSM3(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public SydSM4Mac initSM4Mac(int iKeyIndex) {
|
||||
return new SydSM4Mac(this, iKeyIndex);
|
||||
}
|
||||
|
||||
|
||||
|
||||
protected static int[] toIntArray(List<Integer> list) {
|
||||
if (null == list || 0 == list.size()) {
|
||||
return new int[0];
|
||||
}
|
||||
int[] ia = new int[list.size()];
|
||||
for (int i = 0; i < ia.length; i++) {
|
||||
ia[i] = list.get(i);
|
||||
}
|
||||
return ia;
|
||||
}
|
||||
|
||||
protected static boolean[] toBoolArray(List<Boolean> list) {
|
||||
if (null == list || 0 == list.size()) {
|
||||
return new boolean[0];
|
||||
}
|
||||
boolean[] ia = new boolean[list.size()];
|
||||
for (int i = 0; i < ia.length; i++) {
|
||||
ia[i] = list.get(i);
|
||||
}
|
||||
return ia;
|
||||
}
|
||||
}
|
||||
|
||||
@ -1,5 +1,6 @@
|
||||
package com.sunyard.sge.database;
|
||||
|
||||
import com.sunyard.SydApiException;
|
||||
import com.sunyard.sge.database.pool.Workers;
|
||||
|
||||
import java.util.List;
|
||||
@ -9,11 +10,11 @@ import java.util.concurrent.FutureTask;
|
||||
/**
|
||||
* 长连接的真正执行过程转发到长连接线程池中执行。
|
||||
*/
|
||||
public class SydApiWrap implements SydApi{
|
||||
public class SydApiLongLinkWrap implements SydApi {
|
||||
|
||||
private SydApiBuilder builder;
|
||||
|
||||
public SydApiWrap(SydApiBuilder builder) {
|
||||
public SydApiLongLinkWrap(SydApiBuilder builder) {
|
||||
this.builder = builder;
|
||||
}
|
||||
|
||||
@ -35,12 +36,26 @@ public class SydApiWrap implements SydApi{
|
||||
return builder.build().SYD_SM3_Hash_ShortData(pcData);
|
||||
}
|
||||
});
|
||||
return task.get();
|
||||
try {
|
||||
return task.get();
|
||||
} catch (Exception e) {
|
||||
throw new SydApiException("并行任务执行失败", 0xC101, e);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public LongDataReturn<String, String> SYD_SM3_Hash_LongData(byte[] pcData, int iPkgNum, String pcProcData) {
|
||||
return null;
|
||||
FutureTask<LongDataReturn<String, String>> task = Workers.getLongLinkWorks().fTask(new Callable<LongDataReturn<String, String>>() {
|
||||
@Override
|
||||
public LongDataReturn<String, String> call() throws Exception {
|
||||
return builder.build().SYD_SM3_Hash_LongData(pcData,iPkgNum, pcProcData);
|
||||
}
|
||||
});
|
||||
try {
|
||||
return task.get();
|
||||
} catch (Exception e) {
|
||||
throw new SydApiException("并行任务执行失败", 0xC101, e);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -89,12 +104,12 @@ public class SydApiWrap implements SydApi{
|
||||
}
|
||||
|
||||
@Override
|
||||
public SydApiSM4 initSM4(int iKeyIndex, int ende) {
|
||||
public SydSM4 initSM4(int iKeyIndex, int ende) {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public SydApiSM3 initSM3() {
|
||||
public SydSM3 initSM3() {
|
||||
return null;
|
||||
}
|
||||
|
||||
@ -1,253 +0,0 @@
|
||||
package com.sunyard.sge.database;
|
||||
|
||||
import com.sunyard.SydApiException;
|
||||
import com.sunyard.sge.database.pool.HsmLinkInfo;
|
||||
import com.sunyard.sge.pool.CommWorker;
|
||||
import racal.sunyard.main.SydApi4j;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
import java.util.concurrent.Callable;
|
||||
import java.util.concurrent.FutureTask;
|
||||
|
||||
|
||||
/**
|
||||
* 主要用于短连接
|
||||
*/
|
||||
public class SydApiShortLink extends SydApi4Function {
|
||||
private static final int BATCH_SIZE = 7680;
|
||||
// 长连接的所有处理
|
||||
private static final CommWorker longLinkWorks = new CommWorker();
|
||||
|
||||
public SydApiShortLink() {
|
||||
super();
|
||||
}
|
||||
|
||||
public SydApiShortLink(SydApi4j[] hsms, HsmLinkInfo[] linkInfos) {
|
||||
super(hsms, linkInfos);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public List<byte[]> SYD_SM4_BatchData(int[] iKeyIndex, List<byte[]> pcData, int iFlag) {
|
||||
// 将数据进行分组,防止超长。
|
||||
List<List<byte[]>> dataGroups = new ArrayList<>();
|
||||
List<List<Integer>> keyGroups = new ArrayList<>();
|
||||
int totalLen = 0;
|
||||
|
||||
List<byte[]> curDataGroup = new ArrayList<>();
|
||||
List<Integer> curKeyGroup = new ArrayList<>();
|
||||
|
||||
for (int i = 0; i < pcData.size(); i++) {
|
||||
byte[] data = pcData.get(i);
|
||||
if (null == data) {
|
||||
data = new byte[0];
|
||||
}
|
||||
if (
|
||||
curDataGroup.size() > 9 // 分组小于等于 9 个
|
||||
|| (totalLen + data.length > BATCH_SIZE) // 总大小小于 BATCH_SIZE
|
||||
) { // 扩展包
|
||||
dataGroups.add(curDataGroup);
|
||||
keyGroups.add(curKeyGroup);
|
||||
|
||||
curDataGroup = new ArrayList<>();
|
||||
curKeyGroup = new ArrayList<>();
|
||||
}
|
||||
|
||||
|
||||
curDataGroup.add(data);
|
||||
curKeyGroup.add(iKeyIndex[i]);
|
||||
|
||||
totalLen = data.length;
|
||||
|
||||
}
|
||||
|
||||
dataGroups.add(curDataGroup);
|
||||
keyGroups.add(curKeyGroup);
|
||||
|
||||
// 并发处理
|
||||
List<FutureTask<List<byte[]>>> tasks = new ArrayList<>();
|
||||
for (int i = 0; i < dataGroups.size(); i++) {
|
||||
|
||||
int finalI = i;
|
||||
FutureTask<List<byte[]>> task = longLinkWorks.fTask(new Callable<List<byte[]>>() {
|
||||
@Override
|
||||
public List<byte[]> call() throws Exception {
|
||||
return SydApiShortLink.super.SYD_SM4_BatchData(toIntArray(keyGroups.get(finalI)), dataGroups.get(finalI), iFlag);
|
||||
}
|
||||
});
|
||||
tasks.add(task);
|
||||
}
|
||||
|
||||
try {
|
||||
List<byte[]> ret = new ArrayList<>();
|
||||
for (FutureTask<List<byte[]>> t : tasks) {
|
||||
ret.addAll(t.get());
|
||||
}
|
||||
return ret;
|
||||
|
||||
} catch (Exception e) {
|
||||
throw new SydApiException("并行任务执行失败", 0xC101, e);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public String[] SYD_SM4Mac_BatchData(int[] iKeyIndex, List<byte[]> pcData) {
|
||||
// 将数据进行分组,防止超长。
|
||||
List<List<byte[]>> dataGroups = new ArrayList<>();
|
||||
List<List<Integer>> keyGroups = new ArrayList<>();
|
||||
int totalLen = 0;
|
||||
|
||||
List<byte[]> curDataGroup = new ArrayList<>();
|
||||
List<Integer> curKeyGroup = new ArrayList<>();
|
||||
|
||||
for (int i = 0; i < pcData.size(); i++) {
|
||||
byte[] data = pcData.get(i);
|
||||
if (null == data) {
|
||||
data = new byte[0];
|
||||
}
|
||||
if (
|
||||
curDataGroup.size() > 9 // 分组小于等于 9 个
|
||||
|| (totalLen + data.length > BATCH_SIZE) // 总大小小于 BATCH_SIZE
|
||||
) {// 扩展包
|
||||
dataGroups.add(curDataGroup);
|
||||
keyGroups.add(curKeyGroup);
|
||||
|
||||
curDataGroup = new ArrayList<>();
|
||||
curKeyGroup = new ArrayList<>();
|
||||
}
|
||||
|
||||
curDataGroup.add(data);
|
||||
curKeyGroup.add(iKeyIndex[i]);
|
||||
|
||||
totalLen = data.length;
|
||||
}
|
||||
|
||||
dataGroups.add(curDataGroup);
|
||||
keyGroups.add(curKeyGroup);
|
||||
|
||||
// 并发处理
|
||||
List<FutureTask<String[]>> tasks = new ArrayList<>();
|
||||
for (int i = 0; i < dataGroups.size(); i++) {
|
||||
|
||||
int finalI = i;
|
||||
FutureTask<String[]> task = longLinkWorks.fTask(new Callable<String[]>() {
|
||||
@Override
|
||||
public String[] call() throws Exception {
|
||||
return SydApiShortLink.super.SYD_SM4Mac_BatchData(toIntArray(keyGroups.get(finalI)), dataGroups.get(finalI));
|
||||
}
|
||||
});
|
||||
tasks.add(task);
|
||||
}
|
||||
|
||||
try {
|
||||
List<String> ret = new ArrayList<>();
|
||||
for (FutureTask<String[]> t : tasks) {
|
||||
String[] macs = t.get();
|
||||
ret.addAll(Arrays.asList(macs));
|
||||
}
|
||||
return ret.toArray(new String[0]);
|
||||
|
||||
} catch (Exception e) {
|
||||
throw new SydApiException("并行任务执行失败", 0xC101, e);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean[] SYD_SM4Mac_BatchData(int[] iKeyIndex, List<byte[]> pcData, String[] pcMac) {
|
||||
// 将数据进行分组,防止超长。
|
||||
List<List<byte[]>> dataGroups = new ArrayList<>();
|
||||
List<List<Integer>> keyGroups = new ArrayList<>();
|
||||
List<List<String>> macGroups = new ArrayList<>();
|
||||
int totalLen = 0;
|
||||
|
||||
List<byte[]> curDataGroup = new ArrayList<>();
|
||||
List<Integer> curKeyGroup = new ArrayList<>();
|
||||
List<String> curMacGroup = new ArrayList<>();
|
||||
|
||||
for (int i = 0; i < pcData.size(); i++) {
|
||||
byte[] data = pcData.get(i);
|
||||
if (null == data) {
|
||||
data = new byte[0];
|
||||
}
|
||||
if (
|
||||
curDataGroup.size() > 9 // 分组小于等于 9 个
|
||||
|| (totalLen + data.length > BATCH_SIZE) // 总大小小于 BATCH_SIZE
|
||||
) {
|
||||
// 扩展包
|
||||
dataGroups.add(curDataGroup);
|
||||
keyGroups.add(curKeyGroup);
|
||||
macGroups.add(curMacGroup);
|
||||
|
||||
curDataGroup = new ArrayList<>();
|
||||
curKeyGroup = new ArrayList<>();
|
||||
curMacGroup = new ArrayList<>();
|
||||
}
|
||||
|
||||
|
||||
curDataGroup.add(data);
|
||||
curKeyGroup.add(iKeyIndex[i]);
|
||||
curMacGroup.add(pcMac[i]);
|
||||
totalLen = data.length;
|
||||
}
|
||||
|
||||
dataGroups.add(curDataGroup);
|
||||
keyGroups.add(curKeyGroup);
|
||||
macGroups.add(curMacGroup);
|
||||
|
||||
// 并发处理
|
||||
List<FutureTask<boolean[]>> tasks = new ArrayList<>();
|
||||
for (int i = 0; i < dataGroups.size(); i++) {
|
||||
|
||||
int finalI = i;
|
||||
FutureTask<boolean[]> task = longLinkWorks.fTask(new Callable<boolean[]>() {
|
||||
@Override
|
||||
public boolean[] call() throws Exception {
|
||||
return SydApiShortLink.super.SYD_SM4Mac_BatchData(
|
||||
toIntArray(keyGroups.get(finalI)),
|
||||
dataGroups.get(finalI),
|
||||
macGroups.get(finalI).toArray(new String[0])
|
||||
);
|
||||
}
|
||||
});
|
||||
tasks.add(task);
|
||||
}
|
||||
|
||||
try {
|
||||
List<Boolean> ret = new ArrayList<>();
|
||||
for (FutureTask<boolean[]> t : tasks) {
|
||||
boolean[] rets = t.get();
|
||||
for (boolean r : rets) {
|
||||
ret.add(r);
|
||||
}
|
||||
}
|
||||
return toBoolArray(ret);
|
||||
|
||||
} catch (Exception e) {
|
||||
throw new SydApiException("并行任务执行失败", 0xC101, e);
|
||||
}
|
||||
}
|
||||
|
||||
private static int[] toIntArray(List<Integer> list) {
|
||||
if (null == list || 0 == list.size()) {
|
||||
return new int[0];
|
||||
}
|
||||
int[] ia = new int[list.size()];
|
||||
for (int i = 0; i < ia.length; i++) {
|
||||
ia[i] = list.get(i);
|
||||
}
|
||||
return ia;
|
||||
}
|
||||
|
||||
private static boolean[] toBoolArray(List<Boolean> list) {
|
||||
if (null == list || 0 == list.size()) {
|
||||
return new boolean[0];
|
||||
}
|
||||
boolean[] ia = new boolean[list.size()];
|
||||
for (int i = 0; i < ia.length; i++) {
|
||||
ia[i] = list.get(i);
|
||||
}
|
||||
return ia;
|
||||
}
|
||||
}
|
||||
@ -3,19 +3,12 @@ package com.sunyard.sge.database;
|
||||
|
||||
import com.sunyard.SydApiException;
|
||||
|
||||
import java.lang.reflect.Array;
|
||||
import java.nio.ByteBuffer;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
|
||||
public class SydApiSM3 {
|
||||
public class SydSM3 {
|
||||
private boolean is_finished = false;
|
||||
private SydApi api;
|
||||
private int iPkgNum;
|
||||
private String pcProcData;
|
||||
|
||||
public SydApiSM3(SydApi sydApi) {
|
||||
public SydSM3(SydApi sydApi) {
|
||||
this.api = sydApi;
|
||||
}
|
||||
|
||||
@ -4,7 +4,7 @@ import com.sunyard.SydApiException;
|
||||
import com.sunyard.sge.bytes.BytesQueue;
|
||||
|
||||
|
||||
public class SydApiSM4 {
|
||||
public class SydSM4 {
|
||||
|
||||
private SydApi api;
|
||||
private int iKeyIndex;
|
||||
@ -16,7 +16,7 @@ public class SydApiSM4 {
|
||||
private BytesQueue queue = new BytesQueue();
|
||||
|
||||
|
||||
public SydApiSM4(SydApi api, int iKeyIndex, int endeFlag) {
|
||||
public SydSM4(SydApi api, int iKeyIndex, int endeFlag) {
|
||||
this.api = api;
|
||||
this.iFlag = endeFlag;
|
||||
this.iKeyIndex = iKeyIndex;
|
||||
@ -5,7 +5,7 @@ import com.sunyard.proto.Util;
|
||||
|
||||
import java.nio.ByteBuffer;
|
||||
|
||||
public class SydApiSM4Backup {
|
||||
public class SydSM4Backup {
|
||||
|
||||
private SydApi api;
|
||||
private int iKeyIndex;
|
||||
@ -18,7 +18,7 @@ public class SydApiSM4Backup {
|
||||
ByteBuffer sourceWrap = ByteBuffer.wrap(new byte[0]);
|
||||
|
||||
|
||||
public SydApiSM4Backup(SydApi api, int iKeyIndex, int endeFlag) {
|
||||
public SydSM4Backup(SydApi api, int iKeyIndex, int endeFlag) {
|
||||
this.api = api;
|
||||
this.iFlag = endeFlag;
|
||||
this.iKeyIndex = iKeyIndex;
|
||||
@ -30,7 +30,7 @@ public class LongDataTest {
|
||||
|
||||
@Test
|
||||
public void sm3_case1() {
|
||||
SydApiSM3 sm3 = api.initSM3();
|
||||
SydSM3 sm3 = api.initSM3();
|
||||
sm3.update(null);
|
||||
String mac = sm3.digest();
|
||||
Assert.assertEquals("1AB21D8355CFA17F8E61194831E81A8F22BEC8C728FEFB747ED035EB5082AA2B", mac);
|
||||
@ -38,7 +38,7 @@ public class LongDataTest {
|
||||
|
||||
@Test
|
||||
public void sm3_case2() {
|
||||
SydApiSM3 sm3 = api.initSM3();
|
||||
SydSM3 sm3 = api.initSM3();
|
||||
sm3.update(Util.hexString2Bytes("1234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678"));
|
||||
String mac = sm3.digest();
|
||||
Assert.assertEquals("9431C865C84B02C8A7C503F53A6D6C3C66704F8F713D124610314E31B19937F7", mac);
|
||||
@ -46,7 +46,7 @@ public class LongDataTest {
|
||||
|
||||
@Test
|
||||
public void sm3_case3() {
|
||||
SydApiSM3 sm3 = api.initSM3();
|
||||
SydSM3 sm3 = api.initSM3();
|
||||
sm3.update(Util.hexString2Bytes("1234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678"));
|
||||
sm3.update(Util.hexString2Bytes("1234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678"));
|
||||
String mac = sm3.digest();
|
||||
@ -55,7 +55,7 @@ public class LongDataTest {
|
||||
|
||||
@Test
|
||||
public void sm3_case4() {
|
||||
SydApiSM3 sm3 = api.initSM3();
|
||||
SydSM3 sm3 = api.initSM3();
|
||||
System.out.print("org=");
|
||||
for (int i = 0; i < 100; i++) {
|
||||
int lucky = new Random().nextInt(4065);
|
||||
@ -73,7 +73,7 @@ public class LongDataTest {
|
||||
|
||||
@Test
|
||||
public void sm3_case5() {
|
||||
SydApiSM3 sm3 = api.initSM3();
|
||||
SydSM3 sm3 = api.initSM3();
|
||||
String mac = sm3.digest();
|
||||
Assert.assertEquals("1AB21D8355CFA17F8E61194831E81A8F22BEC8C728FEFB747ED035EB5082AA2B", mac);
|
||||
}
|
||||
@ -115,7 +115,7 @@ public class LongDataTest {
|
||||
|
||||
@Test
|
||||
public void case5() {
|
||||
SydApiSM4 sydApiSM4 = api.initSM4(1, 1);
|
||||
SydSM4 sydApiSM4 = api.initSM4(1, 1);
|
||||
byte[] enData = sydApiSM4.finish();
|
||||
System.out.println(Util.bytes2HexString(enData));
|
||||
Assert.assertArrayEquals(Util.hexString2Bytes("FF49F76AD3A71651FE1A8A9F0D2A689E"), enData);
|
||||
@ -123,7 +123,7 @@ public class LongDataTest {
|
||||
|
||||
@Test
|
||||
public void case6() {
|
||||
SydApiSM4 sydApiSM4 = api.initSM4(1, 1);
|
||||
SydSM4 sydApiSM4 = api.initSM4(1, 1);
|
||||
|
||||
for (int i = 0; i < 10; i++) {
|
||||
int lucky = new Random().nextInt(4065);
|
||||
@ -144,8 +144,8 @@ public class LongDataTest {
|
||||
|
||||
int max = 1000;
|
||||
int size = 4065;
|
||||
SydApiSM4 en = api.initSM4(1, 1);
|
||||
SydApiSM4 de = api.initSM4(1, 0);
|
||||
SydSM4 en = api.initSM4(1, 1);
|
||||
SydSM4 de = api.initSM4(1, 0);
|
||||
|
||||
ByteBuffer inData = ByteBuffer.allocate(max * size);
|
||||
ByteBuffer enData = ByteBuffer.allocate(max * size + 16);
|
||||
|
||||
Loading…
Reference in New Issue
Block a user