| #ifndef _RIJNDAEL_H_ |
| #define _RIJNDAEL_H_ |
| |
| /************************************************************************** |
| * This code is based on Szymon Stefanek AES implementation: * |
| * http://www.esat.kuleuven.ac.be/~rijmen/rijndael/rijndael-cpplib.tar.gz * |
| * * |
| * Dynamic tables generation is based on the Brian Gladman's work: * |
| * http://fp.gladman.plus.com/cryptography_technology/rijndael * |
| **************************************************************************/ |
| |
| #define _MAX_KEY_COLUMNS (256/32) |
| #define _MAX_ROUNDS 14 |
| #define MAX_IV_SIZE 16 |
| |
| class Rijndael |
| { |
| private: |
| #ifdef USE_SSE |
| void blockEncryptSSE(const byte *input,size_t numBlocks,byte *outBuffer); |
| void blockDecryptSSE(const byte *input, size_t numBlocks, byte *outBuffer); |
| |
| bool AES_NI; |
| #endif |
| void keySched(byte key[_MAX_KEY_COLUMNS][4]); |
| void keyEncToDec(); |
| void GenerateTables(); |
| |
| // RAR always uses CBC, but we may need to turn it off when calling |
| // this code from other archive formats with CTR and other modes. |
| bool CBCMode; |
| |
| int m_uRounds; |
| byte m_initVector[MAX_IV_SIZE]; |
| byte m_expandedKey[_MAX_ROUNDS+1][4][4]; |
| public: |
| Rijndael(); |
| void Init(bool Encrypt,const byte *key,uint keyLen,const byte *initVector); |
| void blockEncrypt(const byte *input, size_t inputLen, byte *outBuffer); |
| void blockDecrypt(const byte *input, size_t inputLen, byte *outBuffer); |
| void SetCBCMode(bool Mode) {CBCMode=Mode;} |
| }; |
| |
| #endif // _RIJNDAEL_H_ |