blob: 5de5c1756fcc8dbe767220bdb0749b6385e0c495 [file] [log] [blame]
/*############################################################################
# Copyright 2016-2017 Intel Corporation
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
############################################################################*/
/*!
* \file
* \brief BigNum unit tests.
*/
#include "epid/common-testhelper/epid_gtest-testhelper.h"
#include "gtest/gtest.h"
#include "epid/common-testhelper/bignum_wrapper-testhelper.h"
#include "epid/common-testhelper/errors-testhelper.h"
extern "C" {
#include "epid/common/math/bignum.h"
}
namespace {
// Use Test Fixture for SetUp and TearDown
class BigNumTest : public ::testing::Test {
public:
static const BigNumStr str_0;
static const BigNumStr str_1;
static const BigNumStr str_2;
static const BigNumStr str_big;
static const BigNumStr str_2big;
static const BigNumStr str_large_m1;
static const BigNumStr str_large;
static const BigNumStr str_large_p1;
static const BigNumStr str_32byte_high_bit_set;
static const BigNumStr str_32byte_high;
static const std::vector<unsigned char> vec_33byte_low;
virtual void SetUp() {}
virtual void TearDown() {}
::testing::AssertionResult CompareBigNumStr(const BigNumStr* expected,
const BigNumStr* actual);
::testing::AssertionResult CompareBigNum(const BigNum* expected,
const BigNum* actual);
};
const BigNumStr BigNumTest::str_0{
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
const BigNumStr BigNumTest::str_1{
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01};
const BigNumStr BigNumTest::str_2{
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02};
const BigNumStr BigNumTest::str_big{
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
const BigNumStr BigNumTest::str_2big{
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
const BigNumStr BigNumTest::str_large_m1{
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xF0, 0xCD, 0x46, 0xE5, 0xF2,
0x5E, 0xEE, 0x71, 0xA4, 0x9E, 0x0C, 0xDC, 0x65, 0xFB, 0x12, 0x99,
0x92, 0x1A, 0xF6, 0x2D, 0x53, 0x6C, 0xD1, 0x0B, 0x50, 0x0C};
/// Intel(R) EPID 2.0 parameter p
const BigNumStr BigNumTest::str_large{
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xF0, 0xCD, 0x46, 0xE5, 0xF2,
0x5E, 0xEE, 0x71, 0xA4, 0x9E, 0x0C, 0xDC, 0x65, 0xFB, 0x12, 0x99,
0x92, 0x1A, 0xF6, 0x2D, 0x53, 0x6C, 0xD1, 0x0B, 0x50, 0x0D};
const BigNumStr BigNumTest::str_large_p1{
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xF0, 0xCD, 0x46, 0xE5, 0xF2,
0x5E, 0xEE, 0x71, 0xA4, 0x9E, 0x0C, 0xDC, 0x65, 0xFB, 0x12, 0x99,
0x92, 0x1A, 0xF6, 0x2D, 0x53, 0x6C, 0xD1, 0x0B, 0x50, 0x0E};
const BigNumStr BigNumTest::str_32byte_high{
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};
const BigNumStr BigNumTest::str_32byte_high_bit_set{
0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
const std::vector<unsigned char> BigNumTest::vec_33byte_low{
0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
::testing::AssertionResult BigNumTest::CompareBigNumStr(
const BigNumStr* expected, const BigNumStr* actual) {
int size = sizeof(BigNumStr);
unsigned char* expected_str = (unsigned char*)expected;
unsigned char* actual_str = (unsigned char*)actual;
for (int i = 0; i < size; ++i) {
if (expected_str[i] != actual_str[i]) {
return ::testing::AssertionFailure()
<< "Mismatch at " << i << " : Expected " << std::hex
<< expected_str[i] << " Found " << std::hex << actual_str[i];
}
}
return ::testing::AssertionSuccess();
}
::testing::AssertionResult BigNumTest::CompareBigNum(const BigNum* expected_bn,
const BigNum* actual_bn) {
size_t size = 0;
std::vector<unsigned char> expected_str;
std::vector<unsigned char> actual_str;
// Use an extra huge size so we have plenty of room to check
// overflow tests. This assumes no tests try to create a number
// bigger than 64 bytes.
size = sizeof(BigNumStr) * 2;
expected_str.resize(size, 0);
actual_str.resize(size, 0);
THROW_ON_EPIDERR(WriteBigNum(expected_bn, size, &expected_str[0]));
THROW_ON_EPIDERR(WriteBigNum(actual_bn, size, &actual_str[0]));
for (size_t i = 0; i < size; ++i) {
if (expected_str[i] != actual_str[i]) {
return ::testing::AssertionFailure() << "Numbers do not match";
}
}
return ::testing::AssertionSuccess();
}
///////////////////////////////////////////////////////////////////////
// Create / Destroy
TEST_F(BigNumTest, NewCanCreate256BitBigNum) {
BigNum* bn = nullptr;
EXPECT_EQ(kEpidNoErr, NewBigNum(32, &bn));
DeleteBigNum(&bn);
}
TEST_F(BigNumTest, NewFailsGivenNullPointer) {
EXPECT_EQ(kEpidBadArgErr, NewBigNum(sizeof(BigNumStr), NULL));
}
TEST_F(BigNumTest, NewFailsGivenSizeZero) {
BigNum* bn = nullptr;
EXPECT_EQ(kEpidBadArgErr, NewBigNum(0, &bn));
DeleteBigNum(&bn);
}
TEST_F(BigNumTest, DeleteBigNumNullsPointer) {
BigNum* bn = nullptr;
THROW_ON_EPIDERR(NewBigNum(sizeof(BigNumStr), &bn));
DeleteBigNum(&bn);
EXPECT_EQ(nullptr, bn);
}
TEST_F(BigNumTest, DeleteWorksGivenNullPointer) {
BigNum* bn = nullptr;
DeleteBigNum(nullptr);
EXPECT_EQ(nullptr, bn);
}
///////////////////////////////////////////////////////////////////////
// Serialization
TEST_F(BigNumTest, ReadFailsGivenNullPtr) {
BigNum* bn = nullptr;
THROW_ON_EPIDERR(NewBigNum(sizeof(BigNumStr), &bn));
EXPECT_EQ(kEpidBadArgErr, ReadBigNum(NULL, sizeof(BigNumStr), bn));
EXPECT_EQ(kEpidBadArgErr,
ReadBigNum(&this->str_large, sizeof(BigNumStr), NULL));
DeleteBigNum(&bn);
}
TEST_F(BigNumTest, ReadFailsGivenInvalidBufferSize) {
BigNumObj bn(32);
EXPECT_EQ(kEpidBadArgErr, ReadBigNum(&this->str_0, 0, bn));
EXPECT_EQ(kEpidBadArgErr,
ReadBigNum(&this->str_0, std::numeric_limits<size_t>::max(), bn));
#if (SIZE_MAX >= 0x100000001) // When size_t value allowed to be 0x100000001
EXPECT_EQ(kEpidBadArgErr, ReadBigNum(&this->str_0, 0x100000001, bn));
#endif
}
TEST_F(BigNumTest, ReadFailsGivenTooBigBuffer) {
BigNum* bn = nullptr;
THROW_ON_EPIDERR(NewBigNum(sizeof(BigNumStr), &bn));
EXPECT_NE(kEpidNoErr, ReadBigNum(&this->vec_33byte_low[0],
this->vec_33byte_low.size(), bn));
DeleteBigNum(&bn);
}
TEST_F(BigNumTest, WriteFailsGivenNullPtr) {
BigNum* bn = nullptr;
BigNumStr str = {0};
THROW_ON_EPIDERR(NewBigNum(sizeof(BigNumStr), &bn));
EXPECT_EQ(kEpidBadArgErr, WriteBigNum(NULL, sizeof(str), &str));
EXPECT_EQ(kEpidBadArgErr, WriteBigNum(bn, 0, NULL));
DeleteBigNum(&bn);
}
TEST_F(BigNumTest, WriteFailsGivenTooSmallBuffer) {
BigNumStr str;
BigNumObj bn(this->vec_33byte_low);
EXPECT_NE(kEpidNoErr, WriteBigNum(bn, sizeof(str), &str));
}
TEST_F(BigNumTest, ReadCanDeSerializeBigNumStrZero) {
BigNumObj bn_ref;
BigNumObj bn;
EXPECT_EQ(kEpidNoErr, ReadBigNum(&this->str_0, sizeof(this->str_0), bn));
// No way to check this yet
}
TEST_F(BigNumTest, ReadCanDeSerializeBigNum) {
BigNumObj bn;
EXPECT_EQ(kEpidNoErr,
ReadBigNum(&this->str_large, sizeof(this->str_large), bn));
// No way to check this yet
}
TEST_F(BigNumTest, WriteCanSerializeBigNumZero) {
BigNumObj bn; // defaults to 0
BigNumStr str;
EXPECT_EQ(kEpidNoErr, WriteBigNum(bn, sizeof(str), &str));
EXPECT_TRUE(CompareBigNumStr(&str, &this->str_0));
}
TEST_F(BigNumTest, DeSerializeFollowedBySerializeHasSameValue) {
BigNumStr str;
BigNumObj bn;
EXPECT_EQ(kEpidNoErr,
ReadBigNum(&this->str_large, sizeof(this->str_large), bn));
EXPECT_EQ(kEpidNoErr, WriteBigNum(bn, sizeof(str), &str));
EXPECT_TRUE(CompareBigNumStr(&this->str_large, &str));
}
///////////////////////////////////////////////////////////////////////
// Addition
TEST_F(BigNumTest, AddBadArgumentsFail) {
BigNumObj bn;
EXPECT_NE(kEpidNoErr, BigNumAdd(nullptr, nullptr, nullptr));
EXPECT_NE(kEpidNoErr, BigNumAdd(bn, nullptr, nullptr));
EXPECT_NE(kEpidNoErr, BigNumAdd(nullptr, bn, nullptr));
EXPECT_NE(kEpidNoErr, BigNumAdd(nullptr, nullptr, bn));
EXPECT_NE(kEpidNoErr, BigNumAdd(bn, bn, nullptr));
EXPECT_NE(kEpidNoErr, BigNumAdd(nullptr, bn, bn));
EXPECT_NE(kEpidNoErr, BigNumAdd(bn, nullptr, bn));
}
TEST_F(BigNumTest, AddZeroIsIdentity) {
BigNumObj bn;
BigNumObj bn_0(this->str_0);
BigNumObj bn_large(this->str_large);
EXPECT_EQ(kEpidNoErr, BigNumAdd(bn_large, bn_0, bn));
EXPECT_TRUE(CompareBigNum(bn, bn_large));
}
TEST_F(BigNumTest, AddOneIncrements) {
BigNumObj bn;
BigNumObj bn_1(this->str_1);
BigNumObj bn_large(this->str_large);
BigNumObj bn_large_p1(this->str_large_p1);
EXPECT_EQ(kEpidNoErr, BigNumAdd(bn_large, bn_1, bn));
EXPECT_TRUE(CompareBigNum(bn, bn_large_p1));
}
TEST_F(BigNumTest, AddOneTo32ByteInTo32BytesFails) {
BigNumObj bn(32);
BigNumObj bn_1(this->str_1);
BigNumObj bn_32high(this->str_32byte_high);
EXPECT_NE(kEpidNoErr, BigNumAdd(bn_32high, bn_1, bn));
}
TEST_F(BigNumTest, AddOneTo32ByteInTo33BytesIncrements) {
BigNumObj bn(33);
BigNumObj bn_1(this->str_1);
BigNumObj bn_32high(this->str_32byte_high);
BigNumObj bn_33low(this->vec_33byte_low);
EXPECT_EQ(kEpidNoErr, BigNumAdd(bn_32high, bn_1, bn));
EXPECT_TRUE(CompareBigNum(bn, bn_33low));
}
///////////////////////////////////////////////////////////////////////
// Subtraction
TEST_F(BigNumTest, SubBadArgumentsFail) {
BigNumObj bn;
EXPECT_NE(kEpidNoErr, BigNumSub(nullptr, nullptr, nullptr));
EXPECT_NE(kEpidNoErr, BigNumSub(bn, nullptr, nullptr));
EXPECT_NE(kEpidNoErr, BigNumSub(nullptr, bn, nullptr));
EXPECT_NE(kEpidNoErr, BigNumSub(nullptr, nullptr, bn));
EXPECT_NE(kEpidNoErr, BigNumSub(bn, bn, nullptr));
EXPECT_NE(kEpidNoErr, BigNumSub(nullptr, bn, bn));
EXPECT_NE(kEpidNoErr, BigNumSub(bn, nullptr, bn));
}
TEST_F(BigNumTest, SubOneFromZeroFails) {
BigNumObj bn;
BigNumObj bn_0(this->str_0);
BigNumObj bn_1(this->str_1);
EXPECT_EQ(kEpidUnderflowErr, BigNumSub(bn_0, bn_1, bn));
}
TEST_F(BigNumTest, SubZeroIsIdentity) {
BigNumObj bn;
BigNumObj bn_0(this->str_0);
BigNumObj bn_large(this->str_large);
EXPECT_EQ(kEpidNoErr, BigNumSub(bn_large, bn_0, bn));
EXPECT_TRUE(CompareBigNum(bn, bn_large));
}
TEST_F(BigNumTest, SubOneDecrements) {
BigNumObj bn;
BigNumObj bn_1(this->str_1);
BigNumObj bn_large(this->str_large);
BigNumObj bn_large_m1(this->str_large_m1);
EXPECT_EQ(kEpidNoErr, BigNumSub(bn_large, bn_1, bn));
EXPECT_TRUE(CompareBigNum(bn, bn_large_m1));
}
///////////////////////////////////////////////////////////////////////
// Multiplication
TEST_F(BigNumTest, MulBadArgumentsFail) {
BigNumObj bn;
EXPECT_NE(kEpidNoErr, BigNumMul(nullptr, nullptr, nullptr));
EXPECT_NE(kEpidNoErr, BigNumMul(bn, nullptr, nullptr));
EXPECT_NE(kEpidNoErr, BigNumMul(nullptr, bn, nullptr));
EXPECT_NE(kEpidNoErr, BigNumMul(nullptr, nullptr, bn));
EXPECT_NE(kEpidNoErr, BigNumMul(bn, bn, nullptr));
EXPECT_NE(kEpidNoErr, BigNumMul(nullptr, bn, bn));
EXPECT_NE(kEpidNoErr, BigNumMul(bn, nullptr, bn));
}
TEST_F(BigNumTest, MulOneIsIdentity) {
BigNumObj bn;
BigNumObj bn_1(this->str_1);
BigNumObj bn_large(this->str_large);
EXPECT_EQ(kEpidNoErr, BigNumMul(bn_large, bn_1, bn));
EXPECT_TRUE(CompareBigNum(bn, bn_large));
}
TEST_F(BigNumTest, MulTwoIsDouble) {
BigNumObj bn;
BigNumObj bn_2(this->str_2);
BigNumObj bn_big(this->str_big);
BigNumObj bn_2big(this->str_2big);
EXPECT_EQ(kEpidNoErr, BigNumMul(bn_big, bn_2, bn));
EXPECT_TRUE(CompareBigNum(bn, bn_2big));
}
TEST_F(BigNumTest, MulZeroIsZero) {
BigNumObj bn;
BigNumObj bn_0(this->str_0);
BigNumObj bn_large(this->str_large);
EXPECT_EQ(kEpidNoErr, BigNumMul(bn_large, bn_0, bn));
EXPECT_TRUE(CompareBigNum(bn, bn_0));
}
TEST_F(BigNumTest, MulReportsErrorGivenOverflow) {
BigNumObj bn(32);
BigNumObj bn_2(this->str_2);
BigNumObj bn_high_bit_set(this->str_32byte_high_bit_set);
EXPECT_EQ(kEpidBadArgErr, BigNumMul(bn_high_bit_set, bn_2, bn));
}
TEST_F(BigNumTest, MulWorksWith264BitValue) {
BigNumObj bn(33);
BigNumObj bn_2(this->str_2);
BigNumObj bn_high_bit_set(this->str_32byte_high_bit_set);
BigNumObj bn_33low(this->vec_33byte_low);
EXPECT_EQ(kEpidNoErr, BigNumMul(bn_high_bit_set, bn_2, bn));
EXPECT_TRUE(CompareBigNum(bn, bn_33low));
}
///////////////////////////////////////////////////////////////////////
// Division
TEST_F(BigNumTest, DivFailsGivenNullPointer) {
BigNumObj a, b, q, r;
EXPECT_EQ(kEpidBadArgErr, BigNumDiv(nullptr, b, q, r));
EXPECT_EQ(kEpidBadArgErr, BigNumDiv(a, nullptr, q, r));
EXPECT_EQ(kEpidBadArgErr, BigNumDiv(a, b, nullptr, r));
EXPECT_EQ(kEpidBadArgErr, BigNumDiv(a, b, q, nullptr));
}
TEST_F(BigNumTest, DivFailsGivenDivByZero) {
BigNumObj a;
BigNumObj zero(this->str_0);
BigNumObj q, r;
EXPECT_EQ(kEpidBadArgErr, BigNumDiv(a, zero, q, r));
}
TEST_F(BigNumTest, DivToOneKeepsOriginal) {
BigNumObj a(this->str_large);
BigNumObj zero(this->str_0);
BigNumObj one(this->str_1);
BigNumObj q, r;
EXPECT_EQ(kEpidNoErr, BigNumDiv(a, one, q, r));
EXPECT_TRUE(CompareBigNum(a, q));
EXPECT_TRUE(CompareBigNum(zero, r));
}
TEST_F(BigNumTest, DivToItselfIsIdentity) {
BigNumObj a(this->str_large);
BigNumObj zero(this->str_0);
BigNumObj one(this->str_1);
BigNumObj q, r;
EXPECT_EQ(kEpidNoErr, BigNumDiv(a, a, q, r));
EXPECT_TRUE(CompareBigNum(one, q));
EXPECT_TRUE(CompareBigNum(zero, r));
}
TEST_F(BigNumTest, DivOneByTwoIsZero) {
BigNumObj zero(this->str_0);
BigNumObj one(this->str_1);
BigNumObj two(this->str_2);
BigNumObj q, r;
EXPECT_EQ(kEpidNoErr, BigNumDiv(one, two, q, r));
EXPECT_TRUE(CompareBigNum(zero, q));
EXPECT_TRUE(CompareBigNum(one, r));
}
///////////////////////////////////////////////////////////////////////
// IsEven
TEST_F(BigNumTest, IsEvenFailsGivenNullPointer) {
BigNumObj zero(this->str_0);
bool r;
EXPECT_EQ(kEpidBadArgErr, BigNumIsEven(nullptr, &r));
EXPECT_EQ(kEpidBadArgErr, BigNumIsEven(zero, nullptr));
}
TEST_F(BigNumTest, IsEvenPassesEvenNumbers) {
BigNumObj zero(this->str_0);
BigNumObj two(this->str_2);
BigNumObj big(this->str_big);
bool r;
EXPECT_EQ(kEpidNoErr, BigNumMul(big, two, big));
EXPECT_EQ(kEpidNoErr, BigNumIsEven(zero, &r));
EXPECT_EQ(kEpidNoErr, BigNumIsEven(two, &r));
EXPECT_EQ(kEpidNoErr, BigNumIsEven(big, &r));
}
TEST_F(BigNumTest, IsEvenFailsOddNumbers) {
BigNumObj zero(this->str_0);
BigNumObj one(this->str_1);
BigNumObj two(this->str_2);
BigNumObj big(this->str_big);
bool r;
EXPECT_EQ(kEpidNoErr, BigNumMul(big, two, big));
EXPECT_EQ(kEpidNoErr, BigNumAdd(big, one, big));
EXPECT_EQ(kEpidNoErr, BigNumIsEven(one, &r));
EXPECT_EQ(kEpidNoErr, BigNumIsEven(big, &r));
}
///////////////////////////////////////////////////////////////////////
// IsZero
TEST_F(BigNumTest, IsZeroFailsGivenNullPointer) {
BigNumObj zero(this->str_0);
bool r;
EXPECT_EQ(kEpidBadArgErr, BigNumIsZero(nullptr, &r));
EXPECT_EQ(kEpidBadArgErr, BigNumIsZero(zero, nullptr));
}
TEST_F(BigNumTest, IsZeroPassesZero) {
BigNumObj zero(this->str_0);
bool r;
EXPECT_EQ(kEpidNoErr, BigNumIsZero(zero, &r));
}
TEST_F(BigNumTest, IsZeroFailsNonZero) {
BigNumObj one(this->str_1);
BigNumObj two(this->str_2);
BigNumObj big(this->str_big);
bool r;
EXPECT_EQ(kEpidNoErr, BigNumIsZero(one, &r));
EXPECT_EQ(kEpidNoErr, BigNumIsZero(two, &r));
EXPECT_EQ(kEpidNoErr, BigNumIsZero(big, &r));
}
///////////////////////////////////////////////////////////////////////
// Pow2N
TEST_F(BigNumTest, Pow2NFailsGivenNullPointer) {
EXPECT_EQ(kEpidBadArgErr, BigNumPow2N(1, nullptr));
}
TEST_F(BigNumTest, Pow2NZeroGivesOne) {
BigNumObj r;
BigNumObj one(this->str_1);
EXPECT_EQ(kEpidNoErr, BigNumPow2N(0, r));
EXPECT_TRUE(CompareBigNum(one, r));
}
TEST_F(BigNumTest, Pow2NOneGivesTwo) {
BigNumObj r;
BigNumObj two(this->str_2);
EXPECT_EQ(kEpidNoErr, BigNumPow2N(1, r));
EXPECT_TRUE(CompareBigNum(two, r));
}
TEST_F(BigNumTest, Pow2NGivesPow2n) {
unsigned int n = 2;
BigNumObj r;
BigNumObj two(this->str_2);
BigNumObj expect;
EXPECT_EQ(kEpidNoErr, BigNumMul(two, two, expect));
for (n = 2; n < 4; n++) {
EXPECT_EQ(kEpidNoErr, BigNumPow2N(n, r));
EXPECT_TRUE(CompareBigNum(expect, r));
EXPECT_EQ(kEpidNoErr, BigNumMul(expect, two, expect));
n++;
}
}
} // namespace