client.cpp 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220
  1. #include <iostream>
  2. #include "client.hpp"
  3. extern const curvepoint_fp_t bn_curvegen;
  4. Curvepoint PrsonaClient::elGamalGenerator = Curvepoint();
  5. bool PrsonaClient::malicious_server = false;
  6. bool PrsonaClient::malicious_client = false;
  7. PrsonaClient::PrsonaClient(const BGNPublicKey& serverPublicKey, const Curvepoint& elGamalBlindGenerator)
  8. : serverPublicKey(serverPublicKey), elGamalBlindGenerator(elGamalBlindGenerator), max_checked(0)
  9. {
  10. elGamalGenerator = Curvepoint(bn_curvegen);
  11. longTermPrivateKey.set_random();
  12. inversePrivateKey = longTermPrivateKey.curveInverse();
  13. decryption_memoizer[elGamalBlindGenerator * max_checked] = max_checked;
  14. }
  15. void PrsonaClient::set_malicious_server()
  16. {
  17. malicious_server = true;
  18. }
  19. void PrsonaClient::set_malicious_client()
  20. {
  21. malicious_client = true;
  22. }
  23. Curvepoint PrsonaClient::get_short_term_public_key(Proof &pi) const
  24. {
  25. pi = generate_stpk_proof();
  26. return currentFreshGenerator * longTermPrivateKey;
  27. }
  28. void PrsonaClient::make_votes(Proof& pi, std::vector<CurveBipoint>& encryptedVotes, const std::vector<Scalar>& vote, const std::vector<bool>& replace) const
  29. {
  30. encryptedVotes.clear();
  31. for (size_t i = 0; i < vote.size(); i++)
  32. {
  33. CurveBipoint currScore;
  34. if (replace[i])
  35. serverPublicKey.encrypt(currScore, vote[i]);
  36. else
  37. currScore = serverPublicKey.rerandomize(currEncryptedVotes[i]);
  38. encryptedVotes.push_back(currScore);
  39. }
  40. pi = generate_vote_proof(encryptedVotes, vote);
  41. }
  42. void PrsonaClient::receive_fresh_generator(const Proof& pi, const Curvepoint& freshGenerator)
  43. {
  44. if (!verify_generator_proof(pi, freshGenerator))
  45. {
  46. std::cerr << "Could not verify proof of valid fresh generator." << std::endl;
  47. return;
  48. }
  49. currentFreshGenerator = freshGenerator;
  50. }
  51. void PrsonaClient::receive_vote_tally(const Proof& pi, const EGCiphertext& score, bool isDefault)
  52. {
  53. if (isDefault)
  54. {
  55. if (!verify_default_tally_proof(pi, score))
  56. {
  57. std::cerr << "Could not verify proof of valid default tally." << std::endl;
  58. return;
  59. }
  60. }
  61. else
  62. {
  63. if (!verify_valid_tally_proof(pi, score))
  64. {
  65. std::cerr << "Could not verify proof of valid tally." << std::endl;
  66. return;
  67. }
  68. }
  69. currentEncryptedScore = score;
  70. decrypt_score(score);
  71. }
  72. void PrsonaClient::receive_encrypted_votes(const Proof& pi, const std::vector<CurveBipoint>& votes, bool isDefault)
  73. {
  74. if (isDefault)
  75. {
  76. if (!verify_default_votes_proof(pi, votes))
  77. {
  78. std::cerr << "Could not verify proof of valid default votes." << std::endl;
  79. return;
  80. }
  81. }
  82. else
  83. {
  84. if (!verify_valid_votes_proof(pi, votes))
  85. {
  86. std::cerr << "Could not verify proof of valid votes." << std::endl;
  87. return;
  88. }
  89. }
  90. currEncryptedVotes = votes;
  91. }
  92. Proof PrsonaClient::generate_reputation_proof() const
  93. {
  94. if (!malicious_client)
  95. return "PROOF";
  96. return "PROOF";
  97. }
  98. bool PrsonaClient::verify_reputation_proof(const Proof& pi, const Curvepoint& shortTermPublicKey) const
  99. {
  100. if (!malicious_client)
  101. return pi == "PROOF";
  102. return pi == "PROOF";
  103. }
  104. void PrsonaClient::decrypt_score(const EGCiphertext& score)
  105. {
  106. Curvepoint s, hashedDecrypted;
  107. s = score.mask * inversePrivateKey;
  108. hashedDecrypted = score.encryptedMessage - s;
  109. auto lookup = decryption_memoizer.find(hashedDecrypted);
  110. if (lookup != decryption_memoizer.end())
  111. {
  112. currentScore = lookup->second;
  113. return;
  114. }
  115. max_checked++;
  116. Curvepoint decryptionCandidate = elGamalBlindGenerator * max_checked;
  117. while (decryptionCandidate != hashedDecrypted)
  118. {
  119. decryption_memoizer[decryptionCandidate] = max_checked;
  120. decryptionCandidate = decryptionCandidate + elGamalBlindGenerator;
  121. max_checked++;
  122. }
  123. decryption_memoizer[decryptionCandidate] = max_checked;
  124. currentScore = max_checked;
  125. }
  126. Proof PrsonaClient::generate_stpk_proof() const
  127. {
  128. if (!malicious_client)
  129. return "PROOF";
  130. return "PROOF";
  131. }
  132. bool PrsonaClient::verify_generator_proof(const Proof& pi, const Curvepoint& generator) const
  133. {
  134. if (!malicious_server)
  135. return pi == "PROOF";
  136. return pi == "PROOF";
  137. }
  138. bool PrsonaClient::verify_default_tally_proof(const Proof& pi, const EGCiphertext& score) const
  139. {
  140. if (!malicious_server)
  141. return pi == "PROOF";
  142. return pi == "PROOF";
  143. }
  144. bool PrsonaClient::verify_valid_tally_proof(const Proof& pi, const EGCiphertext& score) const
  145. {
  146. if (!malicious_server)
  147. return pi == "PROOF";
  148. return pi == "PROOF";
  149. }
  150. bool PrsonaClient::verify_default_votes_proof(const Proof& pi, const std::vector<CurveBipoint>& votes) const
  151. {
  152. if (!malicious_server)
  153. return pi == "PROOF";
  154. return pi == "PROOF";
  155. }
  156. bool PrsonaClient::verify_valid_votes_proof(const Proof& pi, const std::vector<CurveBipoint>& votes) const
  157. {
  158. if (!malicious_server)
  159. return pi == "PROOF";
  160. return pi == "PROOF";
  161. }
  162. Proof PrsonaClient::generate_vote_proof(const std::vector<CurveBipoint>& encryptedVotes, const std::vector<Scalar>& vote) const
  163. {
  164. if (!malicious_client)
  165. return "PROOF";
  166. return "PROOF";
  167. }
  168. bool PrsonaClient::verify_score_proof(const Proof& pi) const
  169. {
  170. if (!malicious_server)
  171. return pi == "PROOF";
  172. return pi == "PROOF";
  173. }