8 #include <botan/internal/openssl_engine.h>
9 #include <openssl/evp.h>
18 class EVP_BlockCipher :
public BlockCipher
23 BlockCipher* clone()
const;
27 EVP_BlockCipher(
const EVP_CIPHER*,
const std::string&);
29 EVP_BlockCipher(
const EVP_CIPHER*,
const std::string&,
30 size_t,
size_t,
size_t);
36 void encrypt_n(
const byte in[],
byte out[],
size_t blocks)
const;
37 void decrypt_n(
const byte in[],
byte out[],
size_t blocks)
const;
38 void key_schedule(
const byte[],
size_t);
49 EVP_BlockCipher::EVP_BlockCipher(
const EVP_CIPHER* algo,
51 block_sz(EVP_CIPHER_block_size(algo)),
55 if(EVP_CIPHER_mode(algo) != EVP_CIPH_ECB_MODE)
61 EVP_EncryptInit_ex(&
encrypt, algo, 0, 0, 0);
62 EVP_DecryptInit_ex(&
decrypt, algo, 0, 0, 0);
64 EVP_CIPHER_CTX_set_padding(&
encrypt, 0);
65 EVP_CIPHER_CTX_set_padding(&
decrypt, 0);
71 EVP_BlockCipher::EVP_BlockCipher(
const EVP_CIPHER* algo,
73 size_t key_min,
size_t key_max,
75 block_sz(EVP_CIPHER_block_size(algo)),
79 if(EVP_CIPHER_mode(algo) != EVP_CIPH_ECB_MODE)
85 EVP_EncryptInit_ex(&
encrypt, algo, 0, 0, 0);
86 EVP_DecryptInit_ex(&
decrypt, algo, 0, 0, 0);
88 EVP_CIPHER_CTX_set_padding(&
encrypt, 0);
89 EVP_CIPHER_CTX_set_padding(&
decrypt, 0);
95 EVP_BlockCipher::~EVP_BlockCipher()
97 EVP_CIPHER_CTX_cleanup(&
encrypt);
98 EVP_CIPHER_CTX_cleanup(&
decrypt);
104 void EVP_BlockCipher::encrypt_n(
const byte in[],
byte out[],
114 void EVP_BlockCipher::decrypt_n(
const byte in[],
byte out[],
124 void EVP_BlockCipher::key_schedule(
const byte key[],
size_t length)
126 SecureVector<byte> full_key(key, length);
130 full_key += std::make_pair(key, 8);
133 if(EVP_CIPHER_CTX_set_key_length(&
encrypt, length) == 0 ||
134 EVP_CIPHER_CTX_set_key_length(&
decrypt, length) == 0)
140 EVP_CIPHER_CTX_ctrl(&
encrypt, EVP_CTRL_SET_RC2_KEY_BITS, length*8, 0);
141 EVP_CIPHER_CTX_ctrl(&
decrypt, EVP_CTRL_SET_RC2_KEY_BITS, length*8, 0);
144 EVP_EncryptInit_ex(&
encrypt, 0, 0, full_key.begin(), 0);
145 EVP_DecryptInit_ex(&
decrypt, 0, 0, full_key.begin(), 0);
151 BlockCipher* EVP_BlockCipher::clone()
const
153 return new EVP_BlockCipher(EVP_CIPHER_CTX_cipher(&
encrypt),
163 void EVP_BlockCipher::clear()
165 const EVP_CIPHER* algo = EVP_CIPHER_CTX_cipher(&
encrypt);
167 EVP_CIPHER_CTX_cleanup(&
encrypt);
168 EVP_CIPHER_CTX_cleanup(&
decrypt);
171 EVP_EncryptInit_ex(&
encrypt, algo, 0, 0, 0);
172 EVP_DecryptInit_ex(&
decrypt, algo, 0, 0, 0);
173 EVP_CIPHER_CTX_set_padding(&
encrypt, 0);
174 EVP_CIPHER_CTX_set_padding(&
decrypt, 0);
183 OpenSSL_Engine::find_block_cipher(
const SCAN_Name& request,
186 #define HANDLE_EVP_CIPHER(NAME, EVP) \
187 if(request.algo_name() == NAME && request.arg_count() == 0) \
188 return new EVP_BlockCipher(EVP, NAME);
190 #define HANDLE_EVP_CIPHER_KEYLEN(NAME, EVP, MIN, MAX, MOD) \
191 if(request.algo_name() == NAME && request.arg_count() == 0) \
192 return new EVP_BlockCipher(EVP, NAME, MIN, MAX, MOD);
194 #if !defined(OPENSSL_NO_AES)
204 #if !defined(OPENSSL_NO_DES)
209 #if !defined(OPENSSL_NO_BF)
213 #if !defined(OPENSSL_NO_CAST)
217 #if !defined(OPENSSL_NO_CAMELLIA)
223 #if !defined(OPENSSL_NO_RC2)
227 #if !defined(OPENSSL_NO_RC5) && 0
230 return new EVP_BlockCipher(EVP_rc5_32_12_16_ecb(),
231 "RC5(12)", 1, 32, 1);
234 #if !defined(OPENSSL_NO_IDEA) && 0
238 #if !defined(OPENSSL_NO_SEED)
242 #undef HANDLE_EVP_CIPHER
243 #undef HANDLE_EVP_CIPHER_KEYLEN
#define HANDLE_EVP_CIPHER_KEYLEN(NAME, EVP, MIN, MAX, MOD)
std::invalid_argument Invalid_Argument
#define HANDLE_EVP_CIPHER(NAME, EVP)
std::string algo_name() const
Key_Length_Specification cipher_key_spec
size_t arg_as_integer(size_t i, size_t def_value) const