aboutsummaryrefslogtreecommitdiffstats
path: root/src/tests/catchy/test_bigint.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/tests/catchy/test_bigint.cpp')
-rw-r--r--src/tests/catchy/test_bigint.cpp171
1 files changed, 171 insertions, 0 deletions
diff --git a/src/tests/catchy/test_bigint.cpp b/src/tests/catchy/test_bigint.cpp
new file mode 100644
index 000000000..9bd99e919
--- /dev/null
+++ b/src/tests/catchy/test_bigint.cpp
@@ -0,0 +1,171 @@
+// (C) 2015 Simon Warta (Kullo GmbH)
+// Botan is released under the Simplified BSD License (see license.txt)
+
+#include "catch.hpp"
+
+#include <botan/build.h>
+
+#if defined(BOTAN_HAS_BIGINT)
+
+#include <botan/bigint.h>
+
+using namespace Botan;
+
+TEST_CASE("Bigint basics", "[bigint]")
+ {
+ SECTION("in 0-bit border")
+ {
+ BigInt a(0u);
+ CHECK(( a.bits() == 0 ));
+ CHECK(( a.bytes() == 0 ));
+ CHECK(( a.to_u32bit() == 0 ));
+ }
+ SECTION("above 0-bit border")
+ {
+ BigInt a(1u);
+ CHECK(( a.bits() == 1 ));
+ CHECK(( a.bytes() == 1 ));
+ CHECK(( a.to_u32bit() == 1 ));
+ }
+ SECTION("in 8-bit border")
+ {
+ BigInt a(255u);
+ CHECK(( a.bits() == 8 ));
+ CHECK(( a.bytes() == 1 ));
+ CHECK(( a.to_u32bit() == 255 ));
+ }
+ SECTION("above 8-bit border")
+ {
+ BigInt a(256u);
+ CHECK(( a.bits() == 9 ));
+ CHECK(( a.bytes() == 2 ));
+ CHECK(( a.to_u32bit() == 256 ));
+ }
+ SECTION("in 16-bit border")
+ {
+ BigInt a(65535u);
+ CHECK(( a.bits() == 16 ));
+ CHECK(( a.bytes() == 2 ));
+ CHECK(( a.to_u32bit() == 65535 ));
+ }
+ SECTION("above 16-bit border")
+ {
+ BigInt a(65536u);
+ CHECK(( a.bits() == 17 ));
+ CHECK(( a.bytes() == 3 ));
+ CHECK(( a.to_u32bit() == 65536 ));
+ }
+ SECTION("in 32-bit border")
+ {
+ BigInt a(4294967295u);
+ CHECK(( a.bits() == 32 ));
+ CHECK(( a.bytes() == 4 ));
+ CHECK(( a.to_u32bit() == 4294967295u ));
+ }
+ SECTION("above 32-bit border")
+ {
+ BigInt a(4294967296u);
+ CHECK(( a.bits() == 33 ));
+ CHECK(( a.bytes() == 5 ));
+ CHECK_THROWS( a.to_u32bit() );
+ }
+ }
+
+TEST_CASE("Bigint random_integer", "[bigint]")
+ {
+ RandomNumberGenerator *rng = RandomNumberGenerator::make_rng();
+
+ SECTION("min is 0")
+ {
+ // 0–9
+ const size_t MIN = 0;
+ const size_t MAX = 10; // excluded
+ const int ITERATIONS = 10000;
+
+ std::vector<int> counts(MAX, 0);
+ std::vector<double> ratios(MAX, 1.0);
+
+ for (size_t i = 0; i < ITERATIONS; i++)
+ {
+ BigInt b = BigInt::random_integer(*rng, MIN, MAX);
+ size_t x = b.to_u32bit();
+ counts[x]++;
+ }
+
+ std::stringstream debug;
+ for (size_t d = MIN; d < MAX; ++d)
+ {
+ auto ratio = static_cast<double>(counts[d]) / ITERATIONS;
+ ratios[d] = ratio;
+
+ if (!debug.str().empty())
+ {
+ debug << ", ";
+ }
+ debug << d << ": " << std::setprecision(3) << ratio;
+ }
+
+ INFO( debug.str() )
+
+ // Have ~ 10 % on each digit from 0-9
+ CHECK(( 0.09 < ratios[0] )); CHECK(( ratios[0] < 0.11 ));
+ CHECK(( 0.09 < ratios[1] )); CHECK(( ratios[1] < 0.11 ));
+ CHECK(( 0.09 < ratios[2] )); CHECK(( ratios[2] < 0.11 ));
+ CHECK(( 0.09 < ratios[3] )); CHECK(( ratios[3] < 0.11 ));
+ CHECK(( 0.09 < ratios[4] )); CHECK(( ratios[4] < 0.11 ));
+ CHECK(( 0.09 < ratios[5] )); CHECK(( ratios[5] < 0.11 ));
+ CHECK(( 0.09 < ratios[6] )); CHECK(( ratios[6] < 0.11 ));
+ CHECK(( 0.09 < ratios[7] )); CHECK(( ratios[7] < 0.11 ));
+ CHECK(( 0.09 < ratios[8] )); CHECK(( ratios[8] < 0.11 ));
+ CHECK(( 0.09 < ratios[9] )); CHECK(( ratios[9] < 0.11 ));
+ //CHECK( false );
+ }
+
+ SECTION("min is 10")
+ {
+ // 10–19
+ const size_t MIN = 10;
+ const size_t MAX = 20; // excluded
+ const size_t ITERATIONS = 10000;
+
+ std::vector<int> counts(MAX, 0);
+ std::vector<double> ratios(MAX, 1.0);
+
+ for (size_t i = 0; i < ITERATIONS; i++)
+ {
+ BigInt b = BigInt::random_integer(*rng, MIN, MAX);
+ size_t x = b.to_u32bit();
+ counts[x]++;
+ }
+
+ std::stringstream debug;
+ for (size_t d = MIN; d < MAX; ++d)
+ {
+ auto ratio = static_cast<double>(counts[d]) / ITERATIONS;
+ ratios[d] = ratio;
+
+ if (!debug.str().empty())
+ {
+ debug << ", ";
+ }
+ debug << d << ": " << std::setprecision(3) << ratio;
+ }
+
+ INFO( debug.str() )
+
+ // Have ~ 10 % on each digit from 10-19
+ CHECK(( 0.09 < ratios[10] )); CHECK(( ratios[10] < 0.11 ));
+ CHECK(( 0.09 < ratios[11] )); CHECK(( ratios[11] < 0.11 ));
+ CHECK(( 0.09 < ratios[12] )); CHECK(( ratios[12] < 0.11 ));
+ CHECK(( 0.09 < ratios[13] )); CHECK(( ratios[13] < 0.11 ));
+ CHECK(( 0.09 < ratios[14] )); CHECK(( ratios[14] < 0.11 ));
+ CHECK(( 0.09 < ratios[15] )); CHECK(( ratios[15] < 0.11 ));
+ CHECK(( 0.09 < ratios[16] )); CHECK(( ratios[16] < 0.11 ));
+ CHECK(( 0.09 < ratios[17] )); CHECK(( ratios[17] < 0.11 ));
+ CHECK(( 0.09 < ratios[18] )); CHECK(( ratios[18] < 0.11 ));
+ CHECK(( 0.09 < ratios[19] )); CHECK(( ratios[19] < 0.11 ));
+ //CHECK( false );
+ }
+ }
+
+#endif