/*############################################################################ # 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. ############################################################################*/ /// NrProve unit tests. /*! \file */ #include "epid/common-testhelper/epid_gtest-testhelper.h" #include "gtest/gtest.h" extern "C" { #include "epid/member/src/nrprove.h" #include "epid/member/src/signbasic.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" namespace { TEST_F(EpidMemberTest, NrProveFailsGivenNullParameters) { Prng my_prng; MemberCtxObj member(this->kGroupPublicKey, this->kMemberPrivateKey, this->kMemberPrecomp, &Prng::Generate, &my_prng); BasicSignature const* basic_sig = &reinterpret_cast( this->kGrp01Member0SigTest1Sha256.data()) ->sigma0; auto& msg = this->kTest1Msg; auto& bsn = this->kBsn0; SigRl const* sig_rl = reinterpret_cast(this->kSigRlData.data()); NrProof proof; EXPECT_EQ(kEpidBadArgErr, EpidNrProve(nullptr, msg.data(), msg.size(), bsn.data(), bsn.size(), basic_sig, &sig_rl->bk[0], &proof)); EXPECT_EQ(kEpidBadArgErr, EpidNrProve(member, nullptr, msg.size(), bsn.data(), bsn.size(), basic_sig, &sig_rl->bk[0], &proof)); EXPECT_EQ(kEpidBadArgErr, EpidNrProve(member, msg.data(), msg.size(), nullptr, 0, basic_sig, &sig_rl->bk[0], &proof)); EXPECT_EQ(kEpidBadArgErr, EpidNrProve(member, msg.data(), msg.size(), bsn.data(), 0, basic_sig, &sig_rl->bk[0], &proof)); EXPECT_EQ(kEpidBadArgErr, EpidNrProve(member, msg.data(), msg.size(), bsn.data(), bsn.size(), nullptr, &sig_rl->bk[0], &proof)); EXPECT_EQ(kEpidBadArgErr, EpidNrProve(member, msg.data(), msg.size(), bsn.data(), bsn.size(), basic_sig, nullptr, &proof)); EXPECT_EQ(kEpidBadArgErr, EpidNrProve(member, msg.data(), msg.size(), bsn.data(), bsn.size(), basic_sig, &sig_rl->bk[0], nullptr)); } TEST_F(EpidMemberTest, NrProveFailsGivenInvalidSigRlEntry) { Prng my_prng; MemberCtxObj member(this->kGroupPublicKey, this->kMemberPrivateKey, this->kMemberPrecomp, &Prng::Generate, &my_prng); BasicSignature basic_sig; auto msg = this->kTest1Msg; SigRl const* sig_rl = reinterpret_cast(this->kSigRlData.data()); NrProof proof; BigNumStr rnd_bsn = {0}; THROW_ON_EPIDERR(EpidSignBasic(member, msg.data(), msg.size(), nullptr, 0, &basic_sig, &rnd_bsn)); SigRlEntry sig_rl_enty_invalid_k = sig_rl->bk[0]; sig_rl_enty_invalid_k.k.x.data.data[31]++; // make it not in EC group EXPECT_EQ(kEpidBadArgErr, EpidNrProve(member, msg.data(), msg.size(), &rnd_bsn, sizeof(rnd_bsn), &basic_sig, &sig_rl_enty_invalid_k, &proof)); SigRlEntry sig_rl_enty_invalid_b = sig_rl->bk[0]; sig_rl_enty_invalid_b.b.x.data.data[31]++; // make it not in EC group EXPECT_EQ(kEpidBadArgErr, EpidNrProve(member, msg.data(), msg.size(), &rnd_bsn, sizeof(rnd_bsn), &basic_sig, &sig_rl_enty_invalid_b, &proof)); } TEST_F(EpidMemberTest, PROTECTED_NrProveFailsWithInvalidSigRlEntryAndCredential_EPS0) { Prng my_prng; MemberCtxObj member( this->kEps0GroupPublicKey, *(MembershipCredential const*)&this->kEps0MemberPrivateKey, &Prng::Generate, &my_prng); BasicSignature basic_sig; auto msg = this->kTest1Msg; SigRl const* sig_rl = reinterpret_cast(this->kSigRlData.data()); NrProof proof; BigNumStr rnd_bsn = {0}; THROW_ON_EPIDERR(EpidSignBasic(member, msg.data(), msg.size(), nullptr, 0, &basic_sig, &rnd_bsn)); SigRlEntry sig_rl_enty_invalid_k = sig_rl->bk[0]; sig_rl_enty_invalid_k.k.x.data.data[31]++; // make it not in EC group EXPECT_EQ(kEpidBadArgErr, EpidNrProve(member, msg.data(), msg.size(), &rnd_bsn, sizeof(rnd_bsn), &basic_sig, &sig_rl_enty_invalid_k, &proof)); SigRlEntry sig_rl_enty_invalid_b = sig_rl->bk[0]; sig_rl_enty_invalid_b.b.x.data.data[31]++; // make it not in EC group EXPECT_EQ(kEpidBadArgErr, EpidNrProve(member, msg.data(), msg.size(), &rnd_bsn, sizeof(rnd_bsn), &basic_sig, &sig_rl_enty_invalid_b, &proof)); } TEST_F(EpidMemberTest, NrProveFailsGivenInvalidBasicSig) { Prng my_prng; MemberCtxObj member(this->kGroupPublicKey, this->kMemberPrivateKey, this->kMemberPrecomp, &Prng::Generate, &my_prng); BasicSignature basic_sig; auto msg = this->kTest1Msg; SigRl const* sig_rl = reinterpret_cast(this->kSigRlData.data()); NrProof proof; BigNumStr rnd_bsn = {0}; THROW_ON_EPIDERR(EpidSignBasic(member, msg.data(), msg.size(), nullptr, 0, &basic_sig, &rnd_bsn)); // invalid basic sig is only when K value is invalid!! BasicSignature basic_sig_invalid_K = basic_sig; basic_sig_invalid_K.K.x.data.data[31]++; // make it not in EC group EXPECT_EQ( kEpidBadArgErr, EpidNrProve(member, msg.data(), msg.size(), &rnd_bsn, sizeof(rnd_bsn), &basic_sig_invalid_K, &sig_rl->bk[0], &proof)); } TEST_F(EpidMemberTest, PROTECTED_NrProveFailsGivenInvalidBasicSigAndCredential_EPS0) { Prng my_prng; MemberCtxObj member( this->kEps0GroupPublicKey, *(MembershipCredential const*)&this->kEps0MemberPrivateKey, &Prng::Generate, &my_prng); BasicSignature basic_sig; auto msg = this->kTest1Msg; SigRl const* sig_rl = reinterpret_cast(this->kSigRlData.data()); NrProof proof; BigNumStr rnd_bsn = {0}; THROW_ON_EPIDERR(EpidSignBasic(member, msg.data(), msg.size(), nullptr, 0, &basic_sig, &rnd_bsn)); // invalid basic sig is only when K value is invalid!! BasicSignature basic_sig_invalid_K = basic_sig; basic_sig_invalid_K.K.x.data.data[31]++; // make it not in EC group EXPECT_EQ( kEpidBadArgErr, EpidNrProve(member, msg.data(), msg.size(), &rnd_bsn, sizeof(rnd_bsn), &basic_sig_invalid_K, &sig_rl->bk[0], &proof)); } TEST_F(EpidMemberTest, GeneratesNrProofForEmptyMessage) { Prng my_prng; MemberCtxObj member(this->kGroupPublicKey, this->kMemberPrivateKey, kSha256, this->kMemberPrecomp, &Prng::Generate, &my_prng); BasicSignature basic_sig; SigRl const* sig_rl = reinterpret_cast(this->kSigRlData.data()); BigNumStr rnd_bsn = {0}; NrProof proof; ASSERT_EQ(kEpidNoErr, EpidSignBasic(member, nullptr, 0, nullptr, 0, &basic_sig, &rnd_bsn)); EXPECT_EQ(kEpidNoErr, EpidNrProve(member, nullptr, 0, &rnd_bsn, sizeof(rnd_bsn), &basic_sig, &sig_rl->bk[0], &proof)); // Check proof by doing an NrVerify VerifierCtxObj ctx(this->kGroupPublicKey); THROW_ON_EPIDERR(EpidVerifierSetHashAlg(ctx, kSha256)); EXPECT_EQ(kEpidNoErr, EpidNrVerify(ctx, &basic_sig, nullptr, 0, &sig_rl->bk[0], &proof)); } TEST_F(EpidMemberTest, GeneratesNrProofForMsgContainingAllPossibleBytes) { Prng my_prng; MemberCtxObj member(this->kGroupPublicKey, this->kMemberPrivateKey, this->kMemberPrecomp, &Prng::Generate, &my_prng); BasicSignature basic_sig; auto msg = this->kData_0_255; auto& bsn = this->kBsn0; SigRl const* sig_rl = reinterpret_cast(this->kSigRlData.data()); NrProof proof; 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)); EXPECT_EQ(kEpidNoErr, EpidNrProve(member, msg.data(), msg.size(), bsn.data(), bsn.size(), &basic_sig, &sig_rl->bk[0], &proof)); // Check proof by doing an NrVerify VerifierCtxObj ctx(this->kGroupPublicKey); EXPECT_EQ(kEpidNoErr, EpidNrVerify(ctx, &basic_sig, msg.data(), msg.size(), &sig_rl->bk[0], &proof)); } TEST_F(EpidMemberTest, GeneratesNrProof) { Prng my_prng; MemberCtxObj member(this->kGroupPublicKey, this->kMemberPrivateKey, this->kMemberPrecomp, &Prng::Generate, &my_prng); BasicSignature basic_sig; auto msg = this->kTest1Msg; SigRl const* sig_rl = reinterpret_cast(this->kSigRlData.data()); BigNumStr rnd_bsn = {0}; NrProof proof; ASSERT_EQ(kEpidNoErr, EpidSignBasic(member, msg.data(), msg.size(), nullptr, 0, &basic_sig, &rnd_bsn)); EXPECT_EQ(kEpidNoErr, EpidNrProve(member, msg.data(), msg.size(), &rnd_bsn, sizeof(rnd_bsn), &basic_sig, &sig_rl->bk[0], &proof)); // Check proof by doing an NrVerify VerifierCtxObj ctx(this->kGroupPublicKey); EXPECT_EQ(kEpidNoErr, EpidNrVerify(ctx, &basic_sig, msg.data(), msg.size(), &sig_rl->bk[0], &proof)); } TEST_F(EpidMemberTest, PROTECTED_GeneratesNrProofWithCredential_EPS0) { Prng my_prng; MemberCtxObj member( this->kEps0GroupPublicKey, *(MembershipCredential const*)&this->kEps0MemberPrivateKey, &Prng::Generate, &my_prng); BasicSignature basic_sig; auto msg = this->kTest1Msg; SigRl const* sig_rl = reinterpret_cast(this->kSigRlData.data()); BigNumStr rnd_bsn = {0}; NrProof proof; ASSERT_EQ(kEpidNoErr, EpidSignBasic(member, msg.data(), msg.size(), nullptr, 0, &basic_sig, &rnd_bsn)); EXPECT_EQ(kEpidNoErr, EpidNrProve(member, msg.data(), msg.size(), &rnd_bsn, sizeof(rnd_bsn), &basic_sig, &sig_rl->bk[0], &proof)); // Check proof by doing an NrVerify VerifierCtxObj ctx(this->kGroupPublicKey); EXPECT_EQ(kEpidNoErr, EpidNrVerify(ctx, &basic_sig, msg.data(), msg.size(), &sig_rl->bk[0], &proof)); } TEST_F(EpidMemberTest, GeneratesNrProofUsingDefaultHashAlgUsingIKGFData) { Prng my_prng; GroupPubKey grp_public_key = *reinterpret_cast( this->kGroupPublicKeyDataIkgf.data()); PrivKey mbr_private_key = *reinterpret_cast(this->kMemberPrivateKeyDataIkgf.data()); const std::vector sigrl_bin = { #include "epid/common-testhelper/testdata/ikgf/groupa/sigrl.inc" }; MemberCtxObj member(grp_public_key, mbr_private_key, &Prng::Generate, &my_prng); BasicSignature basic_sig; auto msg = this->kTest1Msg; SigRl const* sig_rl = reinterpret_cast(sigrl_bin.data()); BigNumStr rnd_bsn = {0}; NrProof proof; ASSERT_EQ(kEpidNoErr, EpidSignBasic(member, msg.data(), msg.size(), nullptr, 0, &basic_sig, &rnd_bsn)); EXPECT_EQ(kEpidNoErr, EpidNrProve(member, msg.data(), msg.size(), &rnd_bsn, sizeof(rnd_bsn), &basic_sig, &sig_rl->bk[0], &proof)); // Check proof by doing an NrVerify VerifierCtxObj ctx(grp_public_key); EXPECT_EQ(kEpidNoErr, EpidNrVerify(ctx, &basic_sig, msg.data(), msg.size(), &sig_rl->bk[0], &proof)); } TEST_F(EpidMemberTest, GeneratesNrProofUsingSha256HashAlg) { Prng my_prng; MemberCtxObj member(this->kGroupPublicKey, this->kMemberPrivateKey, kSha256, this->kMemberPrecomp, &Prng::Generate, &my_prng); BasicSignature basic_sig; auto msg = this->kTest1Msg; SigRl const* sig_rl = reinterpret_cast(this->kSigRlData.data()); BigNumStr rnd_bsn = {0}; NrProof proof; ASSERT_EQ(kEpidNoErr, EpidSignBasic(member, msg.data(), msg.size(), nullptr, 0, &basic_sig, &rnd_bsn)); EXPECT_EQ(kEpidNoErr, EpidNrProve(member, msg.data(), msg.size(), &rnd_bsn, sizeof(rnd_bsn), &basic_sig, &sig_rl->bk[0], &proof)); // Check proof by doing an NrVerify VerifierCtxObj ctx(this->kGroupPublicKey); THROW_ON_EPIDERR(EpidVerifierSetHashAlg(ctx, kSha256)); EXPECT_EQ(kEpidNoErr, EpidNrVerify(ctx, &basic_sig, msg.data(), msg.size(), &sig_rl->bk[0], &proof)); } TEST_F(EpidMemberTest, GeneratesNrProofUsingSha384HashAlg) { Prng my_prng; MemberCtxObj member(this->kGroupPublicKey, this->kMemberPrivateKey, kSha384, this->kMemberPrecomp, &Prng::Generate, &my_prng); BasicSignature basic_sig; auto msg = this->kTest1Msg; SigRl const* sig_rl = reinterpret_cast(this->kSigRlData.data()); BigNumStr rnd_bsn = {0}; NrProof proof; ASSERT_EQ(kEpidNoErr, EpidSignBasic(member, msg.data(), msg.size(), nullptr, 0, &basic_sig, &rnd_bsn)); EXPECT_EQ(kEpidNoErr, EpidNrProve(member, msg.data(), msg.size(), &rnd_bsn, sizeof(rnd_bsn), &basic_sig, &sig_rl->bk[0], &proof)); // Check proof by doing an NrVerify VerifierCtxObj ctx(this->kGroupPublicKey); THROW_ON_EPIDERR(EpidVerifierSetHashAlg(ctx, kSha384)); EXPECT_EQ(kEpidNoErr, EpidNrVerify(ctx, &basic_sig, msg.data(), msg.size(), &sig_rl->bk[0], &proof)); } TEST_F(EpidMemberTest, GeneratesNrProofUsingSha512HashAlg) { Prng my_prng; MemberCtxObj member(this->kGroupPublicKey, this->kMemberPrivateKey, kSha512, this->kMemberPrecomp, &Prng::Generate, &my_prng); BasicSignature basic_sig; auto msg = this->kTest1Msg; SigRl const* sig_rl = reinterpret_cast(this->kSigRlData.data()); BigNumStr rnd_bsn = {0}; NrProof proof; ASSERT_EQ(kEpidNoErr, EpidSignBasic(member, msg.data(), msg.size(), nullptr, 0, &basic_sig, &rnd_bsn)); EXPECT_EQ(kEpidNoErr, EpidNrProve(member, msg.data(), msg.size(), &rnd_bsn, sizeof(rnd_bsn), &basic_sig, &sig_rl->bk[0], &proof)); // Check proof by doing an NrVerify VerifierCtxObj ctx(this->kGroupPublicKey); THROW_ON_EPIDERR(EpidVerifierSetHashAlg(ctx, kSha512)); EXPECT_EQ(kEpidNoErr, EpidNrVerify(ctx, &basic_sig, msg.data(), msg.size(), &sig_rl->bk[0], &proof)); } TEST_F(EpidMemberTest, GeneratesNrProofUsingSha512256HashAlg) { Prng my_prng; MemberCtxObj member(this->kGroupPublicKey, this->kMemberPrivateKey, kSha512_256, this->kMemberPrecomp, &Prng::Generate, &my_prng); BasicSignature basic_sig; auto msg = this->kTest1Msg; SigRl const* sig_rl = reinterpret_cast(this->kSigRlData.data()); BigNumStr rnd_bsn = {0}; NrProof proof; ASSERT_EQ(kEpidNoErr, EpidSignBasic(member, msg.data(), msg.size(), nullptr, 0, &basic_sig, &rnd_bsn)); EXPECT_EQ(kEpidNoErr, EpidNrProve(member, msg.data(), msg.size(), &rnd_bsn, sizeof(rnd_bsn), &basic_sig, &sig_rl->bk[0], &proof)); // Check proof by doing an NrVerify VerifierCtxObj ctx(this->kGroupPublicKey); THROW_ON_EPIDERR(EpidVerifierSetHashAlg(ctx, kSha512_256)); EXPECT_EQ(kEpidNoErr, EpidNrVerify(ctx, &basic_sig, msg.data(), msg.size(), &sig_rl->bk[0], &proof)); } } // namespace