|
@@ -8,7 +8,7 @@ load('../mpc/beaver.sage')
|
|
|
load('utils.sage')
|
|
load('utils.sage')
|
|
|
|
|
|
|
|
class MpcProof(object):
|
|
class MpcProof(object):
|
|
|
- def __init__(self, transcript, Q, G_factors, H_factors, G, H, a_shares, b_shares, source, party_id):
|
|
|
|
|
|
|
+ def __init__(self, transcript, Q_generator, G_factors, H_factors, G, H, a_shares, b_shares, source, party_id):
|
|
|
'''
|
|
'''
|
|
|
create inner product proof
|
|
create inner product proof
|
|
|
'''
|
|
'''
|
|
@@ -17,7 +17,7 @@ class MpcProof(object):
|
|
|
assert (self.n == len(H) == len(H_factors) == len(a_shares) == len(b_shares))
|
|
assert (self.n == len(H) == len(H_factors) == len(a_shares) == len(b_shares))
|
|
|
self.source = source
|
|
self.source = source
|
|
|
self.party_id=party_id
|
|
self.party_id=party_id
|
|
|
- self.Q = Q
|
|
|
|
|
|
|
+ self.Q = Q_generator
|
|
|
self.G = G
|
|
self.G = G
|
|
|
self.H = H
|
|
self.H = H
|
|
|
self.G_factors = G_factors
|
|
self.G_factors = G_factors
|
|
@@ -37,23 +37,25 @@ class MpcProof(object):
|
|
|
self.H_hist = []
|
|
self.H_hist = []
|
|
|
if self.n!=1:
|
|
if self.n!=1:
|
|
|
self.n /=2
|
|
self.n /=2
|
|
|
- a_shares_l, a_shares_r = a_shares[0:self.n], a_shares[self.n:]
|
|
|
|
|
- b_shares_l, b_shares_r = b_shares[0:self.n], b_shares[self.n:]
|
|
|
|
|
|
|
+ a_shares_l, a_shares_r = a_shares[0:self.n].copy(), a_shares[self.n:].copy()
|
|
|
|
|
+ b_shares_l, b_shares_r = b_shares[0:self.n].copy(), b_shares[self.n:].copy()
|
|
|
self.a_shares_l += [a_shares_l.copy()]
|
|
self.a_shares_l += [a_shares_l.copy()]
|
|
|
self.a_shares_r += [a_shares_r.copy()]
|
|
self.a_shares_r += [a_shares_r.copy()]
|
|
|
self.b_shares_l += [b_shares_l.copy()]
|
|
self.b_shares_l += [b_shares_l.copy()]
|
|
|
self.b_shares_r += [b_shares_r.copy()]
|
|
self.b_shares_r += [b_shares_r.copy()]
|
|
|
- G_l, G_r = G[0:self.n], G[self.n:]
|
|
|
|
|
- H_l, H_r = H[0:self.n], H[self.n:]
|
|
|
|
|
- self.G_hist+=[[G_l, G_r]]
|
|
|
|
|
- self.H_hist+=[[H_l, H_r]]
|
|
|
|
|
|
|
+ G_l, G_r = G[0:self.n].copy(), G[self.n:].copy()
|
|
|
|
|
+ H_l, H_r = H[0:self.n].copy(), H[self.n:].copy()
|
|
|
|
|
+ self.G_hist+=[[G_l.copy(), G_r.copy()]]
|
|
|
|
|
+ self.H_hist+=[[H_l.copy(), H_r.copy()]]
|
|
|
# authenticated inner product
|
|
# authenticated inner product
|
|
|
- #TODO multiplication
|
|
|
|
|
- c_shares_l = [MultiplicationAuthenticatedShares(a_share, b_share, self.source.triplet(self.party_id), self.party_id) for a_share, b_share in zip(a_shares_l, b_shares_r)]
|
|
|
|
|
- c_shares_r = [MultiplicationAuthenticatedShares(a_share, b_share, self.source.triplet(self.party_id), self.party_id) for a_share, b_share in zip(a_shares_r, b_shares_l)]
|
|
|
|
|
|
|
+ c_shares_l = [MultiplicationAuthenticatedShares(a_share, b_share, self.source.triplet(self.party_id), self.party_id) for a_share, b_share in zip(a_shares_l, b_shares_r)].copy()
|
|
|
|
|
+ c_shares_r = [MultiplicationAuthenticatedShares(a_share, b_share, self.source.triplet(self.party_id), self.party_id) for a_share, b_share in zip(a_shares_r, b_shares_l)].copy()
|
|
|
self.c_l += [c_shares_l]
|
|
self.c_l += [c_shares_l]
|
|
|
self.c_r += [c_shares_r]
|
|
self.c_r += [c_shares_r]
|
|
|
- u = K(1)
|
|
|
|
|
|
|
+ #verifier.append_message(b'L', bytes(''.join([l.__str__() for l in [self.L]]), encoding='utf-8'))
|
|
|
|
|
+ #verifier.append_message(b'R', bytes(''.join([r.__str__() for r in [self.R]]), encoding='utf-8'))
|
|
|
|
|
+ #u = K(verifier.challenge_bytes(b'u'))
|
|
|
|
|
+ u = K(1) #for testing purpose
|
|
|
u_inv = 1/u
|
|
u_inv = 1/u
|
|
|
|
|
|
|
|
for i in range(self.n):
|
|
for i in range(self.n):
|
|
@@ -82,13 +84,16 @@ class MpcProof(object):
|
|
|
self.b_shares_r += [b_shares_r.copy()]
|
|
self.b_shares_r += [b_shares_r.copy()]
|
|
|
G_l, G_r = G[0:self.n], G[self.n:] # G_prime_l, G_prime_r
|
|
G_l, G_r = G[0:self.n], G[self.n:] # G_prime_l, G_prime_r
|
|
|
H_l, H_r = H[0:self.n], H[self.n:] # H_prime_l, H_prime_r
|
|
H_l, H_r = H[0:self.n], H[self.n:] # H_prime_l, H_prime_r
|
|
|
- self.G_hist+=[[G_l, G_r]]
|
|
|
|
|
- self.H_hist+=[[H_l, H_r]]
|
|
|
|
|
|
|
+ self.G_hist += [[G_l, G_r]]
|
|
|
|
|
+ self.H_hist += [[H_l, H_r]]
|
|
|
c_shares_l = [MultiplicationAuthenticatedShares(a_share, b_share, self.source.triplet(self.party_id), self.party_id) for (a_share,b_share) in zip(a_shares_l, b_shares_r)] # c_prime_l
|
|
c_shares_l = [MultiplicationAuthenticatedShares(a_share, b_share, self.source.triplet(self.party_id), self.party_id) for (a_share,b_share) in zip(a_shares_l, b_shares_r)] # c_prime_l
|
|
|
c_shares_r = [MultiplicationAuthenticatedShares(a_share, b_share, self.source.triplet(self.party_id), self.party_id) for (a_share,b_share) in zip(a_shares_r, b_shares_l)] # c_prime_r
|
|
c_shares_r = [MultiplicationAuthenticatedShares(a_share, b_share, self.source.triplet(self.party_id), self.party_id) for (a_share,b_share) in zip(a_shares_r, b_shares_l)] # c_prime_r
|
|
|
self.c_l += [c_shares_l]
|
|
self.c_l += [c_shares_l]
|
|
|
self.c_r += [c_shares_r]
|
|
self.c_r += [c_shares_r]
|
|
|
- u = K(1)
|
|
|
|
|
|
|
+ #verifier.append_message(b'L', bytes(''.join([l.__str__() for l in [self.L]]), encoding='utf-8'))
|
|
|
|
|
+ #verifier.append_message(b'R', bytes(''.join([r.__str__() for r in [self.R]]), encoding='utf-8'))
|
|
|
|
|
+ #u = K(verifier.challenge_bytes(b'u'))
|
|
|
|
|
+ u = K(1) # for testing purpose
|
|
|
u_inv = 1/u
|
|
u_inv = 1/u
|
|
|
for i in range(self.n):
|
|
for i in range(self.n):
|
|
|
# u * a_prime_l + u^{-1} * a_prime_r
|
|
# u * a_prime_l + u^{-1} * a_prime_r
|
|
@@ -116,9 +121,6 @@ class MpcProof(object):
|
|
|
self.c_l = [[my_c_l[i].mul(their_c_l[i].d, their_c_l[i].e) for i in range(len(my_c_l))] for my_c_l, their_c_l in zip(self.c_l, their_c_l_shares)]
|
|
self.c_l = [[my_c_l[i].mul(their_c_l[i].d, their_c_l[i].e) for i in range(len(my_c_l))] for my_c_l, their_c_l in zip(self.c_l, their_c_l_shares)]
|
|
|
self.c_r = [[my_c_r[i].mul(their_c_r[i].d, their_c_r[i].e) for i in range(len(my_c_r))] for my_c_r, their_c_r in zip(self.c_r, their_c_r_shares)]
|
|
self.c_r = [[my_c_r[i].mul(their_c_r[i].d, their_c_r[i].e) for i in range(len(my_c_r))] for my_c_r, their_c_r in zip(self.c_r, their_c_r_shares)]
|
|
|
|
|
|
|
|
- print('c_l: {}'.format(self.c_l))
|
|
|
|
|
- print('c_r: {}'.format(self.c_r))
|
|
|
|
|
- print('c: {}'.format(sum([c_l[i].authenticated_open(c_r[i]) for i in range(len(self.c_l[0])) for c_l, c_r in zip(self.c_l, self.c_r)])))
|
|
|
|
|
# create L,R for proof validation
|
|
# create L,R for proof validation
|
|
|
L_l = []
|
|
L_l = []
|
|
|
R_l = []
|
|
R_l = []
|
|
@@ -127,24 +129,29 @@ class MpcProof(object):
|
|
|
self.m /= 2
|
|
self.m /= 2
|
|
|
al_share_g = [al_share.mul_scalar(g) for al_share, g in zip(self.a_shares_l[counter], self.G_factors[self.m:2*self.m])]
|
|
al_share_g = [al_share.mul_scalar(g) for al_share, g in zip(self.a_shares_l[counter], self.G_factors[self.m:2*self.m])]
|
|
|
br_share_h = [br_share.mul_scalar(h) for br_share, h in zip(self.b_shares_r[counter], self.H_factors[0:self.m])]
|
|
br_share_h = [br_share.mul_scalar(h) for br_share, h in zip(self.b_shares_r[counter], self.H_factors[0:self.m])]
|
|
|
- L_gr_al_g_share = MSM(self.G_hist[counter][1], al_share_g, self.source, self.party_id)
|
|
|
|
|
- L_hl_br_h_share = MSM(self.H_hist[counter][0], br_share_h, self.source, self.party_id)
|
|
|
|
|
- L_q_cl_share = MSM(self.Q, self.c_l[counter], self.source, self.party_id)
|
|
|
|
|
|
|
+ self.L_gr_al_g_share = MSM(self.G_hist[counter][1], al_share_g, self.source, self.party_id)
|
|
|
|
|
+ self.L_hl_br_h_share = MSM(self.H_hist[counter][0], br_share_h, self.source, self.party_id)
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+ self.L_q_cl_share = MSM(self.Q, self.c_l[counter], self.source, self.party_id)
|
|
|
|
|
+ #self.L_q_cl_share = self.L_hl_br_h_share.copy()
|
|
|
# L, R
|
|
# L, R
|
|
|
# note that P = L*R
|
|
# note that P = L*R
|
|
|
- L_shares = [L_gr_al_g_share, L_hl_br_h_share , L_q_cl_share]
|
|
|
|
|
|
|
+ L_shares = [self.L_gr_al_g_share, self.L_hl_br_h_share , self.L_q_cl_share]
|
|
|
|
|
|
|
|
ar_share_g = [ar_share.mul_scalar(g) for ar_share, g in zip(self.a_shares_r[counter], G_factors[0:self.m])]
|
|
ar_share_g = [ar_share.mul_scalar(g) for ar_share, g in zip(self.a_shares_r[counter], G_factors[0:self.m])]
|
|
|
- bl_share_g = [bl_share.mul_scalar(h) for bl_share, h in zip(self.b_shares_l[counter], H_factors[self.m:2*self.m])]
|
|
|
|
|
- R_gl_ar_g_share = MSM(self.G_hist[counter][0], ar_share_g, self.source, self.party_id)
|
|
|
|
|
- R_hr_bl_h_share = MSM(self.H_hist[counter][1], bl_share_g, self.source, self.party_id)
|
|
|
|
|
- R_q_cr_share = MSM(Q, self.c_r[counter], self.source, self.party_id)
|
|
|
|
|
- R_shares = [R_gl_ar_g_share, R_hr_bl_h_share, R_q_cr_share]
|
|
|
|
|
|
|
+ bl_share_h = [bl_share.mul_scalar(h) for bl_share, h in zip(self.b_shares_l[counter], H_factors[self.m:2*self.m])]
|
|
|
|
|
+ self.R_gl_ar_g_share = MSM(self.G_hist[counter][0], ar_share_g, self.source, self.party_id)
|
|
|
|
|
+ self.R_hr_bl_h_share = MSM(self.H_hist[counter][1], bl_share_h, self.source, self.party_id)
|
|
|
|
|
+ self.R_q_cr_share = MSM(self.Q, self.c_r[counter], self.source, self.party_id)
|
|
|
|
|
+ R_shares = [self.R_gl_ar_g_share, self.R_hr_bl_h_share, self.R_q_cr_share]
|
|
|
L_l += [L_shares]
|
|
L_l += [L_shares]
|
|
|
R_l += [R_shares]
|
|
R_l += [R_shares]
|
|
|
|
|
|
|
|
counter +=1
|
|
counter +=1
|
|
|
while self.m!=1:
|
|
while self.m!=1:
|
|
|
|
|
+ #TODO
|
|
|
|
|
+ assert(False)
|
|
|
self.m /=2
|
|
self.m /=2
|
|
|
# L_prime
|
|
# L_prime
|
|
|
L_gr_al_share = MSM(self.G_hist[counter][1], self.a_shares_l[counter], self.source, self.party_id)
|
|
L_gr_al_share = MSM(self.G_hist[counter][1], self.a_shares_l[counter], self.source, self.party_id)
|
|
@@ -155,7 +162,7 @@ class MpcProof(object):
|
|
|
# R_prime
|
|
# R_prime
|
|
|
R_gl_ar_share = MSM(self.G_hist[counter][0], a_shares_r, self.source, self.party_id)
|
|
R_gl_ar_share = MSM(self.G_hist[counter][0], a_shares_r, self.source, self.party_id)
|
|
|
R_hr_bl_share = MSM(self.H_hist[counter][1], b_shares_l, self.source, self.party_id)
|
|
R_hr_bl_share = MSM(self.H_hist[counter][1], b_shares_l, self.source, self.party_id)
|
|
|
- R_q_cr_share = MSM(Q, self.c_r[counter], self.source, self.party_id)
|
|
|
|
|
|
|
+ R_q_cr_share = MSM(self.Q, self.c_r[counter], self.source, self.party_id)
|
|
|
R_shares = [R_gl_ar_share, R_hr_bl_share, R_q_cr_share]
|
|
R_shares = [R_gl_ar_share, R_hr_bl_share, R_q_cr_share]
|
|
|
|
|
|
|
|
L_l += [L_shares]
|
|
L_l += [L_shares]
|
|
@@ -174,7 +181,7 @@ class MpcProof(object):
|
|
|
#verifier.append_message(b'L', bytes(''.join([l.__str__() for l in [L]]), encoding='utf-8'))
|
|
#verifier.append_message(b'L', bytes(''.join([l.__str__() for l in [L]]), encoding='utf-8'))
|
|
|
#verifier.append_message(b'R', bytes(''.join([r.__str__() for r in [R]]), encoding='utf-8'))
|
|
#verifier.append_message(b'R', bytes(''.join([r.__str__() for r in [R]]), encoding='utf-8'))
|
|
|
#u = K(verifier.challenge_bytes(b'u'))
|
|
#u = K(verifier.challenge_bytes(b'u'))
|
|
|
- u = K(1)
|
|
|
|
|
|
|
+ u = K(1) # for testing purpose
|
|
|
u_inv = 1/u
|
|
u_inv = 1/u
|
|
|
challenges += [u]
|
|
challenges += [u]
|
|
|
challenges_inv += [u_inv]
|
|
challenges_inv += [u_inv]
|
|
@@ -200,7 +207,6 @@ class MpcProof(object):
|
|
|
# inverse of count is reverse
|
|
# inverse of count is reverse
|
|
|
self.inv_s = reversed(self.s)
|
|
self.inv_s = reversed(self.s)
|
|
|
self.hbs_shares = [self.b_shares.mul_scalar(s_i_inv * h_i) for h_i, s_i_inv in zip(H_factors, self.inv_s)]
|
|
self.hbs_shares = [self.b_shares.mul_scalar(s_i_inv * h_i) for h_i, s_i_inv in zip(H_factors, self.inv_s)]
|
|
|
- #TODO (fix) this should be shares, this is fake shares!
|
|
|
|
|
self.neg_u_sq = [i*K(-1) for i in self.u_sq]
|
|
self.neg_u_sq = [i*K(-1) for i in self.u_sq]
|
|
|
self.neg_u_inv_sq = [i*K(-1) for i in self.u_inv_sq]
|
|
self.neg_u_inv_sq = [i*K(-1) for i in self.u_inv_sq]
|
|
|
# P
|
|
# P
|
|
@@ -220,16 +226,9 @@ class MpcProof(object):
|
|
|
L_triad = []
|
|
L_triad = []
|
|
|
for my_lhs_i, their_lhs_i in zip(my_lhs, their_lhs):
|
|
for my_lhs_i, their_lhs_i in zip(my_lhs, their_lhs):
|
|
|
my_lhs_i_de = [[ps.d, ps.e] for ps in my_lhs_i.point_scalars]
|
|
my_lhs_i_de = [[ps.d, ps.e] for ps in my_lhs_i.point_scalars]
|
|
|
- #print("lhs point scalars: {}".format(their_lhs_i.point_scalars))
|
|
|
|
|
their_lhs_i_de = [[ps.d, ps.e] for ps in their_lhs_i.point_scalars]
|
|
their_lhs_i_de = [[ps.d, ps.e] for ps in their_lhs_i.point_scalars]
|
|
|
- #my_lhs_i_share = my_lhs_i.msm(their_lhs_i_de)
|
|
|
|
|
- #their_rhs_i_share = their_lhs_i.msm(my_lhs_i_de)
|
|
|
|
|
- #L_triad += [ECAuthenticatedShare(my_lhs_i_share.authenticated_open(their_rhs_i_share))]
|
|
|
|
|
- #L_triad += [lhs_i]
|
|
|
|
|
lhs_i_share = my_lhs_i.msm(their_lhs_i_de)
|
|
lhs_i_share = my_lhs_i.msm(their_lhs_i_de)
|
|
|
- #L_triad += [ECAuthenticatedShare(my_lhs_i_share.authenticated_open(their_rhs_i_share))]
|
|
|
|
|
L_triad += [lhs_i_share]
|
|
L_triad += [lhs_i_share]
|
|
|
- #L += [sum_shares(L_triad, self.source, self.party_id)]
|
|
|
|
|
self.L += [sum_shares(L_triad, self.source, self.party_id)]
|
|
self.L += [sum_shares(L_triad, self.source, self.party_id)]
|
|
|
## R
|
|
## R
|
|
|
for my_rhs, their_rhs in zip(self.rhs, peer_rhs):
|
|
for my_rhs, their_rhs in zip(self.rhs, peer_rhs):
|
|
@@ -237,16 +236,10 @@ class MpcProof(object):
|
|
|
for my_rhs_i, their_rhs_i in zip(my_rhs, their_rhs):
|
|
for my_rhs_i, their_rhs_i in zip(my_rhs, their_rhs):
|
|
|
my_rhs_i_de = [[ps.d, ps.e] for ps in my_rhs_i.point_scalars]
|
|
my_rhs_i_de = [[ps.d, ps.e] for ps in my_rhs_i.point_scalars]
|
|
|
their_rhs_i_de = [[ps.d, ps.e] for ps in their_rhs_i.point_scalars]
|
|
their_rhs_i_de = [[ps.d, ps.e] for ps in their_rhs_i.point_scalars]
|
|
|
- #my_rhs_i_share = my_rhs_i.msm(their_rhs_i_de)
|
|
|
|
|
- #their_rhs_i_share = their_rhs_i.msm(my_rhs_i_de)
|
|
|
|
|
- #R_triad += [ECAuthenticatedShare(my_lhs_i_share.authenticated_open(their_rhs_i_share))]
|
|
|
|
|
rhs_i_share = my_rhs_i.msm(their_rhs_i_de)
|
|
rhs_i_share = my_rhs_i.msm(their_rhs_i_de)
|
|
|
R_triad += [rhs_i_share]
|
|
R_triad += [rhs_i_share]
|
|
|
- #R_triad += [rhs_i]
|
|
|
|
|
- #R += [sum_shares(R_triad, self.source, self.party_id)]
|
|
|
|
|
self.R += [sum_shares(R_triad, self.source, self.party_id)]
|
|
self.R += [sum_shares(R_triad, self.source, self.party_id)]
|
|
|
# L^(u^2)
|
|
# L^(u^2)
|
|
|
- #temp = K(random.randint(0,p))
|
|
|
|
|
temp = K(0)
|
|
temp = K(0)
|
|
|
self.res_p_4 = MSM(self.L, [AuthenticatedShare(temp, self.source, self.party_id) if self.party_id==0 else AuthenticatedShare(neg_u_sq_i-temp, self.source, self.party_id) for neg_u_sq_i in self.neg_u_sq], self.source, self.party_id)
|
|
self.res_p_4 = MSM(self.L, [AuthenticatedShare(temp, self.source, self.party_id) if self.party_id==0 else AuthenticatedShare(neg_u_sq_i-temp, self.source, self.party_id) for neg_u_sq_i in self.neg_u_sq], self.source, self.party_id)
|
|
|
# R^(u^-2)
|
|
# R^(u^-2)
|
|
@@ -262,7 +255,6 @@ class MpcProof(object):
|
|
|
lhs = my_res_p.msm(their_res_de)
|
|
lhs = my_res_p.msm(their_res_de)
|
|
|
rhs = their_res_p.msm(my_res_de)
|
|
rhs = their_res_p.msm(my_res_de)
|
|
|
p_part = lhs.authenticated_open(rhs)
|
|
p_part = lhs.authenticated_open(rhs)
|
|
|
- print('p_part: {}'.format(p_part))
|
|
|
|
|
P_msm_parts += [p_part]
|
|
P_msm_parts += [p_part]
|
|
|
|
|
|
|
|
# P prime == H(u^{-1} * a_prime_r, u * a_prime_l, u * b_prime_r, u ^ {-1} * b_prime_l, c_prime)
|
|
# P prime == H(u^{-1} * a_prime_r, u * a_prime_l, u * b_prime_r, u ^ {-1} * b_prime_l, c_prime)
|