// $Id: rijndael.h 65 2008-02-25 13:16:37Z tb $
#ifndef RIJNDAEL_H
#define RIJNDAEL_H
#include <inttypes.h>
#include <stdlib.h>
/**
* AES state context to encrypt input data blocks in ECB mode.
*/
class RijndaelEncryptECB
{
protected:
/// key-length-dependent number of rounds
int nr_;
/// encrypt key schedule
uint32_t ek_[60];
public:
/// Set the encryption key. The key must be 16, 24 or 32 bytes long.
void set_key(const unsigned char* key, unsigned int keylen);
/// Encrypt a block of 16 bytes using the current cipher state.
void encrypt_block(const uint8_t src[16], uint8_t dst[16]) const;
/// Encrypt a length of n*16 bytes. Len must be a multiple of 16 or this
/// function will assert().
void encrypt(const void* src, void* dst, size_t len) const;
};
/**
* AES state context to decrypt input data blocks in ECB mode.
*/
class RijndaelDecryptECB
{
protected:
/// key-length-dependent number of rounds
int nr_;
/// decrypt key schedule
uint32_t dk_[60];
public:
/// Set the encryption key. The key must be 16, 24 or 32 bytes long.
void set_key(const unsigned char* key, unsigned int keylen);
/// Decrypt a block of 16 bytes using the current cipher state.
void decrypt_block(const uint8_t src[16], uint8_t dst[16]) const;
/// Decrypt a length of n*16 bytes. Len must be a multiple of 16 or this
/// function will assert().
void decrypt(const void* src, void* dst, size_t len) const;
};
/**
* AES state context to encrypt input data blocks in CBC mode.
*/
class RijndaelEncryptCBC
{
protected:
/// key-length-dependent number of rounds
int nr_;
/// encrypt key schedule
uint32_t ek_[60];
/// cbc initialisation vector
uint8_t cbciv_[16];
public:
/// Set the encryption key. The key must be 16, 24 or 32 bytes long.
void set_key(const unsigned char* key, unsigned int keylen);
/// Set the initial cbc vector. The vector is always 16 bytes long.
void set_cbciv(const uint8_t iv[16]);
/// Encrypt a block of 16 bytes using the current cipher state.
void encrypt_block(const uint8_t src[16], uint8_t dst[16]);
/// Encrypt a length of n*16 bytes. Len must be a multiple of 16 or this
/// function will assert().
void encrypt(const void* src, void* dst, size_t len);
};
/**
* AES state context to decrypt input data blocks in CBC mode.
*/
class RijndaelDecryptCBC
{
protected:
/// key-length-dependent number of rounds
int nr_;
/// decrypt key schedule
uint32_t dk_[60];
/// cbc initialisation vector
uint8_t cbciv_[16];
/// temporary cbc block
uint8_t cbcivsave_[16];
public:
/// Set the encryption key. The key must be 16, 24 or 32 bytes long.
void set_key(const unsigned char* key, unsigned int keylen);
/// Set the initial cbc vector. The vector is always 16 bytes long.
void set_cbciv(const uint8_t iv[16]);
/// Decrypt a block of 16 bytes using the current cipher state.
void decrypt_block(const uint8_t src[16], uint8_t dst[16]);
/// Decrypt a length of n*16 bytes. Len must be a multiple of 16 or this
/// function will assert().
void decrypt(const void* src, void* dst, size_t len);
};
#endif // RIJNDAEL_H