|
@@ -507,24 +507,24 @@ std::vector<std::vector<Proof>> PrsonaServer::epoch_calculations(
|
|
|
for (size_t i = 0; i < currentPseudonyms.size(); i++)
|
|
|
nextPseudonyms[i] = currentPseudonyms[order[i]] * power;
|
|
|
|
|
|
-
|
|
|
+ std::cout << "Generating permutation matrix." << std::endl;
|
|
|
|
|
|
std::vector<std::vector<Scalar>> permutations =
|
|
|
generate_permutation_matrix(power);
|
|
|
|
|
|
-
|
|
|
+ std::cout << "Generating permutation commitment matrix." << std::endl;
|
|
|
|
|
|
std::vector<std::vector<Scalar>> permutationSeeds;
|
|
|
permutationCommits.clear();
|
|
|
permutationCommits =
|
|
|
generate_commitment_matrix(permutations, permutationSeeds);
|
|
|
|
|
|
-
|
|
|
+ std::cout << "Generating permutation proof." << std::endl;
|
|
|
|
|
|
retval.push_back(generate_valid_permutation_proof(
|
|
|
permutations, permutationSeeds, permutationCommits));
|
|
|
|
|
|
-
|
|
|
+ std::cout << "Generating pseudonym matrix." << std::endl;
|
|
|
|
|
|
std::vector<std::vector<Scalar>> freshPseudonymSeeds;
|
|
|
freshPseudonymSeedCommits.clear();
|
|
@@ -545,9 +545,7 @@ std::vector<std::vector<Proof>> PrsonaServer::epoch_calculations(
|
|
|
|
|
|
|
|
|
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
+ std::cout << "Generating pseudonym proof." << std::endl;
|
|
|
|
|
|
retval.push_back(
|
|
|
generate_proof_of_reordering_plus_power(
|
|
@@ -560,7 +558,7 @@ std::vector<std::vector<Proof>> PrsonaServer::epoch_calculations(
|
|
|
freshPseudonymCommits,
|
|
|
freshPseudonymSeedCommits));
|
|
|
|
|
|
-
|
|
|
+ std::cout << "Generating server tally matrix." << std::endl;
|
|
|
|
|
|
std::vector<std::vector<Scalar>> serverTallySeeds;
|
|
|
serverTallyCommits.clear();
|
|
@@ -569,7 +567,7 @@ std::vector<std::vector<Proof>> PrsonaServer::epoch_calculations(
|
|
|
permutations,
|
|
|
serverTallySeeds);
|
|
|
|
|
|
-
|
|
|
+ std::cout << "Generating server tally proof." << std::endl;
|
|
|
|
|
|
retval.push_back(
|
|
|
generate_proof_of_reordering<TwistBipoint>(
|
|
@@ -580,10 +578,9 @@ std::vector<std::vector<Proof>> PrsonaServer::epoch_calculations(
|
|
|
permutationCommits,
|
|
|
serverTallyCommits,
|
|
|
bgnSystem.get_public_key().get_bipoint_twistgen(),
|
|
|
- bgnSystem.get_public_key().get_bipoint_twist_subgroup_gen(),
|
|
|
- false));
|
|
|
+ bgnSystem.get_public_key().get_bipoint_twist_subgroup_gen()));
|
|
|
|
|
|
-
|
|
|
+ std::cout << "Doing V * P." << std::endl;
|
|
|
|
|
|
std::vector<std::vector<std::vector<Scalar>>> firstVoteMatrixSeeds;
|
|
|
std::vector<std::vector<std::vector<Scalar>>> secondVoteMatrixSeeds;
|
|
@@ -594,12 +591,12 @@ std::vector<std::vector<Proof>> PrsonaServer::epoch_calculations(
|
|
|
firstVoteMatrixSeeds,
|
|
|
false));
|
|
|
|
|
|
-
|
|
|
+ std::cout << "Finishing V * P calculation." << std::endl;
|
|
|
|
|
|
std::vector<std::vector<CurveBipoint>> partialVoteMatrix =
|
|
|
calculate_next_vote_matrix(voteMatrixCommits[0]);
|
|
|
|
|
|
-
|
|
|
+ std::cout << "Doing P^T * (V * P)." << std::endl;
|
|
|
|
|
|
voteMatrixCommits.push_back(
|
|
|
generate_vote_tensor(
|
|
@@ -608,7 +605,7 @@ std::vector<std::vector<Proof>> PrsonaServer::epoch_calculations(
|
|
|
secondVoteMatrixSeeds,
|
|
|
true));
|
|
|
|
|
|
-
|
|
|
+ std::cout << "Proving V * P." << std::endl;
|
|
|
|
|
|
generate_vote_tensor_proofs(
|
|
|
retval,
|
|
@@ -620,7 +617,7 @@ std::vector<std::vector<Proof>> PrsonaServer::epoch_calculations(
|
|
|
voteMatrixCommits[0],
|
|
|
false);
|
|
|
|
|
|
-
|
|
|
+ std::cout << "Proving P^T * (V * P)." << std::endl;
|
|
|
|
|
|
generate_vote_tensor_proofs(
|
|
|
retval,
|
|
@@ -634,7 +631,7 @@ std::vector<std::vector<Proof>> PrsonaServer::epoch_calculations(
|
|
|
|
|
|
if (doUserTallies)
|
|
|
{
|
|
|
-
|
|
|
+ std::cout << "Generating user tally matrix." << std::endl;
|
|
|
|
|
|
std::vector<Curvepoint> userTallyMasks;
|
|
|
std::vector<std::vector<Scalar>> userTallyMaskSeeds;
|
|
@@ -651,7 +648,7 @@ std::vector<std::vector<Proof>> PrsonaServer::epoch_calculations(
|
|
|
userTallyMaskSeedCommits,
|
|
|
userTallyMessageSeeds);
|
|
|
|
|
|
-
|
|
|
+ std::cout << "Proving user tally mask matrix." << std::endl;
|
|
|
|
|
|
retval.push_back(
|
|
|
generate_proof_of_reordering_plus_power(
|
|
@@ -664,7 +661,7 @@ std::vector<std::vector<Proof>> PrsonaServer::epoch_calculations(
|
|
|
userTallyCommits[0],
|
|
|
userTallyMaskSeedCommits));
|
|
|
|
|
|
-
|
|
|
+ std::cout << "Proving user tally message matrix." << std::endl;
|
|
|
|
|
|
retval.push_back(
|
|
|
generate_proof_of_reordering<Curvepoint>(
|
|
@@ -675,11 +672,10 @@ std::vector<std::vector<Proof>> PrsonaServer::epoch_calculations(
|
|
|
permutationCommits,
|
|
|
userTallyCommits[1],
|
|
|
EL_GAMAL_GENERATOR,
|
|
|
- elGamalBlindGenerator,
|
|
|
- false));
|
|
|
+ elGamalBlindGenerator));
|
|
|
}
|
|
|
|
|
|
-
|
|
|
+ std::cout << "Giving self updates." << std::endl;
|
|
|
|
|
|
|
|
|
update_data(
|
|
@@ -713,6 +709,8 @@ bool PrsonaServer::accept_epoch_updates(
|
|
|
if (pi.empty())
|
|
|
return false;
|
|
|
|
|
|
+ std::cout << "Verifying valid permutation matrix." << std::endl;
|
|
|
+
|
|
|
verification =
|
|
|
verify_valid_permutation_proof(pi[0], permutationCommits);
|
|
|
if (!verification)
|
|
@@ -721,6 +719,8 @@ bool PrsonaServer::accept_epoch_updates(
|
|
|
return false;
|
|
|
}
|
|
|
|
|
|
+ std::cout << "Verifying valid pseudonym vector." << std::endl;
|
|
|
+
|
|
|
verification =
|
|
|
verify_proof_of_reordering_plus_power(
|
|
|
pi[1],
|
|
@@ -734,6 +734,8 @@ bool PrsonaServer::accept_epoch_updates(
|
|
|
return false;
|
|
|
}
|
|
|
|
|
|
+ std::cout << "Verifying valid server tally vector." << std::endl;
|
|
|
+
|
|
|
verification =
|
|
|
verify_proof_of_reordering<TwistBipoint>(
|
|
|
pi[2],
|
|
@@ -741,14 +743,15 @@ bool PrsonaServer::accept_epoch_updates(
|
|
|
permutationCommits,
|
|
|
serverTallyCommits,
|
|
|
bgnSystem.get_public_key().get_bipoint_twistgen(),
|
|
|
- bgnSystem.get_public_key().get_bipoint_twist_subgroup_gen(),
|
|
|
- false);
|
|
|
+ bgnSystem.get_public_key().get_bipoint_twist_subgroup_gen());
|
|
|
if (!verification)
|
|
|
{
|
|
|
std::cerr << "Could not verify valid server tally vector." << std::endl;
|
|
|
return false;
|
|
|
}
|
|
|
|
|
|
+ std::cout << "Verifying valid first half vote matrix." << std::endl;
|
|
|
+
|
|
|
size_t currOffset = 3;
|
|
|
verification = verify_vote_tensor_proofs(
|
|
|
pi,
|
|
@@ -763,6 +766,8 @@ bool PrsonaServer::accept_epoch_updates(
|
|
|
return false;
|
|
|
}
|
|
|
|
|
|
+ std::cout << "Verifying valid second half vote matrix." << std::endl;
|
|
|
+
|
|
|
std::vector<std::vector<CurveBipoint>> partialVoteMatrix =
|
|
|
calculate_next_vote_matrix(voteMatrixCommits[0]);
|
|
|
currOffset += voteMatrix.size();
|
|
@@ -791,6 +796,8 @@ bool PrsonaServer::accept_epoch_updates(
|
|
|
userTallyMessages.push_back(currentUserEncryptedTallies[i].encryptedMessage);
|
|
|
}
|
|
|
|
|
|
+ std::cout << "Verifying valid user tally masks." << std::endl;
|
|
|
+
|
|
|
verification = verify_proof_of_reordering_plus_power(
|
|
|
pi[currOffset],
|
|
|
userTallyMasks,
|
|
@@ -805,14 +812,15 @@ bool PrsonaServer::accept_epoch_updates(
|
|
|
|
|
|
currOffset++;
|
|
|
|
|
|
+ std::cout << "Verifying valid user tally messages." << std::endl;
|
|
|
+
|
|
|
verification = verify_proof_of_reordering<Curvepoint>(
|
|
|
pi[currOffset],
|
|
|
userTallyMessages,
|
|
|
permutationCommits,
|
|
|
userTallyCommits[1],
|
|
|
EL_GAMAL_GENERATOR,
|
|
|
- elGamalBlindGenerator,
|
|
|
- false);
|
|
|
+ elGamalBlindGenerator);
|
|
|
if (!verification)
|
|
|
{
|
|
|
std::cerr << "Could not verify user tally messages." << std::endl;
|
|
@@ -820,6 +828,8 @@ bool PrsonaServer::accept_epoch_updates(
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ std::cout << "Verifying pseudonyms are all different." << std::endl;
|
|
|
+
|
|
|
verification = update_data(
|
|
|
freshPseudonymCommits,
|
|
|
serverTallyCommits,
|
|
@@ -899,7 +909,7 @@ std::vector<std::vector<Curvepoint>> PrsonaServer::generate_commitment_matrix(
|
|
|
seeds[i][last] = seeds[i][last] - seeds[i][j];
|
|
|
}
|
|
|
|
|
|
- element = encrypt<Curvepoint>(g, h, permutations[i][j], seeds[i][j]);
|
|
|
+ element = g * permutations[i][j] + h * seeds[i][j];
|
|
|
|
|
|
currRow.push_back(element);
|
|
|
}
|
|
@@ -933,7 +943,6 @@ std::vector<std::vector<TwistBipoint>> PrsonaServer::generate_server_tally_matri
|
|
|
previousVoteTallies,
|
|
|
seeds,
|
|
|
bgnSystem.get_public_key().get_bipoint_twist_subgroup_gen(),
|
|
|
- false,
|
|
|
false);
|
|
|
}
|
|
|
|
|
@@ -965,7 +974,6 @@ std::vector<std::vector<std::vector<CurveBipoint>>> PrsonaServer::generate_vote_
|
|
|
inputRow,
|
|
|
currSeeds,
|
|
|
bgnSystem.get_public_key().get_bipoint_curve_subgroup_gen(),
|
|
|
- true,
|
|
|
false));
|
|
|
|
|
|
seeds.push_back(currSeeds);
|
|
@@ -1028,8 +1036,7 @@ void PrsonaServer::generate_vote_tensor_proofs(
|
|
|
permutationCommits,
|
|
|
matrixCommits[i],
|
|
|
bgnSystem.get_public_key().get_bipoint_curvegen(),
|
|
|
- bgnSystem.get_public_key().get_bipoint_curve_subgroup_gen(),
|
|
|
- true));
|
|
|
+ bgnSystem.get_public_key().get_bipoint_curve_subgroup_gen()));
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -1063,8 +1070,7 @@ bool PrsonaServer::verify_vote_tensor_proofs(
|
|
|
permutationCommits,
|
|
|
matrixCommits[i],
|
|
|
bgnSystem.get_public_key().get_bipoint_curvegen(),
|
|
|
- bgnSystem.get_public_key().get_bipoint_curve_subgroup_gen(),
|
|
|
- true);
|
|
|
+ bgnSystem.get_public_key().get_bipoint_curve_subgroup_gen());
|
|
|
}
|
|
|
|
|
|
return retval;
|
|
@@ -1104,7 +1110,6 @@ std::vector<std::vector<std::vector<Curvepoint>>> PrsonaServer::generate_user_ta
|
|
|
messages,
|
|
|
messageSeeds,
|
|
|
elGamalBlindGenerator,
|
|
|
- false,
|
|
|
false));
|
|
|
|
|
|
return retval;
|
|
@@ -1141,7 +1146,6 @@ std::vector<std::vector<T>> PrsonaServer::generate_reordered_plus_power_matrix(
|
|
|
oldValues,
|
|
|
seeds,
|
|
|
h,
|
|
|
- false,
|
|
|
true);
|
|
|
|
|
|
for (size_t i = 0; i < permutations.size(); i++)
|
|
@@ -1157,7 +1161,6 @@ std::vector<std::vector<T>> PrsonaServer::generate_reordered_matrix(
|
|
|
const std::vector<T>& oldValues,
|
|
|
std::vector<std::vector<Scalar>>& seeds,
|
|
|
const T& h,
|
|
|
- bool inverted,
|
|
|
bool cancelOut) const
|
|
|
{
|
|
|
std::vector<std::vector<T>> retval;
|
|
@@ -1166,75 +1169,33 @@ std::vector<std::vector<T>> PrsonaServer::generate_reordered_matrix(
|
|
|
for (size_t i = 0; i < permutations.size(); i++)
|
|
|
{
|
|
|
std::vector<Scalar> currSeeds;
|
|
|
- for (size_t j = 0; j < permutations[i].size(); j++)
|
|
|
+ std::vector<T> currRow;
|
|
|
+ for (size_t j = 0; j < permutations[i].size(); j++)\
|
|
|
+ {
|
|
|
currSeeds.push_back(Scalar(0));
|
|
|
+ currRow.push_back(T());
|
|
|
+ }
|
|
|
seeds.push_back(currSeeds);
|
|
|
+ retval.push_back(currRow);
|
|
|
}
|
|
|
|
|
|
for (size_t i = 0; i < permutations.size(); i++)
|
|
|
{
|
|
|
- std::vector<T> currRow;
|
|
|
-
|
|
|
- T g = oldValues[i];
|
|
|
-
|
|
|
- size_t last =
|
|
|
- (inverted ?
|
|
|
- permutations[i].size() - 1 :
|
|
|
- permutations.size() - 1);
|
|
|
+ size_t last = permutations[i].size() - 1;
|
|
|
for (size_t j = 0; j < permutations[i].size(); j++)
|
|
|
{
|
|
|
- T element;
|
|
|
-
|
|
|
if (!cancelOut)
|
|
|
{
|
|
|
seeds[i][j].set_random();
|
|
|
}
|
|
|
- else if (inverted && j != last)
|
|
|
+ else if (j != last)
|
|
|
{
|
|
|
seeds[i][j].set_random();
|
|
|
seeds[i][last] = seeds[i][last] - seeds[i][j];
|
|
|
}
|
|
|
- else if (!inverted && i != last)
|
|
|
- {
|
|
|
- seeds[i][j].set_random();
|
|
|
- seeds[last][j] = seeds[last][j] - seeds[i][j];
|
|
|
- }
|
|
|
|
|
|
- element = encrypt<T>(g, h, permutations[i][j], seeds[i][j]);
|
|
|
-
|
|
|
- currRow.push_back(element);
|
|
|
+ retval[i][j] = oldValues[j] * permutations[j][i] + h * seeds[i][j];
|
|
|
}
|
|
|
-
|
|
|
- retval.push_back(currRow);
|
|
|
- }
|
|
|
-
|
|
|
-
|
|
|
- * is transposed of the actual result we want
|
|
|
- * (where you can fold a row into the correct value,
|
|
|
- * instead of folding a column).
|
|
|
- * "inverted" is true when we need this transposed version
|
|
|
- * (right multiplication by P^T, or left multiplication by P) */
|
|
|
- if (!inverted)
|
|
|
- {
|
|
|
- retval = transpose_matrix<T>(retval);
|
|
|
- seeds = transpose_matrix<Scalar>(seeds);
|
|
|
- }
|
|
|
-
|
|
|
- return retval;
|
|
|
-}
|
|
|
-
|
|
|
-template <typename T>
|
|
|
-std::vector<std::vector<T>> PrsonaServer::transpose_matrix(
|
|
|
- const std::vector<std::vector<T>>& input) const
|
|
|
-{
|
|
|
- std::vector<std::vector<T>> retval;
|
|
|
-
|
|
|
- for (size_t i = 0; i < input.size(); i++)
|
|
|
- {
|
|
|
- std::vector<T> currRow;
|
|
|
- for (size_t j = 0; j < input[i].size(); j++)
|
|
|
- currRow.push_back(input[j][i]);
|
|
|
- retval.push_back(currRow);
|
|
|
}
|
|
|
|
|
|
return retval;
|
|
@@ -1263,13 +1224,6 @@ std::vector<size_t> PrsonaServer::sort_data(const std::vector<Curvepoint>& input
|
|
|
return retval;
|
|
|
}
|
|
|
|
|
|
-template <typename T>
|
|
|
-T PrsonaServer::encrypt(
|
|
|
- const T& g, const T& h, const Scalar& plaintext, const Scalar& lambda) const
|
|
|
-{
|
|
|
- return g * plaintext + h * lambda;
|
|
|
-}
|
|
|
-
|
|
|
bool PrsonaServer::update_data(
|
|
|
const std::vector<std::vector<Curvepoint>>& freshPseudonymCommits,
|
|
|
const std::vector<std::vector<TwistBipoint>>& serverTallyCommits,
|