| /*############################################################################ |
| # 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 |