📄 idea.c.bak
字号:
ideaCipher(pbInData, pbOutData, ideaCtx->ek);
*ulOutDataLen = IDEABLOCKBYTES;
return ARMERR_SUCCESS;
}
/*****************************************************************
Arm_IdeaEncEcbFinalize : Idea算法Ecb模式加密最后一块(<=8字节)
Return value:
ARMERR_SUCCESS : Success
other : failed
Parameters:
ideaCtx : IDEA密钥 input
pbInData : 待加密的明密文 input
ulInDataLen : 待加密的明文长度 input
pbOutData : 加密后的密文 output
*ulOutDataLen : 加密后的密文长度 output
*****************************************************************/
ARM_RV Arm_IdeaEncEcbFinalize(
ARM_IDEA_CTX *ideaCtx,
ARM_UINT8 *pbInData,
ARM_UINT32 ulInDataLen,
ARM_UINT8 *pbOutData,
ARM_UINT32 *ulOutDataLen) // pbOutData 在上层至少分配16字节空间
{
unsigned char data[16];
int pad_bytes;
ARM_UINT32 dataLen;
int i;
if (ulInDataLen > IDEABLOCKBYTES)
return ARMERR_PARAM;
if (ideaCtx->ekBytes != IDEAKEYBYTES)
return ARMERR_PARAM;
/**************************************************************
* 对最后一块加pad加密,满足数据长度=8 或 16(if ulInDataLen ==8)
*************************************************************/
pad_bytes = IDEABLOCKBYTES - (ulInDataLen % IDEABLOCKBYTES);
if (pad_bytes == IDEABLOCKBYTES)
{
for (i=0;i<pad_bytes;i++)
data[7-i]=(unsigned char)pad_bytes;
Arm_IdeaEncRaw((unsigned char*)ideaCtx->ek, ideaCtx->ekBytes,
pbInData, ulInDataLen, pbOutData, &dataLen);
Arm_IdeaEncRaw((unsigned char*)ideaCtx->ek, ideaCtx->ekBytes,
data, 8, &pbOutData[8], ulOutDataLen);
*ulOutDataLen += dataLen;
}
else
{
memcpy(data, pbInData, ulInDataLen);
for (i=0;i<pad_bytes;i++)
data[7-i]=(unsigned char)pad_bytes;
Arm_IdeaEncRaw((unsigned char*)ideaCtx->ek, ideaCtx->ekBytes,
data, 8, pbOutData, ulOutDataLen);
}
/************************加 pad OK****************************/
return ARMERR_SUCCESS;
}
/*****************************************************************
Arm_IdeaDecEcbInitialize : Idea算法Ecb模式解密开始(扩展解密密钥)
Return value:
ARMERR_SUCCESS : Success
other : failed
Parameters:
ideaCtx : IDEA密钥,包含解密密钥 output
pbIdeaKey : IDEA扩展前的密钥 input
ulIdeaKeyLen : IDEA扩展前的密钥长度字节数(=8) input
*****************************************************************/
ARM_RV Arm_IdeaDecEcbInitialize(
ARM_IDEA_CTX *ideaCtx,
ARM_UINT8 *pbIdeaKey,
ARM_UINT32 ulIdeaKeyLen)
{
ideaExpandKey(pbIdeaKey, ulIdeaKeyLen, ideaCtx->ek, &(ideaCtx->ekBytes));
ideaInvertKey(ideaCtx->ek, ideaCtx->ekBytes, ideaCtx->dk, &(ideaCtx->dkBytes));
return ARMERR_SUCCESS;
}
/*****************************************************************
Arm_IdeaDecEcbUpdate : Idea算法Ecb模式解密小整块密文8字节(update)
Return value:
ARMERR_SUCCESS : Success
other : failed
Parameters:
ideaCtx : IDEA解密密钥 input
pbInData : 待解密的密文 input
ulInDataLen : 待解密的密文长度 input
pbOutData : 解密后的明文 output
*ulOutDataLen : 解密后的明文长度 output
*****************************************************************/
ARM_RV Arm_IdeaDecEcbUpdate(
ARM_IDEA_CTX *ideaCtx,
ARM_UINT8 *pbInData,
ARM_UINT32 ulInDataLen,
ARM_UINT8 *pbOutData,
ARM_UINT32 *ulOutDataLen)
{
if (ulInDataLen != IDEABLOCKBYTES)
return ARMERR_PARAM;
ideaCipher(pbInData, pbOutData, ideaCtx->dk);
*ulOutDataLen = IDEABLOCKBYTES;
return ARMERR_SUCCESS;
}
/*****************************************************************
Arm_IdeaDecEcbFinalize : Idea算法Ecb模式解密最后一块(减pad,恢复明文)
Return value:
ARMERR_SUCCESS : Success
other : failed
Parameters:
ideaCtx : IDEA解密密钥 input
pbInData : 待解密的密文 input
ulInDataLen : 待解密的密文长度 input
pbOutData : 解密后的明文 output
*ulOutDataLen : 解密后的明文长度 output
*****************************************************************/
ARM_RV Arm_IdeaDecEcbFinalize(
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_IdeaDecRaw((unsigned char*)ideaCtx->dk, ideaCtx->dkBytes,
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_IdeaEncCbcInitialize : Idea算法Cbc模式加密初始化(扩展加密密钥)
设置IsFirstBlock为真
Return value:
ARMERR_SUCCESS : Success
other : failed
Parameters:
ideaCtx : IDEA密钥,包含加密密钥 output
pbIdeaKey : IDEA扩展前的密钥 input
ulIdeaKeyLen : IDEA扩展前的密钥长度字节数(=8)input
*****************************************************************/
ARM_RV Arm_IdeaEncCbcInitialize(
ARM_IDEA_CTX *ideaCtx,
ARM_UINT8 *pbIdeaKey,
ARM_UINT32 ulIdeaKeyLen)
// ARM_UINT8 *pbIv) //这是什么?
{
ideaExpandKey(pbIdeaKey, ulIdeaKeyLen, ideaCtx->ek, &(ideaCtx->ekBytes));
ideaCtx->IsFirstBlock = 1;
return ARMERR_SUCCESS;
}
/**********************************************************************
Arm_IdeaEncCbcUpdate : Idea算法Cbc模式加密小整块密文8字节(update)
Return value:
ARMERR_SUCCESS : Success
other : failed
Parameters:
ideaCtx : IDEA Cbc上下文 input
pbInData : 待加密的明密文 input
ulInDataLen : 待加密的明文长度 input
pbOutData : 加密后的密文 output
*ulOutDataLen : 加密后的密文长度 output
***********************************************************************/
ARM_RV Arm_IdeaEncCbcUpdate(
ARM_IDEA_CTX *ideaCtx,
ARM_UINT8 *pbInData,
ARM_UINT32 ulInDataLen,
ARM_UINT8 *pbOutData,
ARM_UINT32 *ulOutDataLen)
{
ARM_UINT8 data[DES_BLOCKLEN];
unsigned long i;
if (ulInDataLen != IDEABLOCKBYTES)
return ARMERR_PARAM;
if (ideaCtx->ekBytes != IDEAKEYBYTES)
return ARMERR_PARAM;
if (!(ideaCtx->IsFirstBlock))
{
for ( i = 0; i < ulInDataLen; i ++)
data[i] = (unsigned char)(ideaCtx->CbcCtx[i] ^ pbInData[i]);
}
else
{
memcpy(data, pbInData, ulInDataLen);
ideaCtx->IsFirstBlock = 0;
}
Arm_IdeaEncRaw((unsigned char*)ideaCtx->ek, ideaCtx->ekBytes,
data, ulInDataLen, pbOutData, ulOutDataLen);
if (*ulOutDataLen != IDEABLOCKBYTES)
return ARMERR_GENERIC_ERROR;
memcpy(ideaCtx->CbcCtx, pbOutData, *ulOutDataLen);
return ARMERR_SUCCESS;
}
/**********************************************************************
Arm_IdeaEncCbcFinalize : 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_IdeaEncCbcFinalize(
ARM_IDEA_CTX *ideaCtx,
ARM_UINT8 *pbInData,
ARM_UINT32 ulInDataLen,
ARM_UINT8 *pbOutData, // 至少分配16字节内存
ARM_UINT32 *ulOutDataLen)
{
unsigned char data[16];
ARM_UINT32 dataLen;
int pad_bytes;
int i;
if (ulInDataLen > IDEABLOCKBYTES)
return ARMERR_PARAM;
if (ideaCtx->ekBytes != IDEAKEYBYTES)
return ARMERR_PARAM;
/**************************************************************
* 对最后一块加pad加密,满足数据长度=8 或 16(if ulInDataLen ==8)
*************************************************************/
pad_bytes = IDEABLOCKBYTES - (ulInDataLen % DES_BLOCKLEN);
if (pad_bytes == IDEABLOCKBYTES)
{
for (i=0;i<pad_bytes;i++)
data[7-i]=(unsigned char)pad_bytes;
Arm_IdeaEncCbcUpdate(ideaCtx, pbInData, ulInDataLen,
pbOutData, &dataLen);
Arm_IdeaEncCbcUpdate(ideaCtx, data, 8,
&pbOutData[8], ulOutDataLen);
*ulOutDataLen += dataLen;
}
else
{
memcpy(data, pbInData, ulInDataLen);
for (i=0;i<pad_bytes;i++)
data[7-i]=(unsigned char)pad_bytes;
Arm_IdeaEncCbcUpdate(ideaCtx, data, 8,
pbOutData, ulOutDataLen);
}
/************************加 pad 加密 OK************************/
return ARMERR_SUCCESS;
}
/*****************************************************************
Arm_IdeaDecEcbInitialize : Idea算法Cbc模式解密开始(扩展解密密钥)
初始化IsFirstBlock为真
Return value:
ARMERR_SUCCESS : Success
other : failed
Parameters:
ideaCtx : IDEA Cbc 上下文 output
pbIdeaKey : IDEA扩展前的密钥 input
ulIdeaKeyLen : IDEA扩展前的密钥长度字节数(=8)input
*****************************************************************/
ARM_RV Arm_IdeaDecCbcInitialize(
ARM_IDEA_CTX *ideaCtx,
ARM_UINT8 *pbIdeaKey,
ARM_UINT32 ulIdeaKeyLen)
{
ideaExpandKey(pbIdeaKey, ulIdeaKeyLen, ideaCtx->ek, &(ideaCtx->ekBytes));
ideaInvertKey(ideaCtx->ek, ideaCtx->ekBytes, ideaCtx->dk, &(ideaCtx->dkBytes));
ideaCtx->IsFirstBlock = 1;
return ARMERR_SUCCESS;
}
/*****************************************************************
Arm_IdeaDecEcbUpdate : Idea算法Cbc模式解密小整块密文8字节(update)
Return value:
ARMERR_SUCCESS : Success
other : failed
Parameters:
ideaCtx : IDEA Cbc 解密上下文 input
pbInData : 待解密的密文 input
ulInDataLen : 待解密的密文长度 input
pbOutData : 解密后的明文 output
*ulOutDataLen : 解密后的明文长度 output
*****************************************************************/
ARM_RV Arm_IdeaDecCbcUpdate(
ARM_IDEA_CTX *ideaCtx,
ARM_UINT8 *pbInData,
ARM_UINT32 ulInDataLen,
ARM_UINT8 *pbOutData,
ARM_UINT32 *ulOutDataLen)
{
ARM_UINT8 data[IDEABLOCKBYTES];
unsigned long i;
if (ulInDataLen != IDEABLOCKBYTES)
return ARMERR_PARAM;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -