--- src/engine/openssl/ossl_bc.cpp.orig 2017-10-02 06:00:00 UTC +++ src/engine/openssl/ossl_bc.cpp @@ -8,10 +8,6 @@ #include #include -#if OPENSSL_VERSION_NUMBER >= 0x10100000 - #error "OpenSSL 1.1 API not supported in Botan 1.10, upgrade to 2.x" -#endif - namespace Botan { namespace { @@ -44,7 +40,7 @@ class EVP_BlockCipher : public BlockCipher size_t block_sz; Key_Length_Specification cipher_key_spec; std::string cipher_name; - mutable EVP_CIPHER_CTX encrypt, decrypt; + mutable EVP_CIPHER_CTX *encrypt, *decrypt; }; /* @@ -59,14 +55,15 @@ EVP_BlockCipher::EVP_BlockCipher(const EVP_CIPHER* alg if(EVP_CIPHER_mode(algo) != EVP_CIPH_ECB_MODE) throw Invalid_Argument("EVP_BlockCipher: Non-ECB EVP was passed in"); - EVP_CIPHER_CTX_init(&encrypt); - EVP_CIPHER_CTX_init(&decrypt); + if ((encrypt = EVP_CIPHER_CTX_new()) == NULL) + throw Invalid_Argument("EVP_BlockCipher: EVP_CIPHER_CTX_new failed"); + EVP_EncryptInit_ex(encrypt, algo, 0, 0, 0); + EVP_CIPHER_CTX_set_padding(encrypt, 0); - EVP_EncryptInit_ex(&encrypt, algo, 0, 0, 0); - EVP_DecryptInit_ex(&decrypt, algo, 0, 0, 0); - - EVP_CIPHER_CTX_set_padding(&encrypt, 0); - EVP_CIPHER_CTX_set_padding(&decrypt, 0); + if ((decrypt = EVP_CIPHER_CTX_new()) == NULL) + throw Invalid_Argument("EVP_BlockCipher: EVP_CIPHER_CTX_new failed"); + EVP_DecryptInit_ex(decrypt, algo, 0, 0, 0); + EVP_CIPHER_CTX_set_padding(decrypt, 0); } /* @@ -83,14 +80,15 @@ EVP_BlockCipher::EVP_BlockCipher(const EVP_CIPHER* alg if(EVP_CIPHER_mode(algo) != EVP_CIPH_ECB_MODE) throw Invalid_Argument("EVP_BlockCipher: Non-ECB EVP was passed in"); - EVP_CIPHER_CTX_init(&encrypt); - EVP_CIPHER_CTX_init(&decrypt); + if ((encrypt = EVP_CIPHER_CTX_new()) == NULL) + throw Invalid_Argument("EVP_BlockCipher: EVP_CIPHER_CTX_new failed"); + EVP_EncryptInit_ex(encrypt, algo, 0, 0, 0); + EVP_CIPHER_CTX_set_padding(encrypt, 0); - EVP_EncryptInit_ex(&encrypt, algo, 0, 0, 0); - EVP_DecryptInit_ex(&decrypt, algo, 0, 0, 0); - - EVP_CIPHER_CTX_set_padding(&encrypt, 0); - EVP_CIPHER_CTX_set_padding(&decrypt, 0); + if ((decrypt = EVP_CIPHER_CTX_new()) == NULL) + throw Invalid_Argument("EVP_BlockCipher: EVP_CIPHER_CTX_new failed"); + EVP_DecryptInit_ex(decrypt, algo, 0, 0, 0); + EVP_CIPHER_CTX_set_padding(decrypt, 0); } /* @@ -98,8 +96,8 @@ EVP_BlockCipher::EVP_BlockCipher(const EVP_CIPHER* alg */ EVP_BlockCipher::~EVP_BlockCipher() { - EVP_CIPHER_CTX_cleanup(&encrypt); - EVP_CIPHER_CTX_cleanup(&decrypt); + EVP_CIPHER_CTX_cleanup(encrypt); + EVP_CIPHER_CTX_cleanup(decrypt); } /* @@ -109,7 +107,7 @@ void EVP_BlockCipher::encrypt_n(const byte in[], byte size_t blocks) const { int out_len = 0; - EVP_EncryptUpdate(&encrypt, out, &out_len, in, blocks * block_sz); + EVP_EncryptUpdate(encrypt, out, &out_len, in, blocks * block_sz); } /* @@ -119,7 +117,7 @@ void EVP_BlockCipher::decrypt_n(const byte in[], byte size_t blocks) const { int out_len = 0; - EVP_DecryptUpdate(&decrypt, out, &out_len, in, blocks * block_sz); + EVP_DecryptUpdate(decrypt, out, &out_len, in, blocks * block_sz); } /* @@ -134,19 +132,19 @@ void EVP_BlockCipher::key_schedule(const byte key[], s full_key += std::make_pair(key, 8); } else - if(EVP_CIPHER_CTX_set_key_length(&encrypt, length) == 0 || - EVP_CIPHER_CTX_set_key_length(&decrypt, length) == 0) + if(EVP_CIPHER_CTX_set_key_length(encrypt, length) == 0 || + EVP_CIPHER_CTX_set_key_length(decrypt, length) == 0) throw Invalid_Argument("EVP_BlockCipher: Bad key length for " + cipher_name); if(cipher_name == "RC2") { - EVP_CIPHER_CTX_ctrl(&encrypt, EVP_CTRL_SET_RC2_KEY_BITS, length*8, 0); - EVP_CIPHER_CTX_ctrl(&decrypt, EVP_CTRL_SET_RC2_KEY_BITS, length*8, 0); + EVP_CIPHER_CTX_ctrl(encrypt, EVP_CTRL_SET_RC2_KEY_BITS, length*8, 0); + EVP_CIPHER_CTX_ctrl(decrypt, EVP_CTRL_SET_RC2_KEY_BITS, length*8, 0); } - EVP_EncryptInit_ex(&encrypt, 0, 0, full_key.begin(), 0); - EVP_DecryptInit_ex(&decrypt, 0, 0, full_key.begin(), 0); + EVP_EncryptInit_ex(encrypt, 0, 0, full_key.begin(), 0); + EVP_DecryptInit_ex(decrypt, 0, 0, full_key.begin(), 0); } /* @@ -154,7 +152,7 @@ void EVP_BlockCipher::key_schedule(const byte key[], s */ BlockCipher* EVP_BlockCipher::clone() const { - return new EVP_BlockCipher(EVP_CIPHER_CTX_cipher(&encrypt), + return new EVP_BlockCipher(EVP_CIPHER_CTX_cipher(encrypt), cipher_name, cipher_key_spec.minimum_keylength(), cipher_key_spec.maximum_keylength(), @@ -166,16 +164,16 @@ BlockCipher* EVP_BlockCipher::clone() const */ void EVP_BlockCipher::clear() { - const EVP_CIPHER* algo = EVP_CIPHER_CTX_cipher(&encrypt); + const EVP_CIPHER* algo = EVP_CIPHER_CTX_cipher(encrypt); - EVP_CIPHER_CTX_cleanup(&encrypt); - EVP_CIPHER_CTX_cleanup(&decrypt); - EVP_CIPHER_CTX_init(&encrypt); - EVP_CIPHER_CTX_init(&decrypt); - EVP_EncryptInit_ex(&encrypt, algo, 0, 0, 0); - EVP_DecryptInit_ex(&decrypt, algo, 0, 0, 0); - EVP_CIPHER_CTX_set_padding(&encrypt, 0); - EVP_CIPHER_CTX_set_padding(&decrypt, 0); + EVP_CIPHER_CTX_cleanup(encrypt); + EVP_CIPHER_CTX_cleanup(decrypt); + EVP_CIPHER_CTX_init(encrypt); + EVP_CIPHER_CTX_init(decrypt); + EVP_EncryptInit_ex(encrypt, algo, 0, 0, 0); + EVP_DecryptInit_ex(decrypt, algo, 0, 0, 0); + EVP_CIPHER_CTX_set_padding(encrypt, 0); + EVP_CIPHER_CTX_set_padding(decrypt, 0); } } --- src/engine/openssl/ossl_md.cpp.orig 2017-10-02 06:00:00 UTC +++ src/engine/openssl/ossl_md.cpp @@ -8,10 +8,6 @@ #include #include -#if OPENSSL_VERSION_NUMBER >= 0x10100000 - #error "OpenSSL 1.1 API not supported in Botan 1.10, upgrade to 2.x" -#endif - namespace Botan { namespace { @@ -28,12 +24,12 @@ class EVP_HashFunction : public HashFunction size_t output_length() const { - return EVP_MD_size(EVP_MD_CTX_md(&md)); + return EVP_MD_size(EVP_MD_CTX_md(md)); } size_t hash_block_size() const { - return EVP_MD_block_size(EVP_MD_CTX_md(&md)); + return EVP_MD_block_size(EVP_MD_CTX_md(md)); } EVP_HashFunction(const EVP_MD*, const std::string&); @@ -44,7 +40,7 @@ class EVP_HashFunction : public HashFunction size_t block_size; std::string algo_name; - EVP_MD_CTX md; + EVP_MD_CTX *md; }; /* @@ -52,7 +48,7 @@ class EVP_HashFunction : public HashFunction */ void EVP_HashFunction::add_data(const byte input[], size_t length) { - EVP_DigestUpdate(&md, input, length); + EVP_DigestUpdate(md, input, length); } /* @@ -60,9 +56,9 @@ void EVP_HashFunction::add_data(const byte input[], si */ void EVP_HashFunction::final_result(byte output[]) { - EVP_DigestFinal_ex(&md, output, 0); - const EVP_MD* algo = EVP_MD_CTX_md(&md); - EVP_DigestInit_ex(&md, algo, 0); + EVP_DigestFinal_ex(md, output, 0); + const EVP_MD* algo = EVP_MD_CTX_md(md); + EVP_DigestInit_ex(md, algo, 0); } /* @@ -70,8 +66,8 @@ void EVP_HashFunction::final_result(byte output[]) */ void EVP_HashFunction::clear() { - const EVP_MD* algo = EVP_MD_CTX_md(&md); - EVP_DigestInit_ex(&md, algo, 0); + const EVP_MD* algo = EVP_MD_CTX_md(md); + EVP_DigestInit_ex(md, algo, 0); } /* @@ -79,7 +75,7 @@ void EVP_HashFunction::clear() */ HashFunction* EVP_HashFunction::clone() const { - const EVP_MD* algo = EVP_MD_CTX_md(&md); + const EVP_MD* algo = EVP_MD_CTX_md(md); return new EVP_HashFunction(algo, name()); } @@ -90,8 +86,9 @@ EVP_HashFunction::EVP_HashFunction(const EVP_MD* algo, const std::string& name) : algo_name(name) { - EVP_MD_CTX_init(&md); - EVP_DigestInit_ex(&md, algo, 0); + if ((md = EVP_MD_CTX_new()) == NULL) + throw Invalid_Argument("EVP_HashFunction: EVP_MD_CTX_new failed"); + EVP_DigestInit_ex(md, algo, 0); } /* @@ -99,7 +96,11 @@ EVP_HashFunction::EVP_HashFunction(const EVP_MD* algo, */ EVP_HashFunction::~EVP_HashFunction() { - EVP_MD_CTX_cleanup(&md); +#if OPENSSL_VERSION_NUMBER >= 0x10100000 + EVP_MD_CTX_free(md); +#else + EVP_MD_CTX_cleanup(md); +#endif } }