11#ifndef _AES_H_
22#define _AES_H_
33#include < functional>
4+ #include " general.h"
45#include < cstdio>
56#include < cstring>
67#include < functional>
910#define NUM_BLOCKS 4
1011#define BLOCK_BYTES_LEN (AES_STATE_ROWS * (NUM_BLOCKS) * sizeof (unsigned char ))
1112
12- enum AESChainingMode {
13- ECB, /* Electronic Codebook*/
14- CBC, /* Cipher Block Chaining*/
15- CFB, /* Cipher Feedback*/
16- OFB, /* Output Feedback*/
17- CTR /* Counter*/
18- };
19-
20- enum class AESKeyLength
21- {
22- AES_128,
23- AES_192,
24- AES_256
25- };
2613
27- struct AESData
28- {
14+ struct AESData {
2915 unsigned int numWord;
3016 unsigned int numRound;
3117 unsigned int keySize;
3218};
3319
34- typedef std::function<void (unsigned char *, unsigned int , unsigned char *, unsigned char *&, unsigned int &, const unsigned char *, unsigned char *, AESKeyLength)> EncryptDecryptFunc;
35- static std::map<AESKeyLength,AESData> aesKeyLengthData = {
36- { AESKeyLength::AES_128, {4 , 10 , 128 } },
37- { AESKeyLength::AES_192, {6 , 12 , 192 } },
38- { AESKeyLength::AES_256, {8 , 14 , 256 } }
39- };
4020
41- void padMessage (unsigned char * &message, unsigned int & length, unsigned int & paddedLength);
42- void unpadMessage (unsigned char * message, unsigned int & length);
43- void addRoundKey (unsigned char state[AES_STATE_ROWS][NUM_BLOCKS], unsigned char * roundKey);
44- void checkLength (unsigned int length);
45- void encryptBlock (const unsigned char in[], unsigned char out[], unsigned char * roundKeys, AESKeyLength keyLength);
46- void decryptBlock (const unsigned char in[], unsigned char out[], unsigned char * roundKeys, AESKeyLength keyLength);
47- void subBytes (unsigned char state[AES_STATE_ROWS][NUM_BLOCKS]);
48- void invSubBytes (unsigned char state[AES_STATE_ROWS][NUM_BLOCKS]);
49- void invShiftRows (unsigned char state[AES_STATE_ROWS][NUM_BLOCKS]);
50- void invMixColumns (unsigned char state[AES_STATE_ROWS][NUM_BLOCKS]);
51- void mixColumns (unsigned char state[AES_STATE_ROWS][NUM_BLOCKS]);
52- void shiftRows (unsigned char state[AES_STATE_ROWS][NUM_BLOCKS]);
53- void keyExpansion (const unsigned char * key, unsigned char roundKeys[], AESKeyLength keyLength);
54- unsigned char xtime (unsigned char x);
55- void rotWord (unsigned char word[AES_STATE_ROWS]);
56- void subWord (unsigned char word[AES_STATE_ROWS]);
57- void rconWord (unsigned char rcon[AES_STATE_ROWS], unsigned int n);
58- unsigned char multiply (unsigned char x, unsigned char y);
59- void xorBlocks (const unsigned char *a, const unsigned char *b,
60- unsigned char *c, unsigned int len);
61- void generateRandomIV (unsigned char * iv);
62- size_t calculatEncryptedLenAES (size_t inLen, bool isFirst);
63- size_t calculatDecryptedLenAES (size_t inLen, bool isFirst);
64- void generateKey (unsigned char *, AESKeyLength keyLength);
21+ static std::map<AESKeyLength, AESData> aesKeyLengthData = {
22+ {AESKeyLength::AES_128, {4 , 10 , 16 }},
23+ {AESKeyLength::AES_192, {6 , 12 , 24 }},
24+ {AESKeyLength::AES_256, {8 , 14 , 32 }}};
25+
26+ unsigned int getPaddedLength (unsigned int originalLength);
27+ void padMessage (unsigned char *originalMessage, unsigned int originalLength,unsigned char * paddedMessage);
28+ unsigned int getUnpadMessageLength (unsigned char *message,unsigned int paddedLength);
29+ void addRoundKey (unsigned char state[AES_STATE_ROWS][NUM_BLOCKS],
30+ unsigned char *roundKey);
31+ void checkLength (unsigned int length);
32+ void encryptBlock (const unsigned char in[], unsigned char out[],
33+ unsigned char *roundKeys, AESKeyLength keyLength);
34+ void decryptBlock (const unsigned char in[], unsigned char out[],
35+ unsigned char *roundKeys, AESKeyLength keyLength);
36+ void subBytes (unsigned char state[AES_STATE_ROWS][NUM_BLOCKS]);
37+ void invSubBytes (unsigned char state[AES_STATE_ROWS][NUM_BLOCKS]);
38+ void invShiftRows (unsigned char state[AES_STATE_ROWS][NUM_BLOCKS]);
39+ void invMixColumns (unsigned char state[AES_STATE_ROWS][NUM_BLOCKS]);
40+ void mixColumns (unsigned char state[AES_STATE_ROWS][NUM_BLOCKS]);
41+ void shiftRows (unsigned char state[AES_STATE_ROWS][NUM_BLOCKS]);
42+ void keyExpansion (const unsigned char *key, unsigned char roundKeys[],
43+ AESKeyLength keyLength);
44+ unsigned char xtime (unsigned char x);
45+ void rotWord (unsigned char word[AES_STATE_ROWS]);
46+ void subWord (unsigned char word[AES_STATE_ROWS]);
47+ void rconWord (unsigned char rcon[AES_STATE_ROWS], unsigned int n);
48+ unsigned char multiply (unsigned char x, unsigned char y);
49+ void xorBlocks (const unsigned char *a, const unsigned char *b, unsigned char *c,
50+ unsigned int len);
51+ void generateRandomIV (unsigned char *iv);
52+ size_t calculatEncryptedLenAES (size_t inLen, bool isFirst,
53+ AESChainingMode chainingMode);
54+ size_t calculatDecryptedLenAES (size_t inLen, bool isFirst,AESChainingMode chainingMode);
55+ void generateKey (unsigned char *, AESKeyLength keyLength);
6556
6657/* Inverse S-Box*/
6758const unsigned char invSBox[16 ][16 ] = {
@@ -133,4 +124,4 @@ const unsigned char sBox[16][16] = {
133124 {0x8c , 0xa1 , 0x89 , 0x0d , 0xbf , 0xe6 , 0x42 , 0x68 , 0x41 , 0x99 , 0x2d , 0x0f ,
134125 0xb0 , 0x54 , 0xbb , 0x16 }};
135126
136- #endif
127+ #endif
0 commit comments