// $Id: serpent.h 74 2008-02-25 23:38:09Z tb $
#ifndef SERPENT_H
#define SERPENT_H
#include <stdint.h>
#include <stdlib.h>
namespace SerpentBotan {
/**
* Serpent encryption cipher state context to encrypt input data blocks in ECB
* (Electronic codebook) mode.
*/
class EncryptECB
{
private:
/// storage for the key schedule
uint32_t round_key[132];
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;
};
/**
* Serpent encryption cipher state context to decrypt input data blocks in ECB
* (Electronic codebook) mode.
*/
class DecryptECB
{
private:
/// storage for the key schedule
uint32_t round_key[132];
public:
/// Set the decryption 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;
};
/**
* Serpent encryption cipher state context to encrypt input data blocks in CBC
* (Cipher-block chaining) mode.
*/
class EncryptCBC
{
private:
/// storage for the key schedule
uint32_t l_key[132];
/// cbc initialisation vector
uint8_t l_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);
};
/**
* Serpent encryption cipher state context to decrypt input data blocks in CBC
* (Cipher-block chaining) mode.
*/
class DecryptCBC
{
private:
/// storage for the key schedule
uint32_t l_key[132];
/// cbc initialisation vector
uint8_t l_cbciv[16];
/// temporary cbc block
uint8_t l_cbcivsave[16];
public:
/// Set the decryption 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);
};
} // namespace SerpentBotan
#endif // SERPENT_H