📄 aesenc.c
字号:
// core part
AES_Encrypt(ScheduledKey, AlgInfo->ChainVar);
for( i=0; i<BufLen; i++)
CipherTxt[i] = (BYTE) (AlgInfo->Buffer[i] ^ AlgInfo->ChainVar[i]);
//
*CipherTxtLen = BufLen;
//
return CTR_SUCCESS;
}
/**************************************************************************
*
*/
static RET_VAL CFB_EncFinal(
AES_ALG_INFO *AlgInfo,
BYTE *CipherTxt, // 鞠龋巩捞 免仿瞪 pointer
DWORD *CipherTxtLen) // 免仿登绰 鞠龋巩狼 官捞飘 荐
{
DWORD *ScheduledKey=AlgInfo->RoundKey;
DWORD BufLen=AlgInfo->BufLen;
// Check Output Memory Size
*CipherTxtLen = BufLen;
// core part
AES_Encrypt(ScheduledKey, AlgInfo->ChainVar);
BlockXor(AlgInfo->ChainVar, AlgInfo->ChainVar, AlgInfo->Buffer);
memcpy(CipherTxt, AlgInfo->ChainVar, BufLen);
//
*CipherTxtLen = BufLen;
//
return CTR_SUCCESS;
}
/**************************************************************************
*
*/
RET_VAL AES_EncFinal(
AES_ALG_INFO *AlgInfo,
BYTE *CipherTxt, // 鞠龋巩捞 免仿瞪 pointer
DWORD *CipherTxtLen) // 免仿登绰 鞠龋巩狼 官捞飘 荐
{
switch( AlgInfo->ModeID ) {
case AI_ECB : return ECB_EncFinal(AlgInfo, CipherTxt, CipherTxtLen);
case AI_CBC : return CBC_EncFinal(AlgInfo, CipherTxt, CipherTxtLen);
case AI_OFB : return OFB_EncFinal(AlgInfo, CipherTxt, CipherTxtLen);
case AI_CFB : return CFB_EncFinal(AlgInfo, CipherTxt, CipherTxtLen);
default : return CTR_FATAL_ERROR;
}
}
/**************************************************************************
*
*/
RET_VAL AES_DecInit(
AES_ALG_INFO *AlgInfo)
{
AlgInfo->BufLen = 0;
if( AlgInfo->ModeID!=AI_ECB )
memcpy(AlgInfo->ChainVar, AlgInfo->IV, AES_BLOCK_LEN);
return CTR_SUCCESS;
}
/**************************************************************************
*
*/
static RET_VAL ECB_DecUpdate(
AES_ALG_INFO *AlgInfo,
BYTE *CipherTxt, // 涝仿登绰 鞠龋巩狼 pointer
DWORD CipherTxtLen, // 涝仿登绰 鞠龋巩狼 官捞飘 荐
BYTE *PlainTxt, // 乞巩捞 免仿瞪 pointer
DWORD *PlainTxtLen) // 免仿登绰 乞巩狼 官捞飘 荐
{
DWORD *ScheduledKey=AlgInfo->RoundKey;
DWORD BlockLen=AES_BLOCK_LEN;
DWORD BufLen=AlgInfo->BufLen;
//
*PlainTxtLen = BufLen + CipherTxtLen;
// No one block
if( BufLen+CipherTxtLen <= BlockLen ) {
memcpy(AlgInfo->Buffer+BufLen, CipherTxt, (int)CipherTxtLen);
AlgInfo->BufLen += CipherTxtLen;
*PlainTxtLen = 0;
return CTR_SUCCESS;
}
// control the case that CipherTxt and PlainTxt are the same buffer
if( CipherTxt==PlainTxt ) return CTR_FATAL_ERROR;
// first block
*PlainTxtLen = BufLen + CipherTxtLen;
memcpy(AlgInfo->Buffer+BufLen, CipherTxt, (int)(BlockLen - BufLen));
CipherTxt += BlockLen - BufLen;
CipherTxtLen -= BlockLen - BufLen;
// core part
BlockCopy(PlainTxt, AlgInfo->Buffer);
AES_Decrypt(ScheduledKey, PlainTxt);
PlainTxt += BlockLen;
while( CipherTxtLen>BlockLen ) {
BlockCopy(PlainTxt, CipherTxt);
AES_Decrypt(ScheduledKey, PlainTxt);
CipherTxt += BlockLen;
PlainTxt += BlockLen;
CipherTxtLen -= BlockLen;
}
// save remained data
memcpy(AlgInfo->Buffer, CipherTxt, (int)CipherTxtLen);
AlgInfo->BufLen = (AlgInfo->BufLen&0xF0000000) + CipherTxtLen;
*PlainTxtLen -= CipherTxtLen;
//
return CTR_SUCCESS;
}
/**************************************************************************
*
*/
static RET_VAL CBC_DecUpdate(
AES_ALG_INFO *AlgInfo,
BYTE *CipherTxt, // 涝仿登绰 鞠龋巩狼 pointer
DWORD CipherTxtLen, // 涝仿登绰 鞠龋巩狼 官捞飘 荐
BYTE *PlainTxt, // 乞巩捞 免仿瞪 pointer
DWORD *PlainTxtLen) // 免仿登绰 乞巩狼 官捞飘 荐
{
DWORD *ScheduledKey=AlgInfo->RoundKey;
DWORD BlockLen=AES_BLOCK_LEN, BufLen=AlgInfo->BufLen;
// Check Output Memory Size
*PlainTxtLen = BufLen + CipherTxtLen;
// No one block
if( BufLen+CipherTxtLen <= BlockLen ) {
memcpy(AlgInfo->Buffer+BufLen, CipherTxt, (int)CipherTxtLen);
AlgInfo->BufLen += CipherTxtLen;
*PlainTxtLen = 0;
return CTR_SUCCESS;
}
// control the case that CipherTxt and PlainTxt are the same buffer
if( CipherTxt==PlainTxt ) return CTR_FATAL_ERROR;
// first block
*PlainTxtLen = BufLen + CipherTxtLen;
memcpy(AlgInfo->Buffer+BufLen, CipherTxt, (int)(BlockLen - BufLen));
CipherTxt += BlockLen - BufLen;
CipherTxtLen -= BlockLen - BufLen;
// core part
BlockCopy(PlainTxt, AlgInfo->Buffer);
AES_Decrypt(ScheduledKey, PlainTxt);
BlockXor(PlainTxt, PlainTxt, AlgInfo->ChainVar);
PlainTxt += BlockLen;
if( CipherTxtLen<=BlockLen ) {
BlockCopy(AlgInfo->ChainVar, AlgInfo->Buffer);
}
else {
if( CipherTxtLen>BlockLen ) {
BlockCopy(PlainTxt, CipherTxt);
AES_Decrypt(ScheduledKey, PlainTxt);
BlockXor(PlainTxt, PlainTxt, AlgInfo->Buffer);
CipherTxt += BlockLen;
PlainTxt += BlockLen;
CipherTxtLen -= BlockLen;
}
while( CipherTxtLen>BlockLen ) {
BlockCopy(PlainTxt, CipherTxt);
AES_Decrypt(ScheduledKey, PlainTxt);
BlockXor(PlainTxt, PlainTxt, CipherTxt-BlockLen);
CipherTxt += BlockLen;
PlainTxt += BlockLen;
CipherTxtLen -= BlockLen;
}
BlockCopy(AlgInfo->ChainVar, CipherTxt-BlockLen);
}
// save remained data
memcpy(AlgInfo->Buffer, CipherTxt, (int)CipherTxtLen);
AlgInfo->BufLen = (AlgInfo->BufLen&0xF0000000) + CipherTxtLen;
*PlainTxtLen -= CipherTxtLen;
//
return CTR_SUCCESS;
}
/**************************************************************************
*
*/
static RET_VAL OFB_DecUpdate(
AES_ALG_INFO *AlgInfo,
BYTE *CipherTxt, // 涝仿登绰 鞠龋巩狼 pointer
DWORD CipherTxtLen, // 涝仿登绰 鞠龋巩狼 官捞飘 荐
BYTE *PlainTxt, // 乞巩捞 免仿瞪 pointer
DWORD *PlainTxtLen) // 免仿登绰 乞巩狼 官捞飘 荐
{
DWORD *ScheduledKey=AlgInfo->RoundKey;
DWORD BlockLen=AES_BLOCK_LEN;
DWORD BufLen=AlgInfo->BufLen;
// Check Output Memory Size
*PlainTxtLen = BufLen + CipherTxtLen;
// No one block
if( BufLen+CipherTxtLen <= BlockLen ) {
memcpy(AlgInfo->Buffer+BufLen, CipherTxt, (int)CipherTxtLen);
AlgInfo->BufLen += CipherTxtLen;
*PlainTxtLen = 0;
return CTR_SUCCESS;
}
// control the case that CipherTxt and PlainTxt are the same buffer
if( PlainTxt==CipherTxt )
return CTR_FATAL_ERROR;
// first block
*PlainTxtLen = BufLen + CipherTxtLen;
memcpy(AlgInfo->Buffer+BufLen, CipherTxt, (int)(BlockLen - BufLen));
CipherTxt += BlockLen - BufLen;
CipherTxtLen -= BlockLen - BufLen;
// core part
AES_Encrypt(ScheduledKey, AlgInfo->ChainVar);
BlockXor(PlainTxt, AlgInfo->ChainVar, AlgInfo->Buffer);
PlainTxt += BlockLen;
while( CipherTxtLen>BlockLen ) {
AES_Encrypt(ScheduledKey, AlgInfo->ChainVar);
BlockXor(PlainTxt, AlgInfo->ChainVar, CipherTxt);
CipherTxt += BlockLen;
PlainTxt += BlockLen;
CipherTxtLen -= BlockLen;
}
// save remained data
memcpy(AlgInfo->Buffer, CipherTxt, (int)CipherTxtLen);
AlgInfo->BufLen = (AlgInfo->BufLen&0xF0000000) + CipherTxtLen;
*PlainTxtLen -= CipherTxtLen;
//
return CTR_SUCCESS;
}
/**************************************************************************
*
*/
static RET_VAL CFB_DecUpdate(
AES_ALG_INFO *AlgInfo,
BYTE *CipherTxt, // 涝仿登绰 鞠龋巩狼 pointer
DWORD CipherTxtLen, // 涝仿登绰 鞠龋巩狼 官捞飘 荐
BYTE *PlainTxt, // 乞巩捞 免仿瞪 pointer
DWORD *PlainTxtLen) // 免仿登绰 乞巩狼 官捞飘 荐
{
DWORD *ScheduledKey=AlgInfo->RoundKey;
DWORD BlockLen=AES_BLOCK_LEN;
DWORD BufLen=AlgInfo->BufLen;
// Check Output Memory Size
*PlainTxtLen = BufLen + CipherTxtLen;
// No one block
if( BufLen+CipherTxtLen <= BlockLen ) {
memcpy(AlgInfo->Buffer+BufLen, CipherTxt, (int)CipherTxtLen);
AlgInfo->BufLen += CipherTxtLen;
*PlainTxtLen = 0;
return CTR_SUCCESS;
}
// control the case that CipherTxt and PlainTxt are the same buffer
if( PlainTxt==CipherTxt )
return CTR_FATAL_ERROR;
// first block
*PlainTxtLen = BufLen + CipherTxtLen;
memcpy(AlgInfo->Buffer+BufLen, CipherTxt, (int)(BlockLen - BufLen));
CipherTxt += BlockLen - BufLen;
CipherTxtLen -= BlockLen - BufLen;
// core part
AES_Encrypt(ScheduledKey, AlgInfo->ChainVar);
BlockXor(PlainTxt, AlgInfo->ChainVar, AlgInfo->Buffer);
BlockCopy(AlgInfo->ChainVar, AlgInfo->Buffer);
PlainTxt += BlockLen;
while( CipherTxtLen>BlockLen ) {
AES_Encrypt(ScheduledKey, AlgInfo->ChainVar);
BlockXor(PlainTxt, AlgInfo->ChainVar, CipherTxt);
BlockCopy(AlgInfo->ChainVar, CipherTxt);
CipherTxt += BlockLen;
PlainTxt += BlockLen;
CipherTxtLen -= BlockLen;
}
// save remained data
memcpy(AlgInfo->Buffer, CipherTxt, (int)CipherTxtLen);
AlgInfo->BufLen = (AlgInfo->BufLen&0xF0000000) + CipherTxtLen;
*PlainTxtLen -= CipherTxtLen;
//
return CTR_SUCCESS;
}
/**************************************************************************
*
*/
RET_VAL AES_DecUpdate(
AES_ALG_INFO *AlgInfo,
BYTE *CipherTxt, // 鞠龋巩捞 免仿瞪 pointer
DWORD CipherTxtLen, // 免仿登绰 鞠龋巩狼 官捞飘 荐
BYTE *PlainTxt, // 涝仿登绰 乞巩狼 pointer
DWORD *PlainTxtLen) // 涝仿登绰 乞巩狼 官捞飘 荐
{
switch( AlgInfo->ModeID ) {
case AI_ECB : return ECB_DecUpdate(AlgInfo, CipherTxt, CipherTxtLen,
PlainTxt, PlainTxtLen);
case AI_CBC : return CBC_DecUpdate(AlgInfo, CipherTxt, CipherTxtLen,
PlainTxt, PlainTxtLen);
case AI_OFB : return OFB_DecUpdate(AlgInfo, CipherTxt, CipherTxtLen,
PlainTxt, PlainTxtLen);
case AI_CFB : return CFB_DecUpdate(AlgInfo, CipherTxt, CipherTxtLen,
PlainTxt, PlainTxtLen);
default : return CTR_FATAL_ERROR;
}
}
/**************************************************************************
*
*/
RET_VAL ECB_DecFinal(
AES_ALG_INFO *AlgInfo,
BYTE *PlainTxt, // 乞巩捞 免仿瞪 pointer
DWORD *PlainTxtLen) // 免仿登绰 乞巩狼 官捞飘 荐
{
DWORD *ScheduledKey=AlgInfo->RoundKey;
DWORD BlockLen=AES_BLOCK_LEN, BufLen=AlgInfo->BufLen;
RET_VAL ret;
// Check Output Memory Size
if( BufLen==0 ) {
*PlainTxtLen = 0;
return CTR_SUCCESS;
}
*PlainTxtLen = BlockLen;
if( BufLen!=BlockLen ) return CTR_CIPHER_LEN_ERROR;
// core part
BlockCopy(PlainTxt, AlgInfo->Buffer);
AES_Decrypt(ScheduledKey, PlainTxt);
// Padding Check
ret = PaddCheck(PlainTxt, BlockLen, AlgInfo->PadType);
if( ret==(DWORD)-3 ) return CTR_PAD_CHECK_ERROR;
if( ret==(DWORD)-1 ) return CTR_FATAL_ERROR;
*PlainTxtLen = BlockLen - ret;
//
return CTR_SUCCESS;
}
/**************************************************************************
*
*/
RET_VAL CBC_DecFinal(
AES_ALG_INFO *AlgInfo,
BYTE *PlainTxt, // 乞巩捞 免仿瞪 pointer
DWORD *PlainTxtLen) // 免仿登绰 乞巩狼 官捞飘 荐
{
DWORD *ScheduledKey=AlgInfo->RoundKey;
DWORD BlockLen=AES_BLOCK_LEN, BufLen=AlgInfo->BufLen;
RET_VAL ret;
// Check Output Memory Size
if( BufLen==0 ) {
*PlainTxtLen = 0;
return CTR_SUCCESS;
}
*PlainTxtLen = BlockLen;
if( BufLen!=BlockLen ) return CTR_CIPHER_LEN_ERROR;
// core part
BlockCopy(PlainTxt, AlgInfo->Buffer);
AES_Decrypt(ScheduledKey, PlainTxt);
BlockXor(PlainTxt, PlainTxt, AlgInfo->ChainVar);
BlockCopy(AlgInfo->ChainVar, AlgInfo->Buffer);
// Padding Check
ret = PaddCheck(PlainTxt, BlockLen, AlgInfo->PadType);
if( ret==(DWORD)-3 ) return CTR_PAD_CHECK_ERROR;
if( ret==(DWORD)-1 ) return CTR_FATAL_ERROR;
*PlainTxtLen = BlockLen - ret;
//
return CTR_SUCCESS;
}
/**************************************************************************
*
*/
RET_VAL OFB_DecFinal(
AES_ALG_INFO *AlgInfo,
BYTE *PlainTxt, // 乞巩捞 免仿瞪 pointer
DWORD *PlainTxtLen) // 免仿登绰 乞巩狼 官捞飘 荐
{
DWORD *ScheduledKey=AlgInfo->RoundKey;
DWORD i, BufLen=AlgInfo->BufLen;
// Check Output Memory Size
*PlainTxtLen = BufLen;
// core part
AES_Encrypt(ScheduledKey, AlgInfo->ChainVar);
for( i=0; i<BufLen; i++)
PlainTxt[i] = (BYTE) (AlgInfo->Buffer[i] ^ AlgInfo->ChainVar[i]);
*PlainTxtLen = BufLen;
//
return CTR_SUCCESS;
}
/**************************************************************************
*
*/
RET_VAL CFB_DecFinal(
AES_ALG_INFO *AlgInfo,
BYTE *PlainTxt, // 乞巩捞 免仿瞪 pointer
DWORD *PlainTxtLen) // 免仿登绰 乞巩狼 官捞飘 荐
{
DWORD *ScheduledKey=AlgInfo->RoundKey;
DWORD BufLen=AlgInfo->BufLen;
// Check Output Memory Size
*PlainTxtLen = BufLen;
// core part
AES_Encrypt(ScheduledKey, AlgInfo->ChainVar);
BlockXor(AlgInfo->ChainVar, AlgInfo->ChainVar, AlgInfo->Buffer);
memcpy(PlainTxt, AlgInfo->ChainVar, BufLen);
*PlainTxtLen = BufLen;
//
return CTR_SUCCESS;
}
/**************************************************************************
*
*/
RET_VAL AES_DecFinal(
AES_ALG_INFO *AlgInfo,
BYTE *PlainTxt, // 涝仿登绰 乞巩狼 pointer
DWORD *PlainTxtLen) // 涝仿登绰 乞巩狼 官捞飘 荐
{
switch( AlgInfo->ModeID ) {
case AI_ECB : return ECB_DecFinal(AlgInfo, PlainTxt, PlainTxtLen);
case AI_CBC : return CBC_DecFinal(AlgInfo, PlainTxt, PlainTxtLen);
case AI_OFB : return OFB_DecFinal(AlgInfo, PlainTxt, PlainTxtLen);
case AI_CFB : return CFB_DecFinal(AlgInfo, PlainTxt, PlainTxtLen);
default : return CTR_FATAL_ERROR;
}
}
/*************** END OF FILE **********************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -