server.cpp 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193
  1. #include "server.hpp"
  2. extern const scalar_t bn_n;
  3. const Scalar PrsonaServer::scalarN(bn_n);
  4. extern const curvepoint_fp_t bn_curvegen;
  5. const Curvepoint PrsonaServer::elGamalGenerator(bn_curvegen);
  6. PrsonaServer::PrsonaServer()
  7. {
  8. Scalar lambda;
  9. lambda.set_random();
  10. elGamalBlindGenerator = elGamalGenerator * lambda;
  11. currentSeed.set_random();
  12. }
  13. Curvepoint PrsonaServer::get_blinding_generator() const
  14. {
  15. return elGamalBlindGenerator;
  16. }
  17. Curvepoint PrsonaServer::get_fresh_generator() const
  18. {
  19. return elGamalGenerator * currentSeed;
  20. }
  21. Curvepoint PrsonaServer::add_new_client(const Curvepoint& longTermPublicKey)
  22. {
  23. Curvepoint newPseudonym = longTermPublicKey * currentSeed;
  24. currentPseudonyms.push_back(newPseudonym);
  25. TwistBipoint newTalliedVote;
  26. encrypt(newTalliedVote, Scalar(0));
  27. previousVoteTally.push_back(newTalliedVote);
  28. CurveBipoint defaultVote;
  29. encrypt(defaultVote, Scalar(0));
  30. vector<CurveBipoint> newRow;
  31. for (size_t i = 0; i < voteMatrix.size(); i++)
  32. {
  33. rerandomize(defaultVote);
  34. voteMatrix[i].push_back(defaultVote);
  35. rerandomize(defaultVote);
  36. newRow.push_back(defaultVote);
  37. }
  38. rerandomize(defaultVote);
  39. newRow.push_back(defaultVote);
  40. voteMatrix.push_back(newRow);
  41. return newPseudonym;
  42. }
  43. vector<EGCiphertext> PrsonaServer::epoch()
  44. {
  45. Scalar inverseSeed = scalarN - currentSeed;
  46. Scalar nextSeed;
  47. nextSeed.set_random();
  48. vector<Quadripoint> BGNEncryptedTallies;
  49. vector<Scalar> decryptedTallies;
  50. vector<EGCiphertext> EGEncryptedTallies(currentPseudonyms.size());
  51. for (size_t i = 0; i < voteMatrix.size(); i++)
  52. {
  53. vector<Quadripoint> currTally;
  54. for (size_t j = 0; j < previousVoteTally.size(); j++)
  55. {
  56. Quadripoint curr;
  57. homomorphic_multiplication(curr, voteMatrix[j][i], previousVoteTally[j]);
  58. currTally.push_back(curr);
  59. }
  60. BGNEncryptedTallies.push_back(std::accumulate(currTally.begin(), currTally.end(), Quadripoint()));
  61. }
  62. for (size_t i = 0; i < currentPseudonyms.size(); i++)
  63. {
  64. currentPseudonyms[i] = currentPseudonyms[i] * nextSeed;
  65. decryptedTallies.push_back(decrypt(BGNEncryptedTallies[i]));
  66. }
  67. shuffle_vote_matrix(decryptedTallies);
  68. Curvepoint nextGenerator = elGamalGenerator * nextSeed;
  69. for (size_t i = 0; i < currentPseudonyms.size(); i++)
  70. {
  71. Scalar currMask;
  72. currMask.set_random();
  73. previousVoteTally[i] = encrypt(decryptedTallies[i]);
  74. EGEncryptedTallies[i].mask = currentPseudonyms[i] * currMask;
  75. EGEncryptedTallies[i].encryptedMessage = (nextGenerator * currMask) + (elGamalBlindGenerator * decryptedTallies[i]);
  76. }
  77. for (size_t i = 0; i < currentPseudonyms.size(); i++)
  78. {
  79. currentPseudonyms[i] = currentPseudonyms[i] * inverseSeed;
  80. EGEncryptedTallies[i].mask = EGEncryptedTallies[i].mask * inverseSeed;
  81. }
  82. shuffle_vote_matrix(EGEncryptedTallies);
  83. return EGEncryptedTallies;
  84. }
  85. template <typename T>
  86. void PrsonaServer::shuffle_vote_matrix(vector<T>& otherVector)
  87. {
  88. vector<sorting_t> sortTracker;
  89. for (size_t i = 0; i < currentPseudonyms.size(); i++)
  90. {
  91. sorting_t curr;
  92. curr.pseudonym = currentPseudonyms[i];
  93. curr.index = i;
  94. sortTracker.push_back(curr);
  95. }
  96. std::sort(sortTracker.begin(), sortTracker.end());
  97. vector<Curvepoint> newPseudonyms;
  98. vector<TwistBipoint> newVoteTallies;
  99. vector<vector<CurveBipoint>> newVoteMatrix;
  100. vector<T> newOtherVector;
  101. for (size_t i = 0; i < currentPseudonyms.size(); i++)
  102. {
  103. newPseudonyms.push_back(sortTracker[i].pseudonym);
  104. newVoteTallies.push_back(previousVoteTally[sortTracker[i].index]);
  105. newOtherVector.push_back(otherVector[sortTracker[i].index]);
  106. vector<CurveBipoint> currNewRow;
  107. for (size_t j = 0; j < currentPseudonyms.size(); j++)
  108. {
  109. currNewRow.push_back(voteMatrix[sortTracker[i].index][sortTracker[j].index]);
  110. }
  111. newVoteMatrix.push_back(currNewRow);
  112. }
  113. currentPseudonyms = newPseudonyms;
  114. previousVoteTally = newVoteTallies;
  115. voteMatrix = newVoteMatrix;
  116. otherVector = newOtherVector;
  117. rerandomize_vote_matrix();
  118. }
  119. void PrsonaServer::rerandomize_vote_matrix()
  120. {
  121. for (size_t i = 0; i < voteMatrix.size(); i++)
  122. {
  123. for (size_t j = 0; j < voteMatrix[0].size(); j++)
  124. {
  125. voteMatrix[i][j] = rerandomize(voteMatrix[i][j]);
  126. }
  127. }
  128. }
  129. void PrsonaServer::receive_vote(const Proof& pi, const vector<CurveBipoint>& votes, const Curvepoint& shortTermPublicKey)
  130. {
  131. if (!verify_vote_proof(pi, votes, shortTermPublicKey))
  132. return;
  133. size_t voteSubmitter = binary_search(shortTermPublicKey);
  134. voteMatrix[voteSubmitter] = votes;
  135. rerandomize_vote_matrix();
  136. }
  137. size_t PrsonaServer::binary_search(const Curvepoint& index) const
  138. {
  139. size_t lo, hi;
  140. lo = 0;
  141. hi = currentPseudonyms.size() - 1;
  142. while (lo < hi)
  143. {
  144. size_t mid = (lo + hi) / 2;
  145. if (currentPseudonyms[mid] < index)
  146. lo = mid + 1;
  147. else if (index == currentPseudonyms[mid])
  148. return mid;
  149. else hi = mid - 1;
  150. }
  151. return lo;
  152. }
  153. bool PrsonaServer::verify_vote_proof(const Proof& pi, const vector<CurveBipoint>& votes, const Curvepoint& shortTermPublicKey) const
  154. {
  155. }