1、数据空间(17)< 声明的空间16
uchar DataIn[16] = “1234567890123456”;
那么在调用函数时,DataIn作为入参的话,会出现一些不可预料的问题。
通常定义:
uchar DataIn[] = “1234567890123456”;
如上:定义的数据为:“1234567890123456” 16字节空间,加上停止位为17字节,不声明空间的话,会根据数据所占用的空间,进行默认分配。 此时系统默认分配17字节空间。从而保证函数调用其作为入参的时候,不会出现问题。
实例:
static void ExPedIdKeyCalc_PER1(void)
{
int ret;
uchar State;
uchar DataIn[] = "1234567890123456";
uchar DataIn_Decrypt[256];
int KeyIndex=1;
int Mode=0;
uchar DataOut[256];
uchar EncKeyBlock[4096];
int i=0,cnt=10;
ulong time_ECB,time_CBC, TimeAvr_ECB,TimeAvr_CBC;
ulong StartTime;
memset(EncKeyBlock,0,sizeof(EncKeyBlock));
memset(DataOut,0,sizeof(DataOut));
ret = ExPedOpen();
ASSERT(ret == RET_OK,"ExPedOpen ret = %d\n", ret);
ret = ExPedEraseKeys();
ASSERT(ret == RET_OK, "ExPedEraseKeys fail ret=%d", ret);
ret = ExPedExportIdKey(KeyIndex, EncKeyBlock, Mode);
ASSERT(ret == RET_OK,"ExPedExportIdKey ret = %d\n", ret);
ret = OsRSA(Modulus,ModulusLen,Exp,ExpLen,EncKeyBlock,DataOut);
ASSERT(ret == RET_OK,"OsRSA ret = %d\n", ret);
ret = ExPedWriteKey_SM4_TDK(KeyIndex,DataOut);
ASSERT(ret == RET_OK,"ExPedWriteKey_SM4_TDK ret = %d\n", ret);
TimeAvr_ECB = TimeAvr_CBC= 0;
time_ECB = time_CBC = 0;
for(i=0;i<cnt;i++)
{
memset(DataOut,0,sizeof(DataOut));
GETTIME1(time_ECB, ret = ExPedIdKeyCalc(KeyIndex, NULL, DataIn, strlen(DataIn), DataOut, PED_SM4_ECB_ENCRYPT));
TimeAvr_ECB += time_ECB;
ASSERT(ret == RET_OK,"ExPedIdKeyCalc ret = %d\n", ret);
memset(DataIn_Decrypt,0,sizeof(DataIn_Decrypt));
ret = ExPedSM4(KeyIndex,NULL,DataOut,sizeof(DataOut),DataIn_Decrypt,PED_SM4_ECB_DECRYPT);
ASSERT(ret == RET_OK,"ExPedSM4 ret = %d\n", ret);
ASSERT(memcmp(DataIn,DataIn_Decrypt,strlen(DataIn))==0,"DataIn !=DataIn_Decrypt \n");
uchar Initvector[16] = {0x12, 0x34, 0x56, 0x78, 0x90, 0x12, 0x34, 0x56,
0x78, 0x90, 0xAA, 0xBB, 0xCC, 0xDD, 0xEE, 0xFF };
memset(DataOut,0,sizeof(DataOut));
GETTIME1(time_CBC, ret = ExPedIdKeyCalc(KeyIndex, Initvector, DataIn, strlen(DataIn), DataOut, PED_SM4_CBC_ENCRYPT));
TimeAvr_CBC += time_CBC;
ASSERT(ret == RET_OK,"ExPedIdKeyCalc ret = %d\n", ret);
memset(DataIn_Decrypt,0,sizeof(DataIn_Decrypt));
ret = ExPedSM4(KeyIndex,Initvector,DataOut,sizeof(DataOut),DataIn_Decrypt,PED_SM4_CBC_DECRYPT);
ASSERT(ret == RET_OK,"ExPedSM4 ret = %d\n", ret);
ASSERT(memcmp(DataIn,DataIn_Decrypt,strlen(DataIn))==0,"DataIn !=DataIn_Decrypt \n");
}
LOG("EBC=%d,CBC=%d",TimeAvr_ECB/cnt,TimeAvr_CBC/cnt);
ExPedClose();
}
错误实例:
static void ExPedIdKeyCalc_PER1(void)
{
int ret;
uchar State;
uchar DataIn[16] = "1234567890123456";
uchar DataIn_Decrypt[256];
int KeyIndex=1;
int Mode=0;
uchar DataOut[256];
uchar EncKeyBlock[4096];
int i=0,cnt=10;
ulong time_ECB,time_CBC, TimeAvr_ECB,TimeAvr_CBC;
ulong StartTime;
memset(EncKeyBlock,0,sizeof(EncKeyBlock));
memset(DataOut,0,sizeof(DataOut));
ret = ExPedOpen();
ASSERT(ret == RET_OK,"ExPedOpen ret = %d\n", ret);
ret = ExPedEraseKeys();
ASSERT(ret == RET_OK, "ExPedEraseKeys fail ret=%d", ret);
ret = ExPedExportIdKey(KeyIndex, EncKeyBlock, Mode);
ASSERT(ret == RET_OK,"ExPedExportIdKey ret = %d\n", ret);
ret = OsRSA(Modulus,ModulusLen,Exp,ExpLen,EncKeyBlock,DataOut);
ASSERT(ret == RET_OK,"OsRSA ret = %d\n", ret);
ret = ExPedWriteKey_SM4_TDK(KeyIndex,DataOut);
ASSERT(ret == RET_OK,"ExPedWriteKey_SM4_TDK ret = %d\n", ret);
TimeAvr_ECB = TimeAvr_CBC= 0;
time_ECB = time_CBC = 0;
for(i=0;i<cnt;i++)
{
memset(DataOut,0,sizeof(DataOut));
GETTIME1(time_ECB, ret = ExPedIdKeyCalc(KeyIndex, NULL, DataIn, strlen(DataIn), DataOut, PED_SM4_ECB_ENCRYPT));
TimeAvr_ECB += time_ECB;
ASSERT(ret == RET_OK,"ExPedIdKeyCalc ret = %d\n", ret);
memset(DataIn_Decrypt,0,sizeof(DataIn_Decrypt));
ret = ExPedSM4(KeyIndex,NULL,DataOut,sizeof(DataOut),DataIn_Decrypt,PED_SM4_ECB_DECRYPT);
ASSERT(ret == RET_OK,"ExPedSM4 ret = %d\n", ret);
ASSERT(memcmp(DataIn,DataIn_Decrypt,strlen(DataIn))==0,"DataIn !=DataIn_Decrypt \n");
uchar Initvector[16] = {0x12, 0x34, 0x56, 0x78, 0x90, 0x12, 0x34, 0x56,
0x78, 0x90, 0xAA, 0xBB, 0xCC, 0xDD, 0xEE, 0xFF };
memset(DataOut,0,sizeof(DataOut));
GETTIME1(time_CBC, ret = ExPedIdKeyCalc(KeyIndex, Initvector, DataIn, strlen(DataIn), DataOut, PED_SM4_CBC_ENCRYPT));
TimeAvr_CBC += time_CBC;
ASSERT(ret == RET_OK,"ExPedIdKeyCalc ret = %d\n", ret);
memset(DataIn_Decrypt,0,sizeof(DataIn_Decrypt));
ret = ExPedSM4(KeyIndex,Initvector,DataOut,sizeof(DataOut),DataIn_Decrypt,PED_SM4_CBC_DECRYPT);
ASSERT(ret == RET_OK,"ExPedSM4 ret = %d\n", ret);
ASSERT(memcmp(DataIn,DataIn_Decrypt,strlen(DataIn))==0,"DataIn !=DataIn_Decrypt \n");
}
LOG("EBC=%d,CBC=%d",TimeAvr_ECB/cnt,TimeAvr_CBC/cnt);
ExPedClose();
}
其中声明定义:uchar DataIn[16] = “1234567890123456”;
//但是后面实际占用的字节空间为17字节
这会导致在 调用GETTIME1(time_CBC, ret = ExPedIdKeyCalc(KeyIndex, Initvector, DataIn, strlen(DataIn), DataOut, PED_SM4_CBC_ENCRYPT));函数时,报错,ret 返回-10010(参数错误)。
作为一个测试人员,在这个问题上踩过2次坑了,每次排查问题,都花费好长时间,所以分享给大家,避免采坑啊!!!!