multiplicationL1.cpp 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370
  1. #include "multiplicationL1.hpp"
  2. //template <typename S, typename T>
  3. BitEvalL2 multiplicationL1 (BitEvalL1<curvepoint_fp_t> eval1, BitEvalL1<twistpoint_fp2_t> eval2, PublicKey public_key)
  4. {
  5. BitEvalL2 produit;
  6. F2 s=rand()%2;
  7. produit.set_bit_masque(eval1.get_bit_masque()*eval2.get_bit_masque()-s);
  8. Bipoint<curvepoint_fp_t> bipoint_curve_subgroupelt;
  9. Bipoint<twistpoint_fp2_t> bipoint_twist_subgroupelt;
  10. scalar_t lambda1, lambda2;
  11. scalar_setrandom(lambda1, bn_r);
  12. scalar_setrandom(lambda2, bn_r);
  13. bipoint_curve_subgroupelt.scalarmult_vartime(public_key.get_bipoint_curvegen(),lambda1); // calcul de u1
  14. bipoint_curve_subgroupelt.makeaffine();
  15. bipoint_twist_subgroupelt.scalarmult_vartime(public_key.get_bipoint_twistgen(),lambda2); // calcul de v1
  16. bipoint_twist_subgroupelt.makeaffine();
  17. public_key.get_bipoint_twist_groupelt().makeaffine();
  18. Quadripoint factor1, factor2, factor3, factor4, factor5;
  19. Bipoint<curvepoint_fp_t> chiffre_1_curve;
  20. Bipoint<twistpoint_fp2_t> chiffre_1_twist, chiffre_s;
  21. //calcul de e(beta_1,beta_2)
  22. factor1 = pairing(eval1.get_bipoint(),eval2.get_bipoint());
  23. //calcul de e(Enc(1), a1 beta2 + Enc(s))
  24. Bipoint<curvepoint_fp_t> temp1;
  25. Bipoint<twistpoint_fp2_t> temp2;
  26. chiffrement(chiffre_s,s, public_key);
  27. chiffre_s.makeaffine();
  28. chiffrement(chiffre_1_curve,1, public_key);
  29. temp1=chiffre_1_curve;
  30. temp1.makeaffine();
  31. if (eval1.get_bit_masque() == 1)
  32. {
  33. temp2 = eval2.get_bipoint()+chiffre_s;
  34. }
  35. else
  36. {
  37. temp2 = chiffre_s;
  38. }
  39. temp2.makeaffine();
  40. factor2 = pairing(temp1, temp2);
  41. //calcul de e(a2 beta1, Enc(1))
  42. Bipoint<curvepoint_fp_t> temp3; // les bipoints sont initialisés par défaut au bipoint à l'infini
  43. Bipoint<twistpoint_fp2_t> temp4;
  44. chiffrement(chiffre_1_twist,1, public_key);
  45. //F2 un;
  46. //dechiffrement(un,chiffre_1_twist,private_key);
  47. //zout(un);
  48. if (eval2.get_bit_masque() == 1) //sinon temp3 doit etre le bipoint à l'infini
  49. {
  50. temp3 = eval1.get_bipoint();
  51. }
  52. temp3.makeaffine();
  53. //temp3.print();
  54. temp4=chiffre_1_twist;
  55. temp4.makeaffine();
  56. //ecris(affichage de chiffre_1_twist);
  57. //temp4.print();
  58. factor3 = pairing(temp3, temp4);
  59. //ecris(affichage de pi_1(f3[0]));
  60. //private_key.pi_1(temp3).print(0);
  61. //ecris(affichage de pi_2(f3[1]));
  62. //private_key.pi_2(chiffre_1_twist).print();
  63. //ecris(affichage de e(pi_1(f3[0]),pi_2(f3[1])));
  64. //pairing(private_key.pi_1(temp3),private_key.pi_2(temp4)).print(0);
  65. //ecris(affichage de e(f3[0],f3[1]));
  66. //pairing(temp3,temp4).print(0);
  67. //ecris(affichage de pi_T(e(f3[0],f3[1])));
  68. //private_key.pi_T(pairing(temp3,temp4)).print(0);
  69. //calcul de e(u,v1)
  70. factor4 = pairing(public_key.get_bipoint_curve_groupelt(),bipoint_twist_subgroupelt);
  71. //calcul de e(u1,v)
  72. factor5 = pairing(bipoint_curve_subgroupelt,public_key.get_bipoint_twist_groupelt());
  73. produit.set_quadripoint(factor1*factor2*factor3*factor4*factor5);
  74. return produit;
  75. }
  76. BitEvalL2 multiplicationL1 (BitChiffre eval1, BitChiffre eval2, PublicKey public_key)
  77. {
  78. //signature;
  79. if (eval1.get_type() == CURVE && eval2.get_type() == TWIST)
  80. {
  81. BitEvalL2 produit;
  82. F2 s=rand()%2;
  83. //zout(s);
  84. //cout << "a1 = " << eval1.get_bit_masque() << endl;
  85. //cout << "a2 = " << eval2.get_bit_masque() << endl;
  86. //cin.ignore() ; //NB temps[] d'attente
  87. produit.set_bit_masque(eval1.get_bit_masque()*eval2.get_bit_masque()-s);
  88. //eval1.print_bit_masque();
  89. //eval2.print_bit_masque();
  90. //ecris(affichage de a1a2-s);
  91. //produit.print_bit_masque();
  92. Bipoint<curvepoint_fp_t> bipoint_curve_subgroupelt;
  93. Bipoint<twistpoint_fp2_t> bipoint_twist_subgroupelt;
  94. scalar_t lambda1, lambda2;
  95. scalar_setrandom(lambda1, bn_r);
  96. scalar_setrandom(lambda2, bn_r);
  97. //mpz_class mpz1, mpz2;
  98. //mpz1=scalar2mpz(lambda1);
  99. //mpz2=scalar2mpz(lambda2);
  100. //scalar_print(stdout,lambda1);
  101. //JUMP;
  102. //zout(mpz1);
  103. //scalar_print(stdout,lambda2);
  104. //JUMP;
  105. //zout(mpz2);
  106. bipoint_curve_subgroupelt.scalarmult_vartime(public_key.get_bipoint_curvegen(),lambda1); // calcul de u1
  107. bipoint_curve_subgroupelt.makeaffine();
  108. bipoint_twist_subgroupelt.scalarmult_vartime(public_key.get_bipoint_twistgen(),lambda2); // calcul de v1
  109. bipoint_twist_subgroupelt.makeaffine();
  110. public_key.get_bipoint_twist_groupelt().makeaffine();
  111. Quadripoint factor1, factor2, factor3, factor4, factor5;
  112. Bipoint<curvepoint_fp_t> chiffre_1_curve;
  113. Bipoint<twistpoint_fp2_t> chiffre_1_twist, chiffre_s;
  114. //calcul de e(beta_1,beta_2)
  115. factor1 = pairing(eval1.get_bipoint_curve(),eval2.get_bipoint_twist());
  116. //calcul de e(Enc(1), a1 beta2 + Enc(s))
  117. Bipoint<curvepoint_fp_t> temp1;
  118. Bipoint<twistpoint_fp2_t> temp2;
  119. chiffrement(chiffre_s,s, public_key);
  120. chiffre_s.makeaffine();
  121. chiffrement(chiffre_1_curve,1, public_key);
  122. temp1=chiffre_1_curve;
  123. temp1.makeaffine();
  124. if (eval1.get_bit_masque() == 1)
  125. {
  126. temp2 = eval2.get_bipoint_twist()+chiffre_s;
  127. }
  128. else
  129. {
  130. temp2 = chiffre_s;
  131. }
  132. temp2.makeaffine();
  133. factor2 = pairing(temp1, temp2);
  134. //calcul de e(a2 beta1, Enc(1))
  135. Bipoint<curvepoint_fp_t> temp3; // les bipoints sont initialisés par défaut au bipoint à l'infini
  136. Bipoint<twistpoint_fp2_t> temp4;
  137. chiffrement(chiffre_1_twist,1, public_key);
  138. //F2 un;
  139. //dechiffrement(un,chiffre_1_twist,private_key);
  140. //zout(un);
  141. if (eval2.get_bit_masque() == 1) //sinon temp3 doit etre le bipoint à l'infini
  142. {
  143. temp3 = eval1.get_bipoint_curve();
  144. }
  145. temp3.makeaffine();
  146. //temp3.print();
  147. temp4=chiffre_1_twist;
  148. temp4.makeaffine();
  149. //ecris(affichage de chiffre_1_twist);
  150. //temp4.print();
  151. factor3 = pairing(temp3, temp4);
  152. //ecris(affichage de pi_1(f3[0]));
  153. //private_key.pi_1(temp3).print(0);
  154. //ecris(affichage de pi_2(f3[1]));
  155. //private_key.pi_2(chiffre_1_twist).print();
  156. //ecris(affichage de e(pi_1(f3[0]),pi_2(f3[1])));
  157. //pairing(private_key.pi_1(temp3),private_key.pi_2(temp4)).print(0);
  158. //ecris(affichage de e(f3[0],f3[1]));
  159. //pairing(temp3,temp4).print(0);
  160. //ecris(affichage de pi_T(e(f3[0],f3[1])));
  161. //private_key.pi_T(pairing(temp3,temp4)).print(0);
  162. //calcul de e(u,v1)
  163. factor4 = pairing(public_key.get_bipoint_curve_groupelt(),bipoint_twist_subgroupelt);
  164. //calcul de e(u1,v)
  165. factor5 = pairing(bipoint_curve_subgroupelt,public_key.get_bipoint_twist_groupelt());
  166. //private_key.pi_1(bipoint_curve_subgroupelt).print();
  167. //private_key.pi_2(public_key.get_bipoint_twist_groupelt()).print();
  168. //ecris(affichage de e(pi_1(u),pi_2(v1)));
  169. //pairing(private_key.pi_1(private_key.pi_1(public_key.get_bipoint_curve_groupelt())),private_key.pi_2(bipoint_twist_subgroupelt)).print();
  170. //ecris(affichage de e(pi_1(u1),pi_2(v)));
  171. //pairing(private_key.pi_1(bipoint_curve_subgroupelt),private_key.pi_2(public_key.get_bipoint_twist_groupelt())).print();
  172. //ecris(affichage de e(-j1l1u1[0]+i1l1u1[1],-j2l2v[0]+i2l2v[1]));
  173. ////void curvepoint_fp_scalarmult_vartime(curvepoint_fp_t rop, const curvepoint_fp_t op, const scalar_t s);
  174. ////void curvepoint_fp_add_vartime(curvepoint_fp_t rop, const curvepoint_fp_t op1, const curvepoint_fp_t op2);
  175. ////void curvepoint_fp_neg(curvepoint_fp_t rop, const curvepoint_fp_t op);
  176. //curvepoint_fp_t tempc[6], op1;
  177. //twistpoint_fp2_t tempt[5], op2;
  178. //fp12e_t tempf[60], test, test2, test3, test4;
  179. //curvepoint_fp_neg(tempc[0],bipoint_curve_subgroupelt[0]);
  180. //curvepoint_fp_scalarmult_vartime(tempc[1],tempc[0],private_key.get("j1").scalar());
  181. //curvepoint_fp_scalarmult_vartime(tempc[2],tempc[1],private_key.get("l1").scalar());
  182. //curvepoint_fp_scalarmult_vartime(tempc[3],bipoint_curve_subgroupelt[1],private_key.get("i1").scalar());
  183. //curvepoint_fp_scalarmult_vartime(tempc[4],tempc[3],private_key.get("l1").scalar());
  184. //curvepoint_fp_makeaffine(tempc[2]);curvepoint_fp_makeaffine(tempc[4]);
  185. //curvepoint_fp_add_vartime(op1,tempc[2],tempc[4]);
  186. //twistpoint_fp2_neg(tempt[0],public_key.get_bipoint_twist_groupelt()[0]);
  187. //twistpoint_fp2_scalarmult_vartime(tempt[1],tempt[0],private_key.get("j2").scalar());
  188. //twistpoint_fp2_scalarmult_vartime(tempt[2],tempt[1],private_key.get("l2").scalar());
  189. //twistpoint_fp2_scalarmult_vartime(tempt[3],public_key.get_bipoint_twist_groupelt()[1],private_key.get("i2").scalar());
  190. //twistpoint_fp2_scalarmult_vartime(tempt[4],tempt[3],private_key.get("l2").scalar());
  191. //twistpoint_fp2_add_vartime(op2,tempt[5],tempt[4]);
  192. //OptimalAte(test,op1,op2);
  193. //fp12e_print(stdout,test);
  194. //JUMP;
  195. //ecris(affichage de e(-j1l1u1[0],-j2l2v[0]+i2l2v[1])e(i1l1u1[1],-j2l2v[0]+i2l2v[1]));
  196. //OptimalAte(tempf[0],tempc[2],op2);
  197. //OptimalAte(tempf[1],tempc[4],op2);
  198. //fp12e_mul(test2,tempf[0],tempf[1]);
  199. //fp12e_print(stdout,test2);
  200. //JUMP;
  201. //ecris(affichage de e(-j1l1u1[0],-j2l2v[0])e(-j1l1u1[0],i2l2v[1])e(i1l1u1[1],-j2l2v[0])e(i1l1u1[1],i2l2v[1]));
  202. //OptimalAte(tempf[2],tempc[2],tempt[2]);
  203. //OptimalAte(tempf[3],tempc[2],tempt[4]);
  204. //OptimalAte(tempf[4],tempc[4],tempt[2]);
  205. //OptimalAte(tempf[5],tempc[4],tempt[4]);
  206. //fp12e_mul(tempf[6],tempf[2],tempf[3]);
  207. //fp12e_mul(tempf[7],tempf[4],tempf[5]);
  208. //fp12e_mul(test3,tempf[6],tempf[7]);
  209. //fp12e_print(stdout,test3);
  210. //JUMP;
  211. //ecris(affichage de e(u1[0],v[0])^((-j1l1)(-j2l2)) e(u1[0],v[1])^((-j1l1)(i2l2)) e(u1[1],v[0])^((i1l1)(-j2l2)) e(u1[1],v[1])^((i1l1)(i2l2)));
  212. //curvepoint_fp_makeaffine(bipoint_curve_subgroupelt[0]);curvepoint_fp_makeaffine(bipoint_curve_subgroupelt[1]);
  213. //twistpoint_fp2_makeaffine(public_key.get_bipoint_twist_groupelt()[0]);twistpoint_fp2_makeaffine(public_key.get_bipoint_twist_groupelt()[1]);
  214. //OptimalAte(tempf[8],bipoint_curve_subgroupelt[0],public_key.get_bipoint_twist_groupelt()[0]);
  215. //OptimalAte(tempf[9],bipoint_curve_subgroupelt[0],public_key.get_bipoint_twist_groupelt()[1]);
  216. //OptimalAte(tempf[10],bipoint_curve_subgroupelt[1],public_key.get_bipoint_twist_groupelt()[0]);
  217. //OptimalAte(tempf[11],bipoint_curve_subgroupelt[1],public_key.get_bipoint_twist_groupelt()[1]);
  218. //fp12e_invert(tempf[12],tempf[8]);
  219. //fp12e_pow_vartime(tempf[13],tempf[12],private_key.get("j1").scalar());
  220. //fp12e_pow_vartime(tempf[14],tempf[13],private_key.get("l1").scalar());
  221. //fp12e_invert(tempf[15],tempf[14]);
  222. //fp12e_pow_vartime(tempf[16],tempf[15],private_key.get("j2").scalar());
  223. //fp12e_pow_vartime(tempf[17],tempf[16],private_key.get("l2").scalar());
  224. //fp12e_invert(tempf[18],tempf[9]);
  225. //fp12e_pow_vartime(tempf[19],tempf[18],private_key.get("j1").scalar());
  226. //fp12e_pow_vartime(tempf[20],tempf[19],private_key.get("l1").scalar());
  227. //fp12e_pow_vartime(tempf[21],tempf[20],private_key.get("i2").scalar());
  228. //fp12e_pow_vartime(tempf[22],tempf[21],private_key.get("l2").scalar());
  229. //fp12e_invert(tempf[23],tempf[10]);
  230. //fp12e_pow_vartime(tempf[24],tempf[23],private_key.get("i1").scalar());
  231. //fp12e_pow_vartime(tempf[25],tempf[24],private_key.get("l1").scalar());
  232. //fp12e_pow_vartime(tempf[26],tempf[25],private_key.get("j2").scalar());
  233. //fp12e_pow_vartime(tempf[27],tempf[26],private_key.get("l2").scalar());
  234. //fp12e_pow_vartime(tempf[28],tempf[27],private_key.get("i1").scalar());
  235. //fp12e_pow_vartime(tempf[29],tempf[28],private_key.get("l1").scalar());
  236. //fp12e_pow_vartime(tempf[30],tempf[29],private_key.get("i2").scalar());
  237. //fp12e_pow_vartime(tempf[31],tempf[30],private_key.get("l2").scalar());
  238. //fp12e_mul(tempf[32],tempf[17],tempf[22]);
  239. //fp12e_mul(tempf[33],tempf[27],tempf[31]);
  240. //fp12e_mul(test4,tempf[32],tempf[33]);
  241. //fp12e_print(stdout,test4);
  242. //JUMP;
  243. //ecris(affichage de e(u1[0],v[0])^((-j1l1)(-j2l2)));
  244. //fp12e_print(stdout,tempf[17]);
  245. //JUMP;
  246. //ecris(affichage de e(-j1l1u1[0],-j2l2v[0]));
  247. //fp12e_print(stdout,tempf[6]);
  248. //JUMP;
  249. //zout(scalar2mpz(private_key.get("i1").scalar()));
  250. //zout(scalar2mpz(private_key.get("j1").scalar()));
  251. //zout(scalar2mpz(private_key.get("k1").scalar()));
  252. //zout(scalar2mpz(private_key.get("l1").scalar()));
  253. //zout(scalar2mpz(private_key.get("i2").scalar()));
  254. //zout(scalar2mpz(private_key.get("j2").scalar()));
  255. //zout(scalar2mpz(private_key.get("k2").scalar()));
  256. //zout(scalar2mpz(private_key.get("l2").scalar()));
  257. //ecris(affichage de e(u1[0],v[0])^j1);
  258. //fp12e_pow_vartime(tempf[34],tempf[8],private_key.get("j1").scalar());
  259. //fp12e_print(stdout,tempf[34]);
  260. //JUMP;
  261. //ecris(affichage de e(j1u1[0],v[0]));
  262. //curvepoint_fp_scalarmult_vartime(tempc[5],bipoint_curve_subgroupelt[0],private_key.get("j1").scalar());
  263. //curvepoint_fp_makeaffine(tempc[5]);
  264. //twistpoint_fp2_makeaffine(public_key.get_bipoint_twist_groupelt()[0]);
  265. //OptimalAte(tempf[36],tempc[5],public_key.get_bipoint_twist_groupelt()[0]);
  266. //fp12e_print(stdout,tempf[36]);
  267. //JUMP;
  268. //exit(0);
  269. //ecris(affichage de e(pi_1(u),pi_2(v)));
  270. //pairing(private_key.pi_1(public_key.get_bipoint_curve_groupelt()),private_key.pi_2(public_key.get_bipoint_twist_groupelt())).print(0);
  271. //ecris(affichage de (e(pi_1(u),pi_2(v)))^2);
  272. //pairing(private_key.pi_1(public_key.get_bipoint_curve_groupelt()),private_key.pi_2(public_key.get_bipoint_twist_groupelt())).square().print_point(0);
  273. //ecris(affichage de (e(pi_1(u),pi_2(v)))^3);
  274. //scalar_t trois; trois[0]=3;
  275. //pairing(private_key.pi_1(public_key.get_bipoint_curve_groupelt()),private_key.pi_2(public_key.get_bipoint_twist_groupelt())).pow_vartime(trois).print_point(0);
  276. //ecris(affichage de (e(pi_1(u),pi_2(v)))^4);
  277. //scalar_t quatre; quatre[0]=4;
  278. //pairing(private_key.pi_1(public_key.get_bipoint_curve_groupelt()),private_key.pi_2(public_key.get_bipoint_twist_groupelt())).pow_vartime(quatre).print_point(0);
  279. produit.set_quadripoint(factor1*factor2*factor3*factor4*factor5);
  280. return produit;
  281. }
  282. else
  283. {
  284. cout << "Problème de type dans multiplicationL1, le premier argument doit être un élément de type CURVE et le second, un élément de type TWIST" << endl;
  285. exit(0);
  286. }
  287. }