seg-database-c/demo/demo_api.c
2026-07-10 17:53:18 +08:00

1449 lines
40 KiB
C
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.

#ifndef _DEMO_API_H_
#include "demo_api.h"
#endif
#define SM4_BATCH_NUM 4
#define SM4_MAC_BATCH_NUM 4
static const char g_cHexToAsc1[] = "0123456789ABCDEF";
static int g_iTable_ASC_HEX[] =
{
0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,
0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,
0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f,
0x40, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f
};
/*乱序*/
void IniOrgData(char *pcData, int iOrgDataLen, int k)
{
int i = 0;
for (i = 0; i < iOrgDataLen; i++, k++)
{
memset(pcData + i, k, 1);
if (k == 9)
{
k = 0;
}
}
}
void PrintHex(const char* Title, unsigned char* Data, int DataLen)
{
int i;
printf("[%s][len=%d]:", Title, DataLen);
for (i = 0; i < DataLen; i++)
{
if (!(i % 16)) printf("\n ");
printf(" %02X", Data[i]);
}
printf("\n");
}
void HexToBin(int iLen, unsigned char* pucInBuf, unsigned char* pucOutBuf)
{
for (; iLen > 0; iLen -= 2, pucInBuf += 2)
{
(*pucOutBuf++) = (g_iTable_ASC_HEX[(*pucInBuf)] << 4) | g_iTable_ASC_HEX[*(pucInBuf + 1)];
}
}
void BinToHex(int iLen, unsigned char* pucInBuf, unsigned char* pucOutBuf)
{
for (; iLen > 0; iLen--)
{
(*pucOutBuf++) = g_cHexToAsc1[((*pucInBuf) >> 4) & 0xf];
(*pucOutBuf++) = g_cHexToAsc1[(*pucInBuf++) & 0xf];
}
}
//精确到微秒
int us_difftime(struct timeval start_time, struct timeval end_time)
{
long start = start_time.tv_sec * 1000000 + start_time.tv_usec;
long end = end_time.tv_sec * 1000000 + end_time.tv_usec;
return end - start;
}
//精确到微秒
int ms_difftime(struct timeval start_time, struct timeval end_time)
{
long start = start_time.tv_sec * 1000 + start_time.tv_usec * 0.001;
long end = end_time.tv_sec * 1000 + end_time.tv_usec * 0.001;
return end - start;
}
int SM4_ShortData_Test(void *hHandle)
{
int iRet = 0, i = 0;
char cEncData[4096 + 16] = {0};
int iEncDataLen = 0;
char cDecData[4096 + 16] = {0};
int iDecDataLen = 0;
char cOrgData[4096] = { 0 };
IniOrgData(cOrgData, 2048, 1);
for(i = 1; i <= 1024; i++)
{
iEncDataLen = i + 16;
iRet = SYD_SM4_ShortData(hHandle, KEYINDEX, cOrgData, i, SM4_ENCRYPT, cEncData, &iEncDataLen);
if(iRet != 0)
{
LOG("SYD_SM4_ShortData ret=%08x, i=%d", iRet, i);
return iRet;
}
iDecDataLen = i;
iRet = SYD_SM4_ShortData(hHandle, KEYINDEX, cEncData, iEncDataLen, SM4_DECRYPT, cDecData, &iDecDataLen);
if(iRet != 0)
{
LOG("SYD_SM4_ShortData ret=%08x, i=%d", iRet, i);
return iRet;
}
if(iDecDataLen != i)
{
LOG("iDecDataLen(%d) != (%d)", iDecDataLen, i);
return -1;
}
if(memcmp(cDecData, cOrgData, i))
{
LOG("memcmp err i=%d", i);
return -1;
}
printf("i=%d\r", i);
fflush(stdout);
}
return 0;
}
int SM4_BatchData_Test(void *hHandle)
{
int ret = 0, i = 0, j = 0, k = 0, iBatchNum = 0;
int iKeyIdex[SM4_BATCH_NUM] = {0};
char cEncData[SM4_BATCH_NUM][2048 + 16] = {{0}};
int iEncDataLen[SM4_BATCH_NUM] = {0};
char cDecData[SM4_BATCH_NUM][4096 + 16] = {{0}};
int iDecDataLen[SM4_BATCH_NUM] = {0};
char cOrgData[SM4_BATCH_NUM][2048] = {{0}};
int iOrgDataLen[SM4_BATCH_NUM] = {0};
char *pTmpOrgData[SM4_BATCH_NUM] = {0};
int iTmpOrgDataLen[SM4_BATCH_NUM] = {0};
char *pTmpEncData[SM4_BATCH_NUM] = {0};
char *pTmpDecData[SM4_BATCH_NUM] = {0};
for(i = 0; i < SM4_BATCH_NUM; i++)
{
IniOrgData(cOrgData[i], 2048, i);
iKeyIdex[i] = KEYINDEX;
pTmpOrgData[i] = cOrgData[i];
pTmpEncData[i] = cEncData[i];
pTmpDecData[i] = cDecData[i];
}
for(i = 1; i <= 1024; i++)
{
for(j = 0; j < SM4_BATCH_NUM; j++)
{
iTmpOrgDataLen[j] = i;
iEncDataLen[j] = i + 16;
iDecDataLen[j] = i;
}
/* 特殊测试 pcData为NULL测试 */
ret = SYD_SM4_BatchData(hHandle, iKeyIdex, NULL, iTmpOrgDataLen, SM4_BATCH_NUM, SM4_ENCRYPT, pTmpEncData, iEncDataLen);
if(ret != 0)
{
LOG("SYD_SM4_BatchData ret=%08x, i=%d", ret, i);
return ret;
}
/* 特殊测试 iSize为0测试 */
ret = SYD_SM4_BatchData(hHandle, iKeyIdex, pTmpOrgData, iTmpOrgDataLen, 0, SM4_ENCRYPT, pTmpEncData, iEncDataLen);
if(ret != 0)
{
LOG("SYD_SM4_BatchData ret=%08x, i=%d", ret, i);
return ret;
}
ret = SYD_SM4_BatchData(hHandle, iKeyIdex, pTmpOrgData, iTmpOrgDataLen, SM4_BATCH_NUM, SM4_ENCRYPT, pTmpEncData, iEncDataLen);
if(ret != 0)
{
LOG("SYD_SM4_BatchData ret=%08x, i=%d", ret, i);
return ret;
}
ret = SYD_SM4_BatchData(hHandle, iKeyIdex, pTmpEncData, iEncDataLen, SM4_BATCH_NUM, SM4_DECRYPT, pTmpDecData, iDecDataLen);
if(ret != 0)
{
LOG("SYD_SM4_BatchData ret=%08x, i=%d", ret, i);
return ret;
}
for(j = 0; j < SM4_BATCH_NUM; j++)
{
if(iDecDataLen[j] != i)
{
LOG("iDecDataLen[%d](%d) != (%d)", j, iDecDataLen[j], i);
return -1;
}
if(memcmp(pTmpDecData[j], pTmpOrgData[j], i))
{
LOG("memcmp err i=%d, j=%d", i, j);
return -1;
}
}
printf("i=%d\r", i);
fflush(stdout);
}
return 0;
}
int SM4_LongData_Test_Special(void *hHandle)
{
int ret = 0;
char bEncData[9000] = { 0 };
int ulEncDataLen = 9000;
char bDecData[9000] = { 0 };
int ulDecDataLen = 0;
int ulDecDataLen1 = 0;
void *hEncProchandle = NULL;
void *hDecProchandle = NULL;
/*1、0长度数据测试*/
ret = SYD_SM4_LongDataInit(KEYINDEX, SM4_ENCRYPT, &hEncProchandle);
if (ret != 0)
{
LOG("SYD_SM4_LongDataInit, ret=%08x", ret);
return ret;
}
ret = SYD_SM4_LongDataFinal(hHandle, bEncData, &ulEncDataLen, hEncProchandle);
if (ret != 0)
{
LOG("SYD_SM4_LongDataFinal ret=%08x", ret);
goto END;
}
ret = SYD_SM4_LongDataInit(KEYINDEX, SM4_DECRYPT, &hDecProchandle);
if (ret != 0)
{
LOG("SYD_SM4_LongDataInit, ret=%08x", ret);
goto END;
}
ret = SYD_SM4_LongDataUpdate(hHandle, bEncData, ulEncDataLen, bDecData, &ulDecDataLen, hDecProchandle);
if (ret != 0)
{
LOG("SYD_SM4_LongDataUpdate, ret=%08x", ret);
goto END;
}
ret = SYD_SM4_LongDataFinal(hHandle, bDecData, &ulDecDataLen1, hDecProchandle);
if (ret != 0)
{
LOG("SYD_SM4_LongDataFinal ret=%08x", ret);
goto END;
}
if(ulDecDataLen != 0)
{
LOG("ulDecDataLen != 0");
goto END;
}
END:
SYD_CloseHandle(hEncProchandle);
SYD_CloseHandle(hDecProchandle);
return 0;
}
int SM4_LongData_Test(void *hHandle)
{
int ret = 0;
int k = 0, iEncDecNum = 10240, iSymSingleBytes = 0;
int ulDataLen = 0;
char bEncData[10240 + 16] = { 0 };
int ulEncDataLen = 0;
char* pbEncTemp = NULL;
int ulTempEncLen = 0;
char bDecData[10240] = { 0 };
int ulDecDataLen = 0;
char* pbDecTemp = NULL;
int ulTempDecLen = 0;
void *hEncProchandle = NULL;
void *hDecProchandle = NULL;
char cOrgData[10240] = {0};
IniOrgData(cOrgData, 10240, 1);
for (iSymSingleBytes = 1; iSymSingleBytes <= 6144; iSymSingleBytes++)
{
/*加密*/
ret = SYD_SM4_LongDataInit(KEYINDEX, SM4_ENCRYPT, &hEncProchandle);
if (ret != 0)
{
LOG("SYD_SM4_LongDataInit, ret=%08x", ret);
goto END;
}
pbEncTemp = bEncData;
for (k = 0; k < iEncDecNum / iSymSingleBytes; k++)
{
ulEncDataLen = 10240;
ret = SYD_SM4_LongDataUpdate(hHandle, cOrgData + (k * iSymSingleBytes), iSymSingleBytes, pbEncTemp, &ulEncDataLen, hEncProchandle);
if (ret != 0)
{
LOG("SYD_SM4_LongDataUpdate k=%d, ret=%08x", k, ret);
goto END;
}
ulTempEncLen += ulEncDataLen;
pbEncTemp += ulEncDataLen;
}
if (iEncDecNum % iSymSingleBytes != 0)
{
ulEncDataLen = 10240;
ret = SYD_SM4_LongDataUpdate(hHandle, cOrgData + (iEncDecNum - (iEncDecNum % iSymSingleBytes)), iEncDecNum % iSymSingleBytes, pbEncTemp, &ulEncDataLen, hEncProchandle);
if (ret != 0)
{
LOG("SYD_SM4_LongDataUpdate ret=%08x", ret);
goto END;
}
ulTempEncLen += ulEncDataLen;
pbEncTemp += ulEncDataLen;
}
ulEncDataLen = 10240;
ret = SYD_SM4_LongDataFinal(hHandle, pbEncTemp, &ulEncDataLen, hEncProchandle);
if (ret != 0)
{
LOG("SYD_SM4_LongDataFinal ret=%08x", ret);
goto END;
}
ulTempEncLen += ulEncDataLen;
/*解密*/
ret = SYD_SM4_LongDataInit(KEYINDEX, SM4_DECRYPT, &hDecProchandle);
if (ret != 0)
{
LOG("SYD_SM4_LongDataInit, ulRet=%08x", ret);
goto END;
}
pbDecTemp = bDecData;
for (k = 0; k < ulTempEncLen / iSymSingleBytes; k++)
{
ulDecDataLen = 10240;
ret = SYD_SM4_LongDataUpdate(hHandle, bEncData + (k * iSymSingleBytes), iSymSingleBytes, pbDecTemp, &ulDecDataLen, hDecProchandle);
if (ret != 0)
{
LOG("SYD_SM4_LongDataUpdate k=%d, ret=%08x", k, ret);
goto END;
}
ulTempDecLen += ulDecDataLen;
pbDecTemp += ulDecDataLen;
}
if (ulTempEncLen % iSymSingleBytes != 0)
{
ulDecDataLen = 10240;
ret = SYD_SM4_LongDataUpdate(hHandle, bEncData + (ulTempEncLen - (ulTempEncLen % iSymSingleBytes)), ulTempEncLen % iSymSingleBytes, pbDecTemp, &ulDecDataLen, hDecProchandle);
if (ret != 0)
{
LOG("SKF_DecryptUpdate k=%d, ret=%08x", k, ret);
goto END;
}
ulTempDecLen += ulDecDataLen;
pbDecTemp += ulDecDataLen;
}
ulDecDataLen = 10240;
ret = SYD_SM4_LongDataFinal(hHandle, pbDecTemp, &ulDecDataLen, hDecProchandle);
if (ret != 0)
{
LOG("SKF_DecryptFinal ret=%08x", ret);
goto END;
}
ulTempDecLen += ulDecDataLen;
SYD_CloseHandle(hEncProchandle);
SYD_CloseHandle(hDecProchandle);
if (ulTempDecLen != iEncDecNum)
{
LOG("iSymSingleBytes=%d, ulTempDecLen=%d", iSymSingleBytes, ulTempDecLen);
return 0;
}
if (memcmp(cOrgData, bDecData, ulTempDecLen))
{
LOG("memcmp iSymSingleBytes=%d, ulTempDecLen=%d", iSymSingleBytes, ulTempDecLen);
return 0;
}
memset(bEncData, 0, sizeof(bEncData));
memset(bDecData, 0, sizeof(bDecData));
ulTempEncLen = 0;
ulTempDecLen = 0;
printf("count: %d\r", iSymSingleBytes);
fflush(stdout);
}
END:
if(ret != 0)
{
SYD_CloseHandle(hEncProchandle);
SYD_CloseHandle(hDecProchandle);
}
return 0;
}
int SM3_ShortHash_Test(void *hHandle)
{
int ret = 0;
char cOrgData[2048] = {0};
int iOrgDataLen = 0;
char cHash[33] = {0};
IniOrgData(cOrgData, 2048, 1);
for(iOrgDataLen = 0; iOrgDataLen <= 1024; iOrgDataLen++)
{
ret = SYD_SM3_Hash_ShortData(hHandle, cOrgData, iOrgDataLen, cHash);
if(ret != 0)
{
LOG("SYD_SM3_Hash_ShortData ret=%08x", ret);
return 0;
}
printf("iOrgDataLen=%d\r", iOrgDataLen);
fflush(stdout);
}
return 0;
}
int SM3_LongHash_Test_Special(void *hHandle)
{
int ret = 0;
void* hHash = NULL;
char cOrgData[256] = {0};
char cHash[33] = {0};
ret = SYD_SM3_Hash_Init(&hHash);
if (ret != 0)
{
LOG("SYD_SM3_Hash_Init ret=%08x", ret);
return ret;
}
ret = SYD_SM3_Hash_Final(hHandle, cHash, hHash);
if (ret != 0)
{
LOG("SYD_SM3_Hash_Final ret=%08x", ret);
goto END;
}
PrintHex("cHash", cHash, 32);
SYD_CloseHandle(hHash);
ret = SYD_SM3_Hash_Init(&hHash);
if (ret != 0)
{
LOG("SYD_SM3_Hash_Init ret=%08x", ret);
return ret;
}
ret = SYD_SM3_Hash_Update(hHandle, cOrgData, 0, hHash);
if (ret != 0)
{
LOG("SYD_SM3_Hash_Update ret=%08x", ret);
return ret;
}
ret = SYD_SM3_Hash_Final(hHandle, cHash, hHash);
if (ret != 0)
{
LOG("SYD_SM3_Hash_Final ret=%08x", ret);
goto END;
}
PrintHex("cHash", cHash, 32);
SYD_CloseHandle(hHash);
END:
if(ret != 0)
{
SYD_CloseHandle(hHash);
}
return 0;
}
int SM3_LongHash_Test(void *hHandle)
{
int ulRet = 0, i = 0, num = 0;
void* hHash = NULL;
char bHash[32] = { 0 }, bTmpHash[32] = { 0 };
int ulHashLen = 0, ulTmpHashLen = 0;
int ulHashBytes = 0, ulMultBytes = 0;
char cOrgData[9000] = {0};
IniOrgData(cOrgData, 9000, 1);
for (ulHashBytes = 1; ulHashBytes <= 64; ulHashBytes++)
{
for (ulMultBytes = 1; ulMultBytes < ulHashBytes + 1; ulMultBytes++)
{
/*带公钥的HASH*/
ulRet = SYD_SM3_Hash_Init(&hHash);
if (ulRet != 0)
{
LOG("SYD_SM3_Hash_Init ulRet=%08x", ulRet);
return ulRet;
}
for (i = 0; i < ulHashBytes / ulMultBytes; i++)
{
ulRet = SYD_SM3_Hash_Update(hHandle, cOrgData + (i * ulMultBytes), ulMultBytes, hHash);
if (ulRet != 0)
{
LOG("SYD_SM3_Hash_Update ulRet=%08x", ulRet);
goto END;
}
}
if (ulHashBytes % ulMultBytes != 0)
{
ulRet = SYD_SM3_Hash_Update(hHandle, cOrgData + (ulHashBytes - (ulHashBytes % ulMultBytes)), ulHashBytes % ulMultBytes, hHash);
if (ulRet != 0)
{
LOG("SYD_SM3_Hash_Update ulRet=%08x", ulRet);
goto END;
}
}
ulRet = SYD_SM3_Hash_Final(hHandle, bHash, hHash);
if (ulRet != 0)
{
LOG("SYD_SM3_Hash_Final ulRet=%08x", ulRet);
goto END;
}
SYD_CloseHandle(hHash);
ulRet = SYD_SM3_Hash_ShortData(hHandle, cOrgData, ulHashBytes, bTmpHash);
if(ulRet != 0)
{
LOG("SYD_SM3_Hash_ShortData ulRet=%08x", ulRet);
return 0;
}
if (memcmp(bTmpHash, bHash, 32))
{
LOG("memcmp err");
return 0;
}
}
printf("ulHashBytes=%d\r", ulHashBytes);
fflush(stdout);
}
END:
if (ulRet != 0)
{
SYD_CloseHandle(hHash);
}
return 0;
}
int SM4Mac_ShortData(void *hHandle)
{
int ret = 0;
char cOrgData[2048] = {0};
int iOrgDataLen = 0;
char cMac[33] = {0};
IniOrgData(cOrgData, 2048, 1);
/*1、未校验MAC*/
for(iOrgDataLen = 0; iOrgDataLen <= 1024; iOrgDataLen++)
{
ret = SYD_SM4Mac_ShortData(hHandle, KEYINDEX, cOrgData, iOrgDataLen, cMac, NULL);
if(ret != 0)
{
LOG("SYD_SM4Mac_ShortData ret=%08x", ret);
return 0;
}
printf("iOrgDataLen=%d\r", iOrgDataLen);
fflush(stdout);
}
/*2、校验MAC*/
int iCheckRet = -1;
/*
*注意:手算校验值时不要忘记填充值也是原始数据的一部分
*这里用的密钥分量为
分量1:31313131313131313131313131313131
分量2:32323232323232323232323232323232
合成后的分量:03030303030303030303030303030303
*/
char cCheckMac[] = "A3B596312F67832C4F8B74F8E68FD394";
HexToBin(32, cCheckMac, cMac);
ret = SYD_SM4Mac_ShortData(hHandle, KEYINDEX, cOrgData, 32, cMac, &iCheckRet);
if(ret != 0)
{
LOG("SYD_SM4Mac_ShortData ret=%08x", ret);
return 0;
}
if(iCheckRet != 0)
{
LOG("mac check err iCheckRet=%08x\n", iCheckRet);
}
return 0;
}
int SM4Mac_BatchData(void *hHandle)
{
int ret = 0, i = 0, j = 0;
int iKeyIdex[SM4_MAC_BATCH_NUM] = {0};
int iCheckRet[SM4_MAC_BATCH_NUM] = {0};
char cOrgData[SM4_MAC_BATCH_NUM][2048] = {{0}};
int iOrgDataLen[SM4_MAC_BATCH_NUM] = {0};
char cMac[SM4_MAC_BATCH_NUM][33] = {{0}};
char *pTmpMac[SM4_MAC_BATCH_NUM] = {0};
char *pTmpOrgData[SM4_MAC_BATCH_NUM] = {0};
for(i = 0; i < SM4_MAC_BATCH_NUM; i++)
{
IniOrgData(cOrgData[i], 2048, i);
iKeyIdex[i] = KEYINDEX;
pTmpOrgData[i] = cOrgData[i];
pTmpMac[i] = cMac[i];
}
/*不校验MAC*/
for(i = 1; i <= 1024; i++)
{
for(j = 0; j < SM4_MAC_BATCH_NUM; j++)
{
iOrgDataLen[j] = i;
}
/* 特殊测试 pcData为NULL*/
ret = SYD_SM4Mac_BatchData(hHandle, iKeyIdex, NULL, iOrgDataLen, SM4_MAC_BATCH_NUM, pTmpMac, NULL);
if(ret != 0)
{
LOG("SYD_SM4Mac_BatchData ret=%08x", ret);
return 0;
}
/* 特殊测试 iSize为0 */
ret = SYD_SM4Mac_BatchData(hHandle, iKeyIdex, pTmpOrgData, iOrgDataLen, 0, pTmpMac, NULL);
if(ret != 0)
{
LOG("SYD_SM4Mac_BatchData ret=%08x", ret);
return 0;
}
ret = SYD_SM4Mac_BatchData(hHandle, iKeyIdex, pTmpOrgData, iOrgDataLen, SM4_MAC_BATCH_NUM, pTmpMac, NULL);
if(ret != 0)
{
LOG("SYD_SM4Mac_BatchData ret=%08x", ret);
return 0;
}
printf("i=%d\r", i);
fflush(stdout);
}
/*校验MAC*/
char cCheckMac[10][33] = {0};
char cCheckMac_Bin[10][17] = {0};
strcpy(cCheckMac[0], "4A590763CFD67F045BE26A7570D8FDB1");
strcpy(cCheckMac[1], "7CEDAE1E836889962F8C06C0501613F8");
strcpy(cCheckMac[2], "60F34B352AB359A3109C3C7A343BA881");
strcpy(cCheckMac[3], "2A6600B4397FA5331F7310DBECE475EE");
for(j = 0; j < SM4_MAC_BATCH_NUM; j++)
{
iOrgDataLen[j] = 1;
HexToBin(32, cCheckMac[j], cCheckMac_Bin[j]);
pTmpMac[j] = cCheckMac_Bin[j];
}
memset(iCheckRet, '1', sizeof(iCheckRet));
ret = SYD_SM4Mac_BatchData(hHandle, iKeyIdex, pTmpOrgData, iOrgDataLen, SM4_MAC_BATCH_NUM, pTmpMac, iCheckRet);
if(ret != 0)
{
LOG("SYD_SM4Mac_BatchData ret=%08x", ret);
return 0;
}
for(j = 0; j < SM4_MAC_BATCH_NUM; j++)
{
if(iCheckRet[j] != 0)
{
LOG("mac check err iCheckRet[%d]=%08x\n", j, iCheckRet[j]);
}
}
return 0;
}
int SM4Mac_LongData_Special(void *hHandle)
{
int ret = 0;
char cData[16] = {0};
char cMac[64] = {0};
void *hMacProchandle = NULL;
ret = SYD_SM4Mac_LongDataInit(KEYINDEX, &hMacProchandle);
if (ret != 0)
{
LOG("SYD_SM4Mac_LongDataInit, ret=%08x", ret);
goto END;
}
ret = SYD_SM4Mac_LongDataUpdate(hHandle, cData, 0, hMacProchandle);
if (ret != 0)
{
LOG("SYD_SM4Mac_LongDataUpdate, ret=%08x", ret);
goto END;
}
ret = SYD_SM4Mac_LongDataFinal(hHandle, cMac, NULL, hMacProchandle);
if (ret != 0)
{
LOG("SYD_SM4Mac_LongDataFinal ret=%08x", ret);
goto END;
}
SYD_CloseHandle(hMacProchandle);
PrintHex("cMac", cMac, 64);
END:
if(ret != 0)
{
SYD_CloseHandle(hMacProchandle);
}
return 0;
}
int SM4Mac_LongData(void *hHandle)
{
int ret = 0;
int k = 0, iEncDecNum = 10240, iSymSingleBytes = 0;
char cCheckMac[64] = {0};
char cMac[64] = {0};
void *hMacProchandle = NULL;
char cOrgData[10240] = {0};
IniOrgData(cOrgData, 10240, 1);
char mac_hex[] = "9222B9CDFBCF1F75469A118762F415C9";
char mac_bin[32] = {0};
HexToBin(32, mac_hex, mac_bin);
for (iSymSingleBytes = 1; iSymSingleBytes <= 6144; iSymSingleBytes++)
{
ret = SYD_SM4Mac_LongDataInit(KEYINDEX, &hMacProchandle);
if (ret != 0)
{
LOG("SYD_SM4Mac_LongDataInit, ret=%08x", ret);
goto END;
}
for (k = 0; k < iEncDecNum / iSymSingleBytes; k++)
{
ret = SYD_SM4Mac_LongDataUpdate(hHandle, cOrgData + (k * iSymSingleBytes), iSymSingleBytes, hMacProchandle);
if (ret != 0)
{
LOG("SYD_SM4Mac_LongDataUpdate k=%d, ret=%08x", k, ret);
goto END;
}
}
if (iEncDecNum % iSymSingleBytes != 0)
{
ret = SYD_SM4Mac_LongDataUpdate(hHandle, cOrgData + (iEncDecNum - (iEncDecNum % iSymSingleBytes)), iEncDecNum % iSymSingleBytes, hMacProchandle);
if (ret != 0)
{
LOG("SYD_SM4Mac_LongDataUpdate ret=%08x", ret);
goto END;
}
}
ret = SYD_SM4Mac_LongDataFinal(hHandle, cMac, NULL, hMacProchandle);
if (ret != 0)
{
LOG("SYD_SM4Mac_LongDataFinal ret=%08x", ret);
goto END;
}
SYD_CloseHandle(hMacProchandle);
if(memcmp(cMac, mac_bin, 16))
{
LOG("memcmp err iSymSingleBytes=%d", iSymSingleBytes);
PrintHex("mac_bin", mac_bin, 32);
PrintHex("cMac", cMac, 32);
goto END;
}
printf("count: %d\r", iSymSingleBytes);
fflush(stdout);
}
END:
if(ret != 0)
{
SYD_CloseHandle(hMacProchandle);
}
return 0;
}
int SM4_ShortData_CheckValue(void *hHandle)
{
int ret = 0, i = 0;
char cMac[33] = {0};
char cOrgData[2048] = { 0 };
IniOrgData(cOrgData, 2048, 1);
char cEncryptData[2048] = {0};
int iEncryptDataLen = 0;
char cCheckValue[17] = {0};
char cDecryptData[2048] = {0};
int iDecryptDataLen = 0;
char cErrMac[] = "1234567812345678";
for(i = 1; i <= 1024; i++)
{
iEncryptDataLen = i + 16;
ret = SYD_SM4_Encrypt_Mac_ShortData(hHandle, KEYINDEX, CHECKINDEX, cOrgData, i, \
cEncryptData, &iEncryptDataLen, cCheckValue);
if (ret != 0)
{
LOG("SYD_SM4_Encrypt_Mac_ShortData ret=%08x", ret);
return ret;
}
iDecryptDataLen = sizeof(cDecryptData);
ret = SYD_SM4_Decrypt_Mac_ShortData(hHandle, KEYINDEX, CHECKINDEX, \
cEncryptData, iEncryptDataLen, cCheckValue, cDecryptData, &iDecryptDataLen);
if (ret != 0)
{
LOG("SYD_SM4_Decrypt_Mac_ShortData ret=%08x", ret);
return ret;
}
if(iDecryptDataLen != i)
{
LOG("iDecryptDataLen(%d) != (%d)", iDecryptDataLen, i);
return -1;
}
if(memcmp(cDecryptData, cOrgData, iDecryptDataLen))
{
LOG("memcmp err i=%d", i);
return -1;
}
/* 错误场景,输入错误的MAC值 */
iDecryptDataLen = sizeof(cDecryptData);
ret = SYD_SM4_Decrypt_Mac_ShortData(hHandle, KEYINDEX, CHECKINDEX, \
cEncryptData, iEncryptDataLen, cErrMac, cDecryptData, &iDecryptDataLen);
if (ret != 0x01000010)
{
LOG("SYD_SM4_Decrypt_Mac_ShortData ret=%08x", ret);
return ret;
}
printf("iOrgDataLen=%d\r", i);
fflush(stdout);
}
return 0;
}
int SM4_BatchData_CheckValue(void *hHandle)
{
int ret = 0, i = 0, j = 0;
int iEncKeyIdex[SM4_BATCH_NUM] = {0};
int iCheckKeyIdex[SM4_BATCH_NUM] = {0};
char cOrgData[SM4_BATCH_NUM][2048] = {{0}};
int iOrgDataLen[SM4_BATCH_NUM] = {0};
char cEncData[SM4_BATCH_NUM][1024 + 16] = {{0}};
int iEncDataLen[SM4_BATCH_NUM] = {0};
char cDecData[SM4_BATCH_NUM][1024] = {{0}};
int iDecDataLen[SM4_BATCH_NUM] = {0};
char cCheckValue[SM4_BATCH_NUM][17] = {0};
char *pTmpOrgData[SM4_BATCH_NUM] = {0};
char *pTmpEncData[SM4_BATCH_NUM] = {0};
char *pTmpDecData[SM4_BATCH_NUM] = {0};
char *pTmpCheckValue[SM4_BATCH_NUM] = {0};
char cErrMac[SM4_BATCH_NUM][17] = {0};
char *pTmpErrMac[SM4_BATCH_NUM] = {0};
int iCheckRet[SM4_MAC_BATCH_NUM] = {0};
for(i = 0; i < SM4_BATCH_NUM; i++)
{
IniOrgData(cOrgData[i], 2048, i);
iEncKeyIdex[i] = KEYINDEX;
iCheckKeyIdex[i] = CHECKINDEX;
pTmpOrgData[i] = cOrgData[i];
pTmpEncData[i] = cEncData[i];
pTmpDecData[i] = cDecData[i];
pTmpCheckValue[i] = cCheckValue[i];
memcpy(cErrMac[i], "1234567812345678", 16);
pTmpErrMac[i] = cErrMac[i];
}
for(i = 1; i <= 1024; i++)
{
for(j = 0; j < SM4_BATCH_NUM; j++)
{
iOrgDataLen[j] = i;
iEncDataLen[j] = i + 16;
iDecDataLen[j] = i;
iCheckRet[j] = 1;
}
/* 特殊测试pcData为NULL */
ret = SYD_SM4_Encrypt_Mac_BatchData(hHandle, iEncKeyIdex, iCheckKeyIdex, NULL, iOrgDataLen, \
SM4_BATCH_NUM, pTmpEncData, iEncDataLen, pTmpCheckValue);
if(ret != 0)
{
LOG("SYD_SM4_Encrypt_Mac_BatchData ret=%08x, i=%d", ret, i);
return ret;
}
/* 特殊测试iSize为0 */
ret = SYD_SM4_Encrypt_Mac_BatchData(hHandle, iEncKeyIdex, iCheckKeyIdex, pTmpOrgData, iOrgDataLen, \
0, pTmpEncData, iEncDataLen, pTmpCheckValue);
if(ret != 0)
{
LOG("SYD_SM4_Encrypt_Mac_BatchData ret=%08x, i=%d", ret, i);
return ret;
}
ret = SYD_SM4_Encrypt_Mac_BatchData(hHandle, iEncKeyIdex, iCheckKeyIdex, pTmpOrgData, iOrgDataLen, \
SM4_BATCH_NUM, pTmpEncData, iEncDataLen, pTmpCheckValue);
if(ret != 0)
{
LOG("SYD_SM4_Encrypt_Mac_BatchData ret=%08x, i=%d", ret, i);
return ret;
}
/* 特殊测试pcData为NULL */
ret = SYD_SM4_Decrypt_Mac_BatchData(hHandle, iEncKeyIdex, iCheckKeyIdex, NULL, iEncDataLen, \
pTmpCheckValue, SM4_BATCH_NUM, pTmpDecData, iDecDataLen, iCheckRet);
if(ret != 0)
{
LOG("SYD_SM4_Decrypt_Mac_BatchData ret=%08x, i=%d", ret, i);
return ret;
}
/* 特殊测试iSize为0 */
ret = SYD_SM4_Decrypt_Mac_BatchData(hHandle, iEncKeyIdex, iCheckKeyIdex, pTmpEncData, iEncDataLen, \
pTmpCheckValue, 0, pTmpDecData, iDecDataLen, iCheckRet);
if(ret != 0)
{
LOG("SYD_SM4_Decrypt_Mac_BatchData ret=%08x, i=%d", ret, i);
return ret;
}
ret = SYD_SM4_Decrypt_Mac_BatchData(hHandle, iEncKeyIdex, iCheckKeyIdex, pTmpEncData, iEncDataLen, \
pTmpCheckValue, SM4_BATCH_NUM, pTmpDecData, iDecDataLen, iCheckRet);
if(ret != 0)
{
LOG("SYD_SM4_Decrypt_Mac_BatchData ret=%08x, i=%d", ret, i);
return ret;
}
for(j = 0; j < SM4_BATCH_NUM; j++)
{
if(iCheckRet[j] != 0)
{
LOG("mac check err iCheckRet[%d]=%08x\n", j, iCheckRet[j]);
}
if(iDecDataLen[j] != i)
{
LOG("iDecDataLen[%d](%d) != (%d)", j, iDecDataLen[j], i);
return -1;
}
if(memcmp(pTmpDecData[j], pTmpOrgData[j], i))
{
LOG("memcmp err i=%d, j=%d", i, j);
return -1;
}
}
/* 错误场景,输入错误的MAC值 */
for(j = 0; j < SM4_BATCH_NUM; j++)
{
iDecDataLen[j] = 0;
}
ret = SYD_SM4_Decrypt_Mac_BatchData(hHandle, iEncKeyIdex, iCheckKeyIdex, pTmpEncData, iEncDataLen, \
pTmpErrMac, SM4_BATCH_NUM, pTmpDecData, iDecDataLen, iCheckRet);
if(ret != 0)
{
LOG("SYD_SM4_Decrypt_Mac_BatchData ret=%08x", ret);
return ret;
}
for(j = 0; j < SM4_MAC_BATCH_NUM; j++)
{
if(iDecDataLen[j] != 0)
{
LOG("decdatalen err\n");
}
if(iCheckRet[j] != 0x01000010)
{
LOG("mac check err iCheckRet[%d]=%08x\n", j, iCheckRet[j]);
}
}
printf("i=%d\r", i);
fflush(stdout);
}
return 0;
}
int XN_SM4_Enc_LongData_Test(void *hHandle, int datasize)
{
if(datasize < 1024 || datasize % 16 != 0)
{
LOG("datasize er");
return -1;
}
int ret = 0, k = 0;
int singlebytes = 6144;
char bEncData[8192] = { 0 };
int ulEncDataLen = 0;
void *hEncProchandle = NULL;
char cOrgData[8192] = {0};
IniOrgData(cOrgData, 8192, 1);
/*加密*/
ret = SYD_SM4_LongDataInit(KEYINDEX, SM4_ENCRYPT, &hEncProchandle);
if (ret != 0)
{
LOG("SYD_SM4_LongDataInit, ret=%08x", ret);
goto END;
}
for (k = 0; k < datasize / singlebytes; k++)
{
ulEncDataLen = 9000;
ret = SYD_SM4_LongDataUpdate(hHandle, cOrgData, singlebytes, bEncData, &ulEncDataLen, hEncProchandle);
if (ret != 0)
{
LOG("SYD_SM4_LongDataUpdate k=%d, ret=%08x", k, ret);
goto END;
}
}
ulEncDataLen = 9000;
ret = SYD_SM4_LongDataFinal(hHandle, bEncData, &ulEncDataLen, hEncProchandle);
if (ret != 0)
{
LOG("SYD_SM4_LongDataFinal ret=%08x", ret);
goto END;
}
SYD_CloseHandle(hEncProchandle);
END:
if(ret != 0)
{
SYD_CloseHandle(hEncProchandle);
}
return 0;
}
int XN_SM4_Dec_LongData_Test(void *hHandle, int datasize)
{
if(datasize < 1024 || datasize % 16 != 0)
{
LOG("datasize er");
return -1;
}
int ret = 0, k = 0;
int singlebytes = 6144;
char bDecData[8192] = { 0 };
int ulDecDataLen = 0;
void *hDecProchandle = NULL;
char cOrgData[8192] = {0};
IniOrgData(cOrgData, 8192, 1);
/*解密-这里使用随机数据作为密文而且final不判断返回值 这里只做吞吐量的验证,不做正确性的验证*/
ret = SYD_SM4_LongDataInit(KEYINDEX, SM4_DECRYPT, &hDecProchandle);
if (ret != 0)
{
LOG("SYD_SM4_LongDataInit, ret=%08x", ret);
goto END;
}
for (k = 0; k < datasize / singlebytes; k++)
{
ulDecDataLen = 9000;
ret = SYD_SM4_LongDataUpdate(hHandle, cOrgData, singlebytes, bDecData, &ulDecDataLen, hDecProchandle);
if (ret != 0)
{
LOG("SYD_SM4_LongDataUpdate k=%d, ret=%08x", k, ret);
goto END;
}
}
ulDecDataLen = 9000;
SYD_SM4_LongDataFinal(hHandle, bDecData, &ulDecDataLen, hDecProchandle);
SYD_CloseHandle(hDecProchandle);
END:
if(ret != 0)
{
SYD_CloseHandle(hDecProchandle);
}
return 0;
}
int XN_SM4Mac_LongData_Test(void *hHandle, int datasize)
{
if(datasize < 1024 || datasize % 16 != 0)
{
LOG("datasize err");
return -1;
}
int ret = 0, k = 0;
int singlebytes = 6144;
char cMac[64] = {0};
void *hMacProchandle = NULL;
char cOrgData[9000] = {0};
IniOrgData(cOrgData, 9000, 1);
ret = SYD_SM4Mac_LongDataInit(KEYINDEX, &hMacProchandle);
if (ret != 0)
{
LOG("SYD_SM4Mac_LongDataInit, ret=%08x", ret);
goto END;
}
for (k = 0; k < datasize / singlebytes; k++)
{
ret = SYD_SM4Mac_LongDataUpdate(hHandle, cOrgData, singlebytes, hMacProchandle);
if (ret != 0)
{
LOG("SYD_SM4Mac_LongDataUpdate k=%d, ret=%08x", k, ret);
goto END;
}
}
ret = SYD_SM4Mac_LongDataFinal(hHandle, cMac, NULL, hMacProchandle);
if (ret != 0)
{
LOG("SYD_SM4Mac_LongDataFinal ret=%08x", ret);
goto END;
}
SYD_CloseHandle(hMacProchandle);
END:
if(ret != 0)
{
SYD_CloseHandle(hMacProchandle);
}
return 0;
}
int XN_SM3_LongHash_Test(void *hHandle, int datasize)
{
if(datasize < 1024 || datasize % 16 != 0)
{
LOG("datasize err");
return -1;
}
int ulRet = 0, i = 0;
int singlebytes = 6144;
void* hHash = NULL;
char bHash[32] = { 0 };
char cOrgData[9000] = {0};
IniOrgData(cOrgData, 9000, 1);
/*带公钥的HASH*/
ulRet = SYD_SM3_Hash_Init(&hHash);
if (ulRet != 0)
{
LOG("SYD_SM3_Hash_Init ulRet=%08x", ulRet);
return ulRet;
}
for (i = 0; i < datasize / singlebytes; i++)
{
ulRet = SYD_SM3_Hash_Update(hHandle, cOrgData, singlebytes, hHash);
if (ulRet != 0)
{
LOG("SYD_SM3_Hash_Update ulRet=%08x", ulRet);
goto END;
}
}
ulRet = SYD_SM3_Hash_Final(hHandle, bHash, hHash);
if (ulRet != 0)
{
LOG("SYD_SM3_Hash_Final ulRet=%08x", ulRet);
goto END;
}
SYD_CloseHandle(hHash);
END:
if (ulRet != 0)
{
SYD_CloseHandle(hHash);
}
return 0;
}
int XN_SM4EncMac_LongData_Test(void *hHandle, int datasize)
{
if(datasize < 1024 || datasize % 16 != 0)
{
LOG("datasize er");
return -1;
}
int ret = 0, k = 0;
int singlebytes = 6144;
char bEncData[8192] = { 0 };
int ulEncDataLen = 0;
char cMac[64] = {0};
void *hEncProchandle = NULL;
char cOrgData[8192] = {0};
IniOrgData(cOrgData, 8192, 1);
/*加密*/
ret = SYD_SM4EncDecMac_LongDataInit(KEYINDEX, CHECKINDEX, SM4_ENCRYPT, &hEncProchandle);
if (ret != 0)
{
LOG("SYD_SM4EncDecMac_LongDataInit, ret=%08x", ret);
goto END;
}
for (k = 0; k < datasize / singlebytes; k++)
{
ulEncDataLen = 8192;
ret = SYD_SM4EncDecMac_LongDataUpdate(hHandle, cOrgData, singlebytes, bEncData, &ulEncDataLen, hEncProchandle);
if (ret != 0)
{
LOG("SYD_SM4EncDecMac_LongDataUpdate k=%d, ret=%08x", k, ret);
goto END;
}
}
ulEncDataLen = 8192;
ret = SYD_SM4EncDecMac_LongDataFinal(hHandle, bEncData, &ulEncDataLen, cMac, hEncProchandle);
if (ret != 0)
{
LOG("SYD_SM4EncDecMac_LongDataFinal ret=%08x", ret);
goto END;
}
SYD_CloseHandle(hEncProchandle);
END:
if(ret != 0)
{
SYD_CloseHandle(hEncProchandle);
}
return 0;
}
int XN_SM4DecMac_LongData_Test(void *hHandle, int datasize)
{
if(datasize < 1024 || datasize % 16 != 0)
{
LOG("datasize er");
return -1;
}
int ret = 0, k = 0;
int singlebytes = 6144;
char bDecData[8192] = { 0 };
int ulDecDataLen = 0;
char cMac[64] = {0};
void *hDecProchandle = NULL;
char cOrgData[8192] = {0};
IniOrgData(cOrgData, 8192, 1);
/*解密-这里使用随机数据作为密文而且final不判断返回值 这里只做吞吐量的验证,不做正确性的验证*/
ret = SYD_SM4EncDecMac_LongDataInit(KEYINDEX, CHECKINDEX, SM4_DECRYPT, &hDecProchandle);
if (ret != 0)
{
LOG("SYD_SM4EncDecMac_LongDataInit, ret=%08x", ret);
goto END;
}
for (k = 0; k < datasize / singlebytes; k++)
{
ulDecDataLen = 8192;
ret = SYD_SM4EncDecMac_LongDataUpdate(hHandle, cOrgData, singlebytes, bDecData, &ulDecDataLen, hDecProchandle);
if (ret != 0)
{
LOG("SYD_SM4EncDecMac_LongDataUpdate k=%d, ret=%08x", k, ret);
goto END;
}
}
ulDecDataLen = 8192;
SYD_SM4EncDecMac_LongDataFinal(hHandle, bDecData, &ulDecDataLen, cMac, hDecProchandle);
SYD_CloseHandle(hDecProchandle);
END:
if(ret != 0)
{
SYD_CloseHandle(hDecProchandle);
}
return 0;
}
int SM4_LongData_CheckValue(void *hHandle)
{
int ret = 0;
int k = 0, iEncDecNum = 1024, iSingleBytes = 0;
char bEncData[10240 + 16] = { 0 };
int ulEncDataLen = 0;
char* pbEncTemp = NULL;
int ulTempEncLen = 0;
char bDecData[10240] = { 0 };
int ulDecDataLen = 0;
char* pbDecTemp = NULL;
int ulTempDecLen = 0;
void *hEncProchandle = NULL;
void *hDecProchandle = NULL;
char cOrgData[10240] = {0};
char cMac[64] = {0};
IniOrgData(cOrgData, 10240, 1);
char cShortEncData[2048] = {0};
int iShortEncDataLen = 0;
char cShortDecData[2048] = {0};
int iShortDecDataLen = 0;
char cShortMac[64] = {0};
for (iSingleBytes = 1; iSingleBytes <= 6144; iSingleBytes++)
{
/* 长数据加密并mac */
ret = SYD_SM4EncDecMac_LongDataInit(KEYINDEX, CHECKINDEX, SM4_ENCRYPT, &hEncProchandle);
if (ret != 0)
{
LOG("SYD_SM4EncDecMac_LongDataInit, ret=%08x", ret);
goto END;
}
pbEncTemp = bEncData;
for (k = 0; k < iEncDecNum / iSingleBytes; k++)
{
ulEncDataLen = 10240;
ret = SYD_SM4EncDecMac_LongDataUpdate(hHandle, cOrgData + (k * iSingleBytes), iSingleBytes, \
pbEncTemp, &ulEncDataLen, hEncProchandle);
if (ret != 0)
{
LOG("SYD_SM4EncDecMac_LongDataUpdate k=%d, ret=%08x", k, ret);
goto END;
}
ulTempEncLen += ulEncDataLen; pbEncTemp += ulEncDataLen;
}
if (iEncDecNum % iSingleBytes != 0)
{
ulEncDataLen = 10240;
ret = SYD_SM4EncDecMac_LongDataUpdate(hHandle, cOrgData + (iEncDecNum - (iEncDecNum % iSingleBytes)), \
iEncDecNum % iSingleBytes, pbEncTemp, &ulEncDataLen, hEncProchandle);
if (ret != 0)
{
LOG("SYD_SM4EncDecMac_LongDataUpdate ret=%08x", ret);
goto END;
}
ulTempEncLen += ulEncDataLen; pbEncTemp += ulEncDataLen;
}
ulEncDataLen = 10240;
ret = SYD_SM4EncDecMac_LongDataFinal(hHandle, pbEncTemp, &ulEncDataLen, cMac, hEncProchandle);
if (ret != 0)
{
LOG("SYD_SM4EncDecMac_LongDataFinal ret=%08x", ret);
goto END;
}
ulTempEncLen += ulEncDataLen;
#if 1
/* 使用短数据加密并校验MAC接口来对比密文和MAC值是否一致 */
iShortEncDataLen = sizeof(cShortEncData);
ret = SYD_SM4_Encrypt_Mac_ShortData(hHandle, KEYINDEX, CHECKINDEX, cOrgData, iEncDecNum, \
cShortEncData, &iShortEncDataLen, cShortMac);
if (ret != 0)
{
LOG("SYD_SM4_Encrypt_Mac_ShortData ret=%08x", ret);
return ret;
}
if(iShortEncDataLen != ulTempEncLen)
{
LOG("iShortEncDataLen(%d) != ulTempEncLen(%d)", iShortEncDataLen, ulTempEncLen);
return 0;
}
if(memcmp(cShortEncData, bEncData, ulTempEncLen))
{
LOG("memcmp cShortEncData != bEncData");
return 0;
}
if(memcmp(cShortMac, cMac, 16))
{
LOG("memcmp cShortMac != cMac");
return 0;
}
#endif
/* 长数据解密并校验mac */
ret = SYD_SM4EncDecMac_LongDataInit(KEYINDEX, CHECKINDEX, SM4_DECRYPT, &hDecProchandle);
if (ret != 0)
{
LOG("SYD_SM4EncDecMac_LongDataInit, ret=%08x", ret);
goto END;
}
pbDecTemp = bDecData;
for (k = 0; k < ulTempEncLen / iSingleBytes; k++)
{
ulDecDataLen = 10240;
ret = SYD_SM4EncDecMac_LongDataUpdate(hHandle, bEncData + (k * iSingleBytes), iSingleBytes, \
pbDecTemp, &ulDecDataLen, hDecProchandle);
if (ret != 0)
{
LOG("SYD_SM4EncDecMac_LongDataUpdate k=%d, ret=%08x", k, ret);
goto END;
}
ulTempDecLen += ulDecDataLen; pbDecTemp += ulDecDataLen;
}
if (ulTempEncLen % iSingleBytes != 0)
{
ulDecDataLen = 10240;
ret = SYD_SM4EncDecMac_LongDataUpdate(hHandle, bEncData + (ulTempEncLen - (ulTempEncLen % iSingleBytes)), \
ulTempEncLen % iSingleBytes, pbDecTemp, &ulDecDataLen, hDecProchandle);
if (ret != 0)
{
LOG("SKF_DecryptUpdate k=%d, ret=%08x", k, ret);
goto END;
}
ulTempDecLen += ulDecDataLen; pbDecTemp += ulDecDataLen;
}
ulDecDataLen = 10240;
ret = SYD_SM4EncDecMac_LongDataFinal(hHandle, pbDecTemp, &ulDecDataLen, cMac, hDecProchandle);
if (ret != 0)
{
LOG("SKF_DecryptFinal ret=%08x", ret);
goto END;
}
ulTempDecLen += ulDecDataLen;
SYD_CloseHandle(hEncProchandle);
SYD_CloseHandle(hDecProchandle);
if (ulTempDecLen != iEncDecNum)
{
LOG("iSingleBytes=%d, ulTempDecLen=%d", iSingleBytes, ulTempDecLen);
return 0;
}
if (memcmp(cOrgData, bDecData, ulTempDecLen))
{
LOG("memcmp iSingleBytes=%d, ulTempDecLen=%d", iSingleBytes, ulTempDecLen);
return 0;
}
memset(bEncData, 0, sizeof(bEncData));
memset(bDecData, 0, sizeof(bDecData));
ulTempEncLen = 0;
ulTempDecLen = 0;
printf("count: %d\r", iSingleBytes);
fflush(stdout);
}
END:
if(ret != 0)
{
SYD_CloseHandle(hEncProchandle);
SYD_CloseHandle(hDecProchandle);
}
return 0;
}