添加接口
This commit is contained in:
parent
1a23046250
commit
5d1dc5c31f
2
pom.xml
2
pom.xml
@ -28,7 +28,7 @@
|
|||||||
<dependency>
|
<dependency>
|
||||||
<groupId>com.sunyard</groupId>
|
<groupId>com.sunyard</groupId>
|
||||||
<artifactId>sydapi4j</artifactId>
|
<artifactId>sydapi4j</artifactId>
|
||||||
<version>1.12.20220915</version>
|
<version>1.13.20221212</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.apache.logging.log4j</groupId>
|
<groupId>org.apache.logging.log4j</groupId>
|
||||||
|
|||||||
27
src/main/java/com/sunyard/sge/database/DataAndMac.java
Normal file
27
src/main/java/com/sunyard/sge/database/DataAndMac.java
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
package com.sunyard.sge.database;
|
||||||
|
|
||||||
|
public class DataAndMac {
|
||||||
|
private byte[] data;
|
||||||
|
private String mac;
|
||||||
|
|
||||||
|
public DataAndMac(byte[] data, String mac) {
|
||||||
|
this.data = data;
|
||||||
|
this.mac = mac;
|
||||||
|
}
|
||||||
|
|
||||||
|
public byte[] getData() {
|
||||||
|
return data;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setData(byte[] data) {
|
||||||
|
this.data = data;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getMac() {
|
||||||
|
return mac;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setMac(String mac) {
|
||||||
|
this.mac = mac;
|
||||||
|
}
|
||||||
|
}
|
||||||
28
src/main/java/com/sunyard/sge/database/DataAndMacCheck.java
Normal file
28
src/main/java/com/sunyard/sge/database/DataAndMacCheck.java
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
package com.sunyard.sge.database;
|
||||||
|
|
||||||
|
public class DataAndMacCheck {
|
||||||
|
private byte[] data;
|
||||||
|
private boolean macCheck;
|
||||||
|
|
||||||
|
public DataAndMacCheck(byte[] data, boolean macCheck) {
|
||||||
|
this.data = data;
|
||||||
|
this.macCheck = macCheck;
|
||||||
|
}
|
||||||
|
|
||||||
|
public byte[] getData() {
|
||||||
|
return data;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setData(byte[] data) {
|
||||||
|
this.data = data;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public boolean getMacCheck() {
|
||||||
|
return macCheck;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setMacCheck(boolean macCheck) {
|
||||||
|
this.macCheck = macCheck;
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -272,6 +272,48 @@ public interface SydApi {
|
|||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 短数据加密并计算 MAC
|
||||||
|
*
|
||||||
|
* @param iEncKeyIndex:输入。加密所需要的密钥索引值
|
||||||
|
* @param iMacKeyIndex:输入。计算mac所需要的密钥索引值
|
||||||
|
* @param pcData: 输入。计算mac所需要的数据。
|
||||||
|
* @return DataAndMac
|
||||||
|
* - data 密文
|
||||||
|
* - mac值 (固定长度16字节)转HEX 字符串格式
|
||||||
|
*/
|
||||||
|
DataAndMac SYD_SM4_EncryptAndMac_ShortData(
|
||||||
|
int iEncKeyIndex,
|
||||||
|
int iMacKeyIndex,
|
||||||
|
byte[] pcData
|
||||||
|
);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 短数据校验 MAC 并解密
|
||||||
|
* @param iEncKeyIndex:输入。加密所需要的密钥索引值
|
||||||
|
* @param iMacKeyIndex:输入。计算mac所需要的密钥索引值
|
||||||
|
* @param pcData 输入。密文。
|
||||||
|
* @param mac 输入。密文的 MAC。
|
||||||
|
* @return 明文
|
||||||
|
*/
|
||||||
|
byte[] SYD_SM4_CheckMacAndDecrypt_ShortData(
|
||||||
|
int iEncKeyIndex,
|
||||||
|
int iMacKeyIndex,
|
||||||
|
byte[] pcData,
|
||||||
|
String mac
|
||||||
|
);
|
||||||
|
List<DataAndMac> SYD_SM4_EncryptAndMac_BatchData(
|
||||||
|
int[] iEncKeyIndex,
|
||||||
|
int[] iMacKeyIndex,
|
||||||
|
List<byte[]> pcData
|
||||||
|
);
|
||||||
|
List<DataAndMacCheck> SYD_SM4_CheckMacAndDecrypt_BatchData(
|
||||||
|
int[] iEncKeyIndex,
|
||||||
|
int[] iMacKeyIndex,
|
||||||
|
List<DataAndMac> pcData
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
public ISM4 initSM4(int iKeyIndex, int ende);
|
public ISM4 initSM4(int iKeyIndex, int ende);
|
||||||
|
|
||||||
public ISM3 initSM3();
|
public ISM3 initSM3();
|
||||||
|
|||||||
@ -9,6 +9,7 @@ import com.sunyard.util.SYMUtil;
|
|||||||
import org.apache.logging.log4j.Logger;
|
import org.apache.logging.log4j.Logger;
|
||||||
import racal.sunyard.main.SydApi4j;
|
import racal.sunyard.main.SydApi4j;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
@ -790,6 +791,70 @@ public class SydApiBaseFunction implements SydApi {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public DataAndMac SYD_SM4_EncryptAndMac_ShortData(int iEncKeyIndex, int iMacKeyIndex, byte[] pcData) {
|
||||||
|
byte[] enData = SYD_SM4_ShortData(iEncKeyIndex, pcData, Consts.ECB_ENC);
|
||||||
|
String mac = SYD_SM4Mac_ShortData(iMacKeyIndex, enData);
|
||||||
|
return new DataAndMac(enData, mac);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public byte[] SYD_SM4_CheckMacAndDecrypt_ShortData(int iEncKeyIndex, int iMacKeyIndex, byte[] pcData, String mac) {
|
||||||
|
boolean ret = SYD_SM4Mac_ShortData(iMacKeyIndex, pcData, mac);
|
||||||
|
if (!ret) {
|
||||||
|
throw new SydApiException("MAC 验证不通过", 90);
|
||||||
|
}
|
||||||
|
|
||||||
|
return SYD_SM4_ShortData(iEncKeyIndex, pcData, Consts.ECB_DEC);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<DataAndMac> SYD_SM4_EncryptAndMac_BatchData(int[] iEncKeyIndex, int[] iMacKeyIndex, List<byte[]> pcData) {
|
||||||
|
if (null == this.hsms || null == iMacKeyIndex || null == pcData) {
|
||||||
|
throw new SydApiException("输入内容为空",15);
|
||||||
|
}
|
||||||
|
if ( iEncKeyIndex.length != iMacKeyIndex.length || iEncKeyIndex.length != pcData.size() ) {
|
||||||
|
throw new SydApiException("密钥长度和数据长度不对应", 15);
|
||||||
|
}
|
||||||
|
|
||||||
|
List<byte[]> enDatas = SYD_SM4_BatchData(iEncKeyIndex, pcData, Consts.ECB_ENC);
|
||||||
|
String[] macs = SYD_SM4Mac_BatchData(iMacKeyIndex, enDatas);
|
||||||
|
List<DataAndMac> ret = new ArrayList<DataAndMac>();
|
||||||
|
for ( int i=0 ; i< enDatas.size() ; i++ ) {
|
||||||
|
DataAndMac dam = new DataAndMac(enDatas.get(i), macs[i]);
|
||||||
|
ret.add(dam);
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<DataAndMacCheck> SYD_SM4_CheckMacAndDecrypt_BatchData(int[] iEncKeyIndex, int[] iMacKeyIndex, List<DataAndMac> pcData) {
|
||||||
|
if (null == this.hsms || null == iMacKeyIndex || null == pcData) {
|
||||||
|
throw new SydApiException("输入内容为空",15);
|
||||||
|
}
|
||||||
|
if ( iEncKeyIndex.length != iMacKeyIndex.length || iEncKeyIndex.length != pcData.size() ) {
|
||||||
|
throw new SydApiException("密钥长度和数据长度不对应", 15);
|
||||||
|
}
|
||||||
|
|
||||||
|
String[] macs = new String[pcData.size()];
|
||||||
|
List<byte[]>datas = new ArrayList<>(pcData.size());
|
||||||
|
for ( int i=0 ; i<macs.length; i++ ) {
|
||||||
|
macs[i] = pcData.get(i).getMac();
|
||||||
|
datas.add(pcData.get(i).getData());
|
||||||
|
}
|
||||||
|
|
||||||
|
boolean[] macCheck = SYD_SM4Mac_BatchData(iMacKeyIndex, datas, macs);
|
||||||
|
List<byte[]> enData = SYD_SM4_BatchData(iEncKeyIndex, datas, Consts.ECB_DEC);
|
||||||
|
|
||||||
|
List<DataAndMacCheck>ret = new ArrayList<>(enData.size());
|
||||||
|
for ( int i=0 ; i<enData.size() ; i++ ) {
|
||||||
|
DataAndMacCheck damc = new DataAndMacCheck(enData.get(i), macCheck[i]);
|
||||||
|
ret.add(damc);
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public ISM4 initSM4(int iKeyIndex, int ende) {
|
public ISM4 initSM4(int iKeyIndex, int ende) {
|
||||||
|
|
||||||
|
|||||||
@ -154,6 +154,66 @@ public class SydApiLongLinkWrap implements SydApi {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public DataAndMac SYD_SM4_EncryptAndMac_ShortData(int iEncKeyIndex, int iMacKeyIndex, byte[] pcData) {
|
||||||
|
FutureTask<DataAndMac> task = builder.getLongLinkWorks().fTask(new Callable<DataAndMac>() {
|
||||||
|
@Override
|
||||||
|
public DataAndMac call() throws Exception {
|
||||||
|
return builder.get().SYD_SM4_EncryptAndMac_ShortData(iEncKeyIndex, iMacKeyIndex, pcData);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
try {
|
||||||
|
return task.get();
|
||||||
|
} catch (Exception e) {
|
||||||
|
throw new SydApiException("并行任务执行失败", 0xC101, e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public byte[] SYD_SM4_CheckMacAndDecrypt_ShortData(int iEncKeyIndex, int iMacKeyIndex, byte[] pcData, String mac) {
|
||||||
|
FutureTask<byte[]> task = builder.getLongLinkWorks().fTask(new Callable<byte[]>() {
|
||||||
|
@Override
|
||||||
|
public byte[] 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<DataAndMac> SYD_SM4_EncryptAndMac_BatchData(int[] iEncKeyIndex, int[] iMacKeyIndex, List<byte[]> pcData) {
|
||||||
|
FutureTask<List<DataAndMac>> task = builder.getLongLinkWorks().fTask(new Callable<List<DataAndMac>>() {
|
||||||
|
@Override
|
||||||
|
public List<DataAndMac> 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<DataAndMacCheck> SYD_SM4_CheckMacAndDecrypt_BatchData(int[] iEncKeyIndex, int[] iMacKeyIndex, List<DataAndMac> pcData) {
|
||||||
|
FutureTask<List<DataAndMacCheck>> task = builder.getLongLinkWorks().fTask(new Callable<List<DataAndMacCheck>>() {
|
||||||
|
@Override
|
||||||
|
public List<DataAndMacCheck> 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
|
@Override
|
||||||
public ISM4 initSM4(int iKeyIndex, int ende) {
|
public ISM4 initSM4(int iKeyIndex, int ende) {
|
||||||
return new SydSM4(this, iKeyIndex, ende);
|
return new SydSM4(this, iKeyIndex, ende);
|
||||||
|
|||||||
@ -1,11 +1,7 @@
|
|||||||
package sample;
|
package sample;
|
||||||
|
|
||||||
import com.sunyard.RetWrap;
|
|
||||||
import com.sunyard.SydApi;
|
import com.sunyard.SydApi;
|
||||||
import com.sunyard.proto.Util;
|
import com.sunyard.proto.Util;
|
||||||
import com.sunyard.sge.database.SydApi4Database;
|
|
||||||
import com.sunyard.sge.database.SydApiBaseFunction;
|
|
||||||
import com.sunyard.sge.database.SydApiBuilder;
|
|
||||||
import racal.sunyard.main.SydApi4j;
|
import racal.sunyard.main.SydApi4j;
|
||||||
|
|
||||||
public class Encrypt {
|
public class Encrypt {
|
||||||
@ -20,14 +16,15 @@ public class Encrypt {
|
|||||||
* **/
|
* **/
|
||||||
String pk = api.SM2GetPublicKeyC("4444444444444444", 1);
|
String pk = api.SM2GetPublicKeyC("4444444444444444", 1);
|
||||||
System.out.println("pk=" + pk);
|
System.out.println("pk=" + pk);
|
||||||
|
// eg. 公钥格式 034200040675634F7E262715A0625FB2FBA62F947A8FA3318E5294DCA0829D2673F32022360B9E68BB419605341BED596097624D8F0DE5238CA3B2CF4C1BBBC21F6671B6
|
||||||
byte[] pkBytes = Util.hexString2Bytes(pk);
|
byte[] pkBytes = Util.hexString2Bytes(pk);
|
||||||
/**
|
/**
|
||||||
* SYD_SM2_Encrypt SM2公钥加密
|
* SYD_SM2_Encrypt SM2公钥加密
|
||||||
* 参数1:publicKey 传公钥
|
* 参数1:publicKey 传公钥
|
||||||
* 参数2:pOrgData 传加密数据
|
* 参数2:pOrgData 传加密数据
|
||||||
* **/
|
* **/
|
||||||
byte[] sm2 = api.SYD_SM2_Encrypt(pkBytes ,new byte[100]);
|
byte[] sm2 = api.SYD_SM2_Encrypt(pkBytes, new byte[100]);
|
||||||
String sm2Hex = Util.bytes2HexString(sm2);
|
String sm2Hex = Util.bytes2HexString(sm2);
|
||||||
System.out.println(sm2Hex);
|
System.out.println("密文(DER)="+ sm2Hex);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
85
src/test/java/test/EncryptAndMac.java
Normal file
85
src/test/java/test/EncryptAndMac.java
Normal file
@ -0,0 +1,85 @@
|
|||||||
|
package test;
|
||||||
|
|
||||||
|
import com.google.common.collect.Lists;
|
||||||
|
import com.sunyard.sge.database.*;
|
||||||
|
import org.junit.Assert;
|
||||||
|
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public class EncryptAndMac {
|
||||||
|
|
||||||
|
public static void main(String[] args) {
|
||||||
|
|
||||||
|
// 路径要以 / 或 \\ 结尾表示目录
|
||||||
|
|
||||||
|
String[] pcipList = {"172.1.41.216", "172.1.41.129"};
|
||||||
|
int[] iportList = {8080, 8889};
|
||||||
|
SydApi api = new SydApi4Database();
|
||||||
|
try {
|
||||||
|
|
||||||
|
api.SYD_Short_Connect_Ex(pcipList, iportList, 1000, 1000);
|
||||||
|
|
||||||
|
// 密钥索引
|
||||||
|
int keyEncIdx = 0;
|
||||||
|
|
||||||
|
int keyMacIdx = 1;
|
||||||
|
|
||||||
|
// 测试数据
|
||||||
|
byte[] data = new byte[16];
|
||||||
|
|
||||||
|
|
||||||
|
// 短数据
|
||||||
|
DataAndMac ret = api.SYD_SM4_EncryptAndMac_ShortData(keyEncIdx, keyMacIdx, data);
|
||||||
|
byte[] deData = api.SYD_SM4_CheckMacAndDecrypt_ShortData(keyEncIdx, keyMacIdx, ret.getData(), ret.getMac());
|
||||||
|
|
||||||
|
if (Arrays.equals( data, deData ) ) {
|
||||||
|
System.out.println("短数据加密并计算 MAC - 测试通过");
|
||||||
|
} else {
|
||||||
|
System.out.println("短数据加密并计算 MAC - 测试失败");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// 批量短数据
|
||||||
|
List<byte[]>data2 = Lists.newArrayList(
|
||||||
|
new byte[8],
|
||||||
|
new byte[500],
|
||||||
|
new byte[512]
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
List<DataAndMac> ret2 = api.SYD_SM4_EncryptAndMac_BatchData(
|
||||||
|
new int[] {keyEncIdx, keyEncIdx, keyEncIdx},
|
||||||
|
new int[] {keyMacIdx, keyMacIdx, keyMacIdx},
|
||||||
|
data2
|
||||||
|
);
|
||||||
|
|
||||||
|
List<DataAndMacCheck>deDatas = api.SYD_SM4_CheckMacAndDecrypt_BatchData(
|
||||||
|
new int[] {keyEncIdx, keyEncIdx, keyEncIdx},
|
||||||
|
new int[] {keyMacIdx, keyMacIdx, keyMacIdx},
|
||||||
|
ret2
|
||||||
|
);
|
||||||
|
|
||||||
|
for (int i=0; i< deDatas.size(); i++){
|
||||||
|
byte[] d1 = data2.get(i);
|
||||||
|
DataAndMacCheck d2 = deDatas.get(i);
|
||||||
|
|
||||||
|
if (! d2.getMacCheck() ) {
|
||||||
|
System.out.println("批量短数据加密并计算 MAC 验证失败 - 测试失败");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (! Arrays.equals( d1, d2.getData() ) ) {
|
||||||
|
System.out.println("批量短数据加密并计算 MAC - 测试失败");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
System.out.println("批量短数据加密并计算 MAC - 测试通过");
|
||||||
|
|
||||||
|
} finally {
|
||||||
|
if (null != api) {
|
||||||
|
api.SYD_Disconnect_Ex();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -1,6 +1,5 @@
|
|||||||
package test;
|
package test;
|
||||||
|
|
||||||
import com.sunyard.proto.Util;
|
|
||||||
import com.sunyard.sge.database.Consts;
|
import com.sunyard.sge.database.Consts;
|
||||||
import com.sunyard.sge.database.SydApi;
|
import com.sunyard.sge.database.SydApi;
|
||||||
import com.sunyard.sge.database.SydApi4Database;
|
import com.sunyard.sge.database.SydApi4Database;
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user