sydapi-java-sge-database/src/test/java/test/FuncTest.java
jiangr.wu@sunyard.com 4ad5250026 错误码优化
2025-08-11 18:18:36 +08:00

3510 lines
149 KiB
Java
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package test;
import com.sunyard.SydApiException;
import com.sunyard.log.ILogFactory;
import com.sunyard.log.ILogger;
import com.sunyard.proto.Util;
import com.sunyard.sge.database.*;
import com.sunyard.sge.log.LogbackFactory;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
/**
* 功能确认
*/
public class FuncTest {
private ILogFactory iLogFactory = new LogbackFactory();
private ILogger log = iLogFactory.getLogger(FuncTest.class);
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;
}
public SydApi connect() {
if (isShortLink) {
System.out.println("short");
SydApi api = new SydApi4Database();
api.SYD_Short_Connect_Ex(config.getIps(), config.getPorts(), connectTimeout, dealTimeout);
return api;
} else {
System.out.println("long");
SydApiBuilder builder = new SydApiBuilder(
config.getIps(),
config.getPorts(),
connectTimeout,
dealTimeout
);
SydApi api = builder.build();
return api;
}
}
private void changeConnect(boolean is_short_link){
isShortLink = is_short_link;
if(isShortLink){
System.out.println("-------- 设置为短连模式 --------\n");
} else {
System.out.println("-------- 设置为长连模式 --------\n");
}
}
public void connectFunc() {
String[] pcIpList = {"172.1.41.129", "172.1.41.216"};
String[] pcIpList_1 = {"1.1.1.1", "2.2.2.2"}; //测试 没有正确的IP和端口
int[] iPortList = {8889, 8889};
int[] iPortList_1 = {8889, 0}; //测试 部分IP端口对应关系无法访问
int[] iPortList_2 = {8889}; //测试 端口号个数与加密机未一一对应
int[] iPortList_3 = {0,0}; //测试 没有正确的IP和端口
log("-------- 设置短连接参数与获取短连接功能测试开始 --------", true);
printBegin();
try{
SydApi api = new SydApi4Database();
api.SYD_Short_Connect_Ex(pcIpList, iPortList, connectTimeout, dealTimeout);
System.out.println("输入正确的加密机IP端口,设置短连接参数与获取短连接成功");
} catch(SydApiException e){
printException("输入正确的加密机IP端口,设置短连接参数与获取短连接失败", e);
}
printEnd();
printBegin();
try{
SydApi api = new SydApi4Database();
api.SYD_Short_Connect_Ex(pcIpList, iPortList_1, connectTimeout, dealTimeout);
System.out.println("部分IP端口对应关系无法访问,设置短连接参数与获取短连接成功");
} catch(SydApiException e){
printException("部分IP端口对应关系无法访问,设置短连接参数与获取短连接失败", e);
}
printEnd();
printBegin();
try{
SydApi api = new SydApi4Database();
api.SYD_Short_Connect_Ex(pcIpList, iPortList_2, connectTimeout, dealTimeout);
System.out.println("端口号个数与加密机未一一对应,设置短连接参数与获取短连接成功");
} catch(Exception e){
System.out.println("端口号个数与加密机未一一对应,设置短连接参数与获取短连接失败 异常:" + e.getMessage());
}
printEnd();
printBegin();
try{
SydApi api = new SydApi4Database();
api.SYD_Short_Connect_Ex(pcIpList_1, iPortList_3, connectTimeout, dealTimeout);
System.out.println("没有正确的IP和端口,设置短连接参数与获取短连接成功");
} catch(SydApiException e){
printException("没有正确的IP和端口,设置短连接参数与获取短连接失败", e);
}
printEnd();
log("-------- 设置短连接参数与获取短连接功能测试结束 --------\n", true);
}
public void disconnectFunc() {
String[] pcIpList = {"172.1.41.129", "172.1.41.216"};
int[] iPortList = {8889, 8889};
log("-------- 断开短连接功能测试开始 --------", true);
printBegin();
try{
SydApi api = new SydApi4Database();
api.SYD_Short_Connect_Ex(pcIpList, iPortList, connectTimeout, dealTimeout);
System.out.println("输入正确的加密机IP端口,设置短连接参数与获取短连接成功");
api.SYD_Disconnect_Ex();
System.out.println("已与设备连接,断开连接成功");
} catch(SydApiException e){
printException("已与设备连接,断开连接失败", e);
}
printEnd();
printBegin();
try{
SydApi api = new SydApi4Database();
api.SYD_Disconnect_Ex();
System.out.println("未与设备连接,断开连接成功");
} catch(SydApiException e){
printException("未与设备连接,断开连接失败", e);
}
printEnd();
log("-------- 断开短连接功能测试结束 --------\n", true);
}
public void longConnectFunc() {
String[] pcIpList = {"172.1.41.129", "172.1.41.216"};
String[] pcIpList_1 = {"1.1.1.1", "2.2.2.2"}; //测试 没有正确的IP和端口
int[] iPortList = {8889, 8889};
int[] iPortList_1 = {8889, 0}; //测试 部分IP端口对应关系无法访问
int[] iPortList_2 = {8889}; //测试 端口号个数与加密机未一一对应
int[] iPortList_3 = {0,0}; //测试 没有正确的IP和端口
log("-------- 设置长连接参数与获取长连接功能测试开始 --------", true);
printBegin();
try{
SydApiBuilder builder = new SydApiBuilder(
pcIpList,
iPortList,
connectTimeout,
dealTimeout
);
SydApi api = builder.build();
System.out.println("输入正确的加密机IP端口,设置长连接参数与获取长连接成功");
} catch(SydApiException e){
printException("输入正确的加密机IP端口,设置长连接参数与获取长连接失败", e);
}
printEnd();
printBegin();
try{
SydApiBuilder builder = new SydApiBuilder(
pcIpList,
iPortList_1,
connectTimeout,
dealTimeout
);
SydApi api = builder.build();
System.out.println("部分IP端口对应关系无法访问,设置长连接参数与获取长连接成功");
} catch(SydApiException e){
printException("部分IP端口对应关系无法访问,设置长连接参数与获取长连接失败", e);
}
printEnd();
printBegin();
try{
SydApiBuilder builder = new SydApiBuilder(
pcIpList,
iPortList_2,
connectTimeout,
dealTimeout
);
SydApi api = builder.build();
System.out.println("端口号个数与加密机未一一对应,设置长连接参数与获取长连接成功");
} catch(Exception e){
System.out.println("端口号个数与加密机未一一对应,设置长连接参数与获取长连接失败 异常:" + e.getMessage());
}
printEnd();
printBegin();
try{
SydApiBuilder builder = new SydApiBuilder(
pcIpList_1,
iPortList_3,
connectTimeout,
dealTimeout
);
SydApi api = builder.build();
System.out.println("没有正确的IP和端口,设置长连接参数与获取长连接成功");
} catch(SydApiException e){
printException("没有正确的IP和端口,设置长连接参数与获取长连接失败", e);
}
printEnd();
log("-------- 设置长连接参数与获取长连接功能测试结束 --------\n", true);
}
public void sm3ShortFunc() {
System.out.println("-------- SM3短数据功能测试开始 --------");
SydApi api = connect();
printBegin();
try{
boolean isSuc = true;
for (int i=1; i<=1024; i++){
byte[] data = new byte[i];
log("sm3ShortFunc_明文" + Util.bytes2HexString(data), false);
byte[] res = api.SYD_SM3_Hash_ShortData(data);
log("sm3ShortFunc_res:" + Util.bytes2HexString(res), false);
ISM3 sm3 = api.initSM3();
sm3.update(data);
byte[] res_2 = sm3.digest();
log("sm3ShortFunc_res_2:" + Util.bytes2HexString(res_2), false);
if(!(Util.bytes2HexString(res).equals(Util.bytes2HexString(res_2))) ){
isSuc = false;
break;
}
}
if(isSuc) {
System.out.println("正常传参,hash计算成功");
} else {
System.out.println("正常传参,hash计算失败");
}
} catch(SydApiException e){
printException("正常传参hash计算失败", e);
}
printEnd();
printBegin();
try {
api.SYD_SM3_Hash_ShortData(new byte[1025]);
System.out.println("输入数据长度超过1K, hash计算成功");
} catch (SydApiException e) {
printException("输入数据长度超过1K", e);
}
printEnd();
System.out.println("-------- SM3短数据功能测试结束 --------\n");
}
public void sm3LongFunc() {
System.out.println("-------- SM3长数据功能测试开始 --------");
SydApi api = connect();
printBegin();
try{
boolean isSuc = true;
for (int i=1; i<=1024; i++){
byte[] data = new byte[i];
log("sm3LongFunc_明文" + Util.bytes2HexString(data), false);
byte[] res = api.SYD_SM3_Hash_ShortData(data);
log("sm3LongFunc_res:" + Util.bytes2HexString(res), false);
LongDataReturn<byte[], byte[]> longDataReturn = api.SYD_SM3_Hash_LongData(data, 0, null);
byte[] res_2 = longDataReturn.getData();
log("sm3LongFunc_res_2:" + Util.bytes2HexString(res_2), false);
if(!(Util.bytes2HexString(res).equals(Util.bytes2HexString(res_2))) ){
isSuc = false;
break;
}
}
if(isSuc) {
System.out.println("包序号输入0,hash计算成功");
} else {
System.out.println("包序号输入0,hash计算失败");
}
} catch(SydApiException e){
printException("包序号输入0", e);
}
printEnd();
printBegin();
try{
boolean isSuc = true;
for (int i=1; i<=1024; i++){
byte[] data = new byte[i];
log("sm3LongFunc_明文" + Util.bytes2HexString(data), false);
byte[] res = api.SYD_SM3_Hash_ShortData(data);
log("sm3LongFunc_res:" + Util.bytes2HexString(res), false);
LongDataReturn<byte[], byte[]> longDataReturn = api.SYD_SM3_Hash_LongData(data, 1, null);
log("sm3LongFunc_ProcData:" + Util.bytes2HexString(longDataReturn.getProcData()), false);
longDataReturn = api.SYD_SM3_Hash_LongData(new byte[0], 3, longDataReturn.getProcData());
byte[] res_2 = longDataReturn.getData();
log("sm3LongFunc_res_2:" + Util.bytes2HexString(res_2), false);
if(!(Util.bytes2HexString(res).equals(Util.bytes2HexString(res_2))) ){
isSuc = false;
break;
}
}
if(isSuc) {
System.out.println("包序号输入1,3,hash计算成功");
} else {
System.out.println("包序号输入1,3,hash计算失败");
}
} catch(SydApiException e){
printException("包序号输入1,3", e);
}
printEnd();
printBegin();
try{
boolean isSuc = true;
for (int i=1; i<=1024; i++){
byte[] data = new byte[i];
log("sm3LongFunc_明文" + Util.bytes2HexString(data), false);
byte[] res = api.SYD_SM3_Hash_ShortData(data);
log("sm3LongFunc_res:" + Util.bytes2HexString(res), false);
LongDataReturn<byte[], byte[]> longDataReturn = api.SYD_SM3_Hash_LongData(data, 1, null);
log("sm3LongFunc_ProcData1:" + Util.bytes2HexString(longDataReturn.getProcData()), false);
longDataReturn = api.SYD_SM3_Hash_LongData(new byte[0], 2, longDataReturn.getProcData());
log("sm3LongFunc_ProcData2:" + Util.bytes2HexString(longDataReturn.getProcData()), false);
longDataReturn = api.SYD_SM3_Hash_LongData(new byte[0], 3, longDataReturn.getProcData());
byte[] res_2 = longDataReturn.getData();
log("sm3LongFunc_res_2:" + Util.bytes2HexString(res_2), false);
if(!(Util.bytes2HexString(res).equals(Util.bytes2HexString(res_2))) ){
isSuc = false;
break;
}
}
if(isSuc) {
System.out.println("包序号输入1,2,3,hash计算成功");
} else {
System.out.println("包序号输入1,2,3,hash计算失败");
}
} catch(SydApiException e){
printException("包序号输入1,2,3", e);
}
printEnd();
printBegin();
try{
LongDataReturn<byte[], byte[]> longDataReturn = api.SYD_SM3_Hash_LongData(new byte[1024], 4, null);
System.out.println("包序号输入4, 成功");
} catch(SydApiException e){
printException("包序号输入4", e);
}
printEnd();
printBegin();
try{
LongDataReturn<byte[], byte[]> longDataReturn = api.SYD_SM3_Hash_LongData(new byte[1024], 1, null);
longDataReturn = api.SYD_SM3_Hash_LongData(new byte[1024], 2, null);
System.out.println("包序号输入1,2但pcProcData无输入, 成功");
} catch(SydApiException e){
printException("包序号输入1,2但pcProcData无输入", e);
}
printEnd();
System.out.println("-------- SM3长数据功能测试结束 --------\n");
}
public void sm3LongFunc_ISM3() {
System.out.println("-------- (ISM3)SM3长数据功能测试开始 --------");
SydApi api = connect();
printBegin();
try{
boolean isSuc = true;
for(int i=1; i<=1024; i++){
byte[] data = genBytes(i);
log("sm3LongFunc_ISM3___明文: " + Util.bytes2HexString(data), false);
byte[] res1 = api.SYD_SM3_Hash_ShortData(data);
log("sm3LongFunc_ISM3___res1: " + Util.bytes2HexString(res1), false);
ISM3 sm3 = api.initSM3();
sm3.update(data);
byte[] res2 = sm3.digest();
log("sm3LongFunc_ISM3___res2: " + Util.bytes2HexString(res2), false);
if(!(Util.bytes2HexString(res1).equals(Util.bytes2HexString(res2)))){
isSuc = false;
break;
}
}
if(isSuc){
System.out.println("输入正确的入参,计算成功" );
} else {
System.out.println("输入正确的入参,计算失败");
}
} catch (SydApiException e){
printException("输入正确的入参,计算失败", e);
}
printEnd();
printBegin();
try{
byte[] data = new byte[4070];
ISM3 sm3 = api.initSM3();
sm3.update(data);
byte[] res = sm3.digest();
System.out.println("输入数据长度超过4064,结果:" + Util.bytes2HexString(res));
} catch (SydApiException e){
printException("输入数据长度超过4064,计算失败", e);
}
printEnd();
System.out.println("-------- (ISM3)SM3长数据功能测试结束 --------\n");
}
public void sm4ShortFunc() {
System.out.println("-------- SM4短数据加解密功能测试开始 --------");
SydApi api = connect();
int key = 0;
printBegin();
try{
boolean isSuc = true;
for (int i=1; i<=1024; i++){
byte[] data = new byte[i];
log("sm4ShortFunc_明文: " + Util.bytes2HexString(data), false);
byte[] enc = api.SYD_SM4_ShortData(key, data, ECB_ENC);
log("sm4ShortFunc_加密后: " + Util.bytes2HexString(enc), false);
byte[] dec = api.SYD_SM4_ShortData(key, enc, ECB_DEC);
log("sm4ShortFunc_解密后: " + Util.bytes2HexString(dec), false);
if(!(Util.bytes2HexString(data).equals(Util.bytes2HexString(dec))) ){
isSuc = false;
break;
}
}
if(isSuc){
System.out.println("正确传参,加密成功,解密成功");
} else {
System.out.println("正确传参,加密失败,解密失败");
}
}catch(SydApiException e){
printException("正确传参", e);
}
printEnd();
printBegin();
try {
byte[] enc = api.SYD_SM4_ShortData(-1, new byte[1024], ECB_ENC);
System.out.println("输入不正确的会话密钥索引,输入加密标识,加密成功");
} catch (SydApiException e) {
printException("输入不正确的会话密钥索引,输入加密标识", e);
}
printEnd();
printBegin();
try {
byte[] enc = api.SYD_SM4_ShortData(key, new byte[1024], ECB_ENC);
System.out.println("正常传参,加密成功");
byte[] dec = api.SYD_SM4_ShortData(-1, enc, ECB_DEC);
System.out.println("输入不正确的会话密钥索引,输入解密标识,解密成功");
} catch (SydApiException e) {
printException("输入不正确的会话密钥索引,输入解密标识", e);
}
printEnd();
printBegin();
try {
byte[] enc = api.SYD_SM4_ShortData(key, new byte[1025], ECB_ENC);
System.out.println("输入数据长度超过1024加密成功");
} catch (SydApiException e) {
printException("输入数据长度超过1024", e);
}
printEnd();
printBegin();
try {
byte[] dec = api.SYD_SM4_ShortData(key, new byte[1050], ECB_DEC);
System.out.println("输入数据长度超过1024+16解密成功");
} catch (SydApiException e) {
printException("输入数据长度超过1024+16", e);
}
printEnd();
printBegin();
try {
byte[] enc = api.SYD_SM4_ShortData(key, new byte[1024], -1);
System.out.println("输入不正确的加解密标识,加解密成功");
} catch (SydApiException e) {
printException("输入不正确的加解密标识", e);
}
printEnd();
printBegin();
try {
byte[] data = new byte[1024];
byte[] enc = api.SYD_SM4_ShortData(key, data, ECB_ENC);
System.out.println("正常传参,加密成功,密文: " + Util.bytes2HexString(enc));
Arrays.fill(enc, 10, 30, (byte)0); //把enc改成不正确的
System.out.println("修改密文后: " + Util.bytes2HexString(enc));
byte[] dec = api.SYD_SM4_ShortData(key, enc, ECB_DEC);
if(Util.bytes2HexString(data).equals(Util.bytes2HexString(dec))){
System.out.println("输入不正确密文信息,解密对比成功");
} else {
System.out.println("输入不正确密文信息,解密对比失败");
}
} catch (SydApiException e) {
printException("输入不正确密文信息, 解密失败", e);
}
printEnd();
System.out.println("-------- SM4短数据加解密功能测试结束 --------\n");
}
public void sm4LongFunc() {
System.out.println("-------- SM4长数据加解密功能测试开始 --------");
SydApi api = connect();
int key = 0;
int key_incorrect = -1;
printBegin();
try{
boolean isSuc = true;
for(int i=1; i<=1024; i++) {
byte[] data = new byte[i];
log("sm4LongFunc_明文: " + Util.bytes2HexString(data), false);
byte[] enc_1 = api.SYD_SM4_LongData(key, data, 0, ECB_ENC);
log("sm4LongFunc_enc_1: " + Util.bytes2HexString(enc_1), false);
byte[] enc_2 = api.SYD_SM4_ShortData(key, data, ECB_ENC);
log("sm4LongFunc_enc_2: " + Util.bytes2HexString(enc_2), false);
if(!(Util.bytes2HexString(enc_1).equals(Util.bytes2HexString(enc_2))) ){
isSuc = false;
break;
}
}
if(isSuc){
System.out.println("输入加密标识包序号为0 加密成功");
} else {
System.out.println("输入加密标识包序号为0 加密失败");
}
} catch (SydApiException e){
printException("输入加密标识包序号为0", e);
}
printEnd();
printBegin();
try{
boolean isSuc = true;
for(int i=1; i<=1024; i++) {
byte[] data = new byte[i];
log("sm4LongFunc_明文: " + Util.bytes2HexString(data), false);
byte[] enc = api.SYD_SM4_LongData(key, data, 0, ECB_ENC);
log("sm4LongFunc_enc: " + Util.bytes2HexString(enc), false);
byte[] dec = api.SYD_SM4_LongData(key, enc, 0, ECB_DEC);
log("sm4LongFunc_dec: " + Util.bytes2HexString(dec), false);
if(!(Util.bytes2HexString(data).equals(Util.bytes2HexString(dec))) ){
isSuc = false;
break;
}
}
if(isSuc){
System.out.println("输入解密标识包序号为0 解密成功");
} else {
System.out.println("输入解密标识包序号为0 解密失败");
}
} catch (SydApiException e){
printException("输入解密标识包序号为0 ", e);
}
printEnd();
printBegin();
try{
boolean isSuc = true;
for(int i=16; i<=1024; i++) {
byte[] data = new byte[i];
log("sm4LongFunc_明文: " + Util.bytes2HexString(data), false);
byte[] data1 = new byte[16]; //为了测试 包序号为13 的情况将明文数据拆成2份
byte[] data2 = new byte[i-16];
byte[] enc_1 = api.SYD_SM4_LongData(key, data1, 1, ECB_ENC);
log("sm4LongFunc_enc_1: " + Util.bytes2HexString(enc_1), false);
byte[] enc_2 = api.SYD_SM4_LongData(key, data2, 3, ECB_ENC);
log("sm4LongFunc_enc_2: " + Util.bytes2HexString(enc_2), false);
byte[] enc = mergeByteArrays(enc_1, enc_2);
byte[] enc_short = api.SYD_SM4_ShortData(key, data, ECB_ENC);
log("sm4LongFunc_enc_short: " + Util.bytes2HexString(enc_short), false);
if(!(Util.bytes2HexString(enc).equals(Util.bytes2HexString(enc_short))) ){
isSuc = false;
break;
}
}
if(isSuc){
System.out.println("输入加密标识包序号为13 加密成功");
} else {
System.out.println("输入加密标识包序号为13 加密失败");
}
} catch (SydApiException e){
printException("输入加密标识包序号为13", e);
}
printEnd();
printBegin();
try{
boolean isSuc = true;
for(int i=16; i<=1024; i++) {
byte[] data = new byte[i];
log("sm4LongFunc_明文: " + Util.bytes2HexString(data), false);
byte[] enc = api.SYD_SM4_LongData(key, data, 0, ECB_ENC);
log("sm4LongFunc_enc: " + Util.bytes2HexString(enc), false);
byte[] enc_1 = Arrays.copyOfRange(enc, 0, 16);
byte[] enc_2 = Arrays.copyOfRange(enc, 16, enc.length);
byte[] dec_1 = api.SYD_SM4_LongData(key, enc_1, 1, ECB_DEC);
log("sm4LongFunc_dec_1: " + Util.bytes2HexString(dec_1), false);
byte[] dec_2 = api.SYD_SM4_LongData(key, enc_2, 3, ECB_DEC);
log("sm4LongFunc_dec_2: " + Util.bytes2HexString(dec_2), false);
byte[] dec = mergeByteArrays(dec_1, dec_2);
log("sm4LongFunc_dec: " + Util.bytes2HexString(dec), false);
if(!(Util.bytes2HexString(data).equals(Util.bytes2HexString(dec))) ){
isSuc = false;
break;
}
}
if(isSuc){
System.out.println("输入解密标识包序号为1,3 解密成功");
} else {
System.out.println("输入解密标识包序号为1,3 解密失败");
}
} catch (SydApiException e){
printException("输入解密标识包序号为1,3 ", e);
}
printEnd();
printBegin();
try{
boolean isSuc = true;
for(int i=32; i<=1024; i++) {
byte[] data = new byte[i];
log("sm4LongFunc_明文: " + Util.bytes2HexString(data), false);
byte[] data1 = new byte[16]; //为了测试 包序号为12,3 的情况,将明文数据拆成
byte[] data2 = new byte[16];
byte[] data3 = new byte[i-32];
byte[] enc_1 = api.SYD_SM4_LongData(key, data1, 1, ECB_ENC);
log("sm4LongFunc_enc_1: " + Util.bytes2HexString(enc_1), false);
byte[] enc_2 = api.SYD_SM4_LongData(key, data2, 2, ECB_ENC);
log("sm4LongFunc_enc_2: " + Util.bytes2HexString(enc_2), false);
byte[] enc_3 = api.SYD_SM4_LongData(key, data3, 3, ECB_ENC);
log("sm4LongFunc_enc_3: " + Util.bytes2HexString(enc_3), false);
byte[] enc = mergeByteArrays(enc_1, enc_2,enc_3);
byte[] enc_short = api.SYD_SM4_ShortData(key, data, ECB_ENC);
log("sm4LongFunc_enc_short: " + Util.bytes2HexString(enc_short), false);
if(!(Util.bytes2HexString(enc).equals(Util.bytes2HexString(enc_short))) ){
isSuc = false;
break;
}
}
if(isSuc){
System.out.println("输入加密标识包序号为1,2,3 加密成功");
} else {
System.out.println("输入加密标识包序号为1,2,3 加密失败");
}
} catch (SydApiException e){
printException("输入加密标识包序号为1,2,3 ", e);
}
printEnd();
printBegin();
try{
boolean isSuc = true;
for(int i=32; i<=1024; i++) {
byte[] data = new byte[i];
log("sm4LongFunc_明文: " + Util.bytes2HexString(data), false);
byte[] enc = api.SYD_SM4_LongData(key, data, 0, ECB_ENC);
log("sm4LongFunc_enc: " + Util.bytes2HexString(enc), false);
byte[] enc_1 = Arrays.copyOfRange(enc, 0, 16);
byte[] enc_2 = Arrays.copyOfRange(enc, 16, 32);
byte[] enc_3 = Arrays.copyOfRange(enc, 32, enc.length);
byte[] dec_1 = api.SYD_SM4_LongData(key, enc_1, 1, ECB_DEC);
log("sm4LongFunc_dec_1: " + Util.bytes2HexString(dec_1), false);
byte[] dec_2 = api.SYD_SM4_LongData(key, enc_2, 2, ECB_DEC);
log("sm4LongFunc_dec_2: " + Util.bytes2HexString(dec_2), false);
byte[] dec_3 = api.SYD_SM4_LongData(key, enc_3, 3, ECB_DEC);
log("sm4LongFunc_dec_3: " + Util.bytes2HexString(dec_3), false);
byte[] dec = mergeByteArrays(dec_1, dec_2,dec_3);
if(!(Util.bytes2HexString(data).equals(Util.bytes2HexString(dec))) ){
isSuc = false;
break;
}
}
if(isSuc){
System.out.println("输入解密标识包序号为1,2,3 解密成功");
} else {
System.out.println("输入解密标识包序号为1,2,3 解密失败");
}
} catch (SydApiException e){
printException("输入解密标识包序号为1,2,3", e);
}
printEnd();
printBegin();
try{
byte[] data = new byte[1024];
byte[] enc = api.SYD_SM4_LongData(key_incorrect, data, 0, ECB_ENC);
System.out.println("输入错误的会话密钥索引,输入加密标识 计算成功");
} catch (SydApiException e){
printException("输入错误的会话密钥索引,输入加密标识",e);
}
printEnd();
printBegin();
try{
byte[] data = new byte[1024];
byte[] enc = api.SYD_SM4_LongData(key, data, 0, ECB_ENC);
System.out.println("先正常传参,算出密文");
byte[] dec = api.SYD_SM4_LongData(key_incorrect, enc, 0, ECB_DEC);
System.out.println("输入错误的会话密钥索引,输入解密标识 计算成功");
} catch (SydApiException e){
printException("输入错误的会话密钥索引,输入解密标识", e);
}
printEnd();
printBegin();
try{
byte[] data = new byte[1024];
byte[] enc = api.SYD_SM4_LongData(key, data, 0, -1);
System.out.println("输入错误的加解密标识 计算成功");
} catch (SydApiException e){
printException("输入错误的加解密标识", e);
}
printEnd();
printBegin();
try{
byte[] data = new byte[4070];
byte[] enc = api.SYD_SM4_LongData(key, data, 0, ECB_ENC);
System.out.println("输入明文大于4064 计算成功");
} catch (SydApiException e){
printException("输入明文大于4064", e);
}
printEnd();
printBegin();
try{
byte[] data = new byte[1024];
byte[] enc = api.SYD_SM4_LongData(key, data, 0, ECB_ENC);
byte[] dec = api.SYD_SM4_LongData(key, new byte[2048], 0, ECB_DEC);
if(Util.bytes2HexString(data).equals(Util.bytes2HexString(dec))){
System.out.println("输入解密标识,输入错误的密文信息 计算成功");
} else {
System.out.println("输入解密标识,输入错误的密文信息 计算失败");
}
} catch (SydApiException e){
printException("输入解密标识,输入错误的密文信息", e);
}
printEnd();
System.out.println("-------- SM4长数据加解密功能测试结束 --------\n");
}
public void sm4LongFunc_ISM4() {
System.out.println("-------- (ISM4)SM4长数据加解密功能测试开始 --------");
SydApi api = connect();
printBegin();
try{
boolean isSuc = true;
for(int i=1; i<=1024; i++){
byte[] data = genBytes(i);
log("sm4LongFunc_ISM4___明文:" + Util.bytes2HexString(data), false);
ISM4 en = api.initSM4(0, ECB_ENC);
byte[] enc1 = en.update(data);
byte[] enc2 = en.finish();
byte[] enc = mergeByteArrays(enc1, enc2);
log("sm4LongFunc_ISM4___加密:" +Util.bytes2HexString(enc), false);
ISM4 de = api.initSM4(0, ECB_DEC);
byte[] dec1 = de.update(enc);
byte[] dec2 = de.finish();
byte[] dec = mergeByteArrays(dec1, dec2);
log("sm4LongFunc_ISM4___解密:" +Util.bytes2HexString(dec), false);
if(!(Util.bytes2HexString(data).equals(Util.bytes2HexString(dec)))){
isSuc = false;
break;
}
}
if(isSuc){
System.out.println("输入正确的入参,加密成功,解密成功");
} else {
System.out.println("输入正确的入参,加密失败,解密失败");
}
} catch (SydApiException e){
printException("输入正确的入参,加密失败,解密失败", e);
}
printEnd();
printBegin();
try{
ISM4 en = api.initSM4(0, ECB_ENC);
byte[] enc1 = en.update(new byte[5000]);
byte[] enc2 = en.finish();
byte[] enc = mergeByteArrays(enc1, enc2);
System.out.println("输入数据长度超过4064输入加密标识 加密成功:" + Util.bytes2HexString(enc));
} catch (SydApiException e){
printException("输入数据长度超过4064输入加密标识 加密失败", e);
}
printEnd();
printBegin();
try{
ISM4 de = api.initSM4(0, ECB_DEC);
byte[] dec1 = de.update(new byte[5000]);
byte[] dec2 = de.finish();
byte[] dec = mergeByteArrays(dec1, dec2);
System.out.println("输入数据长度超过4064输入解密标识 解密成功:" + Util.bytes2HexString(dec));
} catch (SydApiException e){
printException("输入数据长度超过4064输入解密标识 解密失败", e);
}
printEnd();
printBegin();
try{
ISM4 en = api.initSM4(-1, ECB_ENC);
byte[] enc1 = en.update(new byte[1024]);
byte[] enc2 = en.finish();
byte[] enc = mergeByteArrays(enc1, enc2);
System.out.println("输入不正确的密钥索引,输入加密标识 加密成功:" + Util.bytes2HexString(enc));
} catch (SydApiException e){
printException("输入不正确的密钥索引,输入加密标识 加密失败", e);
}
printEnd();
printBegin();
try{
ISM4 en = api.initSM4(0, ECB_ENC);
byte[] enc1 = en.update(new byte[1024]);
byte[] enc2 = en.finish();
byte[] enc = mergeByteArrays(enc1, enc2);
System.out.println("正常传参,加密成功:" + Util.bytes2HexString(enc));
ISM4 de = api.initSM4(-1, ECB_DEC);
byte[] dec1 = de.update(new byte[1024]);
byte[] dec2 = de.finish();
byte[] dec = mergeByteArrays(dec1, dec2);
System.out.println("输入不正确的密钥索引,输入解密标识 解密成功:" + Util.bytes2HexString(dec));
} catch (SydApiException e){
printException("输入不正确的密钥索引,输入解密标识 解密失败", e);
}
printEnd();
printBegin();
try{
byte[] data = new byte[1024];
ISM4 en = api.initSM4(0, ECB_ENC);
byte[] enc1 = en.update(data);
byte[] enc2 = en.finish();
byte[] enc = mergeByteArrays(enc1, enc2);
System.out.println("正常传参,加密成功:" + Util.bytes2HexString(enc));
Arrays.fill(enc, 10, 30, (byte)0);
System.out.println("修改密文后:" + Util.bytes2HexString(enc));
ISM4 de = api.initSM4(0, ECB_DEC);
byte[] dec1 = de.update(enc);
byte[] dec2 = de.finish();
byte[] dec = mergeByteArrays(dec1, dec2);
System.out.println("输入不正确的密文信息,输入解密标识 解密后:" + Util.bytes2HexString(dec));
if(Util.bytes2HexString(data).equals(Util.bytes2HexString(dec))){
System.out.println("输入不正确的密文信息,输入解密标识 解密成功");
} else {
System.out.println("输入不正确的密文信息,输入解密标识 解密对比失败");
}
} catch (SydApiException e){
printException("输入不正确的密文信息,输入解密标识 解密失败", e);
}
printEnd();
System.out.println("-------- (ISM4)SM4长数据加解密功能测试结束 --------");
}
public void sm4macShortFunc() {
System.out.println("-------- SM4MAC短数据功能测试开始 --------");
SydApi api = connect();
int key = 0; //正常索引
int key_incorrect = -1; //不正确的密钥索引
byte[] data = new byte[1024]; //正常数据
byte[] data_toolong = new byte[1025]; //测试数据超过长度限制
byte[] pcMac_incorrect = new byte[15]; //测试pcmac不为16字节的情况
byte[] pcMac_bad = new byte[16]; //测试pcmac和实际算出的pcmac不一样的情况
printBegin();
try{
List<String> verifyDatas = new ArrayList<>(); //用第三方工具算出的sm4mac和接口算的对比
verifyDatas.add("7CEDAE1E836889962F8C06C0501613F8");//对应计算的明文“01”明文为16进制数据
verifyDatas.add("CE088A908C8902F3B97AF3788FC7DF03");//对应计算的明文“0102”
verifyDatas.add("77F320521CE785E1561A3C3048DDC109");//对应计算的明文“010203”
verifyDatas.add("9785D703722AA20388A3DA1EFC94A9A4");//对应计算的明文“01020304”
verifyDatas.add("D188E611873AE220A61F9F1C0616357A");//对应计算的明文“0102030405”
verifyDatas.add("1A6599B031786511B9E3A8C1FDC12B8D");//对应计算的明文“010203040506”
verifyDatas.add("7C8BC8CADC9C70677492EDD393963E12");//对应计算的明文“01020304050607”
verifyDatas.add("EBC4DEC72A537C82AA40E14FC5586B6A");//对应计算的明文“0102030405060708”
verifyDatas.add("AED342547B4615210CC1B194D6166D9A");//对应计算的明文“010203040506070809”
verifyDatas.add("2AD7BAE1AB13880263335F7BA829A91A");//对应计算的明文“0102030405060708090A”
verifyDatas.add("FCECADBAB814904302CB4FD5C1509D7D");//对应计算的明文“0102030405060708090A0B”
verifyDatas.add("8125EA5F71B67C7FACFB581497723C2D");//对应计算的明文“0102030405060708090A0B0C”
verifyDatas.add("3CEB76630ABA335B14D9A5092A32203D");//对应计算的明文“0102030405060708090A0B0C0D”
verifyDatas.add("37E63B7EE45337C7B3B760E648A74B8D");//对应计算的明文“0102030405060708090A0B0C0D0E”
verifyDatas.add("3C6D5E1FE647AB510E09812DD1F4F286");//对应计算的明文“0102030405060708090A0B0C0D0E0F”
verifyDatas.add("90D7B07D7D3A548A2C4D3EAE20BDCA63");//对应计算的明文“0102030405060708090A0B0C0D0E0F10”
boolean isSuc = true;
for (int i=1; i<=16; i++){
byte[] dataBytes = genBytes(i);
log("sm4macShortFunc___明文: " + Util.bytes2HexString(dataBytes), false);
byte[] res = api.SYD_SM4Mac_ShortData(key, dataBytes);
log("sm4macShortFunc___计算后:: " + Util.bytes2HexString(res), false);
if(!(verifyDatas.get(i-1).equals(Util.bytes2HexString(res)))){
isSuc = false;
break;
}
}
if(isSuc){
System.out.println("输入正确入参,计算成功" );
} else {
System.out.println("输入正确入参,计算失败 " );
}
} catch (SydApiException e){
printException("输入正确入参,计算失败", e);
}
printEnd();
printBegin();
try{
boolean isSuc = true;
for (int i=1; i<=16; i++){
byte[] dataBytes = genBytes(i);
log("sm4macShortFunc___明文: " + Util.bytes2HexString(dataBytes), false);
byte[] res = api.SYD_SM4Mac_ShortData(key, dataBytes);
log("sm4macShortFunc___计算后:: " + Util.bytes2HexString(res), false);
boolean check = api.SYD_SM4Mac_ShortData(key, dataBytes, res);
log("sm4macShortFunc___校验:: " + check, false);
if(!check){
isSuc = false;
break;
}
}
if(isSuc){
System.out.println("输入正确入参,校验成功" );
} else {
System.out.println("输入正确入参,校验失败 " );
}
} catch (SydApiException e){
printException("输入正确入参,校验失败", e);
}
printEnd();
printBegin();
try{
byte[] res = api.SYD_SM4Mac_ShortData(key_incorrect, data);
System.out.println("输入不正确的密钥索引,计算成功: " + Util.bytes2HexString(res));
} catch (SydApiException e){
printException("输入不正确的密钥索引,计算失败", e);
}
printEnd();
printBegin();
try{
byte[] res = api.SYD_SM4Mac_ShortData(key, data);
System.out.println("输入正确入参,计算: " + Util.bytes2HexString(res));
boolean check = api.SYD_SM4Mac_ShortData(key_incorrect, data, res);
System.out.println("输入不正确的密钥索引,校验结果:" + check);
} catch (SydApiException e){
printException("输入不正确的密钥索引,校验失败", e);
}
printEnd();
printBegin();
try{
byte[] res = api.SYD_SM4Mac_ShortData(key, data_toolong);
System.out.println("数据长度大于1024,计算成功: " + Util.bytes2HexString(res));
} catch (SydApiException e){
printException("数据长度大于1024,计算失败", e);
}
printEnd();
printBegin();
try{
byte[] res = api.SYD_SM4Mac_ShortData(key, data);
System.out.println("输入正确入参,计算成功: " + Util.bytes2HexString(res));
boolean check = api.SYD_SM4Mac_ShortData(key, data_toolong, res);
System.out.println("数据长度大于1024,校验结果:" + check);
} catch (SydApiException e){
printException("数据长度大于1024,校验失败", e);
} catch (Exception e){
e.printStackTrace();
}
printEnd();
printBegin();
try{
boolean check = api.SYD_SM4Mac_ShortData(key, data, null);
System.out.println("pcMac为空,校验结果:" + check);
} catch (SydApiException e){
printException("pcMac为空,校验失败", e);
} catch (Exception e){
e.printStackTrace();
}
printEnd();
printBegin();
try{
boolean check = api.SYD_SM4Mac_ShortData(key, data, pcMac_incorrect);
System.out.println("pcMac不为16字节,校验结果:" + check);
} catch (SydApiException e){
printException("pcMac不为16字节,校验失败", e);
}
printEnd();
printBegin();
try{
boolean check = api.SYD_SM4Mac_ShortData(key, data, pcMac_bad);
System.out.println("pcMac不正确,校验结果:" + check);
} catch (SydApiException e){
printException("pcMac不正确,校验失败", e);
}
printEnd();
System.out.println("-------- SM4MAC短数据功能测试结束 --------\n");
}
public void sm4macLongFunc() {
System.out.println("-------- SM4MAC长数据功能测试开始 --------");
SydApi api = connect();
int key = 0;
int key_incorrect = -1;
List<String> verifyDatas = new ArrayList<>(); //用第三方工具算出的sm4mac和接口算的对比
verifyDatas.add("7CEDAE1E836889962F8C06C0501613F8");//对应计算的明文“01”明文为16进制数据
verifyDatas.add("CE088A908C8902F3B97AF3788FC7DF03");//对应计算的明文“0102”
verifyDatas.add("77F320521CE785E1561A3C3048DDC109");//对应计算的明文“010203”
verifyDatas.add("9785D703722AA20388A3DA1EFC94A9A4");//对应计算的明文“01020304”
verifyDatas.add("D188E611873AE220A61F9F1C0616357A");//对应计算的明文“0102030405”
verifyDatas.add("1A6599B031786511B9E3A8C1FDC12B8D");//对应计算的明文“010203040506”
verifyDatas.add("7C8BC8CADC9C70677492EDD393963E12");//对应计算的明文“01020304050607”
verifyDatas.add("EBC4DEC72A537C82AA40E14FC5586B6A");//对应计算的明文“0102030405060708”
verifyDatas.add("AED342547B4615210CC1B194D6166D9A");//对应计算的明文“010203040506070809”
verifyDatas.add("2AD7BAE1AB13880263335F7BA829A91A");//对应计算的明文“0102030405060708090A”
verifyDatas.add("FCECADBAB814904302CB4FD5C1509D7D");//对应计算的明文“0102030405060708090A0B”
verifyDatas.add("8125EA5F71B67C7FACFB581497723C2D");//对应计算的明文“0102030405060708090A0B0C”
verifyDatas.add("3CEB76630ABA335B14D9A5092A32203D");//对应计算的明文“0102030405060708090A0B0C0D”
verifyDatas.add("37E63B7EE45337C7B3B760E648A74B8D");//对应计算的明文“0102030405060708090A0B0C0D0E”
verifyDatas.add("3C6D5E1FE647AB510E09812DD1F4F286");//对应计算的明文“0102030405060708090A0B0C0D0E0F”
verifyDatas.add("90D7B07D7D3A548A2C4D3EAE20BDCA63");//对应计算的明文“0102030405060708090A0B0C0D0E0F10”
printBegin();
try{
boolean isSuc = true;
for (int i=1; i<=16; i++){
byte[] data = genBytes(i);
log("sm4macLongFunc___明文: " + Util.bytes2HexString(data), false );
LongDataReturn<byte[], byte[]> longDataReturn = api.SYD_SM4Mac_LongData(key, data, 0, null);
log("sm4macLongFunc___计算结果: " + Util.bytes2HexString(longDataReturn.getData()), false );
if(!(verifyDatas.get(i-1).equals(Util.bytes2HexString(longDataReturn.getData()))) ){
isSuc = false;
break;
}
}
if (isSuc) {
System.out.println("输入正确的入参包序号为0SM4MAC长数据测试成功");
} else {
System.out.println("输入正确的入参包序号为0SM4MAC长数据测试失败");
}
} catch (SydApiException e){
printException("输入正确的入参包序号为0SM4MAC长数据测试失败",e);
}
printEnd();
printBegin();
try{
boolean isSuc = true;
for (int i=1; i<=1024; i++){
byte[] data = genBytes(i);
log("sm4macLongFunc___明文: " + Util.bytes2HexString(data), false );
LongDataReturn<byte[], byte[]> longDataReturn = api.SYD_SM4Mac_LongData(key, data, 0, null);
log("sm4macLongFunc___计算结果: " + Util.bytes2HexString(longDataReturn.getData()), false );
LongDataReturn<byte[], Boolean> booleanLongDataReturn = api.SYD_SM4Mac_LongData(key, data, 0, null, longDataReturn.getData());
log("sm4macLongFunc___校验结果: " + booleanLongDataReturn.getData(), false );
if(!booleanLongDataReturn.getData()){
isSuc = false;
break;
}
}
if (isSuc) {
System.out.println("输入正确的入参包序号为0SM4MAC长数据校验成功");
} else {
System.out.println("输入正确的入参包序号为0SM4MAC长数据校验失败");
}
} catch (SydApiException e){
printException("输入正确的入参包序号为0SM4MAC长数据校验失败",e);
}
printEnd();
printBegin();
try{
boolean isSuc = true;
for (int i=16; i<=1024; i++){
byte[] data = genBytes(i);
log("sm4macLongFunc___明文: " + Util.bytes2HexString(data), false );
byte[] data1 = Arrays.copyOfRange(data, 0, 16);
byte[] data2 = Arrays.copyOfRange(data, 16, data.length);
LongDataReturn<byte[], byte[]> longDataReturn = api.SYD_SM4Mac_LongData(key, data1, 1, null);
log("sm4macLongFunc___计算结果1: " + Util.bytes2HexString(longDataReturn.getProcData()), false );
longDataReturn = api.SYD_SM4Mac_LongData(key, data2, 3, longDataReturn.getProcData());
log("sm4macLongFunc___计算结果2: " + Util.bytes2HexString(longDataReturn.getData()), false );
LongDataReturn<byte[], Boolean> booleanLongDataReturn = api.SYD_SM4Mac_LongData(key, data, 0, null, longDataReturn.getData());
log("sm4macLongFunc___校验结果: " + booleanLongDataReturn.getData(), false );
if(!booleanLongDataReturn.getData() ){
isSuc = false;
break;
}
}
if (isSuc) {
System.out.println("输入正确的入参包序号为1,3SM4MAC长数据测试成功");
} else {
System.out.println("输入正确的入参包序号为1,3SM4MAC长数据测试失败");
}
} catch (SydApiException e){
printException("输入正确的入参包序号为1,3SM4MAC长数据测试失败",e);
}
printEnd();
printBegin();
try{
boolean isSuc = true;
for (int i=16; i<=1024; i++){
byte[] data = genBytes(i);
log("sm4macLongFunc___明文: " + Util.bytes2HexString(data), false );
LongDataReturn<byte[], byte[]> longDataReturn = api.SYD_SM4Mac_LongData(key, data, 0, null);
log("sm4macLongFunc___计算结果: " + Util.bytes2HexString(longDataReturn.getData()), false );
byte[] data1 = Arrays.copyOfRange(data, 0, 16);
byte[] data2 = Arrays.copyOfRange(data, 16, data.length);
LongDataReturn<byte[], Boolean> booleanLongDataReturn = api.SYD_SM4Mac_LongData(key, data1, 1, null, longDataReturn.getData());
log("sm4macLongFunc___校验结果1: " + Util.bytes2HexString(booleanLongDataReturn.getProcData()), false );
booleanLongDataReturn = api.SYD_SM4Mac_LongData(key, data2, 3, booleanLongDataReturn.getProcData(), longDataReturn.getData());
log("sm4macLongFunc___校验结果2: " + booleanLongDataReturn.getData(), false );
if(!booleanLongDataReturn.getData() ){
isSuc = false;
break;
}
}
if (isSuc) {
System.out.println("输入正确的入参包序号为1,3SM4MAC长数据校验成功");
} else {
System.out.println("输入正确的入参包序号为1,3SM4MAC长数据校验失败");
}
} catch (SydApiException e){
printException("输入正确的入参包序号为1,3SM4MAC长数据校验失败",e);
}
printEnd();
printBegin();
try{
boolean isSuc = true;
for (int i=32; i<=1024; i++){
byte[] data = genBytes(i);
log("sm4macLongFunc___明文: " + Util.bytes2HexString(data), false );
byte[] data1 = Arrays.copyOfRange(data, 0, 16);
byte[] data2 = Arrays.copyOfRange(data, 16, 32);
byte[] data3 = Arrays.copyOfRange(data, 32, data.length);
LongDataReturn<byte[], byte[]> longDataReturn = api.SYD_SM4Mac_LongData(key, data1, 1, null);
log("sm4macLongFunc___计算结果1: " + Util.bytes2HexString(longDataReturn.getProcData()), false );
longDataReturn = api.SYD_SM4Mac_LongData(key, data2, 2, longDataReturn.getProcData());
log("sm4macLongFunc___计算结果2: " + Util.bytes2HexString(longDataReturn.getProcData()), false );
longDataReturn = api.SYD_SM4Mac_LongData(key, data3, 3, longDataReturn.getProcData());
log("sm4macLongFunc___计算结果3: " + Util.bytes2HexString(longDataReturn.getData()), false );
LongDataReturn<byte[], Boolean> booleanLongDataReturn = api.SYD_SM4Mac_LongData(key, data, 0, null, longDataReturn.getData());
log("sm4macLongFunc___校验结果: " + booleanLongDataReturn.getData(), false );
if(!booleanLongDataReturn.getData() ){
isSuc = false;
break;
}
}
if (isSuc) {
System.out.println("输入正确的入参包序号为1,2,3SM4MAC长数据测试成功");
} else {
System.out.println("输入正确的入参包序号为1,2,3SM4MAC长数据测试失败");
}
} catch (SydApiException e){
printException("输入正确的入参包序号为1,2,3SM4MAC长数据测试失败",e);
}
printEnd();
printBegin();
try{
boolean isSuc = true;
for (int i=32; i<=1024; i++){
byte[] data = genBytes(i);
log("sm4macLongFunc___明文: " + Util.bytes2HexString(data), false );
LongDataReturn<byte[], byte[]> longDataReturn = api.SYD_SM4Mac_LongData(key, data, 0, null);
log("sm4macLongFunc___计算结果: " + Util.bytes2HexString(longDataReturn.getData()), false );
byte[] data1 = Arrays.copyOfRange(data, 0, 16);
byte[] data2 = Arrays.copyOfRange(data, 16, 32);
byte[] data3 = Arrays.copyOfRange(data, 32, data.length);
LongDataReturn<byte[], Boolean> booleanLongDataReturn = api.SYD_SM4Mac_LongData(key, data1, 1, null, longDataReturn.getData());
log("sm4macLongFunc___校验结果1: " + Util.bytes2HexString(booleanLongDataReturn.getProcData()), false );
booleanLongDataReturn = api.SYD_SM4Mac_LongData(key, data2, 2, booleanLongDataReturn.getProcData(), longDataReturn.getData());
log("sm4macLongFunc___校验结果2: " + Util.bytes2HexString(booleanLongDataReturn.getProcData()), false );
booleanLongDataReturn = api.SYD_SM4Mac_LongData(key, data3, 3, booleanLongDataReturn.getProcData(), longDataReturn.getData());
log("sm4macLongFunc___校验结果3: " + booleanLongDataReturn.getData(), false );
if(!booleanLongDataReturn.getData() ){
isSuc = false;
break;
}
}
if (isSuc) {
System.out.println("输入正确的入参包序号为1,2,3SM4MAC长数据校验成功");
} else {
System.out.println("输入正确的入参包序号为1,2,3SM4MAC长数据校验失败");
}
} catch (SydApiException e){
printException("输入正确的入参包序号为1,2,3SM4MAC长数据校验失败",e);
}
printEnd();
printBegin();
try{
byte[] data = new byte[1024];
LongDataReturn<byte[], byte[]> longDataReturn = api.SYD_SM4Mac_LongData(key_incorrect, data, 0, null);
System.out.println("调用长数据MAC计算接口输入不正确的密钥索引SM4MAC长数据测试成功");
} catch (SydApiException e){
printException("调用长数据MAC计算接口输入不正确的密钥索引SM4MAC长数据测试失败",e);
}
printEnd();
printBegin();
try{
byte[] data = new byte[1024];
LongDataReturn<byte[], byte[]> longDataReturn = api.SYD_SM4Mac_LongData(key, data, 0, null);
System.out.println("正常传参SM4MAC长数据计算成功");
LongDataReturn<byte[], Boolean> booleanLongDataReturn = api.SYD_SM4Mac_LongData(key_incorrect, data, 0, null, longDataReturn.getData());
System.out.println("调用长数据MAC校验接口输入不正确的密钥索引SM4MAC长数据校验成功");
} catch (SydApiException e){
printException("调用长数据MAC校验接口输入不正确的密钥索引SM4MAC长数据校验失败",e);
}
printEnd();
printBegin();
try{
byte[] data = new byte[1024];
LongDataReturn<byte[], byte[]> longDataReturn = api.SYD_SM4Mac_LongData(key, data, 0, null);
System.out.println("正常传参SM4MAC长数据计算成功");
byte[] data1 = Arrays.copyOfRange(data, 0, 16);
byte[] data2 = Arrays.copyOfRange(data, 16, 32);
byte[] data3 = Arrays.copyOfRange(data, 32, data.length);
LongDataReturn<byte[], Boolean> booleanLongDataReturn = api.SYD_SM4Mac_LongData(key, data1, 1, null, longDataReturn.getData());
System.out.println("包序号为1时计算成功");
booleanLongDataReturn = api.SYD_SM4Mac_LongData(key, data2, 2, null, longDataReturn.getData());
System.out.println("包序号为2时pcProcData无输入SM4MAC长数据校验成功");
} catch (SydApiException e){
printException("包序号为2时pcProcData无输入SM4MAC长数据校验失败",e);
} catch (Exception e){
e.printStackTrace();
}
try{
byte[] data = new byte[1024];
LongDataReturn<byte[], byte[]> longDataReturn = api.SYD_SM4Mac_LongData(key, data, 0, null);
System.out.println("正常传参SM4MAC长数据计算成功");
byte[] data1 = Arrays.copyOfRange(data, 0, 16);
byte[] data2 = Arrays.copyOfRange(data, 16, 32);
byte[] data3 = Arrays.copyOfRange(data, 32, data.length);
LongDataReturn<byte[], Boolean> booleanLongDataReturn = api.SYD_SM4Mac_LongData(key, data1, 1, null, longDataReturn.getData());
booleanLongDataReturn = api.SYD_SM4Mac_LongData(key, data2, 2, booleanLongDataReturn.getProcData(), longDataReturn.getData());
System.out.println("包序号为1,2时计算成功");
booleanLongDataReturn = api.SYD_SM4Mac_LongData(key, data3, 3, null, longDataReturn.getData());
System.out.println("包序号为3时pcProcData无输入SM4MAC长数据校验成功");
} catch (SydApiException e){
printException("包序号为3时pcProcData无输入SM4MAC长数据校验失败",e);
} catch (Exception e){
e.printStackTrace();
}
printEnd();
printBegin();
try{
byte[] data = new byte[1024];
LongDataReturn<byte[], byte[]> longDataReturn = api.SYD_SM4Mac_LongData(key, data, 0, null);
System.out.println("正常传参SM4MAC长数据计算成功");
LongDataReturn<byte[], Boolean> booleanLongDataReturn = api.SYD_SM4Mac_LongData(key, data, 0, null, null);
if(booleanLongDataReturn.getData()){
System.out.println("包序号为0时PCMAC无输入SM4MAC长数据校验成功");
} else {
System.out.println("包序号为0时PCMAC无输入SM4MAC长数据校验失败");
}
} catch (SydApiException e){
printException("包序号为0时PCMAC无输入SM4MAC长数据校验失败",e);
}
try{
byte[] data = new byte[1024];
LongDataReturn<byte[], byte[]> longDataReturn = api.SYD_SM4Mac_LongData(key, data, 0, null);
System.out.println("正常传参SM4MAC长数据计算成功");
byte[] data1 = Arrays.copyOfRange(data, 0, 16);
byte[] data2 = Arrays.copyOfRange(data, 16, 32);
byte[] data3 = Arrays.copyOfRange(data, 32, data.length);
LongDataReturn<byte[], Boolean> booleanLongDataReturn = api.SYD_SM4Mac_LongData(key, data1, 1, null, null);
if(booleanLongDataReturn.getData()){
System.out.println("包序号为1时PCMAC无输入SM4MAC长数据校验成功");
} else {
System.out.println("包序号为1时PCMAC无输入SM4MAC长数据校验失败");
}
} catch (SydApiException e){
printException("包序号为1时PCMAC无输入SM4MAC长数据校验失败",e);
}
try{
byte[] data = new byte[1024];
LongDataReturn<byte[], byte[]> longDataReturn = api.SYD_SM4Mac_LongData(key, data, 0, null);
System.out.println("正常传参SM4MAC长数据计算成功");
byte[] data1 = Arrays.copyOfRange(data, 0, 16);
byte[] data2 = Arrays.copyOfRange(data, 16, 32);
byte[] data3 = Arrays.copyOfRange(data, 32, data.length);
LongDataReturn<byte[], Boolean> booleanLongDataReturn = api.SYD_SM4Mac_LongData(key, data1, 1, null, longDataReturn.getData());
System.out.println("包序号为1时计算成功");
booleanLongDataReturn = api.SYD_SM4Mac_LongData(key, data2, 2, booleanLongDataReturn.getProcData(), null);
if(booleanLongDataReturn.getData()){
System.out.println("包序号为2时PCMAC无输入SM4MAC长数据校验成功");
} else {
System.out.println("包序号为2时PCMAC无输入SM4MAC长数据校验失败");
}
} catch (SydApiException e){
printException("包序号为2时PCMAC无输入SM4MAC长数据校验失败",e);
}
try{
byte[] data = new byte[1024];
LongDataReturn<byte[], byte[]> longDataReturn = api.SYD_SM4Mac_LongData(key, data, 0, null);
System.out.println("正常传参SM4MAC长数据计算成功");
byte[] data1 = Arrays.copyOfRange(data, 0, 16);
byte[] data2 = Arrays.copyOfRange(data, 16, 32);
byte[] data3 = Arrays.copyOfRange(data, 32, data.length);
LongDataReturn<byte[], Boolean> booleanLongDataReturn = api.SYD_SM4Mac_LongData(key, data1, 1, null, longDataReturn.getData());
booleanLongDataReturn = api.SYD_SM4Mac_LongData(key, data2, 2, booleanLongDataReturn.getProcData(), longDataReturn.getData());
System.out.println("包序号为1,2时计算成功");
booleanLongDataReturn = api.SYD_SM4Mac_LongData(key, data3, 3, booleanLongDataReturn.getProcData(), null);
if(booleanLongDataReturn.getData()){
System.out.println("包序号为3时PCMAC无输入SM4MAC长数据校验成功");
} else {
System.out.println("包序号为3时PCMAC无输入SM4MAC长数据校验失败");
}
} catch (SydApiException e){
printException("包序号为3时PCMAC无输入SM4MAC长数据校验失败",e);
}
printEnd();
printBegin();
try{
byte[] data = new byte[1024];
LongDataReturn<byte[], byte[]> longDataReturn = api.SYD_SM4Mac_LongData(key, data, 4, null);
System.out.println("输入包序号不为0-3SM4MAC长数据计算成功");
} catch (SydApiException e){
printException("输入包序号不为0-3SM4MAC长数据计算失败",e);
} catch (Exception e){
e.printStackTrace();
}
printEnd();
printBegin();
try{
byte[] data = new byte[1024];
LongDataReturn<byte[], byte[]> longDataReturn = api.SYD_SM4Mac_LongData(key, data, 0, null);
System.out.println("正常传参SM4MAC长数据计算成功");
LongDataReturn<byte[], Boolean> booleanLongDataReturn = api.SYD_SM4Mac_LongData(key, data, 4, null, longDataReturn.getData());
if(booleanLongDataReturn.getData()){
System.out.println("输入包序号不为0-3SM4MAC长数据校验成功");
} else{
System.out.println("输入包序号不为0-3SM4MAC长数据校验失败");
}
} catch (SydApiException e){
printException("输入包序号不为0-3SM4MAC长数据校验失败",e);
} catch (Exception e){
e.printStackTrace();
}
printEnd();
printBegin();
try{
byte[] data = new byte[5000];
LongDataReturn<byte[], byte[]> longDataReturn = api.SYD_SM4Mac_LongData(key, data, 0, null);
System.out.println("输入大于4064的数据长度SM4MAC长数据计算成功");
} catch (SydApiException e){
printException("输入大于4064的数据长度SM4MAC长数据计算失败",e);
} catch (Exception e){
e.printStackTrace();
}
printEnd();
printBegin();
try{
byte[] data = new byte[4000];
LongDataReturn<byte[], byte[]> longDataReturn = api.SYD_SM4Mac_LongData(key, data, 0, null);
System.out.println("正常传参SM4MAC长数据计算成功");
byte[] dataNew = mergeByteArrays(data, new byte[1000]); //dataNew长度为5000
System.out.println("明文数据长度改成: " + dataNew.length);
LongDataReturn<byte[], Boolean> booleanLongDataReturn = api.SYD_SM4Mac_LongData(key, dataNew, 0, null, longDataReturn.getData());
if(booleanLongDataReturn.getData()){
System.out.println("输入大于4064的数据长度SM4MAC长数据校验成功");
} else{
System.out.println("输入大于4064的数据长度SM4MAC长数据校验失败");
}
} catch (SydApiException e){
printException("输入大于4064的数据长度SM4MAC长数据校验失败",e);
} catch (Exception e){
e.printStackTrace();
}
printEnd();
System.out.println("-------- SM4MAC长数据功能测试结束 --------\n");
// 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 sm4macLongFunc_ISM4Mac() {
System.out.println("-------- (ISM4Mac)SM4MAC长数据功能测试开始 --------");
SydApi api = connect();
int key = 0;
byte[] pcMac_incorrect = new byte[15]; //测试数据长度不对的mac
byte[] pcMac_bad = new byte[16]; //测试数据长度正常但是值和原本的mac值不一样的情况
printBegin();
try{
boolean isSuc = true;
for(int i=1; i<=1024; i++){
byte[] data = genBytes(i);
log("sm4macLongFunc_ISM4Mac___明文: " + Util.bytes2HexString(data), false);
byte[] res1 = api.SYD_SM4Mac_ShortData(key, data);
log("sm4macLongFunc_ISM4Mac___res1: " + Util.bytes2HexString(res1), false);
ISM4Mac sm4mac = api.initSM4Mac(key);
sm4mac.update(data);
byte[] res2 = sm4mac.digest();
log("sm4macLongFunc_ISM4Mac___res2: " + Util.bytes2HexString(res2), false);
if(!(Util.bytes2HexString(res1).equals(Util.bytes2HexString(res2)))){
isSuc = false;
break;
}
}
if(isSuc){
System.out.println("输入正确的入参,pcMac无输入,计算成功" );
} else {
System.out.println("输入正确的入参,pcMac无输入,计算失败");
}
} catch (SydApiException e){
printException("输入正确的入参,pcMac无输入,计算失败",e);
}
printEnd();
printBegin();
try{
List<byte[]> dataList = new ArrayList<>();
List<byte[]> macList = new ArrayList<>();
for(int i=1; i<=1024; i++){
byte[] data = genBytes(i);
log("sm4macLongFunc_ISM4Mac___明文: " + Util.bytes2HexString(data), false);
dataList.add(data);
ISM4Mac sm4mac = api.initSM4Mac(key);
sm4mac.update(data);
byte[] res = sm4mac.digest();
log("sm4macLongFunc_ISM4Mac___res: " + Util.bytes2HexString(res), false);
macList.add(res);
}
boolean isSuc = true;
for(int i=1; i<=1024; i++){
byte[] data = dataList.get(i-1);
log("sm4macLongFunc_ISM4Mac___明文: " + Util.bytes2HexString(data), false);
ISM4Mac sm4mac = api.initSM4Mac(key);
sm4mac.update(data);
boolean check = sm4mac.checkDigest(macList.get(i-1));
log("sm4macLongFunc_ISM4Mac___校验结果: " + check, false);
if(!check){
isSuc = false;
break;
}
}
if(isSuc){
System.out.println("pcMac有正确MAC输入输入正确的入参,校验成功" );
} else {
System.out.println("pcMac有正确MAC输入输入正确的入参,校验失败");
}
} catch (SydApiException e){
printException("pcMac有正确MAC输入输入正确的入参,校验失败",e);
}
printEnd();
printBegin();
try{
byte[] data = new byte[5000];
ISM4Mac sm4mac = api.initSM4Mac(key);
sm4mac.update(data);
byte[] res = sm4mac.digest();
System.out.println("输入数据长度超过4064,计算成功:" + Util.bytes2HexString(res));
} catch (SydApiException e){
printException("输入数据长度超过4064计算失败",e);
}
printEnd();
printBegin();
try{
byte[] data = new byte[2048];
ISM4Mac sm4mac = api.initSM4Mac(key);
sm4mac.update(data);
byte[] res = sm4mac.digest();
System.out.println("输入明文2048字节的0,计算结果:" + Util.bytes2HexString(res));
sm4mac = api.initSM4Mac(key);
sm4mac.update(data);
boolean isSuc = sm4mac.checkDigest(pcMac_incorrect);
System.out.println("pcMac不为16字节,校验:" + isSuc);
} catch (SydApiException e){
printException("pcMac不为16字节校验失败",e);
}
printEnd();
printBegin();
try{
byte[] data = new byte[2048];
ISM4Mac sm4mac = api.initSM4Mac(key);
sm4mac.update(data);
byte[] res = sm4mac.digest();
System.out.println("输入明文2048字节的0,计算mac:" + Util.bytes2HexString(res));
sm4mac = api.initSM4Mac(key);
sm4mac.update(data);
boolean isSuc = sm4mac.checkDigest(pcMac_bad);
System.out.println("pcMac为16字节但不正确,校验:" + isSuc);
} catch (SydApiException e){
printException("pcMac为16字节但不正确,校验失败",e);
}
printEnd();
System.out.println("-------- (ISM4Mac)SM4MAC长数据功能测试结束 --------\n");
}
public void sm4BatchFunc() {
System.out.println("-------- SM4批量数据加解密功能测试开始 --------");
SydApi api = connect();
List<byte[]> 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]);
List<byte[]> data_tooLong = new ArrayList<>(); //明文数据超过指定长度
data_tooLong.add(new byte[1025]);
data_tooLong.add(new byte[1025]);
data_tooLong.add(new byte[1025]);
data_tooLong.add(new byte[1025]);
data_tooLong.add(new byte[1025]);
data_tooLong.add(new byte[1025]);
data_tooLong.add(new byte[1025]);
List<byte[]> endata = new ArrayList<>(); //正常密文
endata.add(new byte[1024]);
endata.add(new byte[1024]);
endata.add(new byte[1024]);
endata.add(new byte[1024]);
endata.add(new byte[1024]);
endata.add(new byte[1024]);
endata.add(new byte[1024]);
List<byte[]> endata_tooLong = new ArrayList<>(); //密文数据超过指定长度
endata_tooLong.add(new byte[1050]);
endata_tooLong.add(new byte[1050]);
endata_tooLong.add(new byte[1050]);
endata_tooLong.add(new byte[1050]);
endata_tooLong.add(new byte[1050]);
endata_tooLong.add(new byte[1050]);
endata_tooLong.add(new byte[1050]);
int[] key = new int[]{0, 0, 0, 0, 0, 0, 0}; //正常传参密钥
int[] key_incorrect = new int[]{-1, -1, -1, -1, -1, -1, -1}; //无效密钥测试
int[] key_insufficient = new int[]{0, 0, 0}; //密钥个数和明文数据个数不一致测试
printBegin();
try{
List<byte[]> datas = new ArrayList<>();
int[] keys = new int[1024];
for (int i=1; i<=1024; i++){
datas.add(new byte[i]);
keys[i-1] = 0;
}
List<byte[]> en_data = api.SYD_SM4_BatchData(keys, datas, ECB_ENC);
List<byte[]> de_data = api.SYD_SM4_BatchData(keys, en_data, ECB_DEC);
for(int i=0; i<datas.size(); i++){
log("sm4BatchFunc_明文: " + Util.bytes2HexString(datas.get(i)), false);
log("sm4BatchFunc_加密后: " + Util.bytes2HexString(en_data.get(i)), false);
log("sm4BatchFunc_解密后: " + Util.bytes2HexString(de_data.get(i)), false);
}
if ( contentEquals(datas, de_data)) {
System.out.println("正常传参,加解密对比成功");
} else {
System.out.println("正常传参,加解密对比失败");
}
} catch (SydApiException e){
printException("正常传参,加解密", e);
}
printEnd();
printBegin();
try{
List<byte[]> en_data = api.SYD_SM4_BatchData(key_incorrect, data, ECB_ENC);
System.out.println("输入不正确的密钥索引,输入加密标识,加密成功");
} catch (SydApiException e) {
printException("输入不正确的密钥索引,输入加密标识", e);
}
printEnd();
printBegin();
try{
List<byte[]> en_data = api.SYD_SM4_BatchData(key, data, ECB_ENC);
System.out.println("正常传参,加密成功");
List<byte[]> de_data = api.SYD_SM4_BatchData(key_incorrect, en_data, ECB_DEC);
System.out.println("输入不正确的密钥索引,输入解密标识,解密成功");
} catch (SydApiException e) {
printException("输入不正确的密钥索引,输入解密标识", e);
}
printEnd();
printBegin();
try{
List<byte[]> en_data = api.SYD_SM4_BatchData(key, data, -1);
System.out.println("输入不存在的标识,加解密成功");
} catch (SydApiException e) {
printException("输入不存在的标识", e);
}
printEnd();
printBegin();
try{
List<byte[]> en_data = api.SYD_SM4_BatchData(key_insufficient, data, ECB_ENC);
System.out.println("密钥索引个数和明文数据个数不一致,加密成功");
} catch (SydApiException e) {
printException("密钥索引个数和明文数据个数不一致,加密失败", e);
}
printEnd();
printBegin();
try{
List<byte[]> en_data = api.SYD_SM4_BatchData(key, data, ECB_ENC);
System.out.println("正常传参,加密成功");
List<byte[]> de_data = api.SYD_SM4_BatchData(key_insufficient, en_data, ECB_DEC);
System.out.println("密钥索引个数和密文数据个数不一致,解密成功");
} catch (SydApiException e) {
printException("密钥索引个数和密文数据个数不一致,解密失败", e);
}
printEnd();
printBegin();
try{
List<byte[]> en_data = api.SYD_SM4_BatchData(key, data_tooLong, ECB_ENC);
System.out.println("明文数据长度超过1024加密成功");
} catch (SydApiException e) {
printException("明文数据长度超过1024", e);
}
printEnd();
printBegin();
try{
List<byte[]> de_data = api.SYD_SM4_BatchData(key, endata_tooLong, ECB_DEC);
System.out.println("密文超过1024+16解密成功");
} catch (SydApiException e) {
printException("密文超过1024+16", e);
}
printEnd();
printBegin();
try{
List<byte[]> en_data = api.SYD_SM4_BatchData(key, data, ECB_ENC);
List<byte[]> de_data = api.SYD_SM4_BatchData(key, endata, ECB_DEC);
if(contentEquals(de_data, data)){
System.out.println("输入错误的密文,解密后和之前明文一致");
} else {
System.out.println("输入错误的密文,解密后和之前明文不一致");
}
} catch (SydApiException e){
printException("输入错误的密文,解密失败", e);
}
printEnd();
System.out.println("-------- SM4批量数据加解密功能测试结束 --------\n");
}
public void sm4macBatchFunc() {
System.out.println("-------- SM4MAC批量数据功能测试开始 --------");
SydApi api = connect();
List<byte[]> data = new ArrayList<>();
data.add(new byte[1024]);
data.add(new byte[1024]);
data.add(new byte[1024]);
data.add(new byte[1024]);
List<byte[]> data_toolong = new ArrayList<>(); //数据长度大于1024 测试
data_toolong.add(new byte[1025]);
data_toolong.add(new byte[1025]);
data_toolong.add(new byte[1025]);
data_toolong.add(new byte[1025]);
int[] keyIdx = new int[]{0, 0, 0, 0};
int[] keyIdx_incorrect = new int[]{-1, -1, -1, -1}; //不正确索引测试
int[] keyIdx_insufficient = new int[]{0, 0}; //索引个数与数据个数不一致
List<byte[]> pcMac = new ArrayList<>();
pcMac.add(new byte[1024]);
pcMac.add(new byte[1024]);
pcMac.add(new byte[1024]);
pcMac.add(new byte[1024]);
List<byte[]> pcMac_toolong = new ArrayList<>();
pcMac_toolong.add(new byte[1050]);
pcMac_toolong.add(new byte[1050]);
pcMac_toolong.add(new byte[1050]);
pcMac_toolong.add(new byte[1050]);
printBegin();
try{
List<String> verifyDatas = new ArrayList<>(); //用第三方工具算出的sm4mac和接口算的对比
verifyDatas.add("7CEDAE1E836889962F8C06C0501613F8");//对应计算的明文“01”明文为16进制数据
verifyDatas.add("CE088A908C8902F3B97AF3788FC7DF03");//对应计算的明文“0102”
verifyDatas.add("77F320521CE785E1561A3C3048DDC109");//对应计算的明文“010203”
verifyDatas.add("9785D703722AA20388A3DA1EFC94A9A4");//对应计算的明文“01020304”
verifyDatas.add("D188E611873AE220A61F9F1C0616357A");//对应计算的明文“0102030405”
verifyDatas.add("1A6599B031786511B9E3A8C1FDC12B8D");//对应计算的明文“010203040506”
verifyDatas.add("7C8BC8CADC9C70677492EDD393963E12");//对应计算的明文“01020304050607”
verifyDatas.add("EBC4DEC72A537C82AA40E14FC5586B6A");//对应计算的明文“0102030405060708”
verifyDatas.add("AED342547B4615210CC1B194D6166D9A");//对应计算的明文“010203040506070809”
verifyDatas.add("2AD7BAE1AB13880263335F7BA829A91A");//对应计算的明文“0102030405060708090A”
verifyDatas.add("FCECADBAB814904302CB4FD5C1509D7D");//对应计算的明文“0102030405060708090A0B”
verifyDatas.add("8125EA5F71B67C7FACFB581497723C2D");//对应计算的明文“0102030405060708090A0B0C”
verifyDatas.add("3CEB76630ABA335B14D9A5092A32203D");//对应计算的明文“0102030405060708090A0B0C0D”
verifyDatas.add("37E63B7EE45337C7B3B760E648A74B8D");//对应计算的明文“0102030405060708090A0B0C0D0E”
verifyDatas.add("3C6D5E1FE647AB510E09812DD1F4F286");//对应计算的明文“0102030405060708090A0B0C0D0E0F”
verifyDatas.add("90D7B07D7D3A548A2C4D3EAE20BDCA63");//对应计算的明文“0102030405060708090A0B0C0D0E0F10”
List<byte[]> datas = new ArrayList<>();
int[] keys = new int[16];
for (int i=1; i<=16; i++){
datas.add(genBytes(i));
keys[i-1] = 0;
}
List<byte[]> s = api.SYD_SM4Mac_BatchData(keys, datas);
for(int i=0; i<datas.size(); i++){
log("sm4macBatchFunc___明文: " + Util.bytes2HexString(datas.get(i)), false );
log("sm4macBatchFunc___计算结果: " + Util.bytes2HexString(s.get(i)), false );
}
boolean isSuc = true;
for(int i=0; i<datas.size(); i++){
if(!(verifyDatas.get(i).equals(Util.bytes2HexString(s.get(i)))) ){
isSuc = false;
break;
}
}
if (isSuc) {
System.out.println("输入正确的数据数据大于1组SM4MAC批量数据测试成功");
} else {
System.out.println("输入正确的数据数据大于1组SM4MAC批量数据测试失败");
}
} catch(SydApiException e){
printException("输入正确的数据数据大于1组", e);
}
printEnd();
printBegin();
try{
List<byte[]> datas = new ArrayList<>();
int[] keys = new int[16];
for (int i=1; i<=16; i++){
datas.add(genBytes(i));
keys[i-1] = 0;
}
List<byte[]> s = api.SYD_SM4Mac_BatchData(keys, datas);
boolean[] check = api.SYD_SM4Mac_BatchData(keys, datas, s);
for(int i=0; i<datas.size(); i++){
log("sm4macBatchFunc___明文: " + Util.bytes2HexString(datas.get(i)), false );
log("sm4macBatchFunc___计算结果: " + Util.bytes2HexString(s.get(i)), false );
log("sm4macBatchFunc___校验结果: " + check[i], false );
}
if (isAllTrue(check)) {
System.out.println("输入正确的数据数据大于1组SM4MAC批量数据校验成功");
} else {
System.out.println("输入正确的数据数据大于1组SM4MAC批量数据校验失败");
}
} catch(SydApiException e){
printException("输入正确的数据数据大于1组", e);
}
printEnd();
printBegin();
try{
List<byte[]> s = api.SYD_SM4Mac_BatchData(keyIdx_incorrect, data);
System.out.println("输入不正确的密钥索引信息数据大于1组mac计算成功");
}catch (SydApiException e){
printException("输入不正确的密钥索引信息数据大于1组mac计算失败", e);
}
printEnd();
printBegin();
try{
List<byte[]> s = api.SYD_SM4Mac_BatchData(keyIdx, data);
System.out.println("正常传参mac计算成功");
boolean[] check = api.SYD_SM4Mac_BatchData(keyIdx_incorrect, data, s);
if(isAllTrue(check)){
System.out.println("调用批量数据MAC校验接口输入不正确的密钥索引信息数据大于1组mac校验成功");
} else {
System.out.println("调用批量数据MAC校验接口输入不正确的密钥索引信息数据大于1组mac校验失败");
}
} catch (SydApiException e){
printException("调用批量数据MAC校验接口输入不正确的密钥索引信息数据大于1组mac校验失败", e);
}
printEnd();
printBegin();
try{
List<byte[]> s = api.SYD_SM4Mac_BatchData(keyIdx, data);
System.out.println("正常传参mac计算成功");
boolean[] check = api.SYD_SM4Mac_BatchData(keyIdx, data, pcMac);
if(isAllTrue(check)){
System.out.println("pcMAC输入不正确的MAC值mac校验成功");
} else {
System.out.println("pcMAC输入不正确的MAC值mac校验失败");
}
} catch (SydApiException e){
printException("pcMAC输入不正确的MAC值mac校验失败", e);
}
printEnd();
printBegin();
try{
List<byte[]> s = api.SYD_SM4Mac_BatchData(keyIdx, data_toolong);
System.out.println("数据大于1组单个数据长度大于1024mac计算成功");
} catch (SydApiException e){
printException("数据大于1组单个数据长度大于1024mac计算失败", e);
}
printEnd();
printBegin();
try{
List<byte[]> s = api.SYD_SM4Mac_BatchData(keyIdx, data);
System.out.println("正常传参mac计算成功");
boolean[] check = api.SYD_SM4Mac_BatchData(keyIdx, data, pcMac_toolong);
if(isAllTrue(check)){
System.out.println("pcMac数据长度大于1024+16mac校验成功");
} else {
System.out.println("pcMac数据长度大于1024+16mac校验失败");
}
} catch (SydApiException e){
printException("pcMac数据长度大于1024+16mac校验失败", e);
}
printEnd();
printBegin();
try{
List<byte[]> s = api.SYD_SM4Mac_BatchData(keyIdx_insufficient, data);
System.out.println("索引个数与明文个数不一致mac计算成功");
} catch (Exception e){
System.out.println("索引个数与明文个数不一致mac计算失败 " + e.getMessage());
}
printEnd();
printBegin();
try{
List<byte[]> s = api.SYD_SM4Mac_BatchData(keyIdx, data);
System.out.println("正常传参mac计算成功");
boolean[] check = api.SYD_SM4Mac_BatchData(keyIdx_insufficient, data, s);
if(isAllTrue(check)){
System.out.println("索引个数与密文个数不一致mac校验成功");
} else {
System.out.println("索引个数与密文个数不一致mac校验失败");
}
} catch (Exception e){
System.out.println("索引个数与密文个数不一致mac校验 异常:" + e.getMessage());
}
printEnd();
System.out.println("-------- SM4MAC批量数据功能测试结束 --------\n");
}
public void sm4ShortMacFunc() {
System.out.println("-------- 短数据加密计算MAC功能测试开始 --------");
SydApi api = connect();
int keyEnc = 0;
int keyEnc_incorrect = -1;
int keyMac = 0;
int keyMac_incorrect = -1;
byte[] data = new byte[1024];
byte[] data_incorrect = new byte[1025];
printBegin();
try{
boolean isSuc = true;
for(int i=1; i<=1024; i++){
byte[] bytes = genBytes(i);
log("sm4ShortMacFunc___明文:" + Util.bytes2HexString(bytes), false);
DataAndMac en_data = api.SYD_SM4_EncryptAndMac_ShortData(keyEnc, keyMac, bytes);
log("sm4ShortMacFunc___计算后密文:" + Util.bytes2HexString(en_data.getData()), false);
log("sm4ShortMacFunc___计算后mac:" + Util.bytes2HexString(en_data.getMac()), false);
DataAndMacCheck dataAndMacCheck = api.SYD_SM4_CheckMacAndDecrypt_ShortData(keyEnc, keyMac, en_data.getData(), en_data.getMac());
log("sm4ShortMacFunc___计算后明文:" + Util.bytes2HexString(dataAndMacCheck.getData()), false);
log("sm4ShortMacFunc___计算后校验结果:" + dataAndMacCheck.getMacCheck(), false);
if(!(Util.bytes2HexString(bytes).equals(Util.bytes2HexString(dataAndMacCheck.getData())))){
isSuc = false;
break;
}
if(!dataAndMacCheck.getMacCheck()){
isSuc = false;
break;
}
}
if(isSuc){
System.out.println("输入正确入参, 计算成功");
} else {
System.out.println("输入正确入参, 计算失败");
}
} catch (SydApiException e){
printException("输入正确入参,计算失败", e);
} catch (Exception e){
e.printStackTrace();
}
printEnd();
printBegin();
try{
DataAndMac en_data = api.SYD_SM4_EncryptAndMac_ShortData(keyEnc_incorrect, keyMac, data);
System.out.println("输入不正确的加密密钥索引,密文:" + Util.bytes2HexString(en_data.getData()));
System.out.println("输入不正确的加密密钥索引,mac:" + Util.bytes2HexString(en_data.getMac()));
} catch (SydApiException e){
printException("输入不正确的加密密钥索引,计算失败", e);
}
printEnd();
printBegin();
try{
DataAndMac en_data = api.SYD_SM4_EncryptAndMac_ShortData(keyEnc, keyMac_incorrect, data);
System.out.println("输入不正确的MAC密钥索引,密文:" + Util.bytes2HexString(en_data.getData()));
System.out.println("输入不正确的MAC密钥索引,mac:" + Util.bytes2HexString(en_data.getMac()));
} catch (SydApiException e){
printException("输入不正确的MAC密钥索引,计算失败", e);
}
printEnd();
printBegin();
try{
DataAndMac en_data = api.SYD_SM4_EncryptAndMac_ShortData(keyEnc, keyMac, data_incorrect);
System.out.println("输入数据长度大于1K,密文:" + Util.bytes2HexString(en_data.getData()));
System.out.println("输入数据长度大于1K,mac:" + Util.bytes2HexString(en_data.getMac()));
} catch (SydApiException e){
printException("输入数据长度大于1K,计算失败", e);
}
printEnd();
// System.out.println("step1");
// DataAndMac en_data1 = api.SYD_SM4_EncryptAndMac_ShortData(keyEnc, keyMac, data);
// System.out.println("step2");
// DataAndMacCheck de_data1 = api.SYD_SM4_CheckMacAndDecrypt_ShortData(keyEnc, keyMac, en_data1.getData(), en_data1.getMac());
// System.out.println("step3 " + de_data1.getMacCheck());
//
// //错误测试
// System.out.println("MAC校验失败不继续进行解密测试");
// DataAndMacCheck de_data_err = api.SYD_SM4_CheckMacAndDecrypt_ShortData(keyEnc, keyMac, en_data1.getData(), new byte[16]);
// System.out.println("错误测试返回MAC校验结果"+de_data_err.getMacCheck());
// try {
// DataAndMac en_data2 = api.SYD_SM4_EncryptAndMac_ShortData(keyEnc, keyMac, data);
// 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 测试失败");
// e.printStackTrace();
// }
// }
// 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 {
// data = new byte[1025];
// api.SYD_SM4_EncryptAndMac_ShortData(keyEnc, keyMac, data);
// System.out.println("短数据加密计算MAC校验MAC解密长度超出测试失败");
// } catch (SydApiException e) {
// System.out.println("短数据加密计算MAC校验MAC解密长度超出测试成功");
// }
// if ( ! isShortLink ){
// System.out.println("long link");
// EncryptAndMac.conformance_testcase1_SYD_SM4_EncryptAndMac_ShortData((SydApiLongLinkWrap) api);
// EncryptAndMac.conformance_testcase2_SYD_SM4_EncryptAndMac_ShortData((SydApiLongLinkWrap) api);
// } else {
// System.out.println("short link");
// }
System.out.println("-------- 短数据加密计算MAC功能测试结束 --------\n");
}
public void sm4ShortMacFunc_check() {
System.out.println("-------- 短数据校验MAC解密功能测试开始 --------");
SydApi api = connect();
int keyEnc = 0;
int keyEnc_incorrect = -1;
int keyMac = 0;
int keyMac_incorrect = -1;
byte[] data = new byte[1024];
byte[] data_incorrect = new byte[1025];
byte[] endata_incorrect = new byte[1050]; //测试密文数据长度大于1024+16
byte[] endata_bad = new byte[1024]; //测试密文信息不正确
byte[] pcMac_incorrect = new byte[16]; //测试输入MAC长度为16字节但不正确
byte[] pcMac_bad = new byte[15]; //测试输入MAC长度不为16字节
printBegin();
try{
boolean isSuc = true;
for(int i=1; i<=1024; i++){
byte[] bytes = genBytes(i);
log("sm4ShortMacFunc___明文:" + Util.bytes2HexString(bytes), false);
DataAndMac en_data = api.SYD_SM4_EncryptAndMac_ShortData(keyEnc, keyMac, bytes);
log("sm4ShortMacFunc___计算后密文:" + Util.bytes2HexString(en_data.getData()), false);
log("sm4ShortMacFunc___计算后mac:" + Util.bytes2HexString(en_data.getMac()), false);
DataAndMacCheck dataAndMacCheck = api.SYD_SM4_CheckMacAndDecrypt_ShortData(keyEnc, keyMac, en_data.getData(), en_data.getMac());
log("sm4ShortMacFunc___计算后明文:" + Util.bytes2HexString(dataAndMacCheck.getData()), false);
log("sm4ShortMacFunc___计算后校验结果:" + dataAndMacCheck.getMacCheck(), false);
if(!(Util.bytes2HexString(bytes).equals(Util.bytes2HexString(dataAndMacCheck.getData())))){
isSuc = false;
break;
}
if(!dataAndMacCheck.getMacCheck()){
isSuc = false;
break;
}
}
if(isSuc){
System.out.println("输入正确入参, 校验成功");
} else {
System.out.println("输入正确入参, 校验失败");
}
} catch (SydApiException e){
printException("输入正确入参,校验失败", e);
e.printStackTrace();
}
printEnd();
printBegin();
try{
DataAndMac en_data = api.SYD_SM4_EncryptAndMac_ShortData(keyEnc, keyMac, data);
System.out.println("明文:1024个字节的0");
System.out.println("输入正确入参,密文:" + Util.bytes2HexString(en_data.getData()));
System.out.println("输入正确入参,mac:" + Util.bytes2HexString(en_data.getMac()));
DataAndMacCheck de_data = api.SYD_SM4_CheckMacAndDecrypt_ShortData(keyEnc_incorrect, keyMac, en_data.getData(), en_data.getMac());
if(Util.bytes2HexString(data).equals(de_data.getData())){
System.out.println("输入不正确的加密密钥索引,解密得到明文:" + Util.bytes2HexString(de_data.getData()));
} else {
System.out.println("输入不正确的加密密钥索引,解密得到明文失败");
}
System.out.println("输入不正确的加密密钥索引,mac校验:" + de_data.getMacCheck());
} catch (SydApiException e){
printException("输入不正确的加密密钥索引, 计算校验失败", e);
}
printEnd();
printBegin();
try{
DataAndMac en_data = api.SYD_SM4_EncryptAndMac_ShortData(keyEnc, keyMac, data);
System.out.println("明文:1024个字节的0");
System.out.println("输入正确入参,密文:" + Util.bytes2HexString(en_data.getData()));
System.out.println("输入正确入参,mac:" + Util.bytes2HexString(en_data.getMac()));
DataAndMacCheck de_data = api.SYD_SM4_CheckMacAndDecrypt_ShortData(keyEnc, keyMac_incorrect, en_data.getData(), en_data.getMac());
if(Util.bytes2HexString(data).equals(de_data.getData())){
System.out.println("输入不正确的MAC密钥索引,解密得到明文:" + Util.bytes2HexString(de_data.getData()));
} else {
System.out.println("输入不正确的MAC密钥索引,解密得到明文失败");
}
System.out.println("输入不正确的MAC密钥索引,mac校验:" + de_data.getMacCheck());
} catch (SydApiException e){
printException("输入不正确的MAC密钥索引,计算校验失败", e);
}
printEnd();
printBegin();
try{
DataAndMac en_data = api.SYD_SM4_EncryptAndMac_ShortData(keyEnc, keyMac, data);
System.out.println("明文:1024个字节的0");
System.out.println("输入正确入参,密文:" + Util.bytes2HexString(en_data.getData()));
System.out.println("输入正确入参,mac:" + Util.bytes2HexString(en_data.getMac()));
DataAndMacCheck de_data = api.SYD_SM4_CheckMacAndDecrypt_ShortData(keyEnc, keyMac, endata_incorrect, en_data.getMac());
System.out.println("密文数据长度大于1024+16,解密得到明文:" + Util.bytes2HexString(de_data.getData()));
System.out.println("密文数据长度大于1024+16,mac校验:" + de_data.getMacCheck());
} catch (SydApiException e){
printException("密文数据长度大于1024+16,计算校验失败", e);
}
printEnd();
printBegin();
try{
DataAndMac en_data = api.SYD_SM4_EncryptAndMac_ShortData(keyEnc, keyMac, data);
System.out.println("明文:1024个字节的0");
System.out.println("输入正确入参,密文:" + Util.bytes2HexString(en_data.getData()));
System.out.println("输入正确入参,mac:" + Util.bytes2HexString(en_data.getMac()));
DataAndMacCheck de_data = api.SYD_SM4_CheckMacAndDecrypt_ShortData(keyEnc, keyMac, en_data.getData(), pcMac_incorrect);
if(Util.bytes2HexString(data).equals(de_data.getData())){
System.out.println("输入MAC长度为16字节但不正确,解密得到明文:" + Util.bytes2HexString(de_data.getData()));
} else {
System.out.println("输入MAC长度为16字节但不正确,解密得到明文失败");
}
System.out.println("输入MAC长度为16字节但不正确,mac校验:" + de_data.getMacCheck());
} catch (SydApiException e){
printException("输入MAC长度为16字节但不正确,计算校验失败", e);
}
printEnd();
printBegin();
try{
DataAndMac en_data = api.SYD_SM4_EncryptAndMac_ShortData(keyEnc, keyMac, data);
System.out.println("明文:1024个字节的0");
System.out.println("输入正确入参,密文:" + Util.bytes2HexString(en_data.getData()));
System.out.println("输入正确入参,mac:" + Util.bytes2HexString(en_data.getMac()));
DataAndMacCheck de_data = api.SYD_SM4_CheckMacAndDecrypt_ShortData(keyEnc, keyMac, en_data.getData(), pcMac_bad);
if(Util.bytes2HexString(data).equals(de_data.getData())){
System.out.println("输入MAC长度不为16字节,解密得到明文:" + Util.bytes2HexString(de_data.getData()));
} else {
System.out.println("输入MAC长度不为16字节,解密得到明文失败");
}
System.out.println("输入MAC长度不为16字节,mac校验:" + de_data.getMacCheck());
} catch (SydApiException e){
printException("输入MAC长度不为16字节,计算校验失败", e);
}
printEnd();
printBegin();
try{
DataAndMac en_data = api.SYD_SM4_EncryptAndMac_ShortData(keyEnc, keyMac, data);
System.out.println("明文:1024个字节的0");
System.out.println("输入正确入参,密文:" + Util.bytes2HexString(en_data.getData()));
System.out.println("输入正确入参,mac:" + Util.bytes2HexString(en_data.getMac()));
DataAndMacCheck de_data = api.SYD_SM4_CheckMacAndDecrypt_ShortData(keyEnc, keyMac, endata_bad, en_data.getMac());
if(Util.bytes2HexString(data).equals(de_data.getData())){
System.out.println("密文信息不正确,解密得到明文:" + Util.bytes2HexString(de_data.getData()));
} else {
System.out.println("密文信息不正确,解密得到明文失败");
}
System.out.println("密文信息不正确,mac校验:" + de_data.getMacCheck());
} catch (SydApiException e){
printException("密文信息不正确,计算校验失败", e);
}
printEnd();
System.out.println("-------- 短数据校验MAC解密功能测试结束 --------\n");
}
public void sm4BatchMacFunc() {
System.out.println("-------- 批量数据加密计算MAC功能测试开始 --------");
SydApi api = connect();
List<byte[]> 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]);
List<byte[]> data_toolong = new ArrayList<>();
data_toolong.add(new byte[1025]);
data_toolong.add(new byte[1025]);
data_toolong.add(new byte[1025]);
data_toolong.add(new byte[1025]);
data_toolong.add(new byte[1025]);
data_toolong.add(new byte[1025]);
data_toolong.add(new byte[1025]);
int[] keyEnc = new int[]{0, 0, 0, 0, 0, 0, 0};
int[] keyEnc_incorrect = new int[]{-1, -1, -1, -1, -1, -1, -1};
int[] keyMac = new int[]{0, 0, 0, 0, 0, 0, 0};
int[] keyMac_incorrect = new int[]{-1, -1, -1, -1, -1, -1, -1};
printBegin();
try{
int max = 1024;
List<byte[]> data_test = new ArrayList<>();
int[] keytest = new int[max];
for(int i=0; i<max; i++){
data_test.add(new byte[1024]);
}
boolean isSuc = true;
List<DataAndMac> en_data = api.SYD_SM4_EncryptAndMac_BatchData(keytest, keytest, data_test);
List<DataAndMacCheck> de_data = api.SYD_SM4_CheckMacAndDecrypt_BatchData(keytest, keytest, en_data);
for(int i=0; i<en_data.size(); i++) {
log("sm4BatchMacFunc___明文:" + Util.bytes2HexString(data_test.get(i)), false);
log("sm4BatchMacFunc___加密后:" + Util.bytes2HexString(en_data.get(i).getData()), false);
log("sm4BatchMacFunc___加密后mac:" + Util.bytes2HexString(en_data.get(i).getMac()), false);
log("sm4BatchMacFunc___解密后:" + Util.bytes2HexString(de_data.get(i).getData()), false);
log("sm4BatchMacFunc___校验:" + de_data.get(i).getMacCheck(), false);
if(!(Util.bytes2HexString(data_test.get(i)).equals(Util.bytes2HexString(de_data.get(i).getData())))){
isSuc = false;
break;
}
if(!de_data.get(i).getMacCheck()){
isSuc = false;
break;
}
}
if(isSuc){
System.out.println("输入正确入参,计算成功");
} else {
System.out.println("输入正确入参,计算失败");
}
} catch(SydApiException e){
printException("输入正确入参,计算失败", e);
}
printEnd();
printBegin();
try{
List<DataAndMac> en_data = api.SYD_SM4_EncryptAndMac_BatchData(keyEnc_incorrect, keyMac, data);
System.out.println("明文: 7组数据每组数据都是1024个字节的0");
for(DataAndMac content:en_data) {
System.out.println("输入不正确的加密密钥索引,密文:" + Util.bytes2HexString(content.getData()));
System.out.println("输入不正确的加密密钥索引,mac:" + Util.bytes2HexString(content.getMac()));
}
} catch(SydApiException e){
printException("输入不正确的加密密钥索引,计算失败", e);
}
printEnd();
printBegin();
try{
List<DataAndMac> en_data = api.SYD_SM4_EncryptAndMac_BatchData(keyEnc, keyMac_incorrect, data);
System.out.println("明文: 7组数据每组数据都是1024个字节的0");
for(DataAndMac content:en_data) {
System.out.println("输入不正确的MAC密钥索引,密文:" + Util.bytes2HexString(content.getData()));
System.out.println("输入不正确的MAC密钥索引,mac:" + Util.bytes2HexString(content.getMac()));
}
} catch(SydApiException e){
printException("输入不正确的MAC密钥索引,计算失败", e);
}
printEnd();
printBegin();
try{
List<DataAndMac> en_data = api.SYD_SM4_EncryptAndMac_BatchData(keyEnc, keyMac, data_toolong);
for(DataAndMac content:en_data) {
System.out.println("输入加密数据长度超过1K,密文:" + Util.bytes2HexString(content.getData()));
System.out.println("输入加密数据长度超过1K,mac:" + Util.bytes2HexString(content.getMac()));
}
} catch(SydApiException e){
printException("输入加密数据长度超过1K,计算失败", e);
}
printEnd();
// if ( ! isShortLink ){
// System.out.println("long link");
// EncryptAndMac.conformance_testcase1_sm4BatchMacFunc((SydApiLongLinkWrap) api);
// EncryptAndMac.conformance_testcase2_sm4BatchMacFunc((SydApiLongLinkWrap) api);
// } else {
// System.out.println("short link");
// }
System.out.println("-------- 批量数据加密计算MAC功能测试结束 --------\n");
}
public void sm4BatchMacFunc_check() {
System.out.println("-------- 批量数据校验MAC解密功能测试开始 --------");
SydApi api = connect();
List<byte[]> 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[] keyEnc_incorrect = new int[]{-1, -1, -1, -1, -1, -1, -1};
int[] keyMac = new int[]{0, 0, 0, 0, 0, 0, 0};
int[] keyMac_incorrect = new int[]{-1, -1, -1, -1, -1, -1, -1};
printBegin();
try{
int max = 1024;
List<byte[]> data_test = new ArrayList<>();
int[] keytest = new int[max];
for(int i=0; i<max; i++){
data_test.add(new byte[1024]);
}
boolean isSuc = true;
List<DataAndMac> en_data = api.SYD_SM4_EncryptAndMac_BatchData(keytest, keytest, data_test);
List<DataAndMacCheck> de_data = api.SYD_SM4_CheckMacAndDecrypt_BatchData(keytest, keytest, en_data);
for(int i=0; i<en_data.size(); i++) {
log("sm4BatchMacFunc_check___明文:" + Util.bytes2HexString(data_test.get(i)), false);
log("sm4BatchMacFunc_check___加密后:" + Util.bytes2HexString(en_data.get(i).getData()), false);
log("sm4BatchMacFunc_check___加密后mac:" + Util.bytes2HexString(en_data.get(i).getMac()), false);
log("sm4BatchMacFunc_check___解密后:" + Util.bytes2HexString(de_data.get(i).getData()), false);
log("sm4BatchMacFunc_check___校验:" + de_data.get(i).getMacCheck(), false);
if(!(Util.bytes2HexString(data_test.get(i)).equals(Util.bytes2HexString(de_data.get(i).getData())))){
isSuc = false;
break;
}
if(!de_data.get(i).getMacCheck()){
isSuc = false;
break;
}
}
if(isSuc){
System.out.println("输入正确入参,计算成功");
} else {
System.out.println("输入正确入参,计算失败");
}
} catch(SydApiException e){
printException("输入正确入参,计算失败", e);
}
printEnd();
printBegin();
try{
List<DataAndMac> en_data = api.SYD_SM4_EncryptAndMac_BatchData(keyEnc, keyMac, data);
System.out.println("明文: 7组数据每组数据都是1024个字节的0");
for(DataAndMac content:en_data) {
System.out.println("输入正确入参,密文:" + Util.bytes2HexString(content.getData()));
System.out.println("输入正确入参,mac:" + Util.bytes2HexString(content.getMac()));
}
System.out.println("输入不正确的加密密钥索引,解密及校验如下");
List<DataAndMacCheck> de_data = api.SYD_SM4_CheckMacAndDecrypt_BatchData(keyEnc_incorrect, keyMac, en_data);
for(DataAndMacCheck content:de_data) {
System.out.println("输入不正确的加密密钥索引,解密后:" + Util.bytes2HexString(content.getData()));
System.out.println("输入不正确的加密密钥索引,mac校验:" + content.getMacCheck() );
}
}catch(SydApiException e){
printException("输入不正确的加密密钥索引,校验失败", e);
}
printEnd();
printBegin();
try{
List<DataAndMac> en_data = api.SYD_SM4_EncryptAndMac_BatchData(keyEnc, keyMac, data);
System.out.println("明文: 7组数据每组数据都是1024个字节的0");
for(DataAndMac content:en_data) {
System.out.println("输入正确入参,密文:" + Util.bytes2HexString(content.getData()));
System.out.println("输入正确入参,mac:" + Util.bytes2HexString(content.getMac()));
}
System.out.println("输入不正确的MAC密钥索引解密及校验如下");
List<DataAndMacCheck> de_data = api.SYD_SM4_CheckMacAndDecrypt_BatchData(keyEnc, keyMac_incorrect, en_data);
for(DataAndMacCheck content:de_data) {
System.out.println("输入不正确的MAC密钥索引,解密后:" + Util.bytes2HexString(content.getData()));
System.out.println("输入不正确的MAC密钥索引,mac校验:" + content.getMacCheck() );
}
}catch(SydApiException e){
printException("输入不正确的MAC密钥索引,校验失败", e);
}
printEnd();
printBegin();
try{
List<DataAndMac> en_data = api.SYD_SM4_EncryptAndMac_BatchData(keyEnc, keyMac, data);
System.out.println("明文: 7组数据每组数据都是1024个字节的0");
for(DataAndMac content:en_data) {
System.out.println("输入正确入参,密文:" + Util.bytes2HexString(content.getData()));
System.out.println("输入正确入参,mac:" + Util.bytes2HexString(content.getMac()));
}
System.out.println("密文数据长度大于1024+16解密及校验如下");
for(DataAndMac dataTemp : en_data){
dataTemp.setData(mergeByteArrays(dataTemp.getData(),new byte[1024]));
}
List<DataAndMacCheck> de_data = api.SYD_SM4_CheckMacAndDecrypt_BatchData(keyEnc, keyMac, en_data);
for(DataAndMacCheck content:de_data) {
System.out.println("密文数据长度大于1024+16,解密后:" + Util.bytes2HexString(content.getData()));
System.out.println("密文数据长度大于1024+16,mac校验:" + content.getMacCheck() );
}
}catch(SydApiException e){
printException("密文数据长度大于1024+16", e);
}
printEnd();
printBegin();
try{
List<DataAndMac> en_data = api.SYD_SM4_EncryptAndMac_BatchData(keyEnc, keyMac, data);
System.out.println("明文: 7组数据每组数据都是1024个字节的0");
for(DataAndMac content:en_data) {
System.out.println("输入正确入参,密文:" + Util.bytes2HexString(content.getData()));
System.out.println("输入正确入参,mac:" + Util.bytes2HexString(content.getMac()));
}
System.out.println("密文校验值长度不为16解密及校验如下");
for(DataAndMac dataTemp : en_data){
dataTemp.setMac(new byte[15]);
}
List<DataAndMacCheck> de_data = api.SYD_SM4_CheckMacAndDecrypt_BatchData(keyEnc, keyMac, en_data);
for(DataAndMacCheck content:de_data) {
if(content.getData() == null){
System.out.println("密文校验值长度不为16,解密后: 明文数据为空");
} else {
System.out.println("密文校验值长度不为16,解密后:" + Util.bytes2HexString(content.getData()));
}
System.out.println("密文校验值长度不为16,mac校验:" + content.getMacCheck() );
}
}catch(SydApiException e){
printException("密文校验值长度不为16", e);
}catch (Exception e){
e.printStackTrace();
}
printEnd();
printBegin();
try{
List<DataAndMac> en_data = api.SYD_SM4_EncryptAndMac_BatchData(keyEnc, keyMac, data);
System.out.println("明文: 7组数据每组数据都是1024个字节的0");
for(DataAndMac content:en_data) {
System.out.println("输入正确入参,密文:" + Util.bytes2HexString(content.getData()));
System.out.println("输入正确入参,mac:" + Util.bytes2HexString(content.getMac()));
}
System.out.println("密文校验值长度为16但不正确解密及校验如下");
for(DataAndMac dataTemp : en_data){
dataTemp.setMac(new byte[16]);
}
List<DataAndMacCheck> de_data = api.SYD_SM4_CheckMacAndDecrypt_BatchData(keyEnc, keyMac, en_data);
for(DataAndMacCheck content:de_data) {
if(content.getData() == null){
System.out.println("密文校验值长度为16但不正确,解密后: 明文数据为空");
} else {
System.out.println("密文校验值长度为16但不正确,解密后:" + Util.bytes2HexString(content.getData()));
}
System.out.println("密文校验值长度为16但不正确,mac校验:" + content.getMacCheck() );
}
}catch(SydApiException e){
printException("密文校验值长度为16但不正确", e);
}
printEnd();
printBegin();
try{
List<DataAndMac> en_data = api.SYD_SM4_EncryptAndMac_BatchData(keyEnc, keyMac, data);
System.out.println("明文: 7组数据每组数据都是1024个字节的0");
for(DataAndMac content:en_data) {
System.out.println("输入正确入参,密文:" + Util.bytes2HexString(content.getData()));
System.out.println("输入正确入参,mac:" + Util.bytes2HexString(content.getMac()));
}
System.out.println("输入密文不正确,解密及校验如下");
for(DataAndMac dataTemp : en_data){
Arrays.fill(dataTemp.getData(), 10, 30, (byte)0);
}
List<DataAndMacCheck> de_data = api.SYD_SM4_CheckMacAndDecrypt_BatchData(keyEnc, keyMac, en_data);
for(DataAndMacCheck content:de_data) {
if(content.getData() == null){
System.out.println("输入密文不正确,解密后: 明文数据为空");
} else {
System.out.println("输入密文不正确,解密后:" + Util.bytes2HexString(content.getData()));
}
System.out.println("输入密文不正确,mac校验:" + content.getMacCheck() );
}
}catch(SydApiException e){
printException("输入密文不正确", e);
}
printEnd();
// if ( ! isShortLink ){
// System.out.println("long link");
// EncryptAndMac.conformance_testcase1_sm4BatchMacFunc((SydApiLongLinkWrap) api);
// EncryptAndMac.conformance_testcase2_sm4BatchMacFunc((SydApiLongLinkWrap) api);
// } else {
// System.out.println("short link");
// }
System.out.println("-------- 批量数据校验MAC解密功能测试结束 --------\n");
}
public void loggerFunc() {
String pcLogPath = "./logs";
System.out.println("-------- 设置日志配置功能测试开始 --------");
printBegin();
try{
for(int i=0; i<4; i++){
SydApi.SYD_SetLogConfig(pcLogPath,i );
}
System.out.println("调用该接口设置日志路径分别日志级别为0123, 设置成功");
} catch (Exception e){
System.out.println("调用该接口设置日志路径分别日志级别为0123, 设置失败 异常: " + e.getMessage());
}
printEnd();
printBegin();
try{
SydApi.SYD_SetLogConfig("testlogpath/",3);
System.out.println("日志路径不存在, 设置成功");
} catch (Exception e){
System.out.println("日志路径不存在, 设置失败 异常: " + e.getMessage());
}
try{
SydApi.SYD_SetLogConfig("./logs",5);
System.out.println("日志级别不存在, 设置成功");
} catch (Exception e){
System.out.println("日志级别不存在, 设置失败 异常: " + e.getMessage());
}
printEnd();
System.out.println("-------- 设置日志配置功能测试结束 --------\n");
}
public void funcAll() {
//切换短链接 长连接 对这几个测试无影响
this.loggerFunc();
this.connectFunc();
this.longConnectFunc();
this.disconnectFunc();
this.changeConnect(false); //设置成长连接把相关功能测试下
this.sm3ShortFunc();
this.sm3LongFunc();
this.sm4ShortFunc();
this.sm4LongFunc();
this.sm4macShortFunc();
this.sm4macLongFunc();
this.sm4BatchFunc();
this.sm4macBatchFunc();
this.sm4ShortMacFunc();
this.sm4BatchMacFunc();
this.sm4ShortMacFunc_check();
this.sm4BatchMacFunc_check();
this.sm4macLongFunc_ISM4Mac();
this.sm4LongFunc_ISM4();
this.sm3LongFunc_ISM3();
this.changeConnect(true); //设置成短连接把相关功能测试下
this.sm3ShortFunc();
this.sm3LongFunc();
this.sm4ShortFunc();
this.sm4LongFunc();
this.sm4macShortFunc();
this.sm4macLongFunc();
this.sm4BatchFunc();
this.sm4macBatchFunc();
this.sm4ShortMacFunc();
this.sm4BatchMacFunc();
this.sm4ShortMacFunc_check();
this.sm4BatchMacFunc_check();
this.sm4macLongFunc_ISM4Mac();
this.sm4LongFunc_ISM4();
this.sm3LongFunc_ISM3();
}
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");
System.out.println("10. SM4批量数据加密后生成MAC");
System.out.println("11. SM4长数据MAC");
System.out.println("12. SM4长数据加解密");
System.out.println("13. SM3长数据");
System.out.println("14. SM4长数据MAC(ISM4Mac)");
System.out.println("15. SM4长数据加解密(ISM4)");
System.out.println("16. SM3长数据(ISM3)");
System.out.println("17. SM4短数据解密验证MAC");
System.out.println("18. SM4批量数据验证MAC解密");
System.out.println("19. 断开短链接测试");
System.out.println("20. 切换连接为长连接模式");
System.out.println("21. 切换连接为短连接模式");
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 14:
test.sm4macLongFunc_ISM4Mac();
break;
case 15:
test.sm4LongFunc_ISM4();
break;
case 16:
test.sm3LongFunc_ISM3();
break;
case 17:
test.sm4ShortMacFunc_check();
break;
case 18:
test.sm4BatchMacFunc_check();
break;
case 19:
test.disconnectFunc();
break;
case 20:
test.changeConnect(false);
break;
case 21:
test.changeConnect(true);
break;
case -1:
flag = false;
break;
}
}
}
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);
}
private void printBegin(){
System.out.println("============begin============");
}
private void printEnd(){
System.out.println("============end============\n");
}
private boolean compareLists(List<byte[]> byteList, List<String> hexList) {
// 1. 检查列表长度
if (byteList.size() != hexList.size()) {
System.err.println("列表大小不同:"
+ byteList.size() + " vs " + hexList.size());
return false;
}
// 2. 逐项比较
for (int i = 0; i < byteList.size(); i++) {
byte[] byteData = byteList.get(i);
String hexStr = hexList.get(i);
// 方法1字节转十六进制比较
String convertedHex = Util.bytes2HexString(byteData);
if (!convertedHex.equals(hexStr)) {
System.err.printf("第 %d 项不匹配:\n期望: %s\n实际: %s\n",
i, hexStr.substring(0, 32) + "..." + hexStr.substring(hexStr.length() - 32),
convertedHex.substring(0, 32) + "..." + convertedHex.substring(convertedHex.length() - 32)
);
return false;
}
}
return true;
}
private boolean contentEquals(List<byte[]> list1, List<byte[]> list2) {
// 1. 检查基础条件
if (list1 == list2) return true;
if (list1 == null || list2 == null) return false;
if (list1.size() != list2.size()) return false;
// 2. 逐项比较数组内容
for (int i = 0; i < list1.size(); i++) {
byte[] arr1 = list1.get(i);
byte[] arr2 = list2.get(i);
if (!Arrays.equals(arr1, arr2)) {
// 可添加调试信息
System.err.printf("差异位置: %d\n数组1: %s\n数组2: %s\n",
i, Arrays.toString(arr1), Arrays.toString(arr2));
return false;
}
}
return true;
}
private boolean isAllTrue(boolean[] check){
if(check == null || check.length <= 0){
return false;
}
for (int i = 0; i < check.length; i++) {
if (!check[i]) {
return false;
}
}
return true;
}
private void log(String msg, boolean isPrintln){
if(isPrintln) {
System.out.println(msg);
}
log.debug(msg);
}
private void printException(String msg, SydApiException e){
System.out.println(msg + " 异常,retcode:" + e.getRetCode() + ",msg:" + e.getMessage());
if(false) { //需要输出到文本可以改为true
log.debug(msg + " 异常,retcode:" + e.getRetCode() + ",msg:" + e.getMessage());
}
}
private byte[] mergeByteArrays(byte[] array1, byte[] array2) {
// 创建新数组(长度为两个数组长度之和)
byte[] merged = new byte[array1.length + array2.length];
// 复制第一个数组到新数组开头位置
System.arraycopy(array1, 0, merged, 0, array1.length);
// 复制第二个数组到第一个数组之后的位置
System.arraycopy(array2, 0, merged, array1.length, array2.length);
return merged;
}
private byte[] mergeByteArrays(byte[]... arrays) {
// 校验输入
if (arrays == null) {
throw new IllegalArgumentException("输入数组集合不能为null");
}
// 1. 计算总长度
int totalLength = 0;
for (byte[] array : arrays) {
if (array != null) {
totalLength += array.length;
}
}
// 空数组处理
if (totalLength == 0) {
return new byte[0];
}
// 2. 创建合并目标数组
byte[] merged = new byte[totalLength];
// 3. 逐数组复制
int currentPosition = 0;
for (byte[] array : arrays) {
if (array != null && array.length > 0) {
System.arraycopy(array, 0, merged, currentPosition, array.length);
currentPosition += array.length;
}
}
return merged;
}
private byte[] genBytes(int num){
byte[] result = new byte[num];
for(int i=0; i<num; i++){
result[i] = (byte)(i+1);
}
return result;
}
public void zc_sm3ShortFunc() {
System.out.println("-------- SM3短数据功能测试开始 --------");
SydApi api = connect();
try{
boolean isSuc = true;
for (int i=1; i<=1024; i++){
byte[] data = new byte[i];
byte[] res = api.SYD_SM3_Hash_ShortData(data);
ISM3 sm3 = api.initSM3();
sm3.update(data);
byte[] res_2 = sm3.digest();
if(!(Util.bytes2HexString(res).equals(Util.bytes2HexString(res_2))) ){
isSuc = false;
break;
}
}
if(isSuc) {
System.out.println("正常传参,hash计算成功");
} else {
System.out.println("正常传参,hash计算失败");
}
} catch(SydApiException e){
printException("正常传参hash计算失败", e);
} finally {
api.SYD_Disconnect_Ex();
}
System.out.println("-------- SM3短数据功能测试结束 --------\n");
}
public void zc_sm3LongFunc() {
System.out.println("-------- SM3长数据功能测试开始 --------");
SydApi api = connect();
try{
boolean isSuc = true;
for (int i=1; i<=1024; i++){
byte[] data = new byte[i];
byte[] res = api.SYD_SM3_Hash_ShortData(data);
LongDataReturn<byte[], byte[]> longDataReturn = api.SYD_SM3_Hash_LongData(data, 1, null);
longDataReturn = api.SYD_SM3_Hash_LongData(new byte[0], 2, longDataReturn.getProcData());
longDataReturn = api.SYD_SM3_Hash_LongData(new byte[0], 3, longDataReturn.getProcData());
byte[] res_2 = longDataReturn.getData();
if(!(Util.bytes2HexString(res).equals(Util.bytes2HexString(res_2))) ){
isSuc = false;
break;
}
}
if(isSuc) {
System.out.println("包序号输入1,2,3,hash计算成功");
} else {
System.out.println("包序号输入1,2,3,hash计算失败");
}
} catch(SydApiException e){
printException("包序号输入1,2,3", e);
} finally {
api.SYD_Disconnect_Ex();
}
System.out.println("-------- SM3长数据功能测试结束 --------\n");
}
public void zc_sm4ShortFunc() {
System.out.println("-------- SM4短数据加解密功能测试开始 --------");
SydApi api = connect();
int key = 0;
try{
boolean isSuc = true;
for (int i=1; i<=1024; i++){
byte[] data = new byte[i];
byte[] enc = api.SYD_SM4_ShortData(key, data, ECB_ENC);
byte[] dec = api.SYD_SM4_ShortData(key, enc, ECB_DEC);
if(!(Util.bytes2HexString(data).equals(Util.bytes2HexString(dec))) ){
isSuc = false;
break;
}
}
if(isSuc){
System.out.println("正确传参,加密成功,解密成功");
} else {
System.out.println("正确传参,加密失败,解密失败");
}
}catch(SydApiException e){
printException("正确传参", e);
} finally {
api.SYD_Disconnect_Ex();
}
System.out.println("-------- SM4短数据加解密功能测试结束 --------\n");
}
public void zc_sm4LongFunc() {
System.out.println("-------- SM4长数据加解密功能测试开始 --------");
SydApi api = connect();
int key = 0;
try{
boolean isSuc = true;
for(int i=1; i<=1024; i++) {
byte[] data = new byte[i];
byte[] enc = api.SYD_SM4_LongData(key, data, 0, ECB_ENC);
byte[] dec = api.SYD_SM4_LongData(key, enc, 0, ECB_DEC);
if(!(Util.bytes2HexString(data).equals(Util.bytes2HexString(dec))) ){
isSuc = false;
break;
}
}
if(isSuc){
System.out.println("输入解密标识包序号为0 解密成功");
} else {
System.out.println("输入解密标识包序号为0 解密失败");
}
} catch (SydApiException e){
printException("输入解密标识包序号为0 ", e);
} finally {
api.SYD_Disconnect_Ex();
}
System.out.println("-------- SM4长数据加解密功能测试结束 --------\n");
}
public void zc_sm4macShortFunc() {
System.out.println("-------- SM4MAC短数据功能测试开始 --------");
SydApi api = connect();
int key = 0; //正常索引
try{
boolean isSuc = true;
for (int i=1; i<=16; i++){
byte[] dataBytes = genBytes(i);
byte[] res = api.SYD_SM4Mac_ShortData(key, dataBytes);
boolean check = api.SYD_SM4Mac_ShortData(key, dataBytes, res);
if(!check){
isSuc = false;
break;
}
}
if(isSuc){
System.out.println("输入正确入参,校验成功" );
} else {
System.out.println("输入正确入参,校验失败 " );
}
} catch (SydApiException e){
printException("输入正确入参,校验失败", e);
} finally {
api.SYD_Disconnect_Ex();
}
System.out.println("-------- SM4MAC短数据功能测试结束 --------\n");
}
public void zc_sm4macLongFunc() {
System.out.println("-------- SM4MAC长数据功能测试开始 --------");
SydApi api = connect();
int key = 0;
try{
boolean isSuc = true;
for (int i=1; i<=1024; i++){
byte[] data = genBytes(i);
LongDataReturn<byte[], byte[]> longDataReturn = api.SYD_SM4Mac_LongData(key, data, 0, null);
LongDataReturn<byte[], Boolean> booleanLongDataReturn = api.SYD_SM4Mac_LongData(key, data, 0, null, longDataReturn.getData());
if(!booleanLongDataReturn.getData()){
isSuc = false;
break;
}
}
if (isSuc) {
System.out.println("输入正确的入参包序号为0SM4MAC长数据校验成功");
} else {
System.out.println("输入正确的入参包序号为0SM4MAC长数据校验失败");
}
} catch (SydApiException e){
printException("输入正确的入参包序号为0SM4MAC长数据校验失败",e);
} finally {
api.SYD_Disconnect_Ex();
}
System.out.println("-------- SM4MAC长数据功能测试结束 --------\n");
}
public void zc_sm4BatchFunc() {
System.out.println("-------- SM4批量数据加解密功能测试开始 --------");
SydApi api = connect();
try{
List<byte[]> datas = new ArrayList<>();
int[] keys = new int[1024];
for (int i=1; i<=1024; i++){
datas.add(new byte[i]);
keys[i-1] = 0;
}
List<byte[]> en_data = api.SYD_SM4_BatchData(keys, datas, ECB_ENC);
List<byte[]> de_data = api.SYD_SM4_BatchData(keys, en_data, ECB_DEC);
if ( contentEquals(datas, de_data)) {
System.out.println("正常传参,加解密对比成功");
} else {
System.out.println("正常传参,加解密对比失败");
}
} catch (SydApiException e){
printException("正常传参,加解密", e);
} finally {
api.SYD_Disconnect_Ex();
}
System.out.println("-------- SM4批量数据加解密功能测试结束 --------\n");
}
public void zc_sm4macBatchFunc() {
System.out.println("-------- SM4MAC批量数据功能测试开始 --------");
SydApi api = connect();
try{
List<byte[]> datas = new ArrayList<>();
int[] keys = new int[16];
for (int i=1; i<=16; i++){
datas.add(genBytes(i));
keys[i-1] = 0;
}
List<byte[]> s = api.SYD_SM4Mac_BatchData(keys, datas);
boolean[] check = api.SYD_SM4Mac_BatchData(keys, datas, s);
if (isAllTrue(check)) {
System.out.println("输入正确的数据数据大于1组SM4MAC批量数据校验成功");
} else {
System.out.println("输入正确的数据数据大于1组SM4MAC批量数据校验失败");
}
} catch(SydApiException e){
printException("输入正确的数据数据大于1组", e);
} finally {
api.SYD_Disconnect_Ex();
}
System.out.println("-------- SM4MAC批量数据功能测试结束 --------\n");
}
public void zc_sm4ShortMacFunc() {
System.out.println("-------- 短数据加密计算MAC功能测试开始 --------");
SydApi api = connect();
int keyEnc = 0;
int keyMac = 0;
try{
boolean isSuc = true;
for(int i=1; i<=1024; i++){
byte[] bytes = genBytes(i);
DataAndMac en_data = api.SYD_SM4_EncryptAndMac_ShortData(keyEnc, keyMac, bytes);
DataAndMacCheck dataAndMacCheck = api.SYD_SM4_CheckMacAndDecrypt_ShortData(keyEnc, keyMac, en_data.getData(), en_data.getMac());
if(!(Util.bytes2HexString(bytes).equals(Util.bytes2HexString(dataAndMacCheck.getData())))){
isSuc = false;
break;
}
if(!dataAndMacCheck.getMacCheck()){
isSuc = false;
break;
}
}
if(isSuc){
System.out.println("输入正确入参, 计算成功");
} else {
System.out.println("输入正确入参, 计算失败");
}
} catch (SydApiException e){
printException("输入正确入参,计算失败", e);
} finally {
api.SYD_Disconnect_Ex();
}
System.out.println("-------- 短数据加密计算MAC功能测试结束 --------\n");
}
public void zc_sm4BatchMacFunc() {
System.out.println("-------- 批量数据加密计算MAC功能测试开始 --------");
SydApi api = connect();
try{
boolean isSuc = true;
List<byte[]> dataList = new ArrayList<>();
int[] keys = new int[1024];
for(int i=1; i<=1024; i++){
dataList.add(genBytes(i));
keys[i-1] = 0;
}
List<DataAndMac> en_data = api.SYD_SM4_EncryptAndMac_BatchData(keys, keys, dataList);
List<DataAndMacCheck> de_data = api.SYD_SM4_CheckMacAndDecrypt_BatchData(keys, keys, en_data);
for(int i=0; i<en_data.size(); i++) {
if(!(Util.bytes2HexString(dataList.get(i)).equals(Util.bytes2HexString(de_data.get(i).getData())))){
isSuc = false;
break;
}
if(!de_data.get(i).getMacCheck()){
isSuc = false;
break;
}
}
if(isSuc){
System.out.println("输入正确入参,计算成功");
} else {
System.out.println("输入正确入参,计算失败");
}
} catch(SydApiException e){
printException("输入正确入参,计算失败", e);
} finally {
api.SYD_Disconnect_Ex();
}
System.out.println("-------- 批量数据加密计算MAC功能测试结束 --------\n");
}
public void zc_sm4ShortMacFunc_check() {
System.out.println("-------- 短数据校验MAC解密功能测试开始 --------");
SydApi api = connect();
int keyEnc = 0;
int keyMac = 0;
try{
boolean isSuc = true;
for(int i=1; i<=1024; i++){
byte[] bytes = genBytes(i);
DataAndMac en_data = api.SYD_SM4_EncryptAndMac_ShortData(keyEnc, keyMac, bytes);
DataAndMacCheck dataAndMacCheck = api.SYD_SM4_CheckMacAndDecrypt_ShortData(keyEnc, keyMac, en_data.getData(), en_data.getMac());
if(!(Util.bytes2HexString(bytes).equals(Util.bytes2HexString(dataAndMacCheck.getData())))){
isSuc = false;
break;
}
if(!dataAndMacCheck.getMacCheck()){
isSuc = false;
break;
}
}
if(isSuc){
System.out.println("输入正确入参, 校验成功");
} else {
System.out.println("输入正确入参, 校验失败");
}
} catch (SydApiException e){
printException("输入正确入参,校验失败", e);
} finally {
api.SYD_Disconnect_Ex();
}
System.out.println("-------- 短数据校验MAC解密功能测试结束 --------\n");
}
public void zc_sm4BatchMacFunc_check() {
System.out.println("-------- 批量数据校验MAC解密功能测试开始 --------");
SydApi api = connect();
try{
boolean isSuc = true;
List<byte[]> dataList = new ArrayList<>();
int[] keys = new int[1024];
for(int i=1; i<=1024; i++){
dataList.add(genBytes(i));
keys[i-1] = 0;
}
List<DataAndMac> en_data = api.SYD_SM4_EncryptAndMac_BatchData(keys, keys, dataList);
List<DataAndMacCheck> de_data = api.SYD_SM4_CheckMacAndDecrypt_BatchData(keys, keys, en_data);
for(int i=0; i<en_data.size(); i++) {
if(!(Util.bytes2HexString(dataList.get(i)).equals(Util.bytes2HexString(de_data.get(i).getData())))){
isSuc = false;
break;
}
if(!de_data.get(i).getMacCheck()){
isSuc = false;
break;
}
}
if(isSuc){
System.out.println("输入正确入参,计算成功");
} else {
System.out.println("输入正确入参,计算失败");
}
}catch(SydApiException e){
printException("输入正确入参,计算失败", e);
} finally {
api.SYD_Disconnect_Ex();
}
System.out.println("-------- 批量数据校验MAC解密功能测试结束 --------\n");
}
public void zc_sm4macLongFunc_ISM4Mac() {
System.out.println("-------- (ISM4Mac)SM4MAC长数据功能测试开始 --------");
SydApi api = connect();
int key = 0;
try{
boolean isSuc = true;
for(int i=1; i<=1024; i++){
byte[] data = genBytes(i);
ISM4Mac sm4mac = api.initSM4Mac(key);
sm4mac.update(data);
byte[] res = sm4mac.digest();
boolean check = sm4mac.checkDigest(res);
if(!check){
isSuc = false;
break;
}
}
if(isSuc){
System.out.println("pcMac有正确MAC输入输入正确的入参,校验成功" );
} else {
System.out.println("pcMac有正确MAC输入输入正确的入参,校验失败");
}
} catch (SydApiException e){
printException("pcMac有正确MAC输入输入正确的入参,校验失败",e);
} finally {
api.SYD_Disconnect_Ex();
}
System.out.println("-------- (ISM4Mac)SM4MAC长数据功能测试结束 --------\n");
}
public void zc_sm4LongFunc_ISM4() {
System.out.println("-------- (ISM4)SM4长数据加解密功能测试开始 --------");
SydApi api = connect();
try{
boolean isSuc = true;
for(int i=1; i<=1024; i++){
byte[] data = genBytes(i);
ISM4 en = api.initSM4(0, ECB_ENC);
byte[] enc1 = en.update(data);
byte[] enc2 = en.finish();
byte[] enc = mergeByteArrays(enc1, enc2);
ISM4 de = api.initSM4(0, ECB_DEC);
byte[] dec1 = de.update(enc);
byte[] dec2 = de.finish();
byte[] dec = mergeByteArrays(dec1, dec2);
if(!(Util.bytes2HexString(data).equals(Util.bytes2HexString(dec)))){
isSuc = false;
break;
}
}
if(isSuc){
System.out.println("输入正确的入参,加密成功,解密成功");
} else {
System.out.println("输入正确的入参,加密失败,解密失败");
}
} catch (SydApiException e){
printException("输入正确的入参,加密失败,解密失败", e);
} finally {
api.SYD_Disconnect_Ex();
}
System.out.println("-------- (ISM4)SM4长数据加解密功能测试结束 --------");
}
public void zc_sm3LongFunc_ISM3() {
System.out.println("-------- (ISM3)SM3长数据功能测试开始 --------");
SydApi api = connect();
try{
boolean isSuc = true;
for(int i=1; i<=1024; i++){
byte[] data = genBytes(i);
byte[] res1 = api.SYD_SM3_Hash_ShortData(data);
ISM3 sm3 = api.initSM3();
sm3.update(data);
byte[] res2 = sm3.digest();
if(!(Util.bytes2HexString(res1).equals(Util.bytes2HexString(res2)))){
isSuc = false;
break;
}
}
if(isSuc){
System.out.println("输入正确的入参,计算成功" );
} else {
System.out.println("输入正确的入参,计算失败");
}
} catch (SydApiException e){
printException("输入正确的入参,计算失败", e);
} finally {
api.SYD_Disconnect_Ex();
}
System.out.println("-------- (ISM3)SM3长数据功能测试结束 --------\n");
}
private void executeTestsWithIsolation(List<Runnable> tests) {
for (Runnable test : tests) {
try {
test.run();
} catch (Exception e) {
e.printStackTrace();
}
}
}
}