aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/lib/math/bigint/big_rand.cpp8
-rw-r--r--src/lib/math/bigint/bigint.cpp11
-rw-r--r--src/lib/math/bigint/bigint.h10
-rw-r--r--src/tests/catchy/test_bigint.cpp74
4 files changed, 94 insertions, 9 deletions
diff --git a/src/lib/math/bigint/big_rand.cpp b/src/lib/math/bigint/big_rand.cpp
index ab66c6cdd..074c368e0 100644
--- a/src/lib/math/bigint/big_rand.cpp
+++ b/src/lib/math/bigint/big_rand.cpp
@@ -7,6 +7,7 @@
#include <botan/bigint.h>
#include <botan/parsing.h>
+#include <botan/internal/rounding.h>
namespace Botan {
@@ -19,15 +20,18 @@ void BigInt::randomize(RandomNumberGenerator& rng,
set_sign(Positive);
if(bitsize == 0)
+ {
clear();
+ }
else
{
- secure_vector<byte> array = rng.random_vec((bitsize + 7) / 8);
+ secure_vector<byte> array = rng.random_vec(round_up(bitsize, 8) / 8);
if(bitsize % 8)
array[0] &= 0xFF >> (8 - (bitsize % 8));
array[0] |= 0x80 >> ((bitsize % 8) ? (8 - bitsize % 8) : 0);
- binary_decode(array.data(), array.size());
+
+ binary_decode(array);
}
}
diff --git a/src/lib/math/bigint/bigint.cpp b/src/lib/math/bigint/bigint.cpp
index 045117cbd..242a7fe0b 100644
--- a/src/lib/math/bigint/bigint.cpp
+++ b/src/lib/math/bigint/bigint.cpp
@@ -173,6 +173,11 @@ void BigInt::clear_bit(size_t n)
m_reg[which] &= ~mask;
}
+size_t BigInt::bytes() const
+ {
+ return round_up(bits(), 8) / 8;
+ }
+
/*
* Count how many bits are being used
*/
@@ -253,6 +258,12 @@ BigInt BigInt::abs() const
return x;
}
+void BigInt::grow_to(size_t n)
+ {
+ if(n > size())
+ m_reg.resize(round_up(n, 8));
+ }
+
/*
* Encode this number into bytes
*/
diff --git a/src/lib/math/bigint/bigint.h b/src/lib/math/bigint/bigint.h
index 4a37425f5..d866698b3 100644
--- a/src/lib/math/bigint/bigint.h
+++ b/src/lib/math/bigint/bigint.h
@@ -42,7 +42,7 @@ class BOTAN_DLL BigInt
/**
* Create empty BigInt
*/
- BigInt() { m_signedness = Positive; }
+ BigInt() {}
/**
* Create BigInt from 64 bit integer
@@ -400,7 +400,7 @@ class BOTAN_DLL BigInt
* Give byte length of the integer
* @result byte length of the represented integer value
*/
- size_t bytes() const { return (bits() + 7) / 8; }
+ size_t bytes() const;
/**
* Get the bit length of the integer
@@ -427,11 +427,7 @@ class BOTAN_DLL BigInt
* Increase internal register buffer to at least n words
* @param n new size of register
*/
- void grow_to(size_t n)
- {
- if(n > size())
- m_reg.resize(n + (8 - n % 8));
- }
+ void grow_to(size_t n);
/**
* Fill BigInt with a random number with size of bitsize
diff --git a/src/tests/catchy/test_bigint.cpp b/src/tests/catchy/test_bigint.cpp
new file mode 100644
index 000000000..5f4c960cf
--- /dev/null
+++ b/src/tests/catchy/test_bigint.cpp
@@ -0,0 +1,74 @@
+// (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() );
+ }
+ }
+
+#endif