[research/mpc] upgrade mpc, for ipp compatibility

This commit is contained in:
ertosns
2023-09-13 23:35:43 +03:00
parent 687ff6538a
commit 586c283557
6 changed files with 42 additions and 18 deletions

View File

@@ -1,4 +1,4 @@
load('share.sage')
load('../mpc/share.sage')
import random
class Source(object):
@@ -16,4 +16,3 @@ class Source(object):
def triplet(self, party_id):
triplet = [self.left_a, self.left_b, self.left_c] if party_id==0 else [self.right_a, self.right_b, self.right_c]
return [AuthenticatedShare(share) for share in triplet]

View File

@@ -4,11 +4,13 @@ p = 3618502788666131213697322783095070105623107215331596699973092056135872020481
alpha = 1
# $$y^2 = x^3 + \alpha \dot x + \beta$$ (mod p)
beta = 3141592653589793238462643383279502884197169399375105820974944592307816406665
K = GF(p)
E = EllipticCurve(K, (alpha,beta))
F = GF(p)
E = EllipticCurve(F, [alpha,beta])
ec_order = E.order()
# ECDSA scheme generator
G = E(874739451078007766457464989774322083649278607533249481151382481072868806602, 152666792071518830868575557812948353041420400780739481342941381225525861407)
# ECDSA scheme generator
G_generator = E(874739451078007766457464989774322083649278607533249481151382481072868806602, 152666792071518830868575557812948353041420400780739481342941381225525861407)
p_scalar = 3618502788666131213697322783095070105526743751716087489154079457884512865583
K = GF(p_scalar)
import random
class CurvePoint():
@@ -20,11 +22,17 @@ class CurvePoint():
self.x = self.point[0]
self.y = self.point[1]
def zero():
return G_generator * 0
def __repr__(self):
return "[ x: %s, y: %s, z: 1]"%(self.x, self.y)
return bytes("[ x: {}, y: {}, z: 1]".format(self.x, self.y), encoding='utf-8')
def __str__(self):
return self.__repr__()
def random(max=p):
return G * random.randint(0, max)
return G_generator * random.randint(0, max)
def __add__(self, rhs):
return self.point + rhs.point
@@ -34,10 +42,13 @@ class CurvePoint():
def __neg__(self):
return -1 * self.point
def generator():
return G
return G_generator
def __mul__(self, factor):
return factor * self.point
def msm(points, scalars):
assert len(points) == len(scalars), 'len(p): {}, len(s): {}'.format(len(points), len(scalars))
return sum([s*p for (s, p) in zip(points, scalars)])

View File

@@ -1,5 +1,3 @@
load('pedersen.sage')
def open_2pc(party0_share, party1_share):
return party0_share + party1_share
@@ -90,3 +88,6 @@ class MSM(object):
for point, scalar in zip(self.points, self.scalars):
point_scalars += [ScalingECAuthenticatedShares(point, scalar, beaver.triplet(self.party_id), self.party_id)]
return point_scalars
def sum(self):
return sum(self.msm())

View File

@@ -1,5 +1,4 @@
load('pedersen.sage')
load('ec_share.sage')
load('../mpc/ec_share.sage')
def open_2pc(party0_share, party1_share):
return party0_share + party1_share
@@ -35,7 +34,7 @@ class AuthenticatedShare(object):
def sub_scalar(self, scalar, party_id):
return AuthenticatedShare(self.share - scalar, self.mac, self.public_modifier + scalar) if party_id == 0 else AuthenticatedShare(self.share , self.mac, self.public_modifier + scalar)
def add_scalar(self, scalar, party_id):
return AuthenticatedShare(self.share + scalar, self.mac , self.public_modifier - scalar) if party_id ==0 else AuthenticatedShare(self.share, self.mac, self.public_modifier - scalar)
@@ -69,7 +68,7 @@ class MultiplicationAuthenticatedShares(object):
self.party_id = party_id
def __mul__(self, peer_share):
masked_d_share = self.alpha_as - self.a_as
masked_d_share = self.alpha_as - self.a_as
peer_masked_d_share = peer_share.alpha_as - peer_share.a_as
d = open_2pc(masked_d_share.share, peer_masked_d_share.share)

View File

@@ -1,4 +1,6 @@
load('beaver.sage')
from random import randint
p = 10
party0_val = 3
@@ -6,12 +8,12 @@ party1_val = 22
public_scalar = 2
# additive share distribution, and communication of private values
party0_random = random.randint(0,p)
party0_random = randint(0,p)
alpha1 = AuthenticatedShare(party0_random)
alpha2 = AuthenticatedShare(party0_val - party0_random)
assert (alpha1.authenticated_open(alpha2) == party0_val)
party1_random = random.randint(0,p)
party1_random = randint(0,p)
beta1 = AuthenticatedShare(party1_random)
beta2 = AuthenticatedShare(party1_val - party1_random)
assert (beta1.authenticated_open(beta2) == party1_val)

View File

@@ -0,0 +1,12 @@
load('curve.sage')
import random
pt = CurvePoint.random()
rnd = random.randint(0, p)
s_ff = K(rnd)
s = int(s_ff)
assert s == rnd
s_inv_ff = 1/s_ff
s_inv = int(s_inv_ff)
assert K(s*s_inv) == K(1)
assert (pt * int(K(s * s_inv))) == pt