/*############################################################################ # 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. ############################################################################*/ /// SignBasic unit tests. /*! \file */ #include #include "epid/common-testhelper/epid_gtest-testhelper.h" #include "gtest/gtest.h" extern "C" { #include "epid/member/api.h" #include "epid/member/src/signbasic.h" #include "epid/verifier/api.h" } #include "epid/common-testhelper/errors-testhelper.h" #include "epid/common-testhelper/prng-testhelper.h" #include "epid/common-testhelper/verifier_wrapper-testhelper.h" #include "epid/member/unittests/member-testhelper.h" bool operator==(BigNumStr const& lhs, BigNumStr const& rhs) { return 0 == std::memcmp(&lhs, &rhs, sizeof(lhs)); } namespace { /// Count of elements in array #define COUNT_OF(A) (sizeof(A) / sizeof((A)[0])) ///////////////////////////////////////////////////////////////////////// // Simple error cases TEST_F(EpidMemberTest, SignBasicFailsGivenNullParameters) { Prng my_prng; MemberCtxObj member(this->kGroupPublicKey, this->kMemberPrivateKey, this->kMemberPrecomp, &Prng::Generate, &my_prng); auto& msg = this->kMsg0; auto& bsn = this->kBsn0; BasicSignature basic_sig; EXPECT_EQ(kEpidBadArgErr, EpidSignBasic(nullptr, msg.data(), msg.size(), bsn.data(), bsn.size(), &basic_sig, nullptr)); EXPECT_EQ(kEpidBadArgErr, EpidSignBasic(member, msg.data(), msg.size(), bsn.data(), bsn.size(), nullptr, nullptr)); EXPECT_EQ(kEpidBadArgErr, EpidSignBasic(member, nullptr, msg.size(), bsn.data(), bsn.size(), &basic_sig, nullptr)); EXPECT_EQ(kEpidBadArgErr, EpidSignBasic(member, msg.data(), msg.size(), nullptr, bsn.size(), &basic_sig, nullptr)); } TEST_F(EpidMemberTest, SignBasicFailsGivenNullBasenameAndNullRandomBasename) { Prng my_prng; MemberCtxObj member(this->kGroupPublicKey, this->kMemberPrivateKey, this->kMemberPrecomp, &Prng::Generate, &my_prng); auto& msg = this->kMsg0; BasicSignature basic_sig; EXPECT_EQ(kEpidBadArgErr, EpidSignBasic(member, msg.data(), msg.size(), nullptr, 0, &basic_sig, nullptr)); } TEST_F(EpidMemberTest, SignBasicDoesNotComputeRandomBasenameGivenBasename) { Prng my_prng; MemberCtxObj member(this->kGroupPublicKey, this->kMemberPrivateKey, this->kMemberPrecomp, &Prng::Generate, &my_prng); auto& msg = this->kMsg0; auto& bsn = this->kBsn0; BigNumStr rnd_bsn = {0}; BigNumStr zero = {0}; BasicSignature basic_sig; THROW_ON_EPIDERR(EpidRegisterBasename(member, bsn.data(), bsn.size())); EXPECT_EQ(kEpidNoErr, EpidSignBasic(member, msg.data(), msg.size(), bsn.data(), bsn.size(), &basic_sig, &rnd_bsn)); EXPECT_EQ(zero, rnd_bsn); // verify basic signature VerifierCtxObj ctx(this->kGroupPublicKey); THROW_ON_EPIDERR(EpidVerifierSetBasename(ctx, bsn.data(), bsn.size())); EXPECT_EQ(kEpidSigValid, EpidVerifyBasicSig(ctx, &basic_sig, msg.data(), msg.size())); } TEST_F(EpidMemberTest, SignBasicFailsForBasenameWithoutRegisteredBasenames) { Prng my_prng; MemberCtxObj member(this->kGroupPublicKey, this->kMemberPrivateKey, this->kMemberPrecomp, &Prng::Generate, &my_prng); auto& msg = this->kMsg0; auto& bsn = this->kBsn0; BasicSignature basic_sig; EXPECT_EQ(kEpidBadArgErr, EpidSignBasic(member, msg.data(), msg.size(), bsn.data(), bsn.size(), &basic_sig, nullptr)); } TEST_F(EpidMemberTest, SignBasicFailsForUnregisteredBasename) { Prng my_prng; MemberCtxObj member(this->kGroupPublicKey, this->kMemberPrivateKey, this->kMemberPrecomp, &Prng::Generate, &my_prng); auto& msg = this->kMsg0; auto& bsn0 = this->kBsn0; auto& bsn1 = this->kBsn1; THROW_ON_EPIDERR(EpidRegisterBasename(member, bsn0.data(), bsn0.size())); BasicSignature basic_sig; EXPECT_EQ(kEpidBadArgErr, EpidSignBasic(member, msg.data(), msg.size(), bsn1.data(), bsn1.size(), &basic_sig, nullptr)); } ///////////////////////////////////////////////////////////////////////// // Anonymity TEST_F(EpidMemberTest, BasicSignaturesOfSameMessageAreDifferent) { Prng my_prng; MemberCtxObj member(this->kGroupPublicKey, this->kMemberPrivateKey, this->kMemberPrecomp, &Prng::Generate, &my_prng); auto& msg = this->kMsg0; BasicSignature basic_sig1 = {0}; BasicSignature basic_sig2 = {0}; BigNumStr rnd_bsn = {0}; EXPECT_EQ(kEpidNoErr, EpidSignBasic(member, msg.data(), msg.size(), nullptr, 0, &basic_sig1, &rnd_bsn)); EXPECT_EQ(kEpidNoErr, EpidSignBasic(member, msg.data(), msg.size(), nullptr, 0, &basic_sig2, &rnd_bsn)); EXPECT_NE(0, memcmp(&basic_sig1, &basic_sig2, sizeof(BasicSignature))); } TEST_F(EpidMemberTest, BasicSignaturesOfSameMessageWithSameBasenameAreDifferent) { Prng my_prng; MemberCtxObj member(this->kGroupPublicKey, this->kMemberPrivateKey, this->kMemberPrecomp, &Prng::Generate, &my_prng); auto& msg = this->kMsg0; auto& bsn = this->kBsn0; BasicSignature basic_sig1; BasicSignature basic_sig2; THROW_ON_EPIDERR(EpidRegisterBasename(member, bsn.data(), bsn.size())); EXPECT_EQ(kEpidNoErr, EpidSignBasic(member, msg.data(), msg.size(), bsn.data(), bsn.size(), &basic_sig1, nullptr)); EXPECT_EQ(kEpidNoErr, EpidSignBasic(member, msg.data(), msg.size(), bsn.data(), bsn.size(), &basic_sig2, nullptr)); EXPECT_NE(0, memcmp(&basic_sig1, &basic_sig2, sizeof(BasicSignature))); } ///////////////////////////////////////////////////////////////////////// // Variable basename TEST_F(EpidMemberTest, SignBasicSucceedsUsingRandomBase) { Prng my_prng; MemberCtxObj member(this->kGroupPublicKey, this->kMemberPrivateKey, this->kMemberPrecomp, &Prng::Generate, &my_prng); auto& msg = this->kMsg0; BasicSignature basic_sig; BigNumStr rnd_bsn = {0}; BigNumStr zero = {0}; EXPECT_EQ(kEpidNoErr, EpidSignBasic(member, msg.data(), msg.size(), nullptr, 0, &basic_sig, &rnd_bsn)); EXPECT_NE(0, memcmp(&rnd_bsn, &zero, sizeof(BigNumStr))); // verify basic signature VerifierCtxObj ctx(this->kGroupPublicKey); EXPECT_EQ(kEpidSigValid, EpidVerifyBasicSig(ctx, &basic_sig, msg.data(), msg.size())); } TEST_F(EpidMemberTest, PROTECTED_SignBasicSucceedsUsingRandomBaseWithCredential_EPS0) { Prng my_prng; MemberCtxObj member( this->kEps0GroupPublicKey, *(MembershipCredential const*)&this->kEps0MemberPrivateKey, &Prng::Generate, &my_prng); auto& msg = this->kMsg0; BasicSignature basic_sig; BigNumStr rnd_bsn = {0}; BigNumStr zero = {0}; EXPECT_EQ(kEpidNoErr, EpidSignBasic(member, msg.data(), msg.size(), nullptr, 0, &basic_sig, &rnd_bsn)); EXPECT_NE(0, memcmp(&rnd_bsn, &zero, sizeof(BigNumStr))); // verify basic signature VerifierCtxObj ctx(this->kEps0GroupPublicKey); THROW_ON_EPIDERR(EpidVerifierSetHashAlg(ctx, kSha256)); EXPECT_EQ(kEpidSigValid, EpidVerifyBasicSig(ctx, &basic_sig, msg.data(), msg.size())); } TEST_F(EpidMemberTest, SignBasicSucceedsUsingBasename) { Prng my_prng; MemberCtxObj member(this->kGroupPublicKey, this->kMemberPrivateKey, this->kMemberPrecomp, &Prng::Generate, &my_prng); auto& msg = this->kMsg0; auto& bsn = this->kBsn0; BasicSignature basic_sig; THROW_ON_EPIDERR(EpidRegisterBasename(member, bsn.data(), bsn.size())); EXPECT_EQ(kEpidNoErr, EpidSignBasic(member, msg.data(), msg.size(), bsn.data(), bsn.size(), &basic_sig, nullptr)); // verify basic signature VerifierCtxObj ctx(this->kGroupPublicKey); THROW_ON_EPIDERR(EpidVerifierSetBasename(ctx, bsn.data(), bsn.size())); EXPECT_EQ(kEpidSigValid, EpidVerifyBasicSig(ctx, &basic_sig, msg.data(), msg.size())); } TEST_F(EpidMemberTest, PROTECTED_SignBasicSucceedsUsingBasenameWithCredential_EPS0) { Prng my_prng; MemberCtxObj member( this->kEps0GroupPublicKey, *(MembershipCredential const*)&this->kEps0MemberPrivateKey, &Prng::Generate, &my_prng); auto& msg = this->kMsg0; auto& bsn = this->kBsn0; BasicSignature basic_sig; THROW_ON_EPIDERR(EpidRegisterBasename(member, bsn.data(), bsn.size())); EXPECT_EQ(kEpidNoErr, EpidSignBasic(member, msg.data(), msg.size(), bsn.data(), bsn.size(), &basic_sig, nullptr)); // verify basic signature VerifierCtxObj ctx(this->kEps0GroupPublicKey); THROW_ON_EPIDERR(EpidVerifierSetBasename(ctx, bsn.data(), bsn.size())); THROW_ON_EPIDERR(EpidVerifierSetHashAlg(ctx, kSha256)); EXPECT_EQ(kEpidSigValid, EpidVerifyBasicSig(ctx, &basic_sig, msg.data(), msg.size())); } TEST_F(EpidMemberTest, SignBasicSucceedsUsingBasenameUsingIKGFData) { Prng my_prng; GroupPubKey grp_public_key = *reinterpret_cast( this->kGroupPublicKeyDataIkgf.data()); PrivKey mbr_private_key = *reinterpret_cast(this->kMemberPrivateKeyDataIkgf.data()); MemberCtxObj member(grp_public_key, mbr_private_key, &Prng::Generate, &my_prng); auto& msg = this->kMsg0; auto& bsn = this->kBsn0; BasicSignature basic_sig; THROW_ON_EPIDERR(EpidRegisterBasename(member, bsn.data(), bsn.size())); EXPECT_EQ(kEpidNoErr, EpidSignBasic(member, msg.data(), msg.size(), bsn.data(), bsn.size(), &basic_sig, nullptr)); // verify basic signature VerifierCtxObj ctx(grp_public_key); THROW_ON_EPIDERR(EpidVerifierSetBasename(ctx, bsn.data(), bsn.size())); EXPECT_EQ(kEpidSigValid, EpidVerifyBasicSig(ctx, &basic_sig, msg.data(), msg.size())); } TEST_F(EpidMemberTest, SignBasicSucceedsUsingRandomBaseWithRegisteredBasenames) { Prng my_prng; MemberCtxObj member(this->kGroupPublicKey, this->kMemberPrivateKey, this->kMemberPrecomp, &Prng::Generate, &my_prng); auto& msg = this->kMsg0; auto& bsn = this->kBsn0; THROW_ON_EPIDERR(EpidRegisterBasename(member, bsn.data(), bsn.size())); BasicSignature basic_sig; BigNumStr rnd_bsn = {0}; EXPECT_EQ(kEpidNoErr, EpidSignBasic(member, msg.data(), msg.size(), nullptr, 0, &basic_sig, &rnd_bsn)); // verify basic signature VerifierCtxObj ctx(this->kGroupPublicKey); EXPECT_EQ(kEpidSigValid, EpidVerifyBasicSig(ctx, &basic_sig, msg.data(), msg.size())); } TEST_F(EpidMemberTest, SignBasicSucceedsUsingRandomBaseWithoutRegisteredBasenames) { Prng my_prng; MemberCtxObj member(this->kGroupPublicKey, this->kMemberPrivateKey, this->kMemberPrecomp, &Prng::Generate, &my_prng); auto& msg = this->kMsg0; BasicSignature basic_sig; BigNumStr rnd_bsn = {0}; EXPECT_EQ(kEpidNoErr, EpidSignBasic(member, msg.data(), msg.size(), nullptr, 0, &basic_sig, &rnd_bsn)); // verify basic signature VerifierCtxObj ctx(this->kGroupPublicKey); EXPECT_EQ(kEpidSigValid, EpidVerifyBasicSig(ctx, &basic_sig, msg.data(), msg.size())); } #ifndef TPM_TSS TEST_F(EpidMemberTest, SignBasicSucceedsUsingBsnContainingAllPossibleBytes) { Prng my_prng; MemberCtxObj member(this->kGroupPublicKey, this->kMemberPrivateKey, this->kMemberPrecomp, &Prng::Generate, &my_prng); auto& msg = this->kMsg0; auto& bsn = this->kData_0_255; THROW_ON_EPIDERR(EpidRegisterBasename(member, bsn.data(), bsn.size())); BasicSignature basic_sig; EXPECT_EQ(kEpidNoErr, EpidSignBasic(member, msg.data(), msg.size(), bsn.data(), bsn.size(), &basic_sig, nullptr)); VerifierCtxObj ctx(this->kGroupPublicKey); THROW_ON_EPIDERR(EpidVerifierSetBasename(ctx, bsn.data(), bsn.size())); EXPECT_EQ(kEpidSigValid, EpidVerifyBasicSig(ctx, &basic_sig, msg.data(), msg.size())); } #endif TEST_F(EpidMemberTest, PROTECTED_SignBasicSucceedsAllPossibleBytesForCredential_EPS0) { Prng my_prng; MemberCtxObj member( this->kEps0GroupPublicKey, *(MembershipCredential const*)&this->kEps0MemberPrivateKey, &Prng::Generate, &my_prng); auto& msg = this->kMsg0; auto& bsn = this->kData_0_255; // 0 - 123 THROW_ON_EPIDERR(EpidRegisterBasename(member, bsn.data(), 124)); BasicSignature basic_sig; EXPECT_EQ(kEpidNoErr, EpidSignBasic(member, msg.data(), msg.size(), bsn.data(), 124, &basic_sig, nullptr)); VerifierCtxObj ctx1(this->kEps0GroupPublicKey); THROW_ON_EPIDERR(EpidVerifierSetBasename(ctx1, bsn.data(), 124)); THROW_ON_EPIDERR(EpidVerifierSetHashAlg(ctx1, kSha256)); EXPECT_EQ(kEpidSigValid, EpidVerifyBasicSig(ctx1, &basic_sig, msg.data(), msg.size())); // 124 - 247 THROW_ON_EPIDERR(EpidRegisterBasename(member, bsn.data() + 124, 124)); EXPECT_EQ(kEpidNoErr, EpidSignBasic(member, msg.data(), msg.size(), bsn.data() + 124, 124, &basic_sig, nullptr)); VerifierCtxObj ctx2(this->kEps0GroupPublicKey); THROW_ON_EPIDERR(EpidVerifierSetBasename(ctx2, bsn.data() + 124, 124)); THROW_ON_EPIDERR(EpidVerifierSetHashAlg(ctx2, kSha256)); EXPECT_EQ(kEpidSigValid, EpidVerifyBasicSig(ctx2, &basic_sig, msg.data(), msg.size())); // 248 - 255 THROW_ON_EPIDERR( EpidRegisterBasename(member, bsn.data() + 124 * 2, 256 - 124 * 2)); EXPECT_EQ(kEpidNoErr, EpidSignBasic(member, msg.data(), msg.size(), bsn.data() + 124 * 2, 256 - 124 * 2, &basic_sig, nullptr)); VerifierCtxObj ctx3(this->kEps0GroupPublicKey); THROW_ON_EPIDERR( EpidVerifierSetBasename(ctx3, bsn.data() + 124 * 2, 256 - 124 * 2)); THROW_ON_EPIDERR(EpidVerifierSetHashAlg(ctx3, kSha256)); EXPECT_EQ(kEpidSigValid, EpidVerifyBasicSig(ctx3, &basic_sig, msg.data(), msg.size())); } ///////////////////////////////////////////////////////////////////////// // Variable hash alg TEST_F(EpidMemberTest, SignBasicSucceedsUsingSha256HashAlg) { Prng my_prng; MemberCtxObj member(this->kGroupPublicKey, this->kMemberPrivateKey, kSha256, this->kMemberPrecomp, &Prng::Generate, &my_prng); auto& msg = this->kMsg0; auto& bsn = this->kBsn0; THROW_ON_EPIDERR(EpidRegisterBasename(member, bsn.data(), bsn.size())); BasicSignature basic_sig; EXPECT_EQ(kEpidNoErr, EpidSignBasic(member, msg.data(), msg.size(), bsn.data(), bsn.size(), &basic_sig, nullptr)); // verify basic signature VerifierCtxObj ctx(this->kGroupPublicKey); THROW_ON_EPIDERR(EpidVerifierSetHashAlg(ctx, kSha256)); EXPECT_EQ(kEpidSigValid, EpidVerifyBasicSig(ctx, &basic_sig, msg.data(), msg.size())); } TEST_F(EpidMemberTest, PROTECTED_SignBasicSucceedsUsingSha256HashAlgWithCredential_EPS0) { Prng my_prng; MemberCtxObj member( this->kEps0GroupPublicKey, *(MembershipCredential const*)&this->kEps0MemberPrivateKey, kSha256, &Prng::Generate, &my_prng); auto& msg = this->kMsg0; auto& bsn = this->kBsn0; THROW_ON_EPIDERR(EpidRegisterBasename(member, bsn.data(), bsn.size())); BasicSignature basic_sig; EXPECT_EQ(kEpidNoErr, EpidSignBasic(member, msg.data(), msg.size(), bsn.data(), bsn.size(), &basic_sig, nullptr)); // verify basic signature VerifierCtxObj ctx(this->kEps0GroupPublicKey); THROW_ON_EPIDERR(EpidVerifierSetHashAlg(ctx, kSha256)); EXPECT_EQ(kEpidSigValid, EpidVerifyBasicSig(ctx, &basic_sig, msg.data(), msg.size())); } TEST_F(EpidMemberTest, SignBasicSucceedsUsingSha384HashAlg) { Prng my_prng; MemberCtxObj member(this->kGroupPublicKey, this->kMemberPrivateKey, kSha384, this->kMemberPrecomp, &Prng::Generate, &my_prng); auto& msg = this->kMsg0; auto& bsn = this->kBsn0; THROW_ON_EPIDERR(EpidRegisterBasename(member, bsn.data(), bsn.size())); BasicSignature basic_sig; EXPECT_EQ(kEpidNoErr, EpidSignBasic(member, msg.data(), msg.size(), bsn.data(), bsn.size(), &basic_sig, nullptr)); // verify basic signature VerifierCtxObj ctx(this->kGroupPublicKey); THROW_ON_EPIDERR(EpidVerifierSetHashAlg(ctx, kSha384)); EXPECT_EQ(kEpidSigValid, EpidVerifyBasicSig(ctx, &basic_sig, msg.data(), msg.size())); } TEST_F(EpidMemberTest, SignBasicSucceedsUsingSha512HashAlg) { Prng my_prng; MemberCtxObj member(this->kGroupPublicKey, this->kMemberPrivateKey, kSha512, this->kMemberPrecomp, &Prng::Generate, &my_prng); auto& msg = this->kMsg0; auto& bsn = this->kBsn0; THROW_ON_EPIDERR(EpidRegisterBasename(member, bsn.data(), bsn.size())); BasicSignature basic_sig; EXPECT_EQ(kEpidNoErr, EpidSignBasic(member, msg.data(), msg.size(), bsn.data(), bsn.size(), &basic_sig, nullptr)); // verify basic signature VerifierCtxObj ctx(this->kGroupPublicKey); THROW_ON_EPIDERR(EpidVerifierSetHashAlg(ctx, kSha512)); EXPECT_EQ(kEpidSigValid, EpidVerifyBasicSig(ctx, &basic_sig, msg.data(), msg.size())); } TEST_F(EpidMemberTest, SignBasicSucceedsUsingSha512256HashAlg) { Prng my_prng; MemberCtxObj member(this->kGroupPublicKey, this->kMemberPrivateKey, kSha512_256, this->kMemberPrecomp, &Prng::Generate, &my_prng); auto& msg = this->kMsg0; auto& bsn = this->kBsn0; THROW_ON_EPIDERR(EpidRegisterBasename(member, bsn.data(), bsn.size())); BasicSignature basic_sig; EXPECT_EQ(kEpidNoErr, EpidSignBasic(member, msg.data(), msg.size(), bsn.data(), bsn.size(), &basic_sig, nullptr)); // verify basic signature VerifierCtxObj ctx(this->kGroupPublicKey); THROW_ON_EPIDERR(EpidVerifierSetHashAlg(ctx, kSha512_256)); EXPECT_EQ(kEpidSigValid, EpidVerifyBasicSig(ctx, &basic_sig, msg.data(), msg.size())); } ///////////////////////////////////////////////////////////////////////// TEST_F(EpidMemberTest, SignBasicConsumesPrecomputedSignatures) { Prng my_prng; MemberCtxObj member(this->kGroupPublicKey, this->kMemberPrivateKey, this->kMemberPrecomp, &Prng::Generate, &my_prng); THROW_ON_EPIDERR(EpidAddPreSigs(member, 3)); auto& msg = this->kMsg0; BasicSignature basic_sig; auto& bsn = this->kBsn0; THROW_ON_EPIDERR(EpidRegisterBasename(member, bsn.data(), bsn.size())); // use 1 precomputed signature ASSERT_EQ(kEpidNoErr, EpidSignBasic(member, msg.data(), msg.size(), bsn.data(), bsn.size(), &basic_sig, nullptr)); EXPECT_EQ((size_t)2, EpidGetNumPreSigs(member)); } TEST_F(EpidMemberTest, SignBasicSucceedsWithPrecomputedSignatures) { Prng my_prng; MemberCtxObj member(this->kGroupPublicKey, this->kMemberPrivateKey, this->kMemberPrecomp, &Prng::Generate, &my_prng); auto& msg = this->kMsg0; BasicSignature basic_sig; BigNumStr rnd_bsn = {0}; EXPECT_EQ(kEpidNoErr, EpidSignBasic(member, msg.data(), msg.size(), nullptr, 0, &basic_sig, &rnd_bsn)); // verify basic signature VerifierCtxObj ctx(this->kGroupPublicKey); EXPECT_EQ(kEpidSigValid, EpidVerifyBasicSig(ctx, &basic_sig, msg.data(), msg.size())); } TEST_F(EpidMemberTest, PROTECTED_SignBasicSucceedsUsingPrecompSigWithCredential_EPS0) { Prng my_prng; MemberCtxObj member( this->kEps0GroupPublicKey, *(MembershipCredential const*)&this->kEps0MemberPrivateKey, &Prng::Generate, &my_prng); THROW_ON_EPIDERR(EpidAddPreSigs(member, 1)); auto& msg = this->kMsg0; BasicSignature basic_sig; BigNumStr rnd_bsn = {0}; EXPECT_EQ(kEpidNoErr, EpidSignBasic(member, msg.data(), msg.size(), nullptr, 0, &basic_sig, &rnd_bsn)); VerifierCtxObj ctx(this->kEps0GroupPublicKey); THROW_ON_EPIDERR(EpidVerifierSetHashAlg(ctx, kSha256)); EXPECT_EQ(kEpidSigValid, EpidVerifyBasicSig(ctx, &basic_sig, msg.data(), msg.size())); } TEST_F(EpidMemberTest, SignBasicSucceedsWithoutPrecomputedSignatures) { Prng my_prng; MemberCtxObj member(this->kGroupPublicKey, this->kMemberPrivateKey, this->kMemberPrecomp, &Prng::Generate, &my_prng); THROW_ON_EPIDERR(EpidAddPreSigs(member, 1)); auto& msg = this->kMsg0; BasicSignature basic_sig; auto& bsn = this->kBsn0; THROW_ON_EPIDERR(EpidRegisterBasename(member, bsn.data(), bsn.size())); ASSERT_EQ(kEpidNoErr, EpidSignBasic(member, msg.data(), msg.size(), bsn.data(), bsn.size(), &basic_sig, nullptr)); // test sign without precomputed signatures EXPECT_EQ(kEpidNoErr, EpidSignBasic(member, msg.data(), msg.size(), bsn.data(), bsn.size(), &basic_sig, nullptr)); // verify basic signature VerifierCtxObj ctx(this->kGroupPublicKey); THROW_ON_EPIDERR(EpidVerifierSetBasename(ctx, bsn.data(), bsn.size())); EXPECT_EQ(kEpidSigValid, EpidVerifyBasicSig(ctx, &basic_sig, msg.data(), msg.size())); } ///////////////////////////////////////////////////////////////////////// // Variable messages TEST_F(EpidMemberTest, SignBasicSucceedsGivenEmptyMessage) { Prng my_prng; MemberCtxObj member(this->kGroupPublicKey, this->kMemberPrivateKey, this->kMemberPrecomp, &Prng::Generate, &my_prng); auto& msg = this->kMsg0; auto& bsn = this->kBsn0; THROW_ON_EPIDERR(EpidRegisterBasename(member, bsn.data(), bsn.size())); BasicSignature basic_sig; EXPECT_EQ(kEpidNoErr, EpidSignBasic(member, msg.data(), 0, bsn.data(), bsn.size(), &basic_sig, nullptr)); VerifierCtxObj ctx(this->kGroupPublicKey); THROW_ON_EPIDERR(EpidVerifierSetBasename(ctx, bsn.data(), bsn.size())); EXPECT_EQ(kEpidSigValid, EpidVerifyBasicSig(ctx, &basic_sig, msg.data(), 0)); } TEST_F(EpidMemberTest, SignBasicSucceedsWithShortMessage) { // check: 1, 13, 128, 256, 512, 1021, 1024 bytes // 13 and 1021 are primes Prng my_prng; MemberCtxObj member(this->kGroupPublicKey, this->kMemberPrivateKey, this->kMemberPrecomp, &Prng::Generate, &my_prng); BasicSignature basic_sig; BigNumStr rnd_bsn = {0}; VerifierCtxObj ctx(this->kGroupPublicKey); size_t lengths[] = {1, 13, 128, 256, 512, 1021, 1024}; // have desired lengths to loop over std::vector msg( lengths[COUNT_OF(lengths) - 1]); // allocate message for max size for (size_t n = 0; n < msg.size(); n++) { msg.at(n) = (uint8_t)n; } for (auto length : lengths) { EXPECT_EQ(kEpidNoErr, EpidSignBasic(member, msg.data(), length, nullptr, 0, &basic_sig, &rnd_bsn)) << "EpidSignBasic for message_len: " << length << " failed"; EXPECT_EQ(kEpidNoErr, EpidVerifyBasicSig(ctx, &basic_sig, msg.data(), length)) << "EpidVerifyBasicSig for message_len: " << length << " failed"; } } TEST_F(EpidMemberTest, SignBasicSucceedsWithLongMessage) { Prng my_prng; MemberCtxObj member(this->kGroupPublicKey, this->kMemberPrivateKey, this->kMemberPrecomp, &Prng::Generate, &my_prng); BasicSignature basic_sig; BigNumStr rnd_bsn = {0}; VerifierCtxObj ctx(this->kGroupPublicKey); { // 1000000 std::vector msg(1000000); // allocate message for max size for (size_t n = 0; n < msg.size(); n++) { msg.at(n) = (uint8_t)n; } EXPECT_EQ(kEpidNoErr, EpidSignBasic(member, msg.data(), msg.size(), nullptr, 0, &basic_sig, &rnd_bsn)) << "EpidSignBasic for message_len: " << 1000000 << " failed"; EXPECT_EQ(kEpidNoErr, EpidVerifyBasicSig(ctx, &basic_sig, msg.data(), msg.size())) << "EpidVerifyBasicSig for message_len: " << 1000000 << " failed"; } } TEST_F(EpidMemberTest, SignBasicSucceedsWithMsgContainingAllPossibleBytes) { Prng my_prng; MemberCtxObj member(this->kGroupPublicKey, this->kMemberPrivateKey, this->kMemberPrecomp, &Prng::Generate, &my_prng); auto& msg = this->kData_0_255; auto& bsn = this->kBsn0; THROW_ON_EPIDERR(EpidRegisterBasename(member, bsn.data(), bsn.size())); BasicSignature basic_sig; EXPECT_EQ(kEpidNoErr, EpidSignBasic(member, msg.data(), msg.size(), bsn.data(), bsn.size(), &basic_sig, nullptr)); VerifierCtxObj ctx(this->kGroupPublicKey); THROW_ON_EPIDERR(EpidVerifierSetBasename(ctx, bsn.data(), bsn.size())); EXPECT_EQ(kEpidSigValid, EpidVerifyBasicSig(ctx, &basic_sig, msg.data(), msg.size())); } TEST_F(EpidMemberTest, PROTECTED_SignBasicSucceedsMsgAllPossibleBytesForCredential_EPS0) { Prng my_prng; MemberCtxObj member( this->kEps0GroupPublicKey, *(MembershipCredential const*)&this->kEps0MemberPrivateKey, &Prng::Generate, &my_prng); auto& msg = this->kData_0_255; auto& bsn = this->kBsn0; BasicSignature basic_sig; THROW_ON_EPIDERR(EpidRegisterBasename(member, bsn.data(), bsn.size())); EXPECT_EQ(kEpidNoErr, EpidSignBasic(member, msg.data(), msg.size(), bsn.data(), bsn.size(), &basic_sig, nullptr)); VerifierCtxObj ctx(this->kEps0GroupPublicKey); THROW_ON_EPIDERR(EpidVerifierSetBasename(ctx, bsn.data(), bsn.size())); THROW_ON_EPIDERR(EpidVerifierSetHashAlg(ctx, kSha256)); EXPECT_EQ(kEpidSigValid, EpidVerifyBasicSig(ctx, &basic_sig, msg.data(), msg.size())); } } // namespace