📄 aes.h
字号:
/***************************************************************************
* 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.h
(head file) head file for aes.c : Block Cipher AES
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
\*------------------------------------------------------------------------*/
#ifndef _AES_H
#define _AES_H
/*************** Header files *********************************************/
#include <stdlib.h>
#include <string.h>
#include <memory.h>
//#include "cryptcom.h"
/*************** Assertions ***********************************************/
//////// Define the Endianness ////////
#undef BIG_ENDIAN
#undef LITTLE_ENDIAN
#if defined(USER_BIG_ENDIAN)
#define BIG_ENDIAN
#elif defined(USER_LITTLE_ENDIAN)
#define LITTLE_ENDIAN
#else
#if 0
#define BIG_ENDIAN // Big-Endian machine with pointer casting
#elif defined(_MSC_VER)
#define LITTLE_ENDIAN // Little-Endian machine with pointer casting
#else
#error
#endif
#endif
/*************** Macros ***************************************************/
//////// rotate by using shift operations ////////
#if defined(_MSC_VER)
#define ROTL_DWORD(x, n) _lrotl((x), (n))
#define ROTR_DWORD(x, n) _lrotr((x), (n))
#else
#define ROTL_DWORD(x, n) ( (DWORD)((x) << (n)) | (DWORD)((x) >> (32-(n))) )
#define ROTR_DWORD(x, n) ( (DWORD)((x) >> (n)) | (DWORD)((x) << (32-(n))) )
#endif
//////// reverse the byte order of DWORD(DWORD:4-bytes integer) and WORD.
#define ENDIAN_REVERSE_DWORD(dwS) ( (ROTL_DWORD((dwS), 8) & 0x00ff00ff) \
| (ROTL_DWORD((dwS), 24) & 0xff00ff00) )
//////// move DWORD type to BYTE type and BYTE type to DWORD type
#if defined(BIG_ENDIAN) //// Big-Endian machine
#define BIG_B2D(B, D) D = *(DWORD *)(B)
#define BIG_D2B(D, B) *(DWORD *)(B) = (DWORD)(D)
#define LITTLE_B2D(B, D) D = ENDIAN_REVERSE_DWORD(*(DWORD *)(B))
#define LITTLE_D2B(D, B) *(DWORD *)(B) = ENDIAN_REVERSE_DWORD(D)
#elif defined(LITTLE_ENDIAN) //// Little-Endian machine
#define BIG_B2D(B, D) D = ENDIAN_REVERSE_DWORD(*(DWORD *)(B))
#define BIG_D2B(D, B) *(DWORD *)(B) = ENDIAN_REVERSE_DWORD(D)
#define LITTLE_B2D(B, D) D = *(DWORD *)(B)
#define LITTLE_D2B(D, B) *(DWORD *)(B) = (DWORD)(D)
#else
#error ERROR : Invalid DataChangeType
#endif
/*************** Definitions / Macros *************************************/
//// 泅犁 酒贰狼 4俺 规侥阑 瘤盔茄促.
#define AI_ECB 1
#define AI_CBC 2
#define AI_OFB 3
#define AI_CFB 4
//// 泅犁 酒贰狼 滴 padding阑 瘤盔茄促.
#define AI_NO_PADDING 1 // Padding 绝澜(涝仿捞 16官捞飘狼 硅荐)
#define AI_PKCS_PADDING 2 // padding登绰 官捞飘 荐肺 padding
//// AES俊 包访等 惑荐甸
#define AES_BLOCK_LEN 16 // in BYTEs
#define AES_USER_KEY_LEN 32 // (16,24,32) in BYTEs
#define AES_NO_ROUNDS 10
#define AES_NO_ROUNDKEY 68 // in DWORDs
/*************** New Data Types *******************************************/
//////// Determine data types depand on the processor and compiler.
#define BOOL int // 1-bit data type
#define BYTE unsigned char // unsigned 1-byte data type
#define WORD unsigned short int // unsigned 2-bytes data type
#define DWORD unsigned int // unsigned 4-bytes data type
#define RET_VAL DWORD // return values
//// AES..
typedef struct{
DWORD ModeID; // ECB or CBC
DWORD PadType; // 喉废鞠龋狼 Padding type
BYTE IV[AES_BLOCK_LEN]; // Initial Vector
BYTE ChainVar[AES_BLOCK_LEN]; // Chaining Variable
BYTE Buffer[AES_BLOCK_LEN]; // Buffer for unfilled block
DWORD BufLen; // Buffer狼 蜡瓤 官捞飘 荐
DWORD RoundKey[AES_NO_ROUNDKEY]; // 扼款靛 虐狼 DWORD 荐
} AES_ALG_INFO;
/*************** Constant (Error Code) ************************************/
//// Error Code - 沥府窍绊, 利寸洒 免仿秦具 窃.
#define CTR_SUCCESS 0
#define CTR_FATAL_ERROR 0x1001
#define CTR_INVALID_USERKEYLEN 0x1002 // 厚剐虐狼 辨捞啊 何利例窃.
#define CTR_PAD_CHECK_ERROR 0x1003 //
#define CTR_DATA_LEN_ERROR 0x1004 // 乞巩狼 辨捞啊 何利例窃.
#define CTR_CIPHER_LEN_ERROR 0x1005 // 鞠龋巩捞 喉废狼 硅荐啊 酒丛.
/*************** Prototypes ***********************************************/
//// 单捞鸥 鸥涝 AES_ALG_INFO俊 mode, padding 辆幅 棺 IV 蔼阑 檬扁拳茄促.
void AES_SetAlgInfo(
DWORD ModeID,
DWORD PadType,
BYTE *IV,
AES_ALG_INFO *AlgInfo);
//// 涝仿等 AES_USER_KEY_LEN官牢飘狼 厚剐虐肺 扼款靛 虐 积己
RET_VAL AES_EncKeySchedule(
BYTE *UserKey, // 荤侩磊 厚剐虐甫 涝仿窃.
DWORD UserKeyLen,
AES_ALG_INFO *AlgInfo); // 鞠汗龋侩 Round Key啊 历厘凳.
RET_VAL AES_DecKeySchedule(
BYTE *UserKey, // 荤侩磊 厚剐虐甫 涝仿窃.
DWORD UserKeyLen,
AES_ALG_INFO *AlgInfo); // 鞠汗龋侩 Round Key啊 历厘凳.
//// Init/Update/Final 屈侥阑 鞠龋拳.
RET_VAL AES_EncInit(
AES_ALG_INFO *AlgInfo);
RET_VAL AES_EncUpdate(
AES_ALG_INFO *AlgInfo,
BYTE *PlainTxt, // 乞巩捞 涝仿凳.
DWORD PlainTxtLen,
BYTE *CipherTxt, // 鞠龋巩捞 免仿凳.
DWORD *CipherTxtLen);
RET_VAL AES_EncFinal(
AES_ALG_INFO *AlgInfo,
BYTE *CipherTxt, // 鞠龋巩捞 免仿凳.
DWORD *CipherTxtLen);
//// Init/Update/Final 屈侥阑 汗龋拳.
RET_VAL AES_DecInit(
AES_ALG_INFO *AlgInfo);
RET_VAL AES_DecUpdate(
AES_ALG_INFO *AlgInfo,
BYTE *CipherTxt, // 鞠龋巩捞 涝仿凳.
DWORD CipherTxtLen,
BYTE *PlainTxt, // 汗龋巩捞 免仿凳.
DWORD *PlainTxtLen);
RET_VAL AES_DecFinal(
AES_ALG_INFO *AlgInfo,
BYTE *PlainTxt, // 汗龋巩捞 免仿凳.
DWORD *PlainTxtLen);
/*************** END OF FILE **********************************************/
#endif // _AES_H
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -