multiplicationL1L2.cpp 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184
  1. #include "multiplicationL1L2.hpp"
  2. BitEvalL3 multiplicationL1L2 (BitEvalL1<curvepoint_fp_t> eval1, BitEvalL2 eval2, PublicKey public_key)
  3. {
  4. BitEvalL3 produit;
  5. //calcul de alpĥa
  6. Bipoint<curvepoint_fp_t> bipoint_curve_subgroupelt;
  7. Bipoint<twistpoint_fp2_t> bipoint_twist_subgroupelt;
  8. scalar_t lambda1, lambda2;
  9. scalar_setrandom(lambda1, bn_r);
  10. scalar_setrandom(lambda2, bn_r);
  11. bipoint_curve_subgroupelt.scalarmult_vartime(public_key.get_bipoint_curvegen(),lambda1); // calcul de u1
  12. bipoint_curve_subgroupelt.makeaffine();
  13. bipoint_twist_subgroupelt.scalarmult_vartime(public_key.get_bipoint_twistgen(),lambda2); // calcul de v1
  14. bipoint_twist_subgroupelt.makeaffine();
  15. Quadripoint factor1, factor2, factor3, factor4, factor5;
  16. //calcul de e(Enc(a1a2),Enc(1))
  17. Bipoint<curvepoint_fp_t> temp1, chiffre_produit; // les vec_bipoints sont initialisés par défaut au bipoint à l'infini
  18. Bipoint<twistpoint_fp2_t> temp2, chiffre_1_twist;
  19. chiffrement(chiffre_produit,eval1.get_bit_masque()*eval2.get_bit_masque(), public_key);
  20. temp1=chiffre_produit;
  21. chiffrement(chiffre_1_twist,1, public_key);
  22. temp2=chiffre_1_twist;
  23. temp1.makeaffine();
  24. temp2.makeaffine();
  25. factor1=pairing(temp1,temp2);
  26. //calcul de beta2^a1
  27. if (eval1.get_bit_masque() == 1) // sinon c'est (1,1,1,1)
  28. {
  29. factor2=eval2.get_quadripoint();
  30. }
  31. //calcul de e(a2 beta1, Enc(1)) //si CURVE et e(Enc(1),a2 beta1) si TWIST
  32. Bipoint<curvepoint_fp_t> temp3; // les vec_bipoints sont initialisés par défaut au bipoint à l'infini
  33. Bipoint<twistpoint_fp2_t> temp4;
  34. //chiffrement(chiffre_1_curve,1, public_key, CURVE);
  35. chiffrement(chiffre_1_twist,1, public_key);
  36. //if (eval1.get_type() == CURVE)
  37. //{
  38. if (eval2.get_bit_masque() == 1) //sinon temp3 doit etre le bipoint à l'infini
  39. {
  40. temp3 = eval1.get_bipoint();
  41. }
  42. temp4=chiffre_1_twist;
  43. //}
  44. //else // eval1.get_type() == TWIST
  45. //{
  46. //temp3=chiffre_1_curve.get_bipoint_curve();
  47. //if (eval2.get_bit_masque() == 1) //sinon temp3 doit etre le bipoint à l'infini
  48. //{
  49. //temp4 = eval1.get_bipoint_twist();
  50. //}
  51. //}
  52. temp3.makeaffine();
  53. temp4.makeaffine();
  54. factor3 = pairing(temp3, temp4);
  55. //calcul de e(u,v1)
  56. factor4 = pairing(public_key.get_bipoint_curve_groupelt(),bipoint_twist_subgroupelt);
  57. //calcul de e(u1,v)
  58. factor5 = pairing(bipoint_curve_subgroupelt,public_key.get_bipoint_twist_groupelt());
  59. produit.set_alpha(factor1*factor2*factor3*factor4*factor5);
  60. //calcul de beta
  61. //if (eval1.get_type() == CURVE)
  62. //{
  63. produit.set_bipoint_curve(eval1.get_bipoint());
  64. //}
  65. //else
  66. //{
  67. //produit.set_bipoint_twist(eval1.get_bipoint_twist());
  68. //}
  69. produit.set_quadripoint(eval2.get_quadripoint());
  70. return produit;
  71. }
  72. BitEvalL3 multiplicationL1L2 (BitChiffre eval1, BitEvalL2 eval2, PublicKey public_key)
  73. {
  74. BitEvalL3 produit;
  75. //calcul de alpĥa
  76. Bipoint<curvepoint_fp_t> bipoint_curve_subgroupelt;
  77. Bipoint<twistpoint_fp2_t> bipoint_twist_subgroupelt;
  78. scalar_t lambda1, lambda2;
  79. scalar_setrandom(lambda1, bn_r);
  80. scalar_setrandom(lambda2, bn_r);
  81. bipoint_curve_subgroupelt.scalarmult_vartime(public_key.get_bipoint_curvegen(),lambda1); // calcul de u1
  82. bipoint_curve_subgroupelt.makeaffine();
  83. bipoint_twist_subgroupelt.scalarmult_vartime(public_key.get_bipoint_twistgen(),lambda2); // calcul de v1
  84. bipoint_twist_subgroupelt.makeaffine();
  85. Quadripoint factor1, factor2, factor3, factor4, factor5;
  86. //calcul de e(Enc(a1a2),Enc(1))
  87. Bipoint<curvepoint_fp_t> temp1, chiffre_produit; // les vec_bipoints sont initialisés par défaut au bipoint à l'infini
  88. Bipoint<twistpoint_fp2_t> temp2, chiffre_1_twist;
  89. chiffrement(chiffre_produit,eval1.get_bit_masque()*eval2.get_bit_masque(), public_key);
  90. temp1=chiffre_produit;
  91. chiffrement(chiffre_1_twist,1, public_key);
  92. temp2=chiffre_1_twist;
  93. temp1.makeaffine();
  94. temp2.makeaffine();
  95. factor1=pairing(temp1,temp2);
  96. //calcul de beta2^a1
  97. if (eval1.get_bit_masque() == 1) // sinon c'est (1,1,1,1)
  98. {
  99. factor2=eval2.get_quadripoint();
  100. }
  101. //calcul de e(a2 beta1, Enc(1)) //si CURVE et e(Enc(1),a2 beta1) si TWIST
  102. Bipoint<curvepoint_fp_t> temp3; // les vec_bipoints sont initialisés par défaut au bipoint à l'infini
  103. Bipoint<twistpoint_fp2_t> temp4;
  104. //chiffrement(chiffre_1_curve,1, public_key, CURVE);
  105. chiffrement(chiffre_1_twist,1, public_key);
  106. //if (eval1.get_type() == CURVE)
  107. //{
  108. if (eval2.get_bit_masque() == 1) //sinon temp3 doit etre le bipoint à l'infini
  109. {
  110. temp3 = eval1.get_bipoint_curve();
  111. }
  112. temp4=chiffre_1_twist;
  113. //}
  114. //else // eval1.get_type() == TWIST
  115. //{
  116. //temp3=chiffre_1_curve.get_bipoint_curve();
  117. //if (eval2.get_bit_masque() == 1) //sinon temp3 doit etre le bipoint à l'infini
  118. //{
  119. //temp4 = eval1.get_bipoint_twist();
  120. //}
  121. //}
  122. temp3.makeaffine();
  123. temp4.makeaffine();
  124. factor3 = pairing(temp3, temp4);
  125. //calcul de e(u,v1)
  126. factor4 = pairing(public_key.get_bipoint_curve_groupelt(),bipoint_twist_subgroupelt);
  127. //calcul de e(u1,v)
  128. factor5 = pairing(bipoint_curve_subgroupelt,public_key.get_bipoint_twist_groupelt());
  129. produit.set_alpha(factor1*factor2*factor3*factor4*factor5);
  130. //calcul de beta
  131. //if (eval1.get_type() == CURVE)
  132. //{
  133. produit.set_bipoint_curve(eval1.get_bipoint_curve());
  134. //}
  135. //else
  136. //{
  137. //produit.set_bipoint_twist(eval1.get_bipoint_twist());
  138. //}
  139. produit.set_quadripoint(eval2.get_quadripoint());
  140. return produit;
  141. }