mpc_inner_product_proof_random.sage 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  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() for _ in range(0, int(n/2))])
  11. Q = to_ec_shares_list([CurvePoint.generator()])
  12. Q1 = to_ec_shares_list([CurvePoint.random() for _ in range(len(Q))])
  13. Q2 = [q - q1 for q, q1 in zip(Q, Q1)]
  14. H = to_ec_shares_list([CurvePoint.generator() for i in range(0,n)])
  15. H1 = to_ec_shares_list([CurvePoint.random() for i in range(0,n)])
  16. H2 = [h - h1 for h, h1 in zip(H, H1)]
  17. G = to_ec_shares_list([CurvePoint.generator() for i in range(0,n)])
  18. G1 = to_ec_shares_list([CurvePoint.random() for i in range(0,n)])
  19. G2 = [g - g1 for g, g1 in zip(G, G1)]
  20. ## source
  21. source = Source(p)
  22. ## alpha
  23. party0_val = [random.randint(0,p) for _ in range(0,n)]
  24. party1_val = [random.randint(0,p) for _ in range(0,n)]
  25. party0_random = [random.randint(0,p) for _ in range(0,n)]
  26. alpha1 = [AuthenticatedShare(party0_random[i], source, 0) for i in range(0,n)]
  27. alpha2 = [AuthenticatedShare(party0_val[i] - party0_random[i], source, 0) for i in range(0,n)]
  28. #print('alpha2: {}'.format(alpha2))
  29. a_shares = [alpha1, alpha2]
  30. #print('a shares: {}'.format(a_shares))
  31. ## beta
  32. party1_random = [random.randint(0,p) for _ in range(0,n)]
  33. beta1 = [AuthenticatedShare(party1_random[i], source, 1) for i in range(0,n)]
  34. beta2 = [AuthenticatedShare(party1_val[i] - party1_random[i], source, 1) for i in range(0,n)]
  35. b_shares = [beta1, beta2]
  36. #print('b shares: {}'.format(b_shares))
  37. ## c
  38. 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])]
  39. 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])]
  40. ##
  41. 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)]
  42. 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)]
  43. party_0_c_share = [sum_shares(party_0_c_shares, source, 0)]
  44. party_1_c_share = [sum_shares(party_1_c_shares, source, 1)]
  45. ##
  46. y_inv = K(1)
  47. ##
  48. G_factors = [K(1)]*n
  49. H_factors = [y_inv**i for i in range(0,n)]
  50. ##
  51. party_0_b_prime_shares = [b_share.mul_scalar(y) for b_share, y in zip(b_shares[0], H_factors)]
  52. party_0_a_prime_shares = a_shares[0].copy()
  53. ##
  54. party_1_b_prime_shares = [b_share.mul_scalar(y) for b_share, y in zip(b_shares[1], H_factors)]
  55. party_1_a_prime_shares = a_shares[1].copy()
  56. ##
  57. party_0_g_a_prime_shares = MSM(G1, party_0_a_prime_shares, source, 0)
  58. party_0_h_b_prime_shares = MSM(H1, party_0_b_prime_shares, source, 0)
  59. party_0_q_c_shares = MSM(Q1, party_0_c_share, source, 0)
  60. ##
  61. party_1_g_a_prime_shares = MSM(G2, party_1_a_prime_shares, source, 1)
  62. party_1_h_b_prime_shares = MSM(H2, party_1_b_prime_shares, source, 1)
  63. party_1_q_c_shares = MSM(Q2, party_1_c_share, source, 1)
  64. ## msm multiplication shares announcement for g_a_prime_shares
  65. 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]
  66. 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]
  67. party_0_g_a_prime_shares_lhs = party_0_g_a_prime_shares.msm(party_1_g_a_prime_shares_de)
  68. party_1_g_a_prime_shares_rhs = party_1_g_a_prime_shares.msm(party_0_g_a_prime_shares_de)
  69. g_a_prime = party_0_g_a_prime_shares_lhs.authenticated_open(party_1_g_a_prime_shares_rhs)
  70. ## msm multiplication shares announcement for g_b_prime_shares
  71. 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]
  72. 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]
  73. party_0_h_b_prime_shares_lhs = party_0_h_b_prime_shares.msm(party_1_h_b_prime_shares_de)
  74. party_1_h_b_prime_shares_rhs = party_1_h_b_prime_shares.msm(party_0_h_b_prime_shares_de)
  75. h_b_prime = party_0_h_b_prime_shares_lhs.authenticated_open(party_1_h_b_prime_shares_rhs)
  76. ## msm multiplication shares announcement for q_c_prime_shares
  77. 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]
  78. 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]
  79. party_0_q_c_shares_lhs = party_0_q_c_shares.msm(party_1_q_c_shares_de)
  80. party_1_q_c_shares_rhs = party_1_q_c_shares.msm(party_0_q_c_shares_de)
  81. q_c = party_0_q_c_shares_lhs.authenticated_open(party_1_q_c_shares_rhs)
  82. ## party 0 proof generation
  83. party_0_transcript = Transcript('bulletproof')
  84. party_0_proof = MpcProof(party_0_transcript, Q1, G_factors, H_factors, G1, H1, a_shares[0], b_shares[0], source, 0)
  85. ## party 1 proof generation
  86. party_1_transcript = Transcript('bulletproof')
  87. party_1_proof = MpcProof(party_1_transcript, Q2, G_factors, H_factors, G2, H2, a_shares[1], b_shares[1], source, 1)
  88. ## create proof L, R
  89. party_1_proof_c_l = party_1_proof.c_l.copy()
  90. party_1_proof_c_r = party_1_proof.c_r.copy()
  91. party_0_proof_c_l = party_0_proof.c_l.copy()
  92. party_0_proof_c_r = party_0_proof.c_r.copy()
  93. 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)]
  94. 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)]
  95. 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)]
  96. #print('c_l: {}'.format(c_l_res))
  97. 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)]
  98. 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)]
  99. 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)]
  100. #print('c_r: {}'.format(c_r_res))
  101. party_0_proof.create(party_1_proof_c_l, party_1_proof_c_r)
  102. party_1_proof.create(party_0_proof_c_l, party_0_proof_c_r)
  103. ## expected P
  104. expected_P = sum([g_a_prime, h_b_prime, q_c])
  105. ## party 0 proof verification
  106. party_0_verifier = Transcript('bulletproof')
  107. party_0_proof.calculate_c_shares(n, party_0_verifier, G_factors, H_factors)
  108. ## party 1 proof verification
  109. party_1_verifier = Transcript('bulletproof')
  110. party_1_proof.calculate_c_shares(n, party_1_verifier, G_factors, H_factors)
  111. ##
  112. 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]
  113. 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]
  114. ##
  115. party_1_proof_lhs = [[ii.copy() for ii in i] for i in party_1_proof.lhs]
  116. party_0_proof_lhs = [[ii.copy() for ii in i] for i in party_0_proof.lhs]
  117. party_1_proof_rhs = [[ii.copy() for ii in i] for i in party_1_proof.rhs]
  118. party_0_proof_rhs = [[ii.copy() for ii in i] for i in party_0_proof.rhs]
  119. # verify party 1 lpr
  120. party_0_proof.open_lr(Q1, G1, H1, party_1_c_shares_de ,party_1_proof_lhs, party_1_proof_rhs)
  121. # verify party 0 lpr
  122. party_1_proof.open_lr(Q2, G2, H2, party_0_c_shares_de, party_0_proof_lhs, party_0_proof_rhs)
  123. party_0_proof_l = party_0_proof.L
  124. party_1_proof_l = party_1_proof.L
  125. 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))
  126. party_0_proof_r = party_0_proof.R
  127. party_1_proof_r = party_1_proof.R
  128. 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))
  129. # validate proofs
  130. party_0_proof.open_and_validate_P(party_1_proof.res_p, expected_P)