1449 lines
40 KiB
C
1449 lines
40 KiB
C
#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;
|
||
} |