📄 idea.c.bak
字号:
if (ideaCtx->dkBytes != IDEAKEYBYTES)
return ARMERR_PARAM;
Arm_IdeaDecRaw((unsigned char*)ideaCtx->dk, ideaCtx->dkBytes,
pbInData, ulInDataLen, data, ulOutDataLen);
if (*ulOutDataLen != IDEABLOCKBYTES)
return ARMERR_GENERIC_ERROR;
/**************************************************************
* 解密后与CbcCtx(上组密文)异或恢复本组明文
***************************************************************/
if (!(ideaCtx->IsFirstBlock))
{
for ( i = 0; i < ulInDataLen; i ++)
pbOutData[i] = (unsigned char)(ideaCtx->CbcCtx[i] ^ data[i]);
}
else
{
memcpy(pbOutData, data, *ulOutDataLen);
ideaCtx->IsFirstBlock = 0;
}
/*******************本组密文作为下组CbcCtx*********************/
memcpy(ideaCtx->CbcCtx, pbInData, ulInDataLen);
return ARMERR_SUCCESS;
}
/*****************************************************************
Arm_IdeaDecCbcFinalize : Idea算法Cbc模式解密最后一块,减pad
Return value:
ARMERR_SUCCESS : Success
other : failed
Parameters:
ideaCtx : IDEA Cbc 解密上下文 input
pbInData : 待解密的密文 input
ulInDataLen : 待解密的密文长度 input
pbOutData : 解密后的明文 output
*ulOutDataLen : 解密后的明文长度 output
*****************************************************************/
ARM_RV Arm_IdeaDecCbcFinalize(
ARM_IDEA_CTX *ideaCtx,
ARM_UINT8 *pbInData,
ARM_UINT32 ulInDataLen,
ARM_UINT8 *pbOutData,
ARM_UINT32 *ulOutDataLen)
{
unsigned char data[IDEABLOCKBYTES];
ARM_UINT32 dataLen;
int pad_bytes;
int i;
if (ulInDataLen != IDEABLOCKBYTES)
return ARMERR_PARAM;
if (ideaCtx->dkBytes != IDEAKEYBYTES)
return ARMERR_PARAM;
Arm_IdeaDecCbcUpdate(ideaCtx, pbInData, ulInDataLen,
data, &dataLen);
/**************************************************************
* 对此最后一块解密减pad,得到明文
*************************************************************/
pad_bytes = data[7];
if ((pad_bytes < 0) || (pad_bytes > 8))
return ARMERR_GENERIC_ERROR;
for (i=8; i>(8-pad_bytes); i--)
{
if (data[i-1]!=pad_bytes)
return ARMERR_GENERIC_ERROR;
}
*ulOutDataLen = dataLen - pad_bytes;
memcpy(pbOutData, data, *ulOutDataLen);
return ARMERR_SUCCESS;
}
/*****************************************************************
Arm_Idea_Block : Idea Operation 对idea函数进行功能测试
Return value:
ARMERR_SUCCESS : Success
other : failed
Parameters:
Command : command data buffer
: nLength for keyLen
: nInstruction for IDEA_BLOCK
: pParameter for key be expanded
Result : Result data buffer
*****************************************************************/
ARM_RV Arm_Idea_Block(CardCommand *Command, CardResult *Result)
{
ARM_UINT8 *pbIdeaKey;
ARM_UINT32 ulIdeaKeyLen;
pbIdeaKey = (unsigned char *)Command->pParameter;
ulIdeaKeyLen = Command->nLength;
test_IdeaEcb_Block(pbIdeaKey, ulIdeaKeyLen);
getch();
test_IdeaCbc_Block(pbIdeaKey, ulIdeaKeyLen);
Result->nLength = 8;
// memcpy(Result->pResult, ideaCtx.ek, 128);
return ARMERR_SUCCESS;
}
/******************************Ecb*功能测试****************************/
ARM_RV test_IdeaEcb_Block(ARM_UINT8 *pbIdeaKey, ARM_UINT32 ulIdeaKeyLen)
{
ARM_UINT32 i;
unsigned char x[8];
ARM_IDEA_CTX ideaCtx;
ARM_UINT32 ulOutDataLen, len;
unsigned char pbInData[60], pbOutData[60], data[16];
unsigned long message[10];
for ( i = 0; i < 8; i ++)
x[i] = (unsigned char)i;
/**************************对x 8 字节加解密************************/
printf("\nTesting Idea Encrypt (Ecb mode) 8 bytes........\n");
memcpy(pbInData, x, 8);
Arm_IdeaEncEcbInitialize(&ideaCtx, pbIdeaKey, ulIdeaKeyLen);
Arm_IdeaEncEcbFinalize(&ideaCtx, pbInData, 8,
pbOutData, &ulOutDataLen);
printf("Encrypt...\n ");
for ( i = 0; i < ulOutDataLen; i ++)
printf("%02x ", ((unsigned int) pbOutData[i])&0x00ff);
memcpy(pbInData, pbOutData, ulOutDataLen);
Arm_IdeaDecEcbInitialize(&ideaCtx, pbIdeaKey, ulIdeaKeyLen);
Arm_IdeaDecEcbUpdate(&ideaCtx, pbInData, 8,
data, &len);
memcpy(pbOutData, data, 8);
ulOutDataLen = len;
Arm_IdeaDecEcbFinalize(&ideaCtx, &pbInData[8], 8,
data, &len);
memcpy(&pbOutData[8], data, len);
ulOutDataLen += len;
printf("\nDecrypt...\n ");
for ( i = 0; i < ulOutDataLen; i ++)
printf("%02x ", ((unsigned int) pbOutData[i])&0x00ff);
printf("\n");
if (memcmp(x, pbOutData, ulOutDataLen) != 0)
{
printf("ERROR!!!!_____Idea ECB(8 bytes)_____\n\n");
return ARMERR_GENERIC_ERROR;
}
else
{
printf("SUCCESS!!!!_____Idea ECB(8 bytes)_____\n\n");
}
/**************************对message 40个字节加解密************************/
{
ARM_UINT32 messageLen, leftbytes;
ARM_UINT32 blocks;
printf("\nTesting Idea Encrypt (Ecb mode) 10 longs........\n");
for ( i = 0; i < 10; i ++)
message[i] = i;
messageLen = 40; //10 longs = 40 bytes
Arm_IdeaEncEcbInitialize(&ideaCtx, pbIdeaKey, ulIdeaKeyLen);
ulOutDataLen = 0;
blocks = (messageLen + 7) / 8;
for ( i = 0; i < blocks - 1; i ++)
{
memcpy(pbInData, &message[i*2], 8);
Arm_IdeaEncEcbUpdate(&ideaCtx, pbInData, 8,
data, &len);
memcpy(&pbOutData[i*8], data, len);
ulOutDataLen += len;
}
leftbytes = messageLen-i*8;
memcpy(pbInData, &message[i*2], leftbytes);
Arm_IdeaEncEcbFinalize(&ideaCtx, pbInData, leftbytes,
data, &len);
memcpy(&pbOutData[i*8], data, len);
ulOutDataLen += len;
printf("Encrypt...\n ");
for ( i = 0; i < ulOutDataLen; i ++)
printf("%02x ", ((unsigned int) pbOutData[i])&0x00ff);
memcpy(pbInData, pbOutData, ulOutDataLen);
Arm_IdeaDecEcbInitialize(&ideaCtx, pbIdeaKey, ulIdeaKeyLen);
blocks = (ulOutDataLen + 7) / 8;
ulOutDataLen = 0;
for ( i = 0; i < blocks - 1; i ++)
{
Arm_IdeaDecEcbUpdate(&ideaCtx, &pbInData[i*8], 8,
data, &len);
memcpy(&pbOutData[i*8], data, len);
ulOutDataLen += len;
}
Arm_IdeaDecEcbFinalize(&ideaCtx, &pbInData[i*8], 8,
data, &len);
memcpy(&pbOutData[i*8], data, len);
ulOutDataLen += len;
printf("\nDecrypt...\n ");
for ( i = 0; i < ulOutDataLen; i ++)
printf("%02x ", ((unsigned int) pbOutData[i])&0x00ff);
printf("\n");
if (memcmp(message, pbOutData, ulOutDataLen) != 0)
{
printf("ERROR!!!!_____Idea ECB(10 longs)_____\n\n");
return ARMERR_GENERIC_ERROR;
}
else
{
printf("SUCCESS!!!!_____Idea ECB(10 longs)_____\n\n");
}
}
/************if*ARMERR_SUCCESS*Ecb*功能测试*OK*************************/
return ARMERR_SUCCESS;
}
/******************************Cbc*功能测试****************************/
ARM_RV test_IdeaCbc_Block(ARM_UINT8 *pbIdeaKey, ARM_UINT32 ulIdeaKeyLen)
{
ARM_UINT32 i;
unsigned char x[8];
ARM_IDEA_CTX ideaCtx;
ARM_UINT32 ulOutDataLen, len;
unsigned char pbInData[60], pbOutData[60], data[16];
unsigned long message[10];
for ( i = 0; i < 8; i ++)
x[i] = (unsigned char)i;
/**************************对x 8 字节加解密************************/
printf("\nTesting Idea Encrypt (Cbc mode) 8 bytes........\n");
memcpy(pbInData, x, 8);
Arm_IdeaEncCbcInitialize(&ideaCtx, pbIdeaKey, ulIdeaKeyLen);
Arm_IdeaEncCbcFinalize(&ideaCtx, pbInData, 8,
pbOutData, &ulOutDataLen);
printf("Encrypt...\n ");
for ( i = 0; i < ulOutDataLen; i ++)
printf("%02x ", ((unsigned int) pbOutData[i])&0x00ff);
memcpy(pbInData, pbOutData, ulOutDataLen);
Arm_IdeaDecCbcInitialize(&ideaCtx, pbIdeaKey, ulIdeaKeyLen);
Arm_IdeaDecCbcUpdate(&ideaCtx, pbInData, 8,
data, &len);
memcpy(pbOutData, data, 8);
ulOutDataLen = len;
Arm_IdeaDecCbcFinalize(&ideaCtx, &pbInData[8], 8,
data, &len);
memcpy(&pbOutData[8], data, len);
ulOutDataLen += len;
printf("\nDecrypt...\n ");
for ( i = 0; i < ulOutDataLen; i ++)
printf("%02x ", ((unsigned int) pbOutData[i])&0x00ff);
printf("\n");
if (memcmp(x, pbOutData, ulOutDataLen) != 0)
{
printf("ERROR!!!!_____Idea CBC(8 bytes)_____\n\n");
return ARMERR_GENERIC_ERROR;
}
else
{
printf("SUCCESS!!!!_____Idea CBC(8 bytes)_____\n\n");
}
/**************************对message 40个字节加解密************************/
{
ARM_UINT32 messageLen, leftbytes;
ARM_UINT32 blocks;
printf("\nTesting Idea Encrypt (CBC mode) 10 longs........\n");
for ( i = 0; i < 10; i ++)
message[i] = i;
messageLen = 40; //10 longs = 40 bytes
Arm_IdeaEncCbcInitialize(&ideaCtx, pbIdeaKey, ulIdeaKeyLen);
ulOutDataLen = 0;
blocks = (messageLen + 7) / 8;
for ( i = 0; i < blocks - 1; i ++)
{
memcpy(pbInData, &message[i*2], 8);
Arm_IdeaEncCbcUpdate(&ideaCtx, pbInData, 8,
data, &len);
memcpy(&pbOutData[i*8], data, len);
ulOutDataLen += len;
}
leftbytes = messageLen-i*8;
memcpy(pbInData, &message[i*2], leftbytes);
Arm_IdeaEncCbcFinalize(&ideaCtx, pbInData, leftbytes,
data, &len);
memcpy(&pbOutData[i*8], data, len);
ulOutDataLen += len;
printf("Encrypt...\n ");
for ( i = 0; i < ulOutDataLen; i ++)
printf("%02x ", ((unsigned int) pbOutData[i])&0x00ff);
memcpy(pbInData, pbOutData, ulOutDataLen);
Arm_IdeaDecCbcInitialize(&ideaCtx, pbIdeaKey, ulIdeaKeyLen);
blocks = (ulOutDataLen + 7) / 8;
ulOutDataLen = 0;
for ( i = 0; i < blocks - 1; i ++)
{
Arm_IdeaDecCbcUpdate(&ideaCtx, &pbInData[i*8], 8,
data, &len);
memcpy(&pbOutData[i*8], data, len);
ulOutDataLen += len;
}
Arm_IdeaDecCbcFinalize(&ideaCtx, &pbInData[i*8], 8,
data, &len);
memcpy(&pbOutData[i*8], data, len);
ulOutDataLen += len;
printf("\nDecrypt...\n ");
for ( i = 0; i < ulOutDataLen; i ++)
printf("%02x ", ((unsigned int) pbOutData[i])&0x00ff);
printf("\n");
if (memcmp(message, pbOutData, ulOutDataLen) != 0)
{
printf("ERROR!!!!_____Idea CBC(10 longs)_____\n\n");
return ARMERR_GENERIC_ERROR;
}
else
{
printf("SUCCESS!!!!_____Idea CBC(10 longs)_____\n\n");
}
}
/************if*ARMERR_SUCCESS*Cbc*功能测试*OK*************************/
return ARMERR_SUCCESS;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -