This commit is contained in:
cheney
2026-07-10 17:53:18 +08:00
commit 7ec0389a8a
35 changed files with 10836 additions and 0 deletions
+54
View File
@@ -0,0 +1,54 @@
# SlickEdit generated file. Do not edit this file except in designated areas.
# Make command to use for dependencies
MAKE=make
RM=rm
MKDIR=mkdir
# -----Begin user-editable area-----
# -----End user-editable area-----
# If no configuration is specified, "Debug" will be used
ifndef CFG
CFG=Debug
endif
#
# Configuration: Debug
#
ifeq "$(CFG)" "Debug"
OUTDIR=Debug
OUTFILE=../lib/demo
CFG_INC=-I../inc
CFG_LIB=-lsunyard -lpthread
CFG_OBJ=
COMMON_OBJ=$(OUTDIR)/demo.o $(OUTDIR)/demo_api.o
OBJ=$(COMMON_OBJ) $(CFG_OBJ)
ALL_OBJ=$(OUTDIR)/demo.o $(OUTDIR)/demo_api.o
COMPILE=gcc -c -g -o "$(OUTDIR)/$(*F).o" $(CFG_INC) $<
LINK=gcc -g -L ../lib -o "$(OUTFILE)" $(ALL_OBJ) $(CFG_LIB) -Wl,-rpath=../lib
# Pattern rules
$(OUTDIR)/%.o : %.c
$(COMPILE)
# Build rules
all: $(OUTFILE)
$(OUTFILE): $(OUTDIR) $(OBJ)
$(LINK)
$(OUTDIR):
$(MKDIR) -p "$(OUTDIR)"
# Rebuild this project
rebuild: cleanall all
# Clean this project
clean:
$(RM) -f $(OUTFILE)
$(RM) -f $(OBJ)
# Clean this project and all dependencies
cleanall: clean
endif
+579
View File
@@ -0,0 +1,579 @@
#ifndef _DEMO_API_H_
#include "demo_api.h"
#endif
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "demo_xn.c"
static pthread_mutex_t g_mutex;
static float g_allflow[300] = {0};
static unsigned long g_threadnum = 0;
typedef struct {
int datalen;
int cmd;
}XN_INFO;
int connect_test()
{
int ret = 0, i = 0;
void *hHandle = NULL;
const char *iplist[5] = {0};
int port[5] = {0};
iplist[0] = DEV_IP;
port[0] = DEV_PORT;
iplist[1] = DEV_IP;
port[1] = DEV_PORT;
for(i = 0; i < 10; i++)
{
ret = SYD_Connect_Ex(iplist, port, 1, CON_TIMEOUT, DEAL_TIMEOUT, 0, &hHandle);
if(ret != 0)
{
LOG("SYD_Connect_Ex ret=%08x", ret);
return -1;
}
ret = SYD_DisConnect_Ex(hHandle);
if(ret != 0)
{
LOG("SYD_DisConnect_Ex ret=%08x", ret);
return -1;
}
LOG("短连接正常测试|线程数:0|单个连接|成功");
}
for(i = 0; i < 10; i++)
{
ret = SYD_Connect_Ex(iplist, port, 2, CON_TIMEOUT, DEAL_TIMEOUT, 0, &hHandle);
if(ret != 0)
{
LOG("SYD_Connect_Ex ret=%08x", ret);
return -1;
}
ret = SYD_DisConnect_Ex(hHandle);
if(ret != 0)
{
LOG("SYD_DisConnect_Ex ret=%08x", ret);
return -1;
}
LOG("短连接正常测试|线程数:0|2个连接|成功");
}
for(i = 0; i < 10; i++)
{
ret = SYD_Connect_Ex(iplist, port, 1, CON_TIMEOUT, DEAL_TIMEOUT, 5, &hHandle);
if(ret != 0)
{
LOG("SYD_Connect_Ex ret=%08x", ret);
return -1;
}
ret = SYD_DisConnect_Ex(hHandle);
if(ret != 0)
{
LOG("SYD_DisConnect_Ex ret=%08x", ret);
return -1;
}
LOG("短连接正常测试|线程数:5|单个连接|成功");
}
for(i = 0; i < 10; i++)
{
ret = SYD_Connect_Ex(iplist, port, 1, CON_TIMEOUT, DEAL_TIMEOUT, 5, &hHandle);
if(ret != 0)
{
LOG("SYD_Connect_Ex ret=%08x", ret);
return -1;
}
ret = SYD_DisConnect_Ex(hHandle);
if(ret != 0)
{
LOG("SYD_DisConnect_Ex ret=%08x", ret);
return -1;
}
LOG("短连接正常测试|线程数:5|2个连接|成功");
}
return 0;
}
int CMD(void *hHandle, int cmd)
{
int ret = 0;
switch(cmd)
{
case 0:
ret = SM4_ShortData_Test(hHandle);
break;
case 1:
ret = SM4_BatchData_Test(hHandle);
break;
case 2:
ret = SM4_LongData_Test_Special(hHandle);
if(ret != 0)
{
return ret;
}
ret = SM4_LongData_Test(hHandle);
if(ret != 0)
{
return ret;
}
break;
case 3:
ret = SM3_ShortHash_Test(hHandle);
break;
case 4:
ret = SM3_LongHash_Test_Special(hHandle);
if(ret != 0)
{
return ret;
}
ret = SM3_LongHash_Test(hHandle);
if(ret != 0)
{
return ret;
}
break;
case 5:
ret = SM4Mac_ShortData(hHandle);
break;
case 6:
ret = SM4Mac_BatchData(hHandle);
break;
case 7:
ret = SM4Mac_LongData_Special(hHandle);
if(ret != 0)
{
return ret;
}
ret = SM4Mac_LongData(hHandle);
if(ret != 0)
{
return ret;
}
break;
case 8:
ret = SM4_ShortData_CheckValue(hHandle);
break;
case 9:
ret = SM4_BatchData_CheckValue(hHandle);
break;
case 10:
ret = SM4_LongData_CheckValue(hHandle);
break;
default:
LOG("cmd not exit");
ret = 1;
}
return ret;
}
void short_connect_test()
{
int ret = 0, cmd = 0, i = 0;
void *hHandle = NULL;
const char *iplist[2] = {0};
int port[2] = {0};
iplist[0] = DEV_IP;
port[0] = DEV_PORT;
iplist[1] = DEV2_IP;
port[1] = DEV2_PORT;
for(i = 0; i < 10; i++)
{
ret = SYD_Connect_Ex(iplist, port, 2, CON_TIMEOUT, DEAL_TIMEOUT, 0, &hHandle);
if(ret != 0)
{
LOG("SYD_Connect_Ex ret=%08x", ret);
return;
}
for(cmd = 0; cmd <= 9; cmd++)
{
ret = CMD(hHandle, cmd);
if(ret != 0) goto END;
}
ret = SYD_DisConnect_Ex(hHandle);
if(ret != 0)
{
LOG("SYD_DisConnect_Ex ret=%08x", ret);
return;
}
LOG("遍历所有指令|总循环次数:10|已执行次数:%d|成功", i+1);
}
END:
ret = SYD_DisConnect_Ex(hHandle);
if(ret != 0)
{
LOG("SYD_DisConnect_Ex ret=%08x", ret);
return;
}
}
void threadpool_connect_test()
{
int ret = 0, i = 0, cmd = 0;
void *hHandle = NULL;
const char *iplist[2] = {0};
int port[2] = {0};
iplist[0] = DEV_IP;
port[0] = DEV_PORT;
iplist[1] = DEV2_IP;
port[1] = DEV2_PORT;
for(i = 0; i < 10; i++)
{
ret = SYD_Connect_Ex(iplist, port, 2, CON_TIMEOUT, DEAL_TIMEOUT, 5, &hHandle);
if(ret != 0)
{
LOG("SYD_Connect_Ex ret=%08x", ret);
return;
}
for(cmd = 0; cmd <= 9; cmd++)
{
ret = CMD(hHandle, cmd);
if(ret != 0) goto END;
}
ret = SYD_DisConnect_Ex(hHandle);
if(ret != 0)
{
LOG("SYD_DisConnect_Ex ret=%08x", ret);
return;
}
LOG("遍历所有指令|总循环次数:10|已执行次数:%d|成功", i+1);
}
END:
ret = SYD_DisConnect_Ex(hHandle);
if(ret != 0)
{
LOG("SYD_DisConnect_Ex ret=%08x", ret);
return;
}
}
void choose_cmd_test()
{
int ret = 0, i = 0;
int cmd = 0;
void *hHandle = NULL;
const char *iplist[2] = {0};
int port[2] = {0};
iplist[0] = DEV_IP;
port[0] = DEV_PORT;
iplist[1] = DEV2_IP;
port[1] = DEV2_PORT;
while (1)
{
LOG_MSG("/----功能正确性测试-----/");
LOG_MSG("0:SM4短数据");
LOG_MSG("1:SM4批量数据");
LOG_MSG("2:SM4长数据");
LOG_MSG("3:SM3短数据");
LOG_MSG("4:SM3长数据");
LOG_MSG("5:SM4-MAC短数据");
LOG_MSG("6:SM4-MAC批量数据");
LOG_MSG("7:SM4-MAC长数据");
LOG_MSG("8:SM4短数据+密文校验");
LOG_MSG("9:SM4批量数据+密文校验");
LOG_MSG("10:SM4长数据+密文校验");
LOG_MSG("100:退出");
LOG_MSG("请选择测试指令:");
scanf("%d", &cmd);
if(cmd == 100) return;
ret = SYD_Connect_Ex(iplist, port, 2, CON_TIMEOUT, DEAL_TIMEOUT, 0, &hHandle);
if(ret != 0)
{
LOG("SYD_Connect_Ex ret=%08x", ret);
return;
}
ret = CMD(hHandle, cmd);
if(ret == 1) goto END;
ret = SYD_DisConnect_Ex(hHandle);
if(ret != 0)
{
LOG("SYD_DisConnect_Ex ret=%08x", ret);
return;
}
}
END:
ret = SYD_DisConnect_Ex(hHandle);
if(ret != 0)
{
LOG("SYD_DisConnect_Ex ret=%08x", ret);
return;
}
}
void* CMD_XN(void *p)
{
XN_INFO* arg = (XN_INFO *)p;
int ret = 0;
float flow = 0;
long difftime = 0;
struct timeval start_time;
struct timeval local_time;
const char *iplist[5] = {0};
int port[5] = {0};
iplist[0] = DEV_IP;
port[0] = DEV_PORT;
void *hHandle = NULL;
ret = SYD_Connect_Ex(iplist, port, 1, CON_TIMEOUT, 1000, 0, &hHandle);
if(ret != 0)
{
LOG("SYD_Connect_Ex ret=%08x", ret);
return NULL;
}
gettimeofday(&start_time, NULL);
switch(arg->cmd)
{
case 0:
ret = XN_SM4_Enc_LongData_Test(hHandle, arg->datalen);
break;
case 1:
ret = XN_SM4_Dec_LongData_Test(hHandle, arg->datalen);
break;
case 2:
ret = XN_SM4Mac_LongData_Test(hHandle, arg->datalen);
break;
case 3:
ret = XN_SM3_LongHash_Test(hHandle, arg->datalen);
break;
case 4:
ret = XN_SM4EncMac_LongData_Test(hHandle, arg->datalen);
break;
case 5:
ret = XN_SM4DecMac_LongData_Test(hHandle, arg->datalen);
break;
default:
LOG("cmd not exist");
return NULL;
}
gettimeofday(&local_time, NULL);
ret = SYD_DisConnect_Ex(hHandle);
if(ret != 0)
{
LOG("SYD_DisConnect_Ex ret=%08x", ret);
return NULL;
}
pthread_mutex_lock(&g_mutex);
difftime = us_difftime(start_time, local_time);
flow = (arg->datalen / (difftime * 0.000001)) / (1024 * 1024);
g_allflow[g_threadnum] = flow;
LOG_MSG("线程:%ld|用时%ld(us)|数据长度:%d(bytes)|吞吐量:%f(MB/S)", g_threadnum, difftime, arg->datalen, flow);
g_threadnum++;
pthread_mutex_unlock(&g_mutex);
return NULL;
}
void xn_throughput_test()
{
int ret = 0, i = 0, cmd = 0;
long alldatalen = 0;
int run_conut = 0;
float all_flow = 0;
long thread_count = 0;
pthread_t pthid[1000];
XN_INFO arg = {0};
pthread_mutex_init(&g_mutex, NULL);
while (1)
{
LOG_MSG("/------吞吐量测试------/");
LOG_MSG("0:SM4加密长数据");
LOG_MSG("1:SM4解密长数据");
LOG_MSG("2:SM4-MAC长数据");
LOG_MSG("3:SM3长数据");
LOG_MSG("4:SM4加密+MAC长数据");
LOG_MSG("5:SM4解密+MAC长数据");
LOG_MSG("100:退出");
LOG_MSG("请选择测试指令:");
scanf("%d", &cmd);
if(cmd == 100) goto END;
LOG_MSG("请输出数据的总长度(MB):");
scanf("%ld", &alldatalen);
alldatalen = alldatalen * 1024 * 1024;
LOG_MSG("请输入线程数:");
scanf("%ld", &thread_count);
g_threadnum = 0;
memset(g_allflow, 0, sizeof(g_allflow));
arg.cmd = cmd;
arg.datalen = alldatalen / thread_count;
for(i = 0; i < thread_count; i++)
{
ret = pthread_create(&pthid[i], NULL, CMD_XN, (void *)&arg);
if(ret)
{
printf("Fail to create thread %d\n", (int)pthid[i]);
goto END;
}
}
for (i = 0; i < thread_count; i++)
{
ret = pthread_join(pthid[i],NULL);
if(ret)
{
printf("Thread %d join failed\n", (int)pthid[i]);
goto END;
}
}
all_flow = 0;
for (i = 0; i < thread_count; i++)
{
all_flow += g_allflow[i];
}
LOG_MSG("命令:%d|线程数:%ld|总吞吐量:%f(MB/S)", arg.cmd, thread_count, all_flow);
}
END:
pthread_mutex_destroy(&g_mutex);
}
int stability_test()
{
int ret = 0, cmd = 0;
long long i = 0, count = 0;
void *hHandle = NULL;
const char *iplist[2] = {0};
int port[5] = {0};
iplist[0] = DEV_IP;
port[0] = DEV_PORT;
ret = SYD_Connect_Ex(iplist, port, 1, CON_TIMEOUT, 5000, 0, &hHandle);
if(ret != 0)
{
LOG("SYD_Connect_Ex ret=%08x", ret);
return 0;
}
LOG_MSG("请输入循环次数:");
scanf("%lld", &count);
for(i = 0; i < count; i++)
{
for(cmd = 0; cmd <= 10; cmd++)
{
ret = CMD(hHandle, cmd);
if(ret != 0)
{
LOG("命令:%d|当前循环次数:%lld|错误!", cmd, i);
goto END;
}
}
}
END:
ret = SYD_DisConnect_Ex(hHandle);
if(ret != 0)
{
LOG("SYD_DisConnect_Ex ret=%08x", ret);
return 0;
}
}
int main()
{
int ret = 0, mode = 0;
void *hHandle = NULL;
char version[256] = {0};
int version_len = sizeof(version);
const char *iplist[5] = {0};
int port[5] = {0};
iplist[0] = DEV_IP;
port[0] = DEV_PORT;
ret = SYD_SetLogConfig("./Log", 6, 2);
if(ret != 0)
{
LOG("SYD_SetLogConfig ret=%08x", ret);
return 0;
}
ret = SYD_Connect_Ex(iplist, port, 1, CON_TIMEOUT, DEAL_TIMEOUT, 0, &hHandle);
if(ret != 0)
{
LOG("SYD_Connect_Ex ret=%08x", ret);
return 0;
}
ret = SYD_GetVersionInfo(hHandle, version, &version_len);
if(ret != 0)
{
LOG("SYD_GetVersionInfo ret=%08x", ret);
return 0;
}
printf("%s\n", version);
ret = SYD_DisConnect_Ex(hHandle);
if(ret != 0)
{
LOG("SYD_DisConnect_Ex ret=%08x", ret);
return 0;
}
/*
*注意:该测试需要提前手动合成密钥,密钥合成方式如下
*机构号16字节0 类型:ZEK(00A) 索引:8字节0 方案:X 不变种 分量个数:2
*这里用的密钥分量为
分量1:31313131313131313131313131313131
分量2:32323232323232323232323232323232
合成后的分量:03030303030303030303030303030303
*/
while (1)
{
LOG_MSG("/---功能测试---/");
LOG_MSG("0:连接正确性测试");
LOG_MSG("1:金交所业务场景1:循环多次(短连接-遍历所有功能-断开连接)");
LOG_MSG("2:金交所业务场景2:循环多次(连接池-遍历所有功能-断开连接)");
LOG_MSG("3:功能正确性测试");
LOG_MSG("4:吞吐量测试");
LOG_MSG("5:TPS性能测试");
LOG_MSG("6:稳定性测试");
LOG_MSG("100:退出");
LOG_MSG("请选择测试类型:");
scanf("%d", &mode);
switch (mode)
{
case 0:
connect_test();
break;
case 1:
short_connect_test();
break;
case 2:
threadpool_connect_test();
break;
case 3:
choose_cmd_test();
break;
case 4:
xn_throughput_test();
break;
case 5:
xn_cmd_tps();
break;
case 6:
stability_test();
break;
case 100:
return 0;
default:
LOG("mode not exist!");
break;
}
}
return 0;
}
+1449
View File
File diff suppressed because it is too large Load Diff
+53
View File
@@ -0,0 +1,53 @@
#ifndef _DEMO_API_H_
#define _DEMO_API_H_
#ifndef _DEMO_TYPEDEF_H_
#include "demo_typedef.h"
#endif
#ifndef _SUNYARD_H_
#include "sunyard.h"
#endif
#define DEV_IP "127.0.0.1"
#define DEV_PORT 8889
#define DEV2_IP "127.0.0.1"
#define DEV2_PORT 8889
#define CON_TIMEOUT 5000
#define DEAL_TIMEOUT 5000
#define KEYINDEX 0
#define CHECKINDEX 0
void IniOrgData(char *pcData, int iOrgDataLen, int k);
void PrintHex(const char* Title, unsigned char* Data, int DataLen);
void HexToBin(int iLen, unsigned char* pucInBuf, unsigned char* pucOutBuf);
void BinToHex(int iLen, unsigned char* pucInBuf, unsigned char* pucOutBuf);
int us_difftime(struct timeval start_time, struct timeval end_time);
int ms_difftime(struct timeval start_time, struct timeval end_time);
int SM4_ShortData_Test(void *hHandle);
int SM4_BatchData_Test(void *hHandle);
int SM4_LongData_Test(void *hHandle);
int SM4_LongData_Test_Special(void *hHandle);
int SM3_ShortHash_Test(void *hHandle);
int SM3_LongHash_Test(void *hHandle);
int SM3_LongHash_Test_Special(void *hHandle);
int SM4Mac_ShortData(void *hHandle);
int SM4Mac_BatchData(void *hHandle);
int SM4Mac_LongData(void *hHandle);
int SM4Mac_LongData_Special(void *hHandle);
int SM4_ShortData_CheckValue(void *hHandle);
int SM4_BatchData_CheckValue(void *hHandle);
int SM4_LongData_CheckValue(void *hHandle);
int XN_SM4_Enc_LongData_Test(void *hHandle, int datasize);
int XN_SM4_Dec_LongData_Test(void *hHandle, int datasize);
int XN_SM4Mac_LongData_Test(void *hHandle, int singlebytes);
int XN_SM3_LongHash_Test(void *hHandle, int singlebytes);
int XN_SM4EncMac_LongData_Test(void *hHandle, int datasize);
int XN_SM4DecMac_LongData_Test(void *hHandle, int datasize);
#endif
+24
View File
@@ -0,0 +1,24 @@
#ifndef _DEMO_TYPEDEF_H_
#define _DEMO_TYPEDEF_H_
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <pthread.h>
#include <sys/time.h>
#define API_DEBUG 1
#define API_DEBUG_ERR 1
#define LOG(format, ...) \
if (API_DEBUG) \
printf("[DEBUG|%s@%s,%d] " format "\n", \
__FUNCTION__, __FILE__, __LINE__, ##__VA_ARGS__)
#define LOG_MSG(format, ...) \
if (API_DEBUG_ERR) \
printf("[DEBUG|%s@%s,%d] " format "\n", \
__FUNCTION__, __FILE__, __LINE__, ##__VA_ARGS__)
#endif
+462
View File
@@ -0,0 +1,462 @@
#define BATCH_MAX_SIZE 4
typedef struct
{
int cycle_num; /*<单线程循环次数>*/
int cmd; /*<命令码>*/
int data_len; /*<数据长度>*/
} trd_arg_t;
typedef struct
{
int keyidex[BATCH_MAX_SIZE];
int checkidex[BATCH_MAX_SIZE];
char sm4_short_encdata[1024 + 16];
int sm4_short_encdata_len;
char sm4_short_decdata[1024];
int sm4_short_decdata_len;
char sm4_short_checkvalue[33];
int sm4_short_checkvalue_len;
char sm4_batch_encdata[BATCH_MAX_SIZE][1024 + 16];
int sm4_batch_encdata_len[BATCH_MAX_SIZE];
char *tmp_sm4_batch_encdata[BATCH_MAX_SIZE];
char sm4_batch_decdata[BATCH_MAX_SIZE][1024];
int sm4_batch_decdata_len[BATCH_MAX_SIZE];
char *tmp_sm4_batch_decdata[BATCH_MAX_SIZE];
char sm4_batch_checkvalue[BATCH_MAX_SIZE][33];
int sm4_batch_checkvalue_len[BATCH_MAX_SIZE];
char *tmp_sm4_batch_checkvalue[BATCH_MAX_SIZE];
char sm4_batch_mac[BATCH_MAX_SIZE][33];
int sm4_batch_mac_len[BATCH_MAX_SIZE];
char *tmp_sm4_batch_mac[BATCH_MAX_SIZE];
char batch_orgdata[BATCH_MAX_SIZE][2048];
int batch_orgdata_len[BATCH_MAX_SIZE];
char *tmp_batch_orgdata[BATCH_MAX_SIZE];
char hash[33];
char mac[33];
int checkret[BATCH_MAX_SIZE];
} xn_init_config_t;
xn_init_config_t g_stc_xn_init_config;
static pthread_mutex_t g_time_mutex;
static int g_thread_count = 0;
static long g_all_time[300] = {0};
static long g_all_average_time[300] = {0};
static char g_org_data[9000] = {0};
long GetTime()
{
struct timeval t_time;
gettimeofday(&t_time,NULL);
return ((long)t_time.tv_sec) * 1000000 + ((long)t_time.tv_usec);
}
static int xn_tps_init_data(int data_len)
{
if(data_len <= 0 || data_len > 1024)
{
LOG("输入数据长度错误, 范围为[1, 1024]");
return -1;
}
int ret = 0, i = 0;
int check_ret[BATCH_MAX_SIZE] = {0};
void *handle = NULL;
const char *iplist[2] = {0};
int port[2] = {0};
iplist[0] = DEV_IP;
port[0] = DEV_PORT;
ret = SYD_Connect_Ex(iplist, port, 1, CON_TIMEOUT, DEAL_TIMEOUT, 0, &handle);
if(ret != 0)
{
LOG("SYD_Connect_Ex ret=%08x", ret);
return ret;
}
memset(&g_stc_xn_init_config, 0, sizeof(xn_init_config_t));
for(i = 0; i < BATCH_MAX_SIZE; i++)
{
g_stc_xn_init_config.keyidex[i] = KEYINDEX;
g_stc_xn_init_config.checkidex[i] = CHECKINDEX;
g_stc_xn_init_config.sm4_short_encdata_len = sizeof(g_stc_xn_init_config.sm4_short_encdata);
g_stc_xn_init_config.sm4_short_decdata_len = sizeof(g_stc_xn_init_config.sm4_short_decdata);
g_stc_xn_init_config.sm4_short_checkvalue_len = sizeof(g_stc_xn_init_config.sm4_short_checkvalue);
g_stc_xn_init_config.sm4_batch_encdata_len[i] = sizeof(g_stc_xn_init_config.sm4_batch_encdata[i]);
g_stc_xn_init_config.tmp_sm4_batch_encdata[i] = g_stc_xn_init_config.sm4_batch_encdata[i];
g_stc_xn_init_config.sm4_batch_decdata_len[i] = sizeof(g_stc_xn_init_config.sm4_batch_decdata[i]);
g_stc_xn_init_config.tmp_sm4_batch_decdata[i] = g_stc_xn_init_config.sm4_batch_decdata[i];
g_stc_xn_init_config.sm4_batch_checkvalue_len[i] = sizeof(g_stc_xn_init_config.sm4_batch_checkvalue[i]);
g_stc_xn_init_config.tmp_sm4_batch_checkvalue[i] = g_stc_xn_init_config.sm4_batch_checkvalue[i];
g_stc_xn_init_config.sm4_batch_mac_len[i] = sizeof(g_stc_xn_init_config.sm4_batch_mac[i]);
g_stc_xn_init_config.tmp_sm4_batch_mac[i] = g_stc_xn_init_config.sm4_batch_mac[i];
IniOrgData(g_stc_xn_init_config.batch_orgdata[i], 2048, 1);
g_stc_xn_init_config.batch_orgdata_len[i] = data_len;
g_stc_xn_init_config.tmp_batch_orgdata[i] = g_stc_xn_init_config.batch_orgdata[i];
}
ret = SYD_SM4_Encrypt_Mac_ShortData(handle, g_stc_xn_init_config.keyidex[0], g_stc_xn_init_config.checkidex[0], \
g_org_data, data_len, g_stc_xn_init_config.sm4_short_encdata, &g_stc_xn_init_config.sm4_short_encdata_len, \
g_stc_xn_init_config.sm4_short_checkvalue);
if(ret != 0)
{
LOG("SYD_SM4_Encrypt_Mac_ShortData ret=%08x", ret);
goto END;
}
g_stc_xn_init_config.sm4_short_checkvalue_len = 16;
ret = SYD_SM4_Encrypt_Mac_BatchData(handle, g_stc_xn_init_config.keyidex, g_stc_xn_init_config.checkidex, \
g_stc_xn_init_config.tmp_batch_orgdata, g_stc_xn_init_config.batch_orgdata_len, BATCH_MAX_SIZE, \
g_stc_xn_init_config.tmp_sm4_batch_encdata, g_stc_xn_init_config.sm4_batch_encdata_len, \
g_stc_xn_init_config.tmp_sm4_batch_checkvalue);
if(ret != 0)
{
LOG("SYD_SM4_Encrypt_Mac_BatchData ret=%08x", ret);
goto END;
}
g_stc_xn_init_config.sm4_short_checkvalue_len = 16;
END:
SYD_DisConnect_Ex(handle);
return ret;
}
static int xn_sm4_short_enc(void* handle, unsigned int data_len)
{
int ret = 0;
unsigned int sm4_short_encdata_len = sizeof(g_stc_xn_init_config.sm4_short_encdata);
ret = SYD_SM4_ShortData(handle, g_stc_xn_init_config.keyidex[0], g_org_data, data_len, \
SM4_ENCRYPT, g_stc_xn_init_config.sm4_short_encdata, &sm4_short_encdata_len);
if (ret != 0)
{
LOG("SYD_SM4_ShortData err ret=%08x", ret);
return ret;
}
return 0;
}
static int xn_sm4_short_dec(void* handle, unsigned int data_len)
{
int ret = 0;
unsigned int sm4_short_decdata_len = sizeof(g_stc_xn_init_config.sm4_short_decdata);
ret = SYD_SM4_ShortData(handle, g_stc_xn_init_config.keyidex[0], g_stc_xn_init_config.sm4_short_encdata, \
g_stc_xn_init_config.sm4_short_encdata_len, SM4_DECRYPT, g_stc_xn_init_config.sm4_short_decdata, \
&sm4_short_decdata_len);
if (ret != 0)
{
LOG("SYD_SM4_ShortData err ret=%08x", ret);
return ret;
}
return 0;
}
static int xn_sm4_short_mac(void* handle, unsigned int data_len)
{
int ret = 0;
ret = SYD_SM4Mac_ShortData(handle, g_stc_xn_init_config.keyidex[0], g_org_data, data_len, \
g_stc_xn_init_config.mac, NULL);
if(ret != 0)
{
LOG("SYD_SM4Mac_ShortData ret=%08x", ret);
return 0;
}
return 0;
}
static int xn_sm4_batch_mac(void* handle)
{
int ret = 0;
ret = SYD_SM4Mac_BatchData(handle, g_stc_xn_init_config.keyidex, g_stc_xn_init_config.tmp_batch_orgdata, \
g_stc_xn_init_config.batch_orgdata_len, BATCH_MAX_SIZE, g_stc_xn_init_config.tmp_sm4_batch_mac, NULL);
if(ret != 0)
{
LOG("SYD_SM4Mac_BatchData ret=%08x", ret);
return 0;
}
return 0;
}
static int xn_sm4_batch_enc(void* handle)
{
int ret = 0;
ret = SYD_SM4_BatchData(handle, g_stc_xn_init_config.keyidex, g_stc_xn_init_config.tmp_batch_orgdata, \
g_stc_xn_init_config.batch_orgdata_len, BATCH_MAX_SIZE, SM4_ENCRYPT, \
g_stc_xn_init_config.tmp_sm4_batch_encdata, g_stc_xn_init_config.sm4_batch_encdata_len);
if(ret != 0)
{
LOG("SYD_SM4_BatchData ret=%08x", ret);
return ret;
}
return 0;
}
static int xn_sm4_batch_dec(void* handle)
{
int ret = 0;
ret = SYD_SM4_BatchData(handle, g_stc_xn_init_config.keyidex, g_stc_xn_init_config.tmp_sm4_batch_encdata, \
g_stc_xn_init_config.sm4_batch_encdata_len, BATCH_MAX_SIZE, SM4_DECRYPT, \
g_stc_xn_init_config.tmp_sm4_batch_decdata, g_stc_xn_init_config.sm4_batch_decdata_len);
if(ret != 0)
{
LOG("SYD_SM4_BatchData ret=%08x", ret);
return ret;
}
return 0;
}
static int xn_sm3_short_data(void* handle, unsigned int data_len)
{
int ret = 0;
ret = SYD_SM3_Hash_ShortData(handle, g_org_data, data_len, g_stc_xn_init_config.hash);
if(ret != 0)
{
LOG("SYD_SM3_Hash_ShortData ret=%08x", ret);
return ret;
}
return 0;
}
static int xn_sm4_enc_short_checkvalue(void* handle, unsigned int data_len)
{
int ret = 0;
unsigned int sm4_short_encdata_len = sizeof(g_stc_xn_init_config.sm4_short_encdata);
ret = SYD_SM4_Encrypt_Mac_ShortData(handle, g_stc_xn_init_config.keyidex[0], g_stc_xn_init_config.checkidex[0], \
g_org_data, data_len, g_stc_xn_init_config.sm4_short_encdata, &sm4_short_encdata_len, g_stc_xn_init_config.mac);
if(ret != 0)
{
LOG("SYD_SM4_Encrypt_Mac_ShortData ret=%08x", ret);
return 0;
}
return 0;
}
static int xn_sm4_dec_short_checkvalue(void* handle)
{
int ret = 0;
unsigned int sm4_short_decdata_len = sizeof(g_stc_xn_init_config.sm4_short_decdata);
ret = SYD_SM4_Decrypt_Mac_ShortData(handle, g_stc_xn_init_config.keyidex[0], g_stc_xn_init_config.checkidex[0], \
g_stc_xn_init_config.sm4_short_encdata, g_stc_xn_init_config.sm4_short_encdata_len, g_stc_xn_init_config.sm4_short_checkvalue, \
g_stc_xn_init_config.sm4_short_decdata, &sm4_short_decdata_len);
if (ret != 0)
{
LOG("SYD_SM4_Decrypt_Mac_ShortData err ret=%08x", ret);
return ret;
}
return 0;
}
static int xn_sm4_batch_enc_checkvalue(void* handle)
{
int ret = 0;
ret = SYD_SM4_Encrypt_Mac_BatchData(handle, g_stc_xn_init_config.keyidex, g_stc_xn_init_config.checkidex, \
g_stc_xn_init_config.tmp_batch_orgdata, g_stc_xn_init_config.batch_orgdata_len, BATCH_MAX_SIZE, \
g_stc_xn_init_config.tmp_sm4_batch_encdata, g_stc_xn_init_config.sm4_batch_encdata_len, \
g_stc_xn_init_config.tmp_sm4_batch_checkvalue);
if (ret != 0)
{
LOG("SYD_SM4_Encrypt_Mac_BatchData err ret=%08x", ret);
return ret;
}
return 0;
}
static int xn_sm4_batch_dec_checkvalue(void* handle)
{
int ret = 0;
ret = SYD_SM4_Decrypt_Mac_BatchData(handle, g_stc_xn_init_config.keyidex, g_stc_xn_init_config.checkidex, \
g_stc_xn_init_config.tmp_sm4_batch_encdata, g_stc_xn_init_config.sm4_batch_encdata_len, \
g_stc_xn_init_config.tmp_sm4_batch_checkvalue, BATCH_MAX_SIZE, g_stc_xn_init_config.tmp_sm4_batch_decdata, \
g_stc_xn_init_config.sm4_batch_decdata_len, g_stc_xn_init_config.checkret);
if (ret != 0)
{
LOG("SYD_SM4_Decrypt_Mac_BatchData err ret=%08x", ret);
return ret;
}
return 0;
}
static int command_tps(void* handle, int cmd, int data_len)
{
int ret = 0;
switch(cmd)
{
case 0:
ret = xn_sm4_short_enc(handle, data_len);
break;
case 1:
ret = xn_sm4_short_dec(handle, data_len);
break;
case 2:
ret = xn_sm4_batch_enc(handle);
break;
case 3:
ret = xn_sm4_batch_dec(handle);
break;
case 4:
ret = xn_sm4_short_mac(handle, data_len);
break;
case 5:
ret = xn_sm4_batch_mac(handle);
break;
case 6:
ret = xn_sm3_short_data(handle, data_len);
break;
case 7:
ret = xn_sm4_enc_short_checkvalue(handle, data_len);
break;
case 8:
ret = xn_sm4_dec_short_checkvalue(handle);
break;
case 9:
ret = xn_sm4_batch_enc_checkvalue(handle);
break;
case 10:
ret = xn_sm4_batch_dec_checkvalue(handle);
break;
default:
break;
}
return 0;
}
void *xn_func_tps(void *arg)
{
int ret = 0, i = 0;
long begin = 0, end = 0;
trd_arg_t *trd_arg = (trd_arg_t *)arg;
void *conn_handle = NULL;
const char *iplist[5] = {0};
int port[5] = {0};
iplist[0] = DEV_IP;
port[0] = DEV_PORT;
ret = SYD_Connect_Ex(iplist, port, 1, CON_TIMEOUT, DEAL_TIMEOUT, 0, &conn_handle);
if(ret != 0)
{
LOG("SYD_Connect_Ex ret=%08x", ret);
return NULL;
}
begin = GetTime();
for (i = 0; i < trd_arg->cycle_num; i++)
{
ret = command_tps(conn_handle, trd_arg->cmd, trd_arg->data_len);
if (ret != 0) goto END;
}
end = GetTime() - begin;
LOG_MSG("笔数=%d|总用时:%ld(us)|单笔用时:%ld(us)", trd_arg->cycle_num, end, (end/trd_arg->cycle_num));
pthread_mutex_lock(&g_time_mutex);
printf("g_thread_count=%d\n", g_thread_count);
g_all_time[g_thread_count] = end;
g_all_average_time[g_thread_count] = (end/trd_arg->cycle_num);
g_thread_count++;
pthread_mutex_unlock(&g_time_mutex);
END:
if (ret == 0)
LOG_MSG("CMD:%d ok", trd_arg->cmd);
else
LOG_MSG("CMD:%d fail", trd_arg->cmd);
ret = SYD_DisConnect_Ex(conn_handle);
if(ret != 0)
{
LOG("SYD_DisConnect_Ex ret=%08x", ret);
return NULL;
}
return NULL;
}
int xn_cmd_tps()
{
int ret = 0;
float all_time = 0, all_average_time = 0, tps = 0;
int i = 0, cmd = 0;
long thread_count = 0, run_count = 0;
pthread_t pthid[1000];
trd_arg_t trd_arg;
memset(&trd_arg, 0, sizeof(trd_arg_t));
IniOrgData(g_org_data, 9000, 1);
pthread_mutex_init(&g_time_mutex, NULL);
while(1)
{
LOG_MSG("/-------性能测试TPS------/");
LOG_MSG("0:SM4短数据加密");
LOG_MSG("1:SM4短数据解密 ");
LOG_MSG("2:SM4批量加密 ");
LOG_MSG("3:SM4批量解密 ");
LOG_MSG("4:SM4-MAC短数据 ");
LOG_MSG("5:SM4-MAC批量数据 ");
LOG_MSG("6:SM3短数据");
LOG_MSG("7:SM4短数据加密&校验值");
LOG_MSG("8:SM4短数据解密&校验值");
LOG_MSG("9:SM4批量数据加密&校验值");
LOG_MSG("10:SM4批量数据解密&校验值");
LOG_MSG("100:退出");
LOG_MSG("请选择测试项:");
scanf("%d", &trd_arg.cmd);
if(trd_arg.cmd == 100) goto END;
LOG_MSG("请输入线程数:");
scanf("%ld", &thread_count);
LOG_MSG("请输入循环笔数:");
scanf("%ld", &run_count);
LOG_MSG("请输入数据长度:");
scanf("%d", &trd_arg.data_len);
trd_arg.cycle_num = run_count / thread_count;
g_thread_count = 0;
ret = xn_tps_init_data(trd_arg.data_len);
if(ret != 0)
{
LOG("xn_tps_init_data err");
goto END;
}
for (i = 0; i < thread_count; i++)
{
ret = pthread_create(&pthid[i], NULL, xn_func_tps, (void *)&trd_arg);
if(ret)
{
LOG("Fail to create thread %d", (int)pthid[i]);
goto END;
}
}
for (i = 0; i < thread_count; i++)
{
ret = pthread_join(pthid[i], NULL);
if(ret)
{
LOG("thread %d join failed\n", (int)pthid[i]);
goto END;
}
}
/*计算总时间*/
all_time = 0;
all_average_time = 0;
for(i = 0; i < g_thread_count; i++)
{
all_time += g_all_time[i];
all_average_time += g_all_average_time[i];
}
if(all_time == 0)
{
all_time = 1;
}
if(all_average_time == 0)
{
all_average_time = 1;
}
/*****平均时间*****/
tps = (run_count * 1000000) / (all_time / thread_count);
LOG_MSG("[指令:%d] [笔数:%ld] [线程数:%ld] [总用时:%f(us)] [TPS:%f] [平均延时:%f(ms)]", \
trd_arg.cmd, run_count, thread_count, (all_time / thread_count), tps, ((all_average_time / thread_count) / 1000));
}
END:
pthread_mutex_destroy(&g_time_mutex);
return 0;
}