mpc_inner_product_proof.sage 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213
  1. load('../mpc/curve.sage')
  2. load('proof.sage')
  3. load('transcript.sage')
  4. load('../mpc/beaver.sage')
  5. load('proof_mpc.sage')
  6. import gc
  7. import numpy as np
  8. ##
  9. n = 2
  10. #Q = to_ec_shares_list([CurvePoint.generator()])
  11. #H = to_ec_shares_list([CurvePoint.generator() for i in range(0,n)])
  12. #G = to_ec_shares_list([CurvePoint.generator() for i in range(0,n)])
  13. Q = to_ec_shares_list([CurvePoint.generator()])
  14. Q1 = to_ec_shares_list([CurvePoint.random()])
  15. Q2 = [q - q1 for q, q1 in zip(Q, Q1)]
  16. H = to_ec_shares_list([CurvePoint.generator() for i in range(0,n)])
  17. H1 = to_ec_shares_list([CurvePoint.random() for i in range(0,n)])
  18. H2 = [h - h1 for h, h1 in zip(H, H1)]
  19. G = to_ec_shares_list([CurvePoint.generator() for i in range(0,n)])
  20. G1 = to_ec_shares_list([CurvePoint.random() for i in range(0,n)])
  21. G2 = [g - g1 for g, g1 in zip(G, G1)]
  22. ## source
  23. source = TestSource()
  24. ## alpha
  25. party0_val = [1,2]
  26. party1_val = [2,4]
  27. party0_random = [random.randint(0,p) for _ in range(0,n)]
  28. alpha1 = [AuthenticatedShare(party0_random[i], source, 0) for i in range(0,n)]
  29. alpha2 = [AuthenticatedShare(party0_val[i] - party0_random[i], source, 0) for i in range(0,n)]
  30. #print('alpha2: {}'.format(alpha2))
  31. a_shares = [alpha1, alpha2]
  32. #print('a shares: {}'.format(a_shares))
  33. ## beta
  34. party1_random = [random.randint(0,p) for _ in range(0,n)]
  35. beta1 = [AuthenticatedShare(party1_random[i], source, 1) for i in range(0,n)]
  36. beta2 = [AuthenticatedShare(party1_val[i] - party1_random[i], source, 1) for i in range(0,n)]
  37. b_shares = [beta1, beta2]
  38. #print('b shares: {}'.format(b_shares))
  39. ## c
  40. my_c_shares = [MultiplicationAuthenticatedShares(a_share, b_share, source.triplet(0), 0) for a_share, b_share in zip(a_shares[0], b_shares[0])]
  41. their_c_shares = [MultiplicationAuthenticatedShares(peer_a_share, peer_b_share, source.triplet(0), 1) for peer_a_share, peer_b_share in zip(a_shares[1], b_shares[1])]
  42. ##
  43. party_0_c_shares = [my_c_share.mul(their_c_share.d.copy(), their_c_share.e.copy()) for my_c_share, their_c_share in zip(my_c_shares, their_c_shares)]
  44. party_1_c_shares = [their_c_share.mul(my_c_share.d.copy(), my_c_share.e.copy()) for my_c_share, their_c_share in zip(my_c_shares, their_c_shares)]
  45. party_0_c_share = [sum_shares(party_0_c_shares, source, 0)]
  46. party_1_c_share = [sum_shares(party_1_c_shares, source, 1)]
  47. ##
  48. y_inv = K(1)
  49. ##
  50. G_factors = [K(1)]*n
  51. H_factors = [y_inv**i for i in range(0,n)]
  52. ##
  53. party_0_b_prime_shares = [b_share.mul_scalar(y) for b_share, y in zip(b_shares[0], H_factors)]
  54. party_0_a_prime_shares = a_shares[0].copy()
  55. ##
  56. party_1_b_prime_shares = [b_share.mul_scalar(y) for b_share, y in zip(b_shares[1], H_factors)]
  57. party_1_a_prime_shares = a_shares[1].copy()
  58. ##
  59. party_0_g_a_prime_shares = MSM(G1, party_0_a_prime_shares, source, 0)
  60. party_0_h_b_prime_shares = MSM(H1, party_0_b_prime_shares, source, 0)
  61. party_0_q_c_shares = MSM(Q1, party_0_c_share, source, 0)
  62. ##
  63. party_1_g_a_prime_shares = MSM(G2, party_1_a_prime_shares, source, 1)
  64. party_1_h_b_prime_shares = MSM(H2, party_1_b_prime_shares, source, 1)
  65. party_1_q_c_shares = MSM(Q2, party_1_c_share, source, 1)
  66. ## msm multiplication shares announcement for g_a_prime_shares
  67. party_0_g_a_prime_shares_de = [[party_0_g_a_prime_share.d, party_0_g_a_prime_share.e] for party_0_g_a_prime_share in party_0_g_a_prime_shares.point_scalars]
  68. party_1_g_a_prime_shares_de = [[party_1_g_a_prime_share.d, party_1_g_a_prime_share.e] for party_1_g_a_prime_share in party_1_g_a_prime_shares.point_scalars]
  69. party_0_g_a_prime_shares_lhs = party_0_g_a_prime_shares.msm(party_1_g_a_prime_shares_de)
  70. party_1_g_a_prime_shares_rhs = party_1_g_a_prime_shares.msm(party_0_g_a_prime_shares_de)
  71. g_a_prime = party_0_g_a_prime_shares_lhs.authenticated_open(party_1_g_a_prime_shares_rhs)
  72. ## msm multiplication shares announcement for g_b_prime_shares
  73. party_0_h_b_prime_shares_de = [[party_0_h_b_prime_share.d, party_0_h_b_prime_share.e] for party_0_h_b_prime_share in party_0_h_b_prime_shares.point_scalars]
  74. party_1_h_b_prime_shares_de = [[party_1_h_b_prime_share.d, party_1_h_b_prime_share.e] for party_1_h_b_prime_share in party_1_h_b_prime_shares.point_scalars]
  75. party_0_h_b_prime_shares_lhs = party_0_h_b_prime_shares.msm(party_1_h_b_prime_shares_de)
  76. party_1_h_b_prime_shares_rhs = party_1_h_b_prime_shares.msm(party_0_h_b_prime_shares_de)
  77. h_b_prime = party_0_h_b_prime_shares_lhs.authenticated_open(party_1_h_b_prime_shares_rhs)
  78. ## msm multiplication shares announcement for q_c_prime_shares
  79. party_0_q_c_shares_de = [[party_0_q_c_share.d, party_0_q_c_share.e] for party_0_q_c_share in party_0_q_c_shares.point_scalars]
  80. party_1_q_c_shares_de = [[party_1_q_c_share.d, party_1_q_c_share.e] for party_1_q_c_share in party_1_q_c_shares.point_scalars]
  81. party_0_q_c_shares_lhs = party_0_q_c_shares.msm(party_1_q_c_shares_de)
  82. party_1_q_c_shares_rhs = party_1_q_c_shares.msm(party_0_q_c_shares_de)
  83. q_c = party_0_q_c_shares_lhs.authenticated_open(party_1_q_c_shares_rhs)
  84. ## party 0 proof generation
  85. party_0_transcript = Transcript('bulletproof')
  86. party_0_proof = MpcProof(party_0_transcript, Q1, G_factors, H_factors, G1, H1, a_shares[0], b_shares[0], source, 0)
  87. ## party 1 proof generation
  88. party_1_transcript = Transcript('bulletproof')
  89. party_1_proof = MpcProof(party_1_transcript, Q2, G_factors, H_factors, G2, H2, a_shares[1], b_shares[1], source, 1)
  90. ## create proof L, R
  91. party_1_proof_c_l = party_1_proof.c_l.copy()
  92. party_1_proof_c_r = party_1_proof.c_r.copy()
  93. party_0_proof_c_l = party_0_proof.c_l.copy()
  94. party_0_proof_c_r = party_0_proof.c_r.copy()
  95. c_l_lhs = [party_0_proof_c_l_i[0].mul(party_1_proof_c_l_i[0].d, party_1_proof_c_l_i[0].e) for party_0_proof_c_l_i, party_1_proof_c_l_i in zip(party_0_proof_c_l, party_1_proof_c_l)]
  96. c_l_rhs = [party_1_proof_c_l_i[0].mul(party_0_proof_c_l_i[0].d, party_0_proof_c_l_i[0].e) for party_1_proof_c_l_i, party_0_proof_c_l_i in zip(party_1_proof_c_l, party_0_proof_c_l)]
  97. c_l_res = [c_l_lhs_i.authenticated_open(c_l_rhs_i) for c_l_lhs_i, c_l_rhs_i in zip(c_l_lhs, c_l_rhs)]
  98. #print('c_l: {}'.format(c_l_res))
  99. c_r_lhs = [party_0_proof_c_r_i[0].mul(party_1_proof_c_r_i[0].d, party_1_proof_c_r_i[0].e) for party_0_proof_c_r_i, party_1_proof_c_r_i in zip(party_0_proof_c_r, party_1_proof_c_r)]
  100. c_r_rhs = [party_1_proof_c_r_i[0].mul(party_0_proof_c_r_i[0].d, party_0_proof_c_r_i[0].e) for party_1_proof_c_r_i, party_0_proof_c_r_i in zip(party_1_proof_c_r, party_0_proof_c_r)]
  101. c_r_res = [c_r_lhs_i.authenticated_open(c_r_rhs_i) for c_r_lhs_i, c_r_rhs_i in zip(c_r_lhs, c_r_rhs)]
  102. #print('c_r: {}'.format(c_r_res))
  103. party_0_proof.create(party_1_proof_c_l, party_1_proof_c_r)
  104. party_1_proof.create(party_0_proof_c_l, party_0_proof_c_r)
  105. # validate L_gr_al_g
  106. L_gr_al_g_truth_table = [874739451078007766457464989774322083649278607533249481151382481072868806602, 152666792071518830868575557812948353041420400780739481342941381225525861407 , 1]
  107. L_gr_al_g_lhs = party_0_proof.L_gr_al_g_share.copy().msm(party_1_proof.L_gr_al_g_share.copy().de())
  108. L_gr_al_g_rhs = party_1_proof.L_gr_al_g_share.copy().msm(party_0_proof.L_gr_al_g_share.copy().de())
  109. L_gr_al_g = L_gr_al_g_lhs.authenticated_open(L_gr_al_g_rhs)
  110. assert L_gr_al_g[0] == L_gr_al_g_truth_table[0] and L_gr_al_g[1] == L_gr_al_g_truth_table[1], 'L_gr_al_g: {}'.format(L_gr_al_g)
  111. # validate L_hl_br_h
  112. L_hl_br_h_truth_table = [296568192680735721663075531306405401515803196637037431012739700151231900092, 2496008012906462030584867856951610048657271546413643307709739611216909709750, 1]
  113. L_hl_br_h_lhs = party_0_proof.L_hl_br_h_share.copy().msm(party_1_proof.L_hl_br_h_share.copy().de())
  114. L_hl_br_h_rhs = party_1_proof.L_hl_br_h_share.copy().msm(party_0_proof.L_hl_br_h_share.copy().de())
  115. L_hl_br_h = L_hl_br_h_lhs.authenticated_open(L_hl_br_h_rhs)
  116. assert L_hl_br_h[0] == L_hl_br_h_truth_table[0] and L_hl_br_h[1] == L_hl_br_h_truth_table[1], 'L_hl_br_h: {}'.format(L_hl_br_h)
  117. # validate L_q_cl
  118. L_q_cl_truth_table = [296568192680735721663075531306405401515803196637037431012739700151231900092, 2496008012906462030584867856951610048657271546413643307709739611216909709750, 1]
  119. L_q_cl_lhs = party_0_proof.L_q_cl_share.copy().msm(party_1_proof.L_q_cl_share.copy().de())
  120. L_q_cl_rhs = party_1_proof.L_q_cl_share.copy().msm(party_0_proof.L_q_cl_share.copy().de())
  121. L_q_cl = L_q_cl_lhs.authenticated_open(L_q_cl_rhs)
  122. assert L_q_cl[0] == L_q_cl_truth_table[0] and L_q_cl[1] == L_q_cl_truth_table[1], 'L_q_cl: {}'.format(L_q_cl)
  123. #validate R_gl_ar_g
  124. R_gl_ar_g_truth_table = [3324833730090626974525872402899302150520188025637965566623476530814354734325, 3147007486456030910661996439995670279305852583596209647900952752170983517249, 1]
  125. R_gl_ar_g_lhs = party_0_proof.R_gl_ar_g_share.copy().msm(party_1_proof.R_gl_ar_g_share.copy().de())
  126. R_gl_ar_g_rhs = party_1_proof.R_gl_ar_g_share.copy().msm(party_0_proof.R_gl_ar_g_share.copy().de())
  127. print(R_gl_ar_g_lhs)
  128. print(R_gl_ar_g_rhs)
  129. R_gl_ar_g = R_gl_ar_g_lhs.authenticated_open(R_gl_ar_g_rhs)
  130. assert R_gl_ar_g[0] == R_gl_ar_g_truth_table[0] and R_gl_ar_g[1] == R_gl_ar_g_truth_table[1], 'R_gl_ar_g: {}'.format(R_gl_ar_g)
  131. #validate R_hr_bl_h
  132. R_hr_bl_h_truth_table = [3324833730090626974525872402899302150520188025637965566623476530814354734325, 3147007486456030910661996439995670279305852583596209647900952752170983517249, 1]
  133. R_hr_bl_h_lhs = party_0_proof.R_hr_bl_h_share.copy().msm(party_1_proof.R_hr_bl_h_share.copy().de())
  134. R_hr_bl_h_rhs = party_1_proof.R_hr_bl_h_share.copy().msm(party_0_proof.R_hr_bl_h_share.copy().de())
  135. R_hr_bl_h = R_hr_bl_h_lhs.authenticated_open(R_hr_bl_h_rhs)
  136. assert R_hr_bl_h[0] == R_hr_bl_h_truth_table[0] and R_hr_bl_h[1] == R_hr_bl_h_truth_table[1], 'R_hr_bl_h: {}'.format(R_hr_bl_h)
  137. #validate R_q_cr
  138. R_q_cr_truth_table = [296568192680735721663075531306405401515803196637037431012739700151231900092, 2496008012906462030584867856951610048657271546413643307709739611216909709750, 1]
  139. R_q_cr_lhs = party_0_proof.R_q_cr_share.copy().msm(party_1_proof.R_q_cr_share.copy().de())
  140. R_q_cr_rhs = party_1_proof.R_q_cr_share.copy().msm(party_0_proof.R_q_cr_share.copy().de())
  141. R_q_cr = R_q_cr_lhs.authenticated_open(R_q_cr_rhs)
  142. print(R_q_cr_lhs)
  143. print(R_q_cr_rhs)
  144. assert R_q_cr[0] == R_q_cr_truth_table[0] and R_q_cr[1] == R_q_cr_truth_table[1], 'R_q_cr: {}'.format(R_q_cr)
  145. # validate L,R
  146. L_truth_table = [944745129853146482146311827146531433242387523423467361347719369673366386761, 2394221861052833782597287772330532919046009427329165562185942323334687758988, 1]
  147. R_truth_table = [3136030469135674343172465880817263454880219855664441593466904169223571314065, 3230850854683103635133032411878658931556916918508772276704988424959453909526, 1]
  148. L = []
  149. R = []
  150. for party_0_proof_lhs, party_1_proof_lhs in zip(party_0_proof.lhs, party_1_proof.lhs):
  151. l_i_l = []
  152. for i in range(len(party_0_proof_lhs)):
  153. l_i_l_0_lhs = party_0_proof_lhs[i].copy().msm(party_1_proof_lhs[i].de())
  154. l_i_l_1_rhs = party_1_proof_lhs[i].copy().msm(party_0_proof_lhs[i].de())
  155. l_i_l += [l_i_l_0_lhs.authenticated_open(l_i_l_1_rhs)]
  156. L += [sum(l_i_l)]
  157. assert L[0][0] == L_truth_table[0] and L[0][1] == L_truth_table[1], 'L: {}'.format(L)
  158. for party_0_proof_rhs, party_1_proof_rhs in zip(party_0_proof.rhs, party_1_proof.rhs):
  159. r_i_l = []
  160. for i in range(len(party_0_proof_rhs)):
  161. r_i_l_lhs = party_0_proof_rhs[i].copy().msm(party_1_proof_rhs[i].de())
  162. r_i_l_rhs = party_1_proof_rhs[i].copy().msm(party_0_proof_rhs[i].de())
  163. r_i_l += [r_i_l_lhs.authenticated_open(r_i_l_rhs)]
  164. R += [sum(r_i_l)]
  165. assert R[0][0] == R_truth_table[0] and R[0][1] == R_truth_table[1], 'R: {}'.format(R)
  166. ## expected P
  167. expected_P = sum([g_a_prime, h_b_prime, q_c])
  168. ## party 0 proof verification
  169. party_0_verifier = Transcript('bulletproof')
  170. party_0_proof.calculate_c_shares(n, party_0_verifier, G_factors, H_factors)
  171. ## party 1 proof verification
  172. party_1_verifier = Transcript('bulletproof')
  173. party_1_proof.calculate_c_shares(n, party_1_verifier, G_factors, H_factors)
  174. ##
  175. party_0_c_shares_de = [[my_c_share.d.copy(), my_c_share.e.copy()] for my_c_share in party_0_proof.my_c_shares]
  176. party_1_c_shares_de = [[my_c_share.d.copy(), my_c_share.e.copy()] for my_c_share in party_1_proof.my_c_shares]
  177. ##
  178. party_1_proof_lhs = [[ii.copy() for ii in i] for i in party_1_proof.lhs]
  179. party_0_proof_lhs = [[ii.copy() for ii in i] for i in party_0_proof.lhs]
  180. party_1_proof_rhs = [[ii.copy() for ii in i] for i in party_1_proof.rhs]
  181. party_0_proof_rhs = [[ii.copy() for ii in i] for i in party_0_proof.rhs]
  182. # verify party 1 lpr
  183. party_0_proof.open_lr(Q1, G1, H1, party_1_c_shares_de ,party_1_proof_lhs, party_1_proof_rhs)
  184. # verify party 0 lpr
  185. party_1_proof.open_lr(Q2, G2, H2, party_0_c_shares_de, party_0_proof_lhs, party_0_proof_rhs)
  186. party_0_proof_l = party_0_proof.L
  187. party_1_proof_l = party_1_proof.L
  188. L = sum(party_0_proof_l_i.authenticated_open(party_1_proof_l_i) for party_0_proof_l_i, party_1_proof_l_i in zip(party_0_proof_l, party_1_proof_l))
  189. party_0_proof_r = party_0_proof.R
  190. party_1_proof_r = party_1_proof.R
  191. R = sum(party_0_proof_r_i.authenticated_open(party_1_proof_r_i) for party_0_proof_r_i, party_1_proof_r_i in zip(party_0_proof_r, party_1_proof_r))
  192. # validate proofs
  193. party_0_proof.open_and_validate_P(party_1_proof.res_p, expected_P)