📄 aesenc.c
字号:
/***************************************************************************
* Copyright (c) 2000-2004, Future Systems, Inc. / Seoul, Republic of Korea *
* All Rights Reserved. *
* *
* This document contains proprietary and confidential information. No *
* parts of this document or the computer program it embodies may be in *
* any way copied, duplicated, reproduced, translated into a different *
* programming language, or distributed to any person, company, or *
* corporation without the prior written consent of Future Systems, Inc. *
* Hyo Sun Hwang *
* 372-2 YangJae B/D 6th Floor, Seoul, Korea *
* +82-2-578-0581 (552) *
***************************************************************************/
/*--------------------- [ Version/Command in detais] ---------------------*\
Description : aes.c
(C-source file) Block Cipher AES - mode function
C0000 : Created by Hyo Sun Hwang (hyosun@future.co.kr) 2000/12/31
C0001 : Modified by Hyo Sun Hwang (hyosun@future.co.kr) 2000/00/00
\*------------------------------------------------------------------------*/
/*************** Header files *********************************************/
#include "aes.h"
/*************** Assertions ***********************************************/
/*************** Definitions / Macros ************************************/
#define BlockCopy(pbDst, pbSrc) { \
((DWORD *)(pbDst))[0] = ((DWORD *)(pbSrc))[0]; \
((DWORD *)(pbDst))[1] = ((DWORD *)(pbSrc))[1]; \
((DWORD *)(pbDst))[2] = ((DWORD *)(pbSrc))[2]; \
((DWORD *)(pbDst))[3] = ((DWORD *)(pbSrc))[3]; \
}
#define BlockXor(pbDst, phSrc1, phSrc2) { \
((DWORD *)(pbDst))[0] = ((DWORD *)(phSrc1))[0] \
^ ((DWORD *)(phSrc2))[0]; \
((DWORD *)(pbDst))[1] = ((DWORD *)(phSrc1))[1] \
^ ((DWORD *)(phSrc2))[1]; \
((DWORD *)(pbDst))[2] = ((DWORD *)(phSrc1))[2] \
^ ((DWORD *)(phSrc2))[2]; \
((DWORD *)(pbDst))[3] = ((DWORD *)(phSrc1))[3] \
^ ((DWORD *)(phSrc2))[3]; \
}
/*************** New Data Types *******************************************/
/*************** Global Variables *****************************************/
/*************** Prototypes ***********************************************/
void AES_Encrypt(
void *CipherKey, // 鞠/汗龋侩 Round Key
BYTE *Data); // 涝免仿阑 困茄 喉废阑 啊府虐绰 pointer
void AES_Decrypt(
void *CipherKey, // 鞠/汗龋侩 Round Key
BYTE *Data); // 涝免仿阑 困茄 喉废阑 啊府虐绰 pointer
/*************** Constants ************************************************/
/*************** Constants ************************************************/
/*************** Macros ***************************************************/
/*************** Global Variables *****************************************/
/*************** Function *************************************************
*
*/
void AES_SetAlgInfo(
DWORD ModeID,
DWORD PadType,
BYTE *IV,
AES_ALG_INFO *AlgInfo)
{
AlgInfo->ModeID = ModeID;
AlgInfo->PadType = PadType;
if( IV!=NULL )
memcpy(AlgInfo->IV, IV, AES_BLOCK_LEN);
else
memset(AlgInfo->IV, 0, AES_BLOCK_LEN);
}
/*************** Function *************************************************
*
*/
static RET_VAL PaddSet(
BYTE *pbOutBuffer,
DWORD dRmdLen,
DWORD dBlockLen,
DWORD dPaddingType)
{
DWORD dPadLen;
switch( dPaddingType ) {
case AI_NO_PADDING :
if( dRmdLen==0 ) return 0;
else return CTR_DATA_LEN_ERROR;
case AI_PKCS_PADDING :
dPadLen = dBlockLen - dRmdLen;
memset(pbOutBuffer+dRmdLen, (char)dPadLen, (int)dPadLen);
return dPadLen;
default :
return CTR_FATAL_ERROR;
}
}
/*************** Function *************************************************
*
*/
static RET_VAL PaddCheck(
BYTE *pbOutBuffer,
DWORD dBlockLen,
DWORD dPaddingType)
{
DWORD i, dPadLen;
switch( dPaddingType ) {
case AI_NO_PADDING :
return 0; // padding等 单捞鸥啊 0官捞飘烙.
case AI_PKCS_PADDING :
dPadLen = pbOutBuffer[dBlockLen-1];
if( ((int)dPadLen<=0) || (dPadLen>(int)dBlockLen) )
return CTR_PAD_CHECK_ERROR;
for( i=1; i<=dPadLen; i++)
if( pbOutBuffer[dBlockLen-i] != dPadLen )
return CTR_PAD_CHECK_ERROR;
return dPadLen;
default :
return CTR_FATAL_ERROR;
}
}
/**************************************************************************
*
*/
RET_VAL AES_EncInit(
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_EncUpdate(
AES_ALG_INFO *AlgInfo, //
BYTE *PlainTxt, // 涝仿登绰 乞巩狼 pointer
DWORD PlainTxtLen, // 涝仿登绰 乞巩狼 官捞飘 荐
BYTE *CipherTxt, // 鞠龋巩捞 免仿瞪 pointer
DWORD *CipherTxtLen) // 免仿登绰 鞠龋巩狼 官捞飘 荐
{
DWORD *ScheduledKey=AlgInfo->RoundKey;
DWORD BlockLen=AES_BLOCK_LEN, BufLen=AlgInfo->BufLen;
//
*CipherTxtLen = BufLen + PlainTxtLen;
// No one block
if( *CipherTxtLen<BlockLen ) {
memcpy(AlgInfo->Buffer+BufLen, PlainTxt, (int)PlainTxtLen);
AlgInfo->BufLen += PlainTxtLen;
*CipherTxtLen = 0;
return CTR_SUCCESS;
}
// control the case that PlainTxt and CipherTxt are the same buffer
if( PlainTxt==CipherTxt )
return CTR_FATAL_ERROR;
// first block
memcpy(AlgInfo->Buffer+BufLen, PlainTxt, (int)(BlockLen - BufLen));
PlainTxt += BlockLen - BufLen;
PlainTxtLen -= BlockLen - BufLen;
// core part
BlockCopy(CipherTxt, AlgInfo->Buffer);
AES_Encrypt(ScheduledKey, CipherTxt);
CipherTxt += BlockLen;
while( PlainTxtLen>=BlockLen ) {
BlockCopy(CipherTxt, PlainTxt);
AES_Encrypt(ScheduledKey, CipherTxt);
PlainTxt += BlockLen;
CipherTxt += BlockLen;
PlainTxtLen -= BlockLen;
}
// save remained data
memcpy(AlgInfo->Buffer, PlainTxt, (int)PlainTxtLen);
AlgInfo->BufLen = PlainTxtLen;
*CipherTxtLen -= PlainTxtLen;
// control the case that PlainTxt and CipherTxt are the same buffer
return CTR_SUCCESS;
}
/**************************************************************************
*
*/
static RET_VAL CBC_EncUpdate(
AES_ALG_INFO *AlgInfo, //
BYTE *PlainTxt, // 涝仿登绰 乞巩狼 pointer
DWORD PlainTxtLen, // 涝仿登绰 乞巩狼 官捞飘 荐
BYTE *CipherTxt, // 鞠龋巩捞 免仿瞪 pointer
DWORD *CipherTxtLen) // 免仿登绰 鞠龋巩狼 官捞飘 荐
{
DWORD *ScheduledKey=AlgInfo->RoundKey;
DWORD BlockLen=AES_BLOCK_LEN, BufLen=AlgInfo->BufLen;
//
*CipherTxtLen = BufLen + PlainTxtLen;
// No one block
if( *CipherTxtLen<BlockLen ) {
memcpy(AlgInfo->Buffer+BufLen, PlainTxt, (int)PlainTxtLen);
AlgInfo->BufLen += PlainTxtLen;
*CipherTxtLen = 0;
return CTR_SUCCESS;
}
// control the case that PlainTxt and CipherTxt are the same buffer
if( PlainTxt==CipherTxt )
return CTR_FATAL_ERROR;
// first block
memcpy(AlgInfo->Buffer+BufLen, PlainTxt, (int)(BlockLen - BufLen));
PlainTxt += BlockLen - BufLen;
PlainTxtLen -= BlockLen - BufLen;
// core part
BlockXor(CipherTxt, AlgInfo->ChainVar, AlgInfo->Buffer);
AES_Encrypt(ScheduledKey, CipherTxt);
CipherTxt += BlockLen;
while( PlainTxtLen>=BlockLen ) {
BlockXor(CipherTxt, CipherTxt-BlockLen, PlainTxt);
AES_Encrypt(ScheduledKey, CipherTxt);
PlainTxt += BlockLen;
CipherTxt += BlockLen;
PlainTxtLen -= BlockLen;
}
BlockCopy(AlgInfo->ChainVar, CipherTxt-BlockLen);
// save remained data
memcpy(AlgInfo->Buffer, PlainTxt, (int)PlainTxtLen);
AlgInfo->BufLen = PlainTxtLen;
*CipherTxtLen -= PlainTxtLen;
//
return CTR_SUCCESS;
}
/**************************************************************************
*
*/
static RET_VAL OFB_EncUpdate(
AES_ALG_INFO *AlgInfo, //
BYTE *PlainTxt, // 涝仿登绰 乞巩狼 pointer
DWORD PlainTxtLen, // 涝仿登绰 乞巩狼 官捞飘 荐
BYTE *CipherTxt, // 鞠龋巩捞 免仿瞪 pointer
DWORD *CipherTxtLen) // 免仿登绰 鞠龋巩狼 官捞飘 荐
{
DWORD *ScheduledKey=AlgInfo->RoundKey;
DWORD BlockLen=AES_BLOCK_LEN;
DWORD BufLen=AlgInfo->BufLen;
// Check Output Memory Size
*CipherTxtLen = BufLen + PlainTxtLen;
// No one block
if( *CipherTxtLen<BlockLen ) {
memcpy(AlgInfo->Buffer+BufLen, PlainTxt, (int)PlainTxtLen);
AlgInfo->BufLen += PlainTxtLen;
*CipherTxtLen = 0;
return CTR_SUCCESS;
}
// control the case that PlainTxt and CipherTxt are the same buffer
if( PlainTxt==CipherTxt )
return CTR_FATAL_ERROR;
// first block
memcpy(AlgInfo->Buffer+BufLen, PlainTxt, (int)(BlockLen - BufLen));
PlainTxt += BlockLen - BufLen;
PlainTxtLen -= BlockLen - BufLen;
// core part
AES_Encrypt(ScheduledKey, AlgInfo->ChainVar);
BlockXor(CipherTxt, AlgInfo->ChainVar, AlgInfo->Buffer);
CipherTxt += BlockLen;
while( PlainTxtLen>=BlockLen ) {
AES_Encrypt(ScheduledKey, AlgInfo->ChainVar);
BlockXor(CipherTxt, AlgInfo->ChainVar, PlainTxt);
PlainTxt += BlockLen;
CipherTxt += BlockLen;
PlainTxtLen -= BlockLen;
}
// save remained data
memcpy(AlgInfo->Buffer, PlainTxt, (int)PlainTxtLen);
AlgInfo->BufLen = (AlgInfo->BufLen&0xF0000000) + PlainTxtLen;
*CipherTxtLen -= PlainTxtLen;
//
return CTR_SUCCESS;
}
/**************************************************************************
*
*/
static RET_VAL CFB_EncUpdate(
AES_ALG_INFO *AlgInfo, //
BYTE *PlainTxt, // 涝仿登绰 乞巩狼 pointer
DWORD PlainTxtLen, // 涝仿登绰 乞巩狼 官捞飘 荐
BYTE *CipherTxt, // 鞠龋巩捞 免仿瞪 pointer
DWORD *CipherTxtLen) // 免仿登绰 鞠龋巩狼 官捞飘 荐
{
DWORD *ScheduledKey=AlgInfo->RoundKey;
DWORD BlockLen=AES_BLOCK_LEN;
DWORD BufLen=AlgInfo->BufLen;
// Check Output Memory Size
*CipherTxtLen = BufLen + PlainTxtLen;
// No one block
if( *CipherTxtLen<BlockLen ) {
memcpy(AlgInfo->Buffer+BufLen, PlainTxt, (int)PlainTxtLen);
AlgInfo->BufLen += PlainTxtLen;
*CipherTxtLen = 0;
return CTR_SUCCESS;
}
// control the case that PlainTxt and CipherTxt are the same buffer
if( PlainTxt==CipherTxt )
return CTR_FATAL_ERROR;
// first block
memcpy(AlgInfo->Buffer+BufLen, PlainTxt, (int)(BlockLen - BufLen));
PlainTxt += BlockLen - BufLen;
PlainTxtLen -= BlockLen - BufLen;
// core part
AES_Encrypt(ScheduledKey, AlgInfo->ChainVar);
BlockXor(AlgInfo->ChainVar, AlgInfo->ChainVar, AlgInfo->Buffer);
BlockCopy(CipherTxt, AlgInfo->ChainVar);
CipherTxt += BlockLen;
while( PlainTxtLen>=BlockLen ) {
AES_Encrypt(ScheduledKey, AlgInfo->ChainVar);
BlockXor(AlgInfo->ChainVar, AlgInfo->ChainVar, PlainTxt);
BlockCopy(CipherTxt, AlgInfo->ChainVar);
PlainTxt += BlockLen;
CipherTxt += BlockLen;
PlainTxtLen -= BlockLen;
}
// save remained data
memcpy(AlgInfo->Buffer, PlainTxt, (int)PlainTxtLen);
AlgInfo->BufLen = (AlgInfo->BufLen&0xF0000000) + PlainTxtLen;
*CipherTxtLen -= PlainTxtLen;
//
return CTR_SUCCESS;
}
/**************************************************************************
*
*/
RET_VAL AES_EncUpdate(
AES_ALG_INFO *AlgInfo,
BYTE *PlainTxt, // 涝仿登绰 乞巩狼 pointer
DWORD PlainTxtLen, // 涝仿登绰 乞巩狼 官捞飘 荐
BYTE *CipherTxt, // 鞠龋巩捞 免仿瞪 pointer
DWORD *CipherTxtLen) // 免仿登绰 鞠龋巩狼 官捞飘 荐
{
switch( AlgInfo->ModeID ) {
case AI_ECB : return ECB_EncUpdate(AlgInfo, PlainTxt, PlainTxtLen,
CipherTxt, CipherTxtLen);
case AI_CBC : return CBC_EncUpdate(AlgInfo, PlainTxt, PlainTxtLen,
CipherTxt, CipherTxtLen);
case AI_OFB : return OFB_EncUpdate(AlgInfo, PlainTxt, PlainTxtLen,
CipherTxt, CipherTxtLen);
case AI_CFB : return CFB_EncUpdate(AlgInfo, PlainTxt, PlainTxtLen,
CipherTxt, CipherTxtLen);
default : return CTR_FATAL_ERROR;
}
}
/**************************************************************************
*
*/
static RET_VAL ECB_EncFinal(
AES_ALG_INFO *AlgInfo, //
BYTE *CipherTxt, // 鞠龋巩捞 免仿瞪 pointer
DWORD *CipherTxtLen) // 免仿登绰 鞠龋巩狼 官捞飘 荐
{
DWORD *ScheduledKey=AlgInfo->RoundKey;
DWORD BlockLen=AES_BLOCK_LEN, BufLen=AlgInfo->BufLen;
DWORD PaddByte;
// Padding
PaddByte = PaddSet(AlgInfo->Buffer, BufLen, BlockLen, AlgInfo->PadType);
if( PaddByte>BlockLen ) return PaddByte;
if( PaddByte==0 ) {
*CipherTxtLen = 0;
return CTR_SUCCESS;
}
// core part
BlockCopy(CipherTxt, AlgInfo->Buffer);
AES_Encrypt(ScheduledKey, CipherTxt);
//
*CipherTxtLen = BlockLen;
//
return CTR_SUCCESS;
}
/**************************************************************************
*
*/
static RET_VAL CBC_EncFinal(
AES_ALG_INFO *AlgInfo,
BYTE *CipherTxt, // 鞠龋巩捞 免仿瞪 pointer
DWORD *CipherTxtLen) // 免仿登绰 鞠龋巩狼 官捞飘 荐
{
DWORD *ScheduledKey=AlgInfo->RoundKey;
DWORD BlockLen=AES_BLOCK_LEN, BufLen=AlgInfo->BufLen;
DWORD PaddByte;
// Padding
PaddByte = PaddSet(AlgInfo->Buffer, BufLen, BlockLen, AlgInfo->PadType);
if( PaddByte>BlockLen ) return PaddByte;
if( PaddByte==0 ) {
*CipherTxtLen = 0;
return CTR_SUCCESS;
}
// core part
BlockXor(CipherTxt, AlgInfo->Buffer, AlgInfo->ChainVar);
AES_Encrypt(ScheduledKey, CipherTxt);
BlockCopy(AlgInfo->ChainVar, CipherTxt);
//
*CipherTxtLen = BlockLen;
//
return CTR_SUCCESS;
}
/**************************************************************************
*
*/
static RET_VAL OFB_EncFinal(
AES_ALG_INFO *AlgInfo,
BYTE *CipherTxt, // 鞠龋巩捞 免仿瞪 pointer
DWORD *CipherTxtLen) // 免仿登绰 鞠龋巩狼 官捞飘 荐
{
DWORD *ScheduledKey=AlgInfo->RoundKey;
DWORD BlockLen=AES_BLOCK_LEN;
DWORD BufLen=AlgInfo->BufLen;
DWORD i;
// Check Output Memory Size
*CipherTxtLen = BlockLen;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -