Просмотр исходного кода

[research/mpc] naive msm over ec mpc

ertosns 2 лет назад
Родитель
Сommit
687ff6538a

+ 1 - 1
script/research/mpc/curve.sage

@@ -24,7 +24,7 @@ class CurvePoint():
           return "[ x: %s, y: %s, z: 1]"%(self.x, self.y)
 
       def random(max=p):
-          return G* random.randint(0, max)
+          return G * random.randint(0, max)
 
       def __add__(self, rhs):
           return self.point + rhs.point

+ 32 - 0
script/research/mpc/ec_msm.sage

@@ -0,0 +1,32 @@
+load('curve.sage')
+load('share.sage')
+load('ec_share.sage')
+load('beaver.sage')
+
+N = 10
+
+source = Source(p)
+points = [CurvePoint.random() for _ in range(0, N)]
+
+lhs_points = [pt - CurvePoint.random() for pt in points]
+rhs_points = [point - lhs for (point, lhs) in zip(points, lhs_points)]
+lhs_points_shares = [ECAuthenticatedShare(pt) for pt in lhs_points]
+rhs_points_shares = [ECAuthenticatedShare(pt) for pt in rhs_points]
+
+
+scalars = [random.randint(0,p) for i in range(0, N)]
+lhs_scalars = [s - random.randint(0,p) for s in scalars]
+rhs_scalars = [s - lhs for (s, lhs) in zip(scalars, lhs_scalars)]
+lhs_scalars_shares = [AuthenticatedShare(s) for s in lhs_scalars]
+rhs_scalars_shares = [AuthenticatedShare(s) for s in rhs_scalars]
+
+lhs_msm = MSM(lhs_points_shares, lhs_scalars_shares, source, 0)
+rhs_msm = MSM(rhs_points_shares, rhs_scalars_shares, source, 1)
+
+res = []
+for lhs, rhs in  zip(lhs_msm.msm(), rhs_msm.msm()):
+    first_share = lhs*rhs
+    second_share = rhs*lhs
+    res += [first_share.authenticated_open(second_share)]
+
+assert (sum(res) == sum([p*s for p, s in zip(points, scalars)]))

+ 18 - 0
script/research/mpc/ec_share.sage

@@ -72,3 +72,21 @@ class ScalingECAuthenticatedShares(object):
           d = open_2pc(masked_d_share.share, peer_masked_d_share.share)
 
           return (self.b_as.mul_point(d) + self.a_as.mul_point(generator).mul_scalar(e) + self.c_as.mul_point(generator)).add_point(d * e, self.party_id)
+
+class MSM(object):
+      def __init__(self, points,  scalars, source,  party_id):
+          '''
+          naive multi scalar multiplicatin, between authenticatedpointsshares, and authenticatedscalarshares
+          '''
+          self.points = points
+          self.scalars = scalars
+          self.source = source
+          self.party_id = party_id
+
+      def msm(self):
+          assert (len(self.points) == len(self.scalars))
+          beaver = self.source
+          point_scalars = []
+          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

+ 1 - 0
script/research/mpc/ec_spdz.sage

@@ -58,3 +58,4 @@ lhs = lhs_share.authenticated_open(rhs_share)
 
 mul_res = party0_val * party1_val
 assert (lhs == (party0_val * party1_val)), 'lhs: {}, rhs: {}'.format(lhs, party0_val * party1_val)
+