Revert "Add botan 2 support"

This change adds a mandatory dependency on Botan, which is not available at this time within Craft.
As this change was not notified to Sysadmin and because it has left us in a state whereby we are unable to get the Windows CI system back up and running, this is being reverted so it can be brought back online.

Please reintroduce this change once support for having Botan as optional is restored

This reverts commit 47163784d74232e3a844fc42897bffc7eff817b4.
This commit is contained in:
Ben Cooksley 2018-04-12 19:48:32 +12:00
parent 47163784d7
commit 01cbb31770
3 changed files with 67 additions and 46 deletions

View File

@ -131,8 +131,8 @@ if (CMAKE_COMPILER_IS_GNUCXX)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wcast-align")
endif()
set ( CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-long-long -Wundef -Werror-implicit-function-declaration -Wchar-subscripts -Wall -W -Wpointer-arith -Wwrite-strings -Wformat-security -Wmissing-format-attribute -fno-common")
set ( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wnon-virtual-dtor -Wno-long-long -Wundef -Wchar-subscripts -Wall -W -Wpointer-arith -Wwrite-strings -Wformat-security -fno-check-new -fno-common")
set ( CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-long-long -ansi -Wundef -Werror-implicit-function-declaration -Wchar-subscripts -Wall -W -Wpointer-arith -Wwrite-strings -Wformat-security -Wmissing-format-attribute -fno-common")
set ( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wnon-virtual-dtor -Wno-long-long -ansi -Wundef -Wchar-subscripts -Wall -W -Wpointer-arith -Wwrite-strings -Wformat-security -fno-check-new -fno-common")
endif (CMAKE_SYSTEM_NAME MATCHES Linux)
endif (CMAKE_COMPILER_IS_GNUCXX)

View File

@ -11,12 +11,30 @@
# Redistribution and use is allowed according to the terms of the BSD license.
# For details see the accompanying COPYING-CMAKE-SCRIPTS file.
# libgcrypt is moving to pkg-config, but earlier version don't have it
#search in typical paths for libgcrypt-config
FIND_PROGRAM(BOTANCONFIG_EXECUTABLE NAMES botan-config botan-config-1.10)
mark_as_advanced(BOTANCONFIG_EXECUTABLE)
#reset variables
set(BOTAN_LIBRARIES)
set(BOTAN_CFLAGS)
find_package(PkgConfig)
pkg_search_module(BOTAN REQUIRED botan>=1.10 botan-1.10 botan-2)
# if botan-config has been found
IF(BOTANCONFIG_EXECUTABLE)
EXEC_PROGRAM(${BOTANCONFIG_EXECUTABLE} ARGS --libs RETURN_VALUE _return_VALUE OUTPUT_VARIABLE BOTAN_LIBRARIES)
EXEC_PROGRAM(${BOTANCONFIG_EXECUTABLE} ARGS --cflags RETURN_VALUE _return_VALUE OUTPUT_VARIABLE BOTAN_CFLAGS)
IF(BOTAN_LIBRARIES)
SET(BOTAN_FOUND TRUE)
ENDIF(BOTAN_LIBRARIES)
MARK_AS_ADVANCED(BOTAN_CFLAGS BOTAN_LIBRARIES)
ENDIF(BOTANCONFIG_EXECUTABLE)
if (BOTAN_FOUND)
if (NOT Botan_FIND_QUIETLY)

View File

@ -23,18 +23,13 @@
#include <qstringlist.h>
#include <botan/hmac.h>
#include <botan/version.h>
#if BOTAN_VERSION_CODE < BOTAN_VERSION_CODE_FOR(2,0,0)
#include <botan/botan.h>
#include <botan/hmac.h>
#if BOTAN_VERSION_CODE < BOTAN_VERSION_CODE_FOR(1,9,0)
#include <botan/s2k.h>
#endif
#if BOTAN_VERSION_CODE >= BOTAN_VERSION_CODE_FOR(1,8,0)
#include <botan/algo_factory.h>
#else
#include <botan/auto_rng.h>
#include <botan/block_cipher.h>
#include <botan/filters.h>
#include <botan/hash.h>
#include <botan/pbkdf.h>
#include <botan/stream_cipher.h>
#endif
#include <stdlib.h>
@ -56,8 +51,14 @@ public:
QCA::SecureArray nextBytes(int size)
{
QCA::SecureArray buf(size);
#if BOTAN_VERSION_CODE < BOTAN_VERSION_CODE_FOR(1,5,0)
Botan::Global_RNG::randomize( (Botan::byte*)buf.data(), buf.size(), Botan::SessionKey );
#elif BOTAN_VERSION_CODE < BOTAN_VERSION_CODE_FOR(1,7,6)
Botan::Global_RNG::randomize( (Botan::byte*)buf.data(), buf.size() );
#else
Botan::AutoSeeded_RNG rng;
rng.randomize(reinterpret_cast<Botan::byte*>(buf.data()), buf.size());
#endif
return buf;
}
};
@ -69,11 +70,7 @@ class BotanHashContext : public QCA::HashContext
public:
BotanHashContext( const QString &hashName, QCA::Provider *p, const QString &type) : QCA::HashContext(p, type)
{
#if BOTAN_VERSION_CODE < BOTAN_VERSION_CODE_FOR(2,0,0)
m_hashObj = Botan::get_hash(hashName.toStdString());
#else
m_hashObj = Botan::HashFunction::create(hashName.toStdString()).release();
#endif
}
~BotanHashContext()
@ -98,7 +95,11 @@ public:
QCA::MemoryRegion final()
{
#if BOTAN_VERSION_CODE < BOTAN_VERSION_CODE_FOR(1,9,0)
QCA::SecureArray a( m_hashObj->OUTPUT_LENGTH );
#else
QCA::SecureArray a( m_hashObj->output_length() );
#endif
m_hashObj->final( (Botan::byte *)a.data() );
return a;
}
@ -114,10 +115,10 @@ class BotanHMACContext : public QCA::MACContext
public:
BotanHMACContext( const QString &hashName, QCA::Provider *p, const QString &type) : QCA::MACContext(p, type)
{
#if BOTAN_VERSION_CODE < BOTAN_VERSION_CODE_FOR(2,0,0)
m_hashObj = new Botan::HMAC(Botan::global_state().algorithm_factory().make_hash_function(hashName.toStdString()));
#if BOTAN_VERSION_CODE < BOTAN_VERSION_CODE_FOR(1,8,0)
m_hashObj = new Botan::HMAC(hashName.toStdString());
#else
m_hashObj = new Botan::HMAC(Botan::HashFunction::create_or_throw(hashName.toStdString()).release());
m_hashObj = new Botan::HMAC(Botan::global_state().algorithm_factory().make_hash_function(hashName.toStdString()));
#endif
if (0 == m_hashObj) {
std::cout << "null context object" << std::endl;
@ -160,7 +161,11 @@ public:
void final( QCA::MemoryRegion *out)
{
#if BOTAN_VERSION_CODE < BOTAN_VERSION_CODE_FOR(1,9,0)
QCA::SecureArray sa( m_hashObj->OUTPUT_LENGTH, 0 );
#else
QCA::SecureArray sa( m_hashObj->output_length(), 0 );
#endif
m_hashObj->final( (Botan::byte *)sa.data() );
*out = sa;
}
@ -192,8 +197,15 @@ public:
QCA::SymmetricKey makeKey(const QCA::SecureArray &secret, const QCA::InitializationVector &salt,
unsigned int keyLength, unsigned int iterationCount)
{
#if BOTAN_VERSION_CODE < BOTAN_VERSION_CODE_FOR(1,9,0)
m_s2k->set_iterations(iterationCount);
m_s2k->change_salt((const Botan::byte*)salt.data(), salt.size());
std::string secretString(secret.data(), secret.size() );
Botan::OctetString key = m_s2k->derive_key(keyLength, secretString);
#else
std::string secretString(secret.data(), secret.size() );
Botan::OctetString key = m_s2k->derive_key(keyLength, secretString, (const Botan::byte*)salt.data(), salt.size(), iterationCount);
#endif
QCA::SecureArray retval(QByteArray((const char*)key.begin(), key.length()));
return QCA::SymmetricKey(retval);
}
@ -210,6 +222,15 @@ public:
std::string secretString(secret.data(), secret.size() );
*iterationCount = 0;
#if BOTAN_VERSION_CODE < BOTAN_VERSION_CODE_FOR(1,9,0)
m_s2k->set_iterations(1);
m_s2k->change_salt((const Botan::byte*)salt.data(), salt.size());
timer.start();
while (timer.elapsed() < msecInterval) {
key = m_s2k->derive_key(keyLength, secretString);
++(*iterationCount);
}
#else
timer.start();
while (timer.elapsed() < msecInterval) {
key = m_s2k->derive_key(keyLength,
@ -219,6 +240,7 @@ public:
1);
++(*iterationCount);
}
#endif
return makeKey(secret, salt, keyLength, *iterationCount);
}
@ -282,14 +304,7 @@ public:
int blockSize() const
{
#if BOTAN_VERSION_CODE < BOTAN_VERSION_CODE_FOR(2,0,0)
return Botan::block_size_of(m_algoName);
#else
if(const std::unique_ptr<Botan::BlockCipher> bc = Botan::BlockCipher::create(m_algoName))
return bc->block_size();
throw Botan::Algorithm_Not_Found(m_algoName);
#endif
}
QCA::AuthTag tag() const
@ -322,31 +337,23 @@ public:
QCA::KeyLength keyLength() const
{
#if BOTAN_VERSION_CODE < BOTAN_VERSION_CODE_FOR(2,0,0)
#if BOTAN_VERSION_CODE < BOTAN_VERSION_CODE_FOR(1,9,0)
return QCA::KeyLength( Botan::min_keylength_of(m_algoName),
Botan::max_keylength_of(m_algoName),
Botan::keylength_multiple_of(m_algoName) );
#else
Botan::Algorithm_Factory &af = Botan::global_state().algorithm_factory();
#endif
Botan::Key_Length_Specification kls(0);
#if BOTAN_VERSION_CODE < BOTAN_VERSION_CODE_FOR(2,0,0)
if(const Botan::BlockCipher *bc = af.prototype_block_cipher(m_algoName))
#else
if(const std::unique_ptr<Botan::BlockCipher> bc = Botan::BlockCipher::create(m_algoName))
#endif
kls = bc->key_spec();
#if BOTAN_VERSION_CODE < BOTAN_VERSION_CODE_FOR(2,0,0)
else if(const Botan::StreamCipher *sc = af.prototype_stream_cipher(m_algoName))
#else
else if(const std::unique_ptr<Botan::StreamCipher> sc = Botan::StreamCipher::create(m_algoName))
#endif
kls = sc->key_spec();
#if BOTAN_VERSION_CODE < BOTAN_VERSION_CODE_FOR(2,0,0)
else if(const Botan::MessageAuthenticationCode *mac = af.prototype_mac(m_algoName))
#else
else if(const std::unique_ptr<Botan::MessageAuthenticationCode> mac = Botan::MessageAuthenticationCode::create(m_algoName))
#endif
kls = mac->key_spec();
return QCA::KeyLength( kls.minimum_keylength(),
kls.maximum_keylength(),
kls.keylength_multiple() );
#endif
}
@ -372,9 +379,7 @@ class botanProvider : public QCA::Provider
public:
void init()
{
#if BOTAN_VERSION_CODE < BOTAN_VERSION_CODE_FOR(2,0,0)
m_init = new Botan::LibraryInitializer;
#endif
}
~botanProvider()
@ -533,9 +538,7 @@ public:
return 0;
}
private:
#if BOTAN_VERSION_CODE < BOTAN_VERSION_CODE_FOR(2,0,0)
Botan::LibraryInitializer *m_init;
#endif
};