#include "asio/boost_simulation.hpp"

void SetOptionsNoOldTls(boost::asio::ssl::context& ctx)
{
	ctx.set_options(boost::asio::ssl::context::no_tlsv1);
	ctx.set_options(boost::asio::ssl::context::no_tlsv1_1);
}

void TestProperConfiguration_inter_CorrectUsage01()
{
	boost::asio::ssl::context ctx(boost::asio::ssl::context::tls_client); // GOOD
	SetOptionsNoOldTls(ctx);
}

void TestProperConfiguration_inter_CorrectUsage02()
{
	boost::asio::ssl::context ctx(boost::asio::ssl::context::sslv23); // GOOD
	ctx.set_options(boost::asio::ssl::context::no_tlsv1 |
		boost::asio::ssl::context::no_tlsv1_1 |
		boost::asio::ssl::context::no_sslv3);
}

void TestProperConfiguration_inter_IncorrectUsage01()
{
	boost::asio::ssl::context ctx(boost::asio::ssl::context::sslv23);	// $ Alert[cpp/boost/tls-settings-misconfiguration] // BAD - missing disable SSLv3
	SetOptionsNoOldTls(ctx);
}

void TestProperConfiguration_IncorrectUsage01()
{
	boost::asio::ssl::context ctx(boost::asio::ssl::context::sslv23);	// $ Alert[cpp/boost/tls-settings-misconfiguration] // BAD
}

void TestProperConfiguration_IncorrectUsage02()
{
	boost::asio::ssl::context ctx(boost::asio::ssl::context::tls);	// $ Alert[cpp/boost/tls-settings-misconfiguration] // BAD
}

void TestProperConfiguration_IncorrectUsage03()
{
	boost::asio::ssl::context ctx(boost::asio::ssl::context::tls);	// $ Alert[cpp/boost/tls-settings-misconfiguration] // BAD
	SetOptionsNoOldTls(ctx);
	ctx.set_options(boost::asio::ssl::context::no_tlsv1 |
		boost::asio::ssl::context::no_tlsv1_2 );			// BUG - disabling TLS 1.2
}

void TestHardcodedProtocols()
{
	//////////////////////// Banned Hardcoded algorithms
	boost::asio::ssl::context cxt_sslv2(boost::asio::ssl::context::sslv2);			// $ Alert[cpp/boost/use-of-deprecated-hardcoded-security-protocol] // BUG
	boost::asio::ssl::context cxt_sslv2c(boost::asio::ssl::context::sslv2_client);	// $ Alert[cpp/boost/use-of-deprecated-hardcoded-security-protocol] // BUG
	boost::asio::ssl::context cxt_sslv2s(boost::asio::ssl::context::sslv2_server);	// $ Alert[cpp/boost/use-of-deprecated-hardcoded-security-protocol] // BUG

	boost::asio::ssl::context cxt_sslv3(boost::asio::ssl::context::sslv3);			// $ Alert[cpp/boost/use-of-deprecated-hardcoded-security-protocol] // BUG
	boost::asio::ssl::context cxt_sslv3c(boost::asio::ssl::context::sslv3_client);	// $ Alert[cpp/boost/use-of-deprecated-hardcoded-security-protocol] // BUG
	boost::asio::ssl::context cxt_sslv3s(boost::asio::ssl::context::sslv3_server);	// $ Alert[cpp/boost/use-of-deprecated-hardcoded-security-protocol] // BUG

	boost::asio::ssl::context cxt_tlsv1(boost::asio::ssl::context::tlsv1);			// $ Alert[cpp/boost/use-of-deprecated-hardcoded-security-protocol] // BUG
	boost::asio::ssl::context cxt_tlsv1c(boost::asio::ssl::context::tlsv1_client);	// $ Alert[cpp/boost/use-of-deprecated-hardcoded-security-protocol] // BUG
	boost::asio::ssl::context cxt_tlsv1s(boost::asio::ssl::context::tlsv1_server);	// $ Alert[cpp/boost/use-of-deprecated-hardcoded-security-protocol] // BUG

	boost::asio::ssl::context cxt_tlsv11(boost::asio::ssl::context::tlsv11);			// $ Alert[cpp/boost/use-of-deprecated-hardcoded-security-protocol] // BUG
	boost::asio::ssl::context cxt_tlsv11c(boost::asio::ssl::context::tlsv11_client);	// $ Alert[cpp/boost/use-of-deprecated-hardcoded-security-protocol] // BUG
	boost::asio::ssl::context cxt_tlsv11s(boost::asio::ssl::context::tlsv11_server);	// $ Alert[cpp/boost/use-of-deprecated-hardcoded-security-protocol] // BUG

	////////////////////// Hardcoded algorithms

	boost::asio::ssl::context cxt_tlsv12(boost::asio::ssl::context::tlsv12);
	boost::asio::ssl::context cxt_tlsv12c(boost::asio::ssl::context::tlsv12_client);
	boost::asio::ssl::context cxt_tlsv12s(boost::asio::ssl::context::tlsv12_server);

	boost::asio::ssl::context cxt_tlsv13(boost::asio::ssl::context::tlsv13);
	boost::asio::ssl::context cxt_tlsv13c(boost::asio::ssl::context::tlsv13_client);
	boost::asio::ssl::context cxt_tlsv13s(boost::asio::ssl::context::tlsv13_server);
}

void InterProceduralTest(boost::asio::ssl::context::method m)
{
	boost::asio::ssl::context cxt1(m);		// $ Alert[cpp/boost/use-of-deprecated-hardcoded-security-protocol] // BUG - Multiple hits (sink)
}

void TestHardcodedProtocols_inter()
{
	//////////////////////// Banned Hardcoded algorithms
	InterProceduralTest(boost::asio::ssl::context::sslv2);			// BUG
	InterProceduralTest(boost::asio::ssl::context::sslv2_client);	// BUG
	InterProceduralTest(boost::asio::ssl::context::sslv2_server);	// BUG

	InterProceduralTest(boost::asio::ssl::context::sslv3);			// BUG
	InterProceduralTest(boost::asio::ssl::context::sslv3_client);	// BUG
	InterProceduralTest(boost::asio::ssl::context::sslv3_server);	// BUG

	InterProceduralTest(boost::asio::ssl::context::tlsv1);			// BUG
	InterProceduralTest(boost::asio::ssl::context::tlsv1_client);	// BUG
	InterProceduralTest(boost::asio::ssl::context::tlsv1_server);	// BUG

	InterProceduralTest(boost::asio::ssl::context::tlsv11);			// BUG
	InterProceduralTest(boost::asio::ssl::context::tlsv11_client);	// BUG
	InterProceduralTest(boost::asio::ssl::context::tlsv11_server);	// BUG

	////////////////////// Hardcoded algorithms

	InterProceduralTest(boost::asio::ssl::context::tlsv12);
	InterProceduralTest(boost::asio::ssl::context::tlsv12_client);
	InterProceduralTest(boost::asio::ssl::context::tlsv12_server);

	InterProceduralTest(boost::asio::ssl::context::tlsv13);
	InterProceduralTest(boost::asio::ssl::context::tlsv13_client);
	InterProceduralTest(boost::asio::ssl::context::tlsv13_server);
}
