⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 aes.h

📁 Advanced encryption system of NIST( 美国国家标准局). The codes are in C.
💻 H
字号:

#ifndef __AESH__
#define __AESH__

#ifdef  __cplusplus
extern "C" {
#endif


/* Macros */

#define MAXCKEY              8  /* Maximum length of user key in 4-byte words */
#define MAXNCOL              8  /* Maximum blocklength in 4-byte words */
#define MAXNRND             14  /* Maximum number of rounds */
#define BITSPERBLOCK       128  /* Default number of bits in a cipher block */

#define AES_ENC              0
#define AES_DEC              1
#define AES_ECB             10
#define AES_CBC             11

#define AES_OK               0
#define AES_ERR_INIT        -1
#define AES_ERR_MODE        -2
#define AES_ERR_BLKLENGTH   -4
#define AES_ERR_KEYLENGTH   -8
#define AES_ERR_DIRECTION  -16

#if !(defined AES_SECURE || defined AES_UNSECURE)
#define AES_SECURE
#endif

/* Macros maintaining FLINT/C namespace */

#define AESInit               AESInit_l
#define	AESKeySched	      AESKeySched_l
#define	AESCrypt	      AESCrypt_l    
#define	AESPurge	      AESPurge_l       
#define AESKeyExpansion       AESKeyExpansion_l
#define	AESInvKeyExpansion    AESInvKeyExpansion_l
#define	AESEncryptBlock       AESEncryptBlock_l
#define	AESDecryptBlock       AESDecryptBlock_l
#define	AESEncBlock           AESEncBlock_l
#define	AESDecBlock           AESDecBlock_l    
#define	AESEncState           AESEncState_l    
#define	AESDecState           AESDecState_l    
#define	AESEncBlockRounds     AESEncBlockRounds_l
#define	AESDecBlockRounds     AESDecBlockRounds_l

/* Conversion of a vector of type UCHAR into ULONG word */

#if !defined AES_BIGENDIAN
#define UC2UL(ucptr)  *(unsigned long *)((ucptr))
#else
#define UC2UL(ucptr) \
          (((unsigned long) *((ucptr)+3) << 24) | \
           ((unsigned long) *((ucptr)+2) << 16) | \
           ((unsigned long) *((ucptr)+1) <<  8) | \
           ((unsigned long) *(ucptr)))
#endif

/* AES specific types */
typedef unsigned long AESXPKEY[(MAXNRND+1)*MAXNCOL];
typedef unsigned long AESSTATE[MAXNCOL];
typedef unsigned long AESROUNDKEY[MAXNCOL];
typedef unsigned char AESBLOCK[4*MAXNCOL];
typedef unsigned char AESKEY[4*MAXCKEY];

typedef struct
{
  AESXPKEY ExpandedKey; 
  int mode;            /* Mode of Operation: AES_ECB, AES_CBC */
  int KeyLength;       /* 128, 192, 256 */
  int BlkLength;       /* 128, 192, 256 */
  int DFlag;           /* AES_ENC, AES_DEC */
} AESKEYSCHED;


typedef struct
{
  int mode;            /* Mode of Operation: AES_ECB, AES_CBC */
  int BlkLength;       /* 128, 192, 256 */
  AESBLOCK IV;         /* Initialization Vector for CBC Mode */
  AESSTATE State;      /* State Buffer */
  AESSTATE Block;      /* Previous State Buffer for CBC Decryption */
} AESWORKSPACE;
  

/******************************************************************************/
/* AES API: Public Functions */

#ifndef __FLINT_API
#ifdef FLINT_USEDLL
#define __FLINT_API                   __cdecl
#else
#define __FLINT_API                   /**/
#endif /* FLINT_USEDLL */
#endif /* !defined __FLINT_API */

#if !defined __FLINT_API_A
#if defined __GNUC__ && !defined __cdecl
#define __FLINT_API_A                 /**/
#else
#define __FLINT_API_A                 __cdecl
#endif /* !defined __GNUC__ */
#endif /* !defined __FLINT_API_A */


/* If the FLINT/C-Package is used under MS Visual C/C++ as DLL,               */
/* all modules accessing data nul_l, one_l, two_l or smallprimes from outside */
/* the DLL must be compiled with -D__FLINT_API_DATA=__declspec(dllimport)     */

#ifndef __FLINT_API_DATA
#if (defined _MSC_VER && _MSC_VER >= 11) && defined FLINT_USEDLL
#define __FLINT_API_DATA              __declspec(dllimport)
#else
#define __FLINT_API_DATA              /**/
#endif /* MSC_VER && FLINT_USEDLL */
#endif /* !defined __FLINT_API_DATA */


int __FLINT_API 
AESInit_l (AESWORKSPACE *   ws, 
           int              mode, 
           int              BlkLength, 
           AESBLOCK         IV, 
           AESKEYSCHED *    AESKey, 
           AESKEY           RawKey, 
           int              KeyLength, 
           int              DFlag);

int __FLINT_API 
AESCrypt_l (AESBLOCK        OutBlock, 
            AESWORKSPACE *  ws, 
            AESKEYSCHED *   ks, 
            AESBLOCK        Inblock, 
            int             InLength);

int __FLINT_API 
AESKeySched_l (AESKEYSCHED *AESKey, 
               AESKEY       RawKey, 
               int          KeyLength, 
               int          BlkLength, 
               int          DFlag, 
               int          mode);

void __FLINT_API
AESPurge_l (AESWORKSPACE *  ws, 
            AESKEYSCHED *   ks);


/******************************************************************************/
/* AES public kernel functions */

/* Key expansion for encryption / decryption */
int __FLINT_API 
AESKeyExpansion_l (AESXPKEY ExpandedKey, AESKEY RawKey, int KeyLength, int BlockLength);

int __FLINT_API
AESInvKeyExpansion_l (AESXPKEY InvExpandedKey, AESKEY RawKey, int KeyLength, int BlockLength);

/* Encryption of a single block w/ KeyExpansion */
int __FLINT_API 
AESEncryptBlock_l (AESBLOCK CipherBlock, AESBLOCK MessBlock, AESKEY RawKey, int KeyLength, int BlockLength);

/* decryption of a single block w/ InvKeyExpansion */
int __FLINT_API
AESDecryptBlock_l (AESBLOCK MessBlock, AESBLOCK CipherBlock, AESKEY RawKey, int KeyLength, int BlockLength);

/* Encryption of a single block w/o KeyExpansion */
int __FLINT_API
AESEncBlock_l (AESBLOCK CipherBlock, AESBLOCK MessBlock, AESXPKEY ExpandedKey, int KeyLength, int BlockLength);

/* Decryption of a single block w/o InvKeyExpansion */
int __FLINT_API 
AESDecBlock_l (AESBLOCK MessBlock, AESBLOCK CipherBlock, AESXPKEY ExpandedKey, int KeyLength, int BlockLength);

/* State encryption */
int __FLINT_API
AESEncState_l (AESSTATE State, AESXPKEY ExpandedKey, int Nk, int Nb);

/* State decryption */
int  __FLINT_API
AESDecState_l (AESSTATE State, AESXPKEY InvExpandedKey, int Nk, int Nb);

/* Block encryption w/ variable number of rounds */
int __FLINT_API
AESEncBlockRounds_l (AESBLOCK CipherBlock, AESBLOCK MessBlock, AESXPKEY ExpandedKey, int KeyLength, int BlockLength, int Rounds);

/* Block decryption w/ variable number of rounds */
int __FLINT_API
AESDecBlockRounds_l (AESBLOCK CipherBlock, AESBLOCK MessBlock, AESXPKEY ExpandedKey, int KeyLength, int BlockLength, int Rounds);

#ifdef  __cplusplus
}
#endif

#endif /* __AESH__ */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -