8 #include <botan/block_cipher.h>
9 #include <botan/internal/openssl.h>
10 #include <openssl/evp.h>
16 class OpenSSL_BlockCipher :
public BlockCipher
19 OpenSSL_BlockCipher(
const std::string& name,
20 const EVP_CIPHER* cipher);
22 OpenSSL_BlockCipher(
const std::string& name,
23 const EVP_CIPHER* cipher,
24 size_t kl_min,
size_t kl_max,
size_t kl_mod);
26 ~OpenSSL_BlockCipher();
28 void clear()
override;
29 std::string provider()
const override {
return "openssl"; }
31 BlockCipher* clone()
const override;
33 size_t block_size()
const override {
return m_block_sz; }
37 void encrypt_n(
const uint8_t in[], uint8_t out[],
size_t blocks)
const override
43 void decrypt_n(
const uint8_t in[], uint8_t out[],
size_t blocks)
const override
49 void key_schedule(
const uint8_t key[],
size_t key_len)
override;
57 OpenSSL_BlockCipher::OpenSSL_BlockCipher(
const std::string& algo_name,
58 const EVP_CIPHER* algo) :
63 if(EVP_CIPHER_mode(algo) != EVP_CIPH_ECB_MODE)
64 throw Invalid_Argument(
"OpenSSL_BlockCipher: Non-ECB EVP was passed in");
69 EVP_EncryptInit_ex(&
m_encrypt, algo,
nullptr,
nullptr,
nullptr);
70 EVP_DecryptInit_ex(&
m_decrypt, algo,
nullptr,
nullptr,
nullptr);
72 EVP_CIPHER_CTX_set_padding(&
m_encrypt, 0);
73 EVP_CIPHER_CTX_set_padding(&
m_decrypt, 0);
76 OpenSSL_BlockCipher::OpenSSL_BlockCipher(
const std::string& algo_name,
77 const EVP_CIPHER* algo,
85 if(EVP_CIPHER_mode(algo) != EVP_CIPH_ECB_MODE)
86 throw Invalid_Argument(
"OpenSSL_BlockCipher: Non-ECB EVP was passed in");
91 EVP_EncryptInit_ex(&
m_encrypt, algo,
nullptr,
nullptr,
nullptr);
92 EVP_DecryptInit_ex(&
m_decrypt, algo,
nullptr,
nullptr,
nullptr);
94 EVP_CIPHER_CTX_set_padding(&
m_encrypt, 0);
95 EVP_CIPHER_CTX_set_padding(&
m_decrypt, 0);
98 OpenSSL_BlockCipher::~OpenSSL_BlockCipher()
107 void OpenSSL_BlockCipher::key_schedule(
const uint8_t key[],
size_t length)
109 secure_vector<uint8_t> full_key(key, key + length);
113 full_key += std::make_pair(key, 8);
116 if(EVP_CIPHER_CTX_set_key_length(&
m_encrypt, length) == 0 ||
117 EVP_CIPHER_CTX_set_key_length(&
m_decrypt, length) == 0)
118 throw Invalid_Argument(
"OpenSSL_BlockCipher: Bad key length for " +
121 EVP_EncryptInit_ex(&
m_encrypt,
nullptr,
nullptr, full_key.data(),
nullptr);
122 EVP_DecryptInit_ex(&
m_decrypt,
nullptr,
nullptr, full_key.data(),
nullptr);
128 BlockCipher* OpenSSL_BlockCipher::clone()
const
140 void OpenSSL_BlockCipher::clear()
142 const EVP_CIPHER* algo = EVP_CIPHER_CTX_cipher(&
m_encrypt);
148 EVP_EncryptInit_ex(&
m_encrypt, algo,
nullptr,
nullptr,
nullptr);
149 EVP_DecryptInit_ex(&
m_decrypt, algo,
nullptr,
nullptr,
nullptr);
150 EVP_CIPHER_CTX_set_padding(&
m_encrypt, 0);
151 EVP_CIPHER_CTX_set_padding(&
m_decrypt, 0);
156 std::unique_ptr<BlockCipher>
159 #define MAKE_OPENSSL_BLOCK(evp_fn) \
160 std::unique_ptr<BlockCipher>(new OpenSSL_BlockCipher(name, evp_fn()))
161 #define MAKE_OPENSSL_BLOCK_KEYLEN(evp_fn, kl_min, kl_max, kl_mod) \
162 std::unique_ptr<BlockCipher>(new OpenSSL_BlockCipher(name, evp_fn(), kl_min, kl_max, kl_mod))
164 #if defined(BOTAN_HAS_AES) && !defined(OPENSSL_NO_AES)
165 if(name ==
"AES-128")
167 if(name ==
"AES-192")
169 if(name ==
"AES-256")
173 #if defined(BOTAN_HAS_CAMELLIA) && !defined(OPENSSL_NO_CAMELLIA)
174 if(name ==
"Camellia-128")
176 if(name ==
"Camellia-192")
178 if(name ==
"Camellia-256")
182 #if defined(BOTAN_HAS_DES) && !defined(OPENSSL_NO_DES)
185 if(name ==
"TripleDES")
189 #if defined(BOTAN_HAS_BLOWFISH) && !defined(OPENSSL_NO_BF)
190 if(name ==
"Blowfish")
194 #if defined(BOTAN_HAS_CAST) && !defined(OPENSSL_NO_CAST)
195 if(name ==
"CAST-128")
199 #if defined(BOTAN_HAS_IDEA) && !defined(OPENSSL_NO_IDEA)
204 #if defined(BOTAN_HAS_SEED) && !defined(OPENSSL_NO_SEED)
Key_Length_Specification m_cipher_key_spec
std::string m_cipher_name
#define MAKE_OPENSSL_BLOCK(evp_fn)
#define MAKE_OPENSSL_BLOCK_KEYLEN(evp_fn, kl_min, kl_max, kl_mod)
std::unique_ptr< BlockCipher > make_openssl_block_cipher(const std::string &name)