/*############################################################################
# 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 <cstring>
#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<const GroupPubKey*>(
this->kGroupPublicKeyDataIkgf.data());
PrivKey mbr_private_key =
*reinterpret_cast<const PrivKey*>(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<uint8_t> 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<uint8_t> 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