/*############################################################################ # 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 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 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 expected_str; std::vector 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::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