client.cpp 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217
  1. #include <iostream>
  2. #include "client.hpp"
  3. extern const curvepoint_fp_t bn_curvegen;
  4. const Curvepoint PrsonaClient::elGamalGenerator(bn_curvegen);
  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. longTermPrivateKey.set_random();
  11. decryption_memoizer[elGamalBlindGenerator * max_checked] = max_checked;
  12. }
  13. void PrsonaClient::set_malicious_server()
  14. {
  15. malicious_server = true;
  16. }
  17. void PrsonaClient::set_malicious_client()
  18. {
  19. malicious_client = true;
  20. }
  21. Curvepoint PrsonaClient::get_short_term_public_key(Proof &pi) const
  22. {
  23. pi = generate_stpk_proof();
  24. return currentFreshGenerator * longTermPrivateKey;
  25. }
  26. void PrsonaClient::make_votes(Proof& pi, std::vector<CurveBipoint>& encryptedVotes, const std::vector<Scalar>& vote, const std::vector<bool>& replace) const
  27. {
  28. encryptedVotes.clear();
  29. for (size_t i = 0; i < vote.size(); i++)
  30. {
  31. CurveBipoint currScore;
  32. if (replace[i])
  33. serverPublicKey.encrypt(currScore, vote[i]);
  34. else
  35. currScore = serverPublicKey.rerandomize(currEncryptedVotes[i]);
  36. encryptedVotes.push_back(currScore);
  37. }
  38. pi = generate_vote_proof(encryptedVotes, vote);
  39. }
  40. void PrsonaClient::receive_fresh_generator(const Proof& pi, const Curvepoint& freshGenerator)
  41. {
  42. if (!verify_generator_proof(pi, freshGenerator))
  43. {
  44. std::cerr << "Could not verify proof of valid fresh generator." << std::endl;
  45. return;
  46. }
  47. currentFreshGenerator = freshGenerator;
  48. }
  49. void PrsonaClient::receive_vote_tally(const Proof& pi, const EGCiphertext& score, bool isDefault)
  50. {
  51. if (isDefault)
  52. {
  53. if (!verify_default_tally_proof(pi, score))
  54. {
  55. std::cerr << "Could not verify proof of valid default tally." << std::endl;
  56. return;
  57. }
  58. }
  59. else
  60. {
  61. if (!verify_valid_tally_proof(pi, score))
  62. {
  63. std::cerr << "Could not verify proof of valid tally." << std::endl;
  64. return;
  65. }
  66. }
  67. currentEncryptedScore = score;
  68. decrypt_score(score);
  69. }
  70. void PrsonaClient::receive_encrypted_votes(const Proof& pi, const std::vector<CurveBipoint>& votes, bool isDefault)
  71. {
  72. if (isDefault)
  73. {
  74. if (!verify_default_votes_proof(pi, votes))
  75. {
  76. std::cerr << "Could not verify proof of valid default votes." << std::endl;
  77. return;
  78. }
  79. }
  80. else
  81. {
  82. if (!verify_valid_votes_proof(pi, votes))
  83. {
  84. std::cerr << "Could not verify proof of valid votes." << std::endl;
  85. return;
  86. }
  87. }
  88. currEncryptedVotes = votes;
  89. }
  90. Proof PrsonaClient::generate_reputation_proof() const
  91. {
  92. if (!malicious_client)
  93. return "PROOF";
  94. return "PROOF";
  95. }
  96. bool PrsonaClient::verify_reputation_proof(const Proof& pi, const Curvepoint& shortTermPublicKey) const
  97. {
  98. if (!malicious_client)
  99. return pi == "PROOF";
  100. return pi == "PROOF";
  101. }
  102. void PrsonaClient::decrypt_score(const EGCiphertext& score)
  103. {
  104. //TOFIX
  105. Curvepoint s, hashedDecrypted;
  106. Scalar decryptionKey = longTermPrivateKey;
  107. s = score.mask * decryptionKey;
  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. }