8 #include <botan/internal/openssl_engine.h> 9 #include <openssl/evp.h> 11 #if OPENSSL_VERSION_NUMBER >= 0x10100000 12 #error "OpenSSL 1.1 API not supported in Botan 1.10, upgrade to 2.x" 22 class EVP_BlockCipher :
public BlockCipher
26 std::string name()
const {
return cipher_name; }
27 BlockCipher* clone()
const;
29 size_t block_size()
const {
return block_sz; }
31 EVP_BlockCipher(
const EVP_CIPHER*,
const std::string&);
33 EVP_BlockCipher(
const EVP_CIPHER*,
const std::string&,
34 size_t,
size_t,
size_t);
36 Key_Length_Specification key_spec()
const {
return cipher_key_spec; }
40 void encrypt_n(
const byte in[],
byte out[],
size_t blocks)
const;
41 void decrypt_n(
const byte in[],
byte out[],
size_t blocks)
const;
42 void key_schedule(
const byte[],
size_t);
45 Key_Length_Specification cipher_key_spec;
46 std::string cipher_name;
47 mutable EVP_CIPHER_CTX encrypt, decrypt;
53 EVP_BlockCipher::EVP_BlockCipher(
const EVP_CIPHER* algo,
54 const std::string& algo_name) :
55 block_sz(EVP_CIPHER_block_size(algo)),
56 cipher_key_spec(EVP_CIPHER_key_length(algo)),
57 cipher_name(algo_name)
59 if(EVP_CIPHER_mode(algo) != EVP_CIPH_ECB_MODE)
62 EVP_CIPHER_CTX_init(&encrypt);
63 EVP_CIPHER_CTX_init(&decrypt);
65 EVP_EncryptInit_ex(&encrypt, algo, 0, 0, 0);
66 EVP_DecryptInit_ex(&decrypt, algo, 0, 0, 0);
68 EVP_CIPHER_CTX_set_padding(&encrypt, 0);
69 EVP_CIPHER_CTX_set_padding(&decrypt, 0);
75 EVP_BlockCipher::EVP_BlockCipher(
const EVP_CIPHER* algo,
76 const std::string& algo_name,
77 size_t key_min,
size_t key_max,
79 block_sz(EVP_CIPHER_block_size(algo)),
80 cipher_key_spec(key_min, key_max, key_mod),
81 cipher_name(algo_name)
83 if(EVP_CIPHER_mode(algo) != EVP_CIPH_ECB_MODE)
86 EVP_CIPHER_CTX_init(&encrypt);
87 EVP_CIPHER_CTX_init(&decrypt);
89 EVP_EncryptInit_ex(&encrypt, algo, 0, 0, 0);
90 EVP_DecryptInit_ex(&decrypt, algo, 0, 0, 0);
92 EVP_CIPHER_CTX_set_padding(&encrypt, 0);
93 EVP_CIPHER_CTX_set_padding(&decrypt, 0);
99 EVP_BlockCipher::~EVP_BlockCipher()
101 EVP_CIPHER_CTX_cleanup(&encrypt);
102 EVP_CIPHER_CTX_cleanup(&decrypt);
108 void EVP_BlockCipher::encrypt_n(
const byte in[],
byte out[],
112 EVP_EncryptUpdate(&encrypt, out, &out_len, in, blocks * block_sz);
118 void EVP_BlockCipher::decrypt_n(
const byte in[],
byte out[],
122 EVP_DecryptUpdate(&decrypt, out, &out_len, in, blocks * block_sz);
128 void EVP_BlockCipher::key_schedule(
const byte key[],
size_t length)
130 SecureVector<byte> full_key(key, length);
132 if(cipher_name ==
"TripleDES" && length == 16)
134 full_key += std::make_pair(key, 8);
137 if(EVP_CIPHER_CTX_set_key_length(&encrypt, length) == 0 ||
138 EVP_CIPHER_CTX_set_key_length(&decrypt, length) == 0)
142 if(cipher_name ==
"RC2")
144 EVP_CIPHER_CTX_ctrl(&encrypt, EVP_CTRL_SET_RC2_KEY_BITS, length*8, 0);
145 EVP_CIPHER_CTX_ctrl(&decrypt, EVP_CTRL_SET_RC2_KEY_BITS, length*8, 0);
148 EVP_EncryptInit_ex(&encrypt, 0, 0, full_key.begin(), 0);
149 EVP_DecryptInit_ex(&decrypt, 0, 0, full_key.begin(), 0);
155 BlockCipher* EVP_BlockCipher::clone()
const 157 return new EVP_BlockCipher(EVP_CIPHER_CTX_cipher(&encrypt),
167 void EVP_BlockCipher::clear()
169 const EVP_CIPHER* algo = EVP_CIPHER_CTX_cipher(&encrypt);
171 EVP_CIPHER_CTX_cleanup(&encrypt);
172 EVP_CIPHER_CTX_cleanup(&decrypt);
173 EVP_CIPHER_CTX_init(&encrypt);
174 EVP_CIPHER_CTX_init(&decrypt);
175 EVP_EncryptInit_ex(&encrypt, algo, 0, 0, 0);
176 EVP_DecryptInit_ex(&decrypt, algo, 0, 0, 0);
177 EVP_CIPHER_CTX_set_padding(&encrypt, 0);
178 EVP_CIPHER_CTX_set_padding(&decrypt, 0);
190 #define HANDLE_EVP_CIPHER(NAME, EVP) \ 191 if(request.algo_name() == NAME && request.arg_count() == 0) \ 192 return new EVP_BlockCipher(EVP, NAME); 194 #define HANDLE_EVP_CIPHER_KEYLEN(NAME, EVP, MIN, MAX, MOD) \ 195 if(request.algo_name() == NAME && request.arg_count() == 0) \ 196 return new EVP_BlockCipher(EVP, NAME, MIN, MAX, MOD); 198 #if !defined(OPENSSL_NO_AES) 208 #if !defined(OPENSSL_NO_DES) 213 #if !defined(OPENSSL_NO_BF) 217 #if !defined(OPENSSL_NO_CAST) 221 #if !defined(OPENSSL_NO_CAMELLIA) 227 #if !defined(OPENSSL_NO_RC2) 231 #if !defined(OPENSSL_NO_RC5) && 0 234 return new EVP_BlockCipher(EVP_rc5_32_12_16_ecb(),
235 "RC5(12)", 1, 32, 1);
238 #if !defined(OPENSSL_NO_IDEA) && 0 242 #if !defined(OPENSSL_NO_SEED) 246 #undef HANDLE_EVP_CIPHER 247 #undef HANDLE_EVP_CIPHER_KEYLEN
#define HANDLE_EVP_CIPHER_KEYLEN(NAME, EVP, MIN, MAX, MOD)
size_t maximum_keylength() const
size_t arg_as_integer(size_t i, size_t def_value) const
std::invalid_argument Invalid_Argument
#define HANDLE_EVP_CIPHER(NAME, EVP)
size_t keylength_multiple() const
BlockCipher * find_block_cipher(const SCAN_Name &, Algorithm_Factory &) const
size_t minimum_keylength() const
std::string algo_name() const