34struct evp_cipher_ctx_st;
35typedef struct evp_cipher_ctx_st EVP_CIPHER_CTX;
39template <std::
size_t N>
class Cipher;
129 virtual void Decrypt(
const std::array<uint8_t, N>& src, std::array<uint8_t, N>& dst)
const = 0;
137 virtual void Encrypt(
const std::array<uint8_t, N>& src, std::array<uint8_t, N>& dst)
const = 0;
145 const std::array<uint8_t, 16> init_vec_;
146 EVP_CIPHER_CTX* ctx_dec_ =
nullptr;
147 EVP_CIPHER_CTX* ctx_enc_ =
nullptr;
164 AesCipher(
const uint8_t* key,
const std::array<uint8_t, 16>& init_vec);
178 void Decrypt(
const std::array<uint8_t, 16>& src, std::array<uint8_t, 16>& dst)
const override;
186 void Encrypt(
const std::array<uint8_t, 16>& src, std::array<uint8_t, 16>& dst)
const override;
194 static const uint8_t kNumRounds = 16;
198 uint32_t sbox_keys[4];
200 uint32_t sub_keys[40];
203 const std::array<uint8_t, 16> init_vec_;
205 static inline uint32_t RotateLeft(uint32_t v, uint32_t n) {
206 return (v << (n & 0x1f)) | (v >> (32 - (n & 0x1f)));
209 static inline uint32_t RotateRight(uint32_t v, uint32_t n) {
210 return (v >> (n & 0x1f)) | (v << (32 - (n & 0x1f)));
220 static uint32_t ReedSolomonEncode(uint32_t k0, uint32_t k1);
229 static uint32_t F32(uint32_t x,
const uint32_t* k32);
232 void InitializeKey(
const uint8_t* key);
262 void Decrypt(
const std::array<uint8_t, 16>& src, std::array<uint8_t, 16>& dst)
const override;
270 void Encrypt(
const std::array<uint8_t, 16>& src, std::array<uint8_t, 16>& dst)
const override;
278 std::array<uint32_t, 16> input_ = {{0}};
280 static inline uint32_t RotateLeft(uint32_t v, uint32_t n) {
281 return (v << (n & 0x1f)) | (v >> (32 - (n & 0x1f)));
290 static std::array<uint8_t, 64> WordToByte(
const std::array<uint32_t, 16>& input);
320 void Process(
const std::array<uint8_t, 64>& src, std::array<uint8_t, 64>& dst);
328 std::array<uint32_t, 16> state_ = {{0}};
330 static inline uint32_t RotateLeft(uint32_t v, uint32_t n) {
331 return (v << (n & 0x1f)) | (v >> (32 - (n & 0x1f)));
340 static std::array<uint8_t, 64> BlockFunction(
const std::array<uint32_t, 16>& state);
363 void Process(
const std::array<uint8_t, 64>& src, std::array<uint8_t, 64>& dst);
LIBKEEPASS_API void encrypt_cbc(std::istream &src, std::ostream &dst, const Cipher< 16 > &cipher)
Encrypts a stream using CBC mode with PKCS #7 padding.
LIBKEEPASS_API std::array< uint8_t, 32 > decrypt_ecb(const std::array< uint8_t, 32 > &src, const Cipher< 16 > &cipher)
Decrypts a 32-byte block using ECB mode with the given cipher.
LIBKEEPASS_API void decrypt_cbc_stream(std::istream &src, std::ostream &dst, const Cipher< 16 > &cipher)
Decrypts a stream using CBC mode with PKCS #7 padding removal.
LIBKEEPASS_API void decrypt_cbc(std::istream &src, std::ostream &dst, const Cipher< 16 > &cipher)
Decrypts a stream using CBC mode with PKCS #7 padding removal.
LIBKEEPASS_API std::array< uint8_t, 32 > encrypt_ecb(const std::array< uint8_t, 32 > &src, const Cipher< 16 > &cipher)
Encrypts a 32-byte block using ECB mode with the given cipher.
AES-256-ECB block cipher using OpenSSL's EVP interface.
Definition cipher.hh:143
void Decrypt(const std::array< uint8_t, 16 > &src, std::array< uint8_t, 16 > &dst) const override
Decrypts a single 16-byte block using AES-256-ECB.
~AesCipher()
Destroys the cipher and frees the OpenSSL contexts.
void Encrypt(const std::array< uint8_t, 16 > &src, std::array< uint8_t, 16 > &dst) const override
Encrypts a single 16-byte block using AES-256-ECB.
AesCipher(const uint8_t *key)
Constructs an AES cipher with a zero initialization vector.
Definition cipher.hh:155
AesCipher(const uint8_t *key, const std::array< uint8_t, 16 > &init_vec)
Constructs an AES cipher with a given initialization vector.
const std::array< uint8_t, 16 > & InitializationVector() const override
Returns the initialization vector.
Definition cipher.hh:170
ChaCha20 stream cipher implementation (RFC 8439, 32-bit counter).
Definition cipher.hh:326
void Process(const std::array< uint8_t, 64 > &src, std::array< uint8_t, 64 > &dst)
Encrypts or decrypts a single 64-byte block.
~ChaCha20Cipher()
Zeroizes the cipher state holding the key.
ChaCha20Cipher(const uint8_t *key, const std::array< uint8_t, 12 > &init_vec)
Constructs a ChaCha20 cipher with the given key and nonce.
Abstract base class for 16-byte block ciphers.
Definition cipher.hh:113
virtual void Decrypt(const std::array< uint8_t, N > &src, std::array< uint8_t, N > &dst) const =0
Decrypts a single block.
virtual const std::array< uint8_t, N > & InitializationVector() const =0
Returns the initialization vector used by this cipher instance.
virtual void Encrypt(const std::array< uint8_t, N > &src, std::array< uint8_t, N > &dst) const =0
Encrypts a single block.
Salsa20 stream cipher implementation.
Definition cipher.hh:276
Salsa20Cipher(const uint8_t *key)
Constructs a Salsa20 cipher with a zero nonce.
Definition cipher.hh:298
Salsa20Cipher(const uint8_t *key, const std::array< uint8_t, 8 > &init_vec)
Constructs a Salsa20 cipher with a given 64-bit nonce.
~Salsa20Cipher()
Zeroizes the cipher state holding the key.
void Process(const std::array< uint8_t, 64 > &src, std::array< uint8_t, 64 > &dst)
Encrypts or decrypts a single 64-byte block.
Twofish-256 block cipher implementation.
Definition cipher.hh:192
~TwofishCipher()
Zeroizes the expanded key schedule.
void Decrypt(const std::array< uint8_t, 16 > &src, std::array< uint8_t, 16 > &dst) const override
Decrypts a single 16-byte block using Twofish-256.
const std::array< uint8_t, 16 > & InitializationVector() const override
Returns the initialization vector.
Definition cipher.hh:254
TwofishCipher(const uint8_t *key, const std::array< uint8_t, 16 > &init_vec)
Constructs a Twofish cipher with a given initialization vector.
TwofishCipher(const uint8_t *key)
Constructs a Twofish cipher with a zero initialization vector.
Definition cipher.hh:240
void Encrypt(const std::array< uint8_t, 16 > &src, std::array< uint8_t, 16 > &dst) const override
Encrypts a single 16-byte block using Twofish-256.
Visibility/export macro for the shared library.
#define LIBKEEPASS_API
Marks a class, function or variable as part of the public ABI.
Definition export.hh:43