|
@@ -393,6 +393,7 @@ void PrsonaServer::build_up_midway_pseudonyms(
|
|
|
std::vector<std::vector<std::vector<Proof>>>& pi,
|
|
|
std::vector<std::vector<std::vector<Curvepoint>>>& permutationCommits,
|
|
|
std::vector<std::vector<std::vector<Curvepoint>>>& freshPseudonymCommits,
|
|
|
+ std::vector<std::vector<std::vector<Curvepoint>>>& freshPseudonymPowerCommits,
|
|
|
std::vector<std::vector<std::vector<Curvepoint>>>& freshPseudonymSeedCommits,
|
|
|
std::vector<std::vector<std::vector<TwistBipoint>>>& serverTallyCommits,
|
|
|
std::vector<std::vector<std::vector<std::vector<std::vector<CurveBipoint>>>>>& voteMatrixCommits,
|
|
@@ -402,24 +403,29 @@ void PrsonaServer::build_up_midway_pseudonyms(
|
|
|
|
|
|
std::vector<std::vector<Curvepoint>> currPermutationCommits;
|
|
|
std::vector<std::vector<Curvepoint>> currFreshPseudonymCommits;
|
|
|
+ std::vector<std::vector<Curvepoint>> currFreshPseudonymPowerCommits;
|
|
|
std::vector<std::vector<Curvepoint>> currFreshPseudonymSeedCommits;
|
|
|
std::vector<std::vector<TwistBipoint>> currServerTallyCommits;
|
|
|
std::vector<std::vector<std::vector<std::vector<CurveBipoint>>>> currVoteMatrixCommits;
|
|
|
std::vector<std::vector<std::vector<Curvepoint>>> currUserTallyCommits;
|
|
|
+ std::vector<std::vector<Curvepoint>> currUserTallyMaskPowerCommits;
|
|
|
std::vector<std::vector<Curvepoint>> currUserTallyMaskSeedCommits;
|
|
|
pi.push_back(epoch_calculations(
|
|
|
currPermutationCommits,
|
|
|
currFreshPseudonymCommits,
|
|
|
+ currFreshPseudonymPowerCommits,
|
|
|
currFreshPseudonymSeedCommits,
|
|
|
currServerTallyCommits,
|
|
|
currVoteMatrixCommits,
|
|
|
currUserTallyCommits,
|
|
|
+ currUserTallyMaskPowerCommits,
|
|
|
currUserTallyMaskSeedCommits,
|
|
|
nextSeed,
|
|
|
false));
|
|
|
|
|
|
permutationCommits.push_back(currPermutationCommits);
|
|
|
freshPseudonymCommits.push_back(currFreshPseudonymCommits);
|
|
|
+ freshPseudonymPowerCommits.push_back(currFreshPseudonymPowerCommits);
|
|
|
freshPseudonymSeedCommits.push_back(currFreshPseudonymSeedCommits);
|
|
|
serverTallyCommits.push_back(currServerTallyCommits);
|
|
|
voteMatrixCommits.push_back(currVoteMatrixCommits);
|
|
@@ -438,10 +444,12 @@ void PrsonaServer::break_down_midway_pseudonyms(
|
|
|
std::vector<std::vector<std::vector<Proof>>>& pi,
|
|
|
std::vector<std::vector<std::vector<Curvepoint>>>& permutationCommits,
|
|
|
std::vector<std::vector<std::vector<Curvepoint>>>& freshPseudonymCommits,
|
|
|
+ std::vector<std::vector<std::vector<Curvepoint>>>& freshPseudonymPowerCommits,
|
|
|
std::vector<std::vector<std::vector<Curvepoint>>>& freshPseudonymSeedCommits,
|
|
|
std::vector<std::vector<std::vector<TwistBipoint>>>& serverTallyCommits,
|
|
|
std::vector<std::vector<std::vector<std::vector<std::vector<CurveBipoint>>>>>& voteMatrixCommits,
|
|
|
std::vector<std::vector<std::vector<std::vector<Curvepoint>>>>& userTallyCommits,
|
|
|
+ std::vector<std::vector<std::vector<Curvepoint>>>& userTallyMaskPowerCommits,
|
|
|
std::vector<std::vector<std::vector<Curvepoint>>>& userTallyMaskSeedCommits,
|
|
|
const Curvepoint& nextGenerator)
|
|
|
{
|
|
@@ -455,28 +463,34 @@ void PrsonaServer::break_down_midway_pseudonyms(
|
|
|
|
|
|
std::vector<std::vector<Curvepoint>> currPermutationCommits;
|
|
|
std::vector<std::vector<Curvepoint>> currFreshPseudonymCommits;
|
|
|
+ std::vector<std::vector<Curvepoint>> currFreshPseudonymPowerCommits;
|
|
|
std::vector<std::vector<Curvepoint>> currFreshPseudonymSeedCommits;
|
|
|
std::vector<std::vector<TwistBipoint>> currServerTallyCommits;
|
|
|
std::vector<std::vector<std::vector<std::vector<CurveBipoint>>>> currVoteMatrixCommits;
|
|
|
std::vector<std::vector<std::vector<Curvepoint>>> currUserTallyCommits;
|
|
|
+ std::vector<std::vector<Curvepoint>> currUserTallyMaskPowerCommits;
|
|
|
std::vector<std::vector<Curvepoint>> currUserTallyMaskSeedCommits;
|
|
|
pi.push_back(epoch_calculations(
|
|
|
currPermutationCommits,
|
|
|
currFreshPseudonymCommits,
|
|
|
+ currFreshPseudonymPowerCommits,
|
|
|
currFreshPseudonymSeedCommits,
|
|
|
currServerTallyCommits,
|
|
|
currVoteMatrixCommits,
|
|
|
currUserTallyCommits,
|
|
|
+ currUserTallyMaskPowerCommits,
|
|
|
currUserTallyMaskSeedCommits,
|
|
|
inverseSeed,
|
|
|
true));
|
|
|
|
|
|
permutationCommits.push_back(currPermutationCommits);
|
|
|
freshPseudonymCommits.push_back(currFreshPseudonymCommits);
|
|
|
+ freshPseudonymPowerCommits.push_back(currFreshPseudonymPowerCommits);
|
|
|
freshPseudonymSeedCommits.push_back(currFreshPseudonymSeedCommits);
|
|
|
serverTallyCommits.push_back(currServerTallyCommits);
|
|
|
voteMatrixCommits.push_back(currVoteMatrixCommits);
|
|
|
userTallyCommits.push_back(currUserTallyCommits);
|
|
|
+ userTallyMaskPowerCommits.push_back(currUserTallyMaskPowerCommits);
|
|
|
userTallyMaskSeedCommits.push_back(currUserTallyMaskSeedCommits);
|
|
|
|
|
|
currentSeed = nextSeed;
|
|
@@ -489,10 +503,12 @@ void PrsonaServer::break_down_midway_pseudonyms(
|
|
|
std::vector<std::vector<Proof>> PrsonaServer::epoch_calculations(
|
|
|
std::vector<std::vector<Curvepoint>>& permutationCommits,
|
|
|
std::vector<std::vector<Curvepoint>>& freshPseudonymCommits,
|
|
|
+ std::vector<std::vector<Curvepoint>>& freshPseudonymPowerCommits,
|
|
|
std::vector<std::vector<Curvepoint>>& freshPseudonymSeedCommits,
|
|
|
std::vector<std::vector<TwistBipoint>>& serverTallyCommits,
|
|
|
std::vector<std::vector<std::vector<std::vector<CurveBipoint>>>>& voteMatrixCommits,
|
|
|
std::vector<std::vector<std::vector<Curvepoint>>>& userTallyCommits,
|
|
|
+ std::vector<std::vector<Curvepoint>> & userTallyMaskPowerCommits,
|
|
|
std::vector<std::vector<Curvepoint>> & userTallyMaskSeedCommits,
|
|
|
const Scalar& power,
|
|
|
bool doUserTallies)
|
|
@@ -528,12 +544,13 @@ std::vector<std::vector<Proof>> PrsonaServer::epoch_calculations(
|
|
|
|
|
|
std::vector<std::vector<Scalar>> freshPseudonymSeeds;
|
|
|
freshPseudonymSeedCommits.clear();
|
|
|
- freshPseudonymCommits.clear();
|
|
|
+ freshPseudonymPowerCommits.clear();
|
|
|
freshPseudonymCommits =
|
|
|
generate_pseudonym_matrix(
|
|
|
permutations,
|
|
|
power,
|
|
|
freshPseudonymSeeds,
|
|
|
+ freshPseudonymPowerCommits,
|
|
|
freshPseudonymSeedCommits);
|
|
|
|
|
|
// for (size_t i = 0; i < freshPseudonymCommits.size(); i++)
|
|
@@ -558,6 +575,7 @@ std::vector<std::vector<Proof>> PrsonaServer::epoch_calculations(
|
|
|
currentPseudonyms,
|
|
|
permutationCommits,
|
|
|
freshPseudonymCommits,
|
|
|
+ freshPseudonymPowerCommits,
|
|
|
freshPseudonymSeedCommits));
|
|
|
|
|
|
// std::cout << "Generating server tally matrix." << std::endl;
|
|
@@ -638,6 +656,7 @@ std::vector<std::vector<Proof>> PrsonaServer::epoch_calculations(
|
|
|
|
|
|
std::vector<Curvepoint> userTallyMasks;
|
|
|
std::vector<std::vector<Scalar>> userTallyMaskSeeds;
|
|
|
+ userTallyMaskPowerCommits.clear();
|
|
|
userTallyMaskSeedCommits.clear();
|
|
|
std::vector<Curvepoint> userTallyMessages;
|
|
|
std::vector<std::vector<Scalar>> userTallyMessageSeeds;
|
|
@@ -648,6 +667,7 @@ std::vector<std::vector<Proof>> PrsonaServer::epoch_calculations(
|
|
|
userTallyMasks,
|
|
|
userTallyMessages,
|
|
|
userTallyMaskSeeds,
|
|
|
+ userTallyMaskPowerCommits,
|
|
|
userTallyMaskSeedCommits,
|
|
|
userTallyMessageSeeds);
|
|
|
|
|
@@ -662,6 +682,7 @@ std::vector<std::vector<Proof>> PrsonaServer::epoch_calculations(
|
|
|
userTallyMasks,
|
|
|
permutationCommits,
|
|
|
userTallyCommits[0],
|
|
|
+ userTallyMaskPowerCommits,
|
|
|
userTallyMaskSeedCommits));
|
|
|
|
|
|
// std::cout << "Proving user tally message matrix." << std::endl;
|
|
@@ -678,15 +699,26 @@ std::vector<std::vector<Proof>> PrsonaServer::epoch_calculations(
|
|
|
elGamalBlindGenerator,
|
|
|
false));
|
|
|
}
|
|
|
+ else
|
|
|
+ {
|
|
|
+ userTallyMaskPowerCommits.clear();
|
|
|
+ userTallyMaskSeedCommits.clear();
|
|
|
+ userTallyCommits.push_back(std::vector<std::vector<Curvepoint>>());
|
|
|
+ userTallyCommits.push_back(std::vector<std::vector<Curvepoint>>());
|
|
|
+ }
|
|
|
|
|
|
// std::cout << "Giving self updates." << std::endl;
|
|
|
|
|
|
// Replace internal values
|
|
|
update_data(
|
|
|
- freshPseudonymCommits,
|
|
|
+ freshPseudonymPowerCommits,
|
|
|
serverTallyCommits,
|
|
|
voteMatrixCommits[1],
|
|
|
- userTallyCommits);
|
|
|
+ userTallyMaskPowerCommits,
|
|
|
+ userTallyCommits[1]);
|
|
|
+
|
|
|
+ if (!doUserTallies)
|
|
|
+ userTallyCommits.clear();
|
|
|
|
|
|
return retval;
|
|
|
}
|
|
@@ -695,10 +727,12 @@ bool PrsonaServer::accept_epoch_updates(
|
|
|
const std::vector<std::vector<Proof>>& pi,
|
|
|
const std::vector<std::vector<Curvepoint>>& permutationCommits,
|
|
|
const std::vector<std::vector<Curvepoint>>& freshPseudonymCommits,
|
|
|
+ const std::vector<std::vector<Curvepoint>>& freshPseudonymPowerCommits,
|
|
|
const std::vector<std::vector<Curvepoint>>& freshPseudonymSeedCommits,
|
|
|
const std::vector<std::vector<TwistBipoint>>& serverTallyCommits,
|
|
|
const std::vector<std::vector<std::vector<std::vector<CurveBipoint>>>>& voteMatrixCommits,
|
|
|
const std::vector<std::vector<std::vector<Curvepoint>>>& userTallyCommits,
|
|
|
+ const std::vector<std::vector<Curvepoint>>& userTallyMaskPowerCommits,
|
|
|
const std::vector<std::vector<Curvepoint>>& userTallyMaskSeedCommits,
|
|
|
bool doUserTallies)
|
|
|
{
|
|
@@ -727,6 +761,7 @@ bool PrsonaServer::accept_epoch_updates(
|
|
|
currentPseudonyms,
|
|
|
permutationCommits,
|
|
|
freshPseudonymCommits,
|
|
|
+ freshPseudonymPowerCommits,
|
|
|
freshPseudonymSeedCommits);
|
|
|
if (!verification)
|
|
|
{
|
|
@@ -781,6 +816,9 @@ bool PrsonaServer::accept_epoch_updates(
|
|
|
|
|
|
currOffset += voteMatrix.size();
|
|
|
|
|
|
+ std::vector<std::vector<Curvepoint>> inputMasks;
|
|
|
+ std::vector<std::vector<Curvepoint>> inputMessages;
|
|
|
+
|
|
|
if (doUserTallies)
|
|
|
{
|
|
|
std::vector<Curvepoint> userTallyMasks;
|
|
@@ -796,6 +834,7 @@ bool PrsonaServer::accept_epoch_updates(
|
|
|
userTallyMasks,
|
|
|
permutationCommits,
|
|
|
userTallyCommits[0],
|
|
|
+ userTallyMaskPowerCommits,
|
|
|
userTallyMaskSeedCommits);
|
|
|
if (!verification)
|
|
|
{
|
|
@@ -818,13 +857,17 @@ bool PrsonaServer::accept_epoch_updates(
|
|
|
std::cerr << "Could not verify user tally messages." << std::endl;
|
|
|
return false;
|
|
|
}
|
|
|
+
|
|
|
+ inputMasks = userTallyMaskPowerCommits;
|
|
|
+ inputMessages = userTallyCommits[1];
|
|
|
}
|
|
|
|
|
|
verification = update_data(
|
|
|
- freshPseudonymCommits,
|
|
|
+ freshPseudonymPowerCommits,
|
|
|
serverTallyCommits,
|
|
|
voteMatrixCommits[1],
|
|
|
- userTallyCommits);
|
|
|
+ inputMasks,
|
|
|
+ inputMessages);
|
|
|
|
|
|
return verification;
|
|
|
}
|
|
@@ -913,6 +956,7 @@ std::vector<std::vector<Curvepoint>> PrsonaServer::generate_pseudonym_matrix(
|
|
|
const std::vector<std::vector<Scalar>>& permutations,
|
|
|
const Scalar& power,
|
|
|
std::vector<std::vector<Scalar>>& seeds,
|
|
|
+ std::vector<std::vector<Curvepoint>>& powerCommits,
|
|
|
std::vector<std::vector<Curvepoint>>& seedCommits) const
|
|
|
{
|
|
|
return generate_reordered_plus_power_matrix<Curvepoint>(
|
|
@@ -920,6 +964,7 @@ std::vector<std::vector<Curvepoint>> PrsonaServer::generate_pseudonym_matrix(
|
|
|
power,
|
|
|
currentPseudonyms,
|
|
|
seeds,
|
|
|
+ powerCommits,
|
|
|
seedCommits,
|
|
|
elGamalBlindGenerator);
|
|
|
}
|
|
@@ -1076,6 +1121,7 @@ std::vector<std::vector<std::vector<Curvepoint>>> PrsonaServer::generate_user_ta
|
|
|
std::vector<Curvepoint>& masks,
|
|
|
std::vector<Curvepoint>& messages,
|
|
|
std::vector<std::vector<Scalar>>& maskSeeds,
|
|
|
+ std::vector<std::vector<Curvepoint>>& maskPowerCommits,
|
|
|
std::vector<std::vector<Curvepoint>>& maskSeedCommits,
|
|
|
std::vector<std::vector<Scalar>>& messageSeeds) const
|
|
|
{
|
|
@@ -1095,6 +1141,7 @@ std::vector<std::vector<std::vector<Curvepoint>>> PrsonaServer::generate_user_ta
|
|
|
power,
|
|
|
masks,
|
|
|
maskSeeds,
|
|
|
+ maskPowerCommits,
|
|
|
maskSeedCommits,
|
|
|
elGamalBlindGenerator));
|
|
|
|
|
@@ -1116,26 +1163,32 @@ std::vector<std::vector<T>> PrsonaServer::generate_reordered_plus_power_matrix(
|
|
|
const Scalar& power,
|
|
|
const std::vector<T>& oldValues,
|
|
|
std::vector<std::vector<Scalar>>& seeds,
|
|
|
+ std::vector<std::vector<T>>& powerCommits,
|
|
|
std::vector<std::vector<Curvepoint>>& seedCommits,
|
|
|
const T& h) const
|
|
|
{
|
|
|
std::vector<std::vector<Scalar>> permutation_plus_power;
|
|
|
+ std::vector<std::vector<T>> retval;
|
|
|
seedCommits.clear();
|
|
|
+ powerCommits.clear();
|
|
|
|
|
|
for (size_t i = 0; i < permutations.size(); i++)
|
|
|
{
|
|
|
std::vector<Scalar> currPermutations;
|
|
|
std::vector<Curvepoint> currSeedCommits;
|
|
|
+ std::vector<T> currRetvalRow;
|
|
|
for (size_t j = 0; j < permutations[i].size(); j++)
|
|
|
{
|
|
|
currPermutations.push_back(permutations[i][j] * power);
|
|
|
currSeedCommits.push_back(Curvepoint());
|
|
|
+ currRetvalRow.push_back(T());
|
|
|
}
|
|
|
permutation_plus_power.push_back(currPermutations);
|
|
|
seedCommits.push_back(currSeedCommits);
|
|
|
+ retval.push_back(currRetvalRow);
|
|
|
}
|
|
|
|
|
|
- std::vector<std::vector<T>> retval =
|
|
|
+ powerCommits =
|
|
|
generate_reordered_matrix<T>(
|
|
|
permutation_plus_power,
|
|
|
oldValues,
|
|
@@ -1144,9 +1197,16 @@ std::vector<std::vector<T>> PrsonaServer::generate_reordered_plus_power_matrix(
|
|
|
false,
|
|
|
true);
|
|
|
|
|
|
+ Scalar inversePower = power.curveMultInverse();
|
|
|
for (size_t i = 0; i < permutations.size(); i++)
|
|
|
+ {
|
|
|
for (size_t j = 0; j < permutations[i].size(); j++)
|
|
|
+ {
|
|
|
seedCommits[i][j] = EL_GAMAL_GENERATOR * seeds[i][j];
|
|
|
+ seeds[i][j] = seeds[i][j] * inversePower;
|
|
|
+ retval[i][j] = powerCommits[i][j] * inversePower;
|
|
|
+ }
|
|
|
+ }
|
|
|
|
|
|
return retval;
|
|
|
}
|
|
@@ -1274,7 +1334,8 @@ bool PrsonaServer::update_data(
|
|
|
const std::vector<std::vector<Curvepoint>>& freshPseudonymCommits,
|
|
|
const std::vector<std::vector<TwistBipoint>>& serverTallyCommits,
|
|
|
const std::vector<std::vector<std::vector<CurveBipoint>>>& voteMatrixCommits,
|
|
|
- const std::vector<std::vector<std::vector<Curvepoint>>>& userTallyCommits)
|
|
|
+ const std::vector<std::vector<Curvepoint>>& userTallyMaskCommits,
|
|
|
+ const std::vector<std::vector<Curvepoint>>& userTallyMessageCommits)
|
|
|
{
|
|
|
std::vector<Curvepoint> newPseudonyms;
|
|
|
std::vector<TwistBipoint> newVoteTallies;
|
|
@@ -1286,10 +1347,10 @@ bool PrsonaServer::update_data(
|
|
|
TwistBipoint voteTallySum = serverTallyCommits[i][0];
|
|
|
|
|
|
Curvepoint userTallyMask, userTallyMessage;
|
|
|
- if (!userTallyCommits.empty())
|
|
|
+ if (!userTallyMaskCommits.empty())
|
|
|
{
|
|
|
- userTallyMask = userTallyCommits[i][0][0];
|
|
|
- userTallyMessage = userTallyCommits[i][0][1];
|
|
|
+ userTallyMask = userTallyMaskCommits[i][0];
|
|
|
+ userTallyMessage = userTallyMessageCommits[i][0];
|
|
|
}
|
|
|
|
|
|
for (size_t j = 1; j < freshPseudonymCommits[i].size(); j++)
|
|
@@ -1297,19 +1358,19 @@ bool PrsonaServer::update_data(
|
|
|
pseudonymSum = pseudonymSum + freshPseudonymCommits[i][j];
|
|
|
voteTallySum = voteTallySum + serverTallyCommits[i][j];
|
|
|
|
|
|
- if (!userTallyCommits.empty())
|
|
|
+ if (!userTallyMaskCommits.empty())
|
|
|
{
|
|
|
userTallyMask = userTallyMask +
|
|
|
- userTallyCommits[i][j][0];
|
|
|
+ userTallyMaskCommits[i][j];
|
|
|
userTallyMessage = userTallyMessage +
|
|
|
- userTallyCommits[i][j][1];
|
|
|
+ userTallyMessageCommits[i][j];
|
|
|
}
|
|
|
}
|
|
|
|
|
|
newPseudonyms.push_back(pseudonymSum);
|
|
|
newVoteTallies.push_back(voteTallySum);
|
|
|
|
|
|
- if (!userTallyCommits.empty())
|
|
|
+ if (!userTallyMaskCommits.empty())
|
|
|
{
|
|
|
newUserTallies.push_back(
|
|
|
EGCiphertext(userTallyMask, userTallyMessage));
|