Bläddra i källkod

[research/mpc] upgrade mpc, for ipp compatibility

ertosns 2 år sedan
förälder
incheckning
586c283557

+ 1 - 2
script/research/mpc/beaver.sage

@@ -1,4 +1,4 @@
-load('share.sage')
+load('../mpc/share.sage')
 
 
 import random
 import random
 class Source(object):
 class Source(object):
@@ -16,4 +16,3 @@ class Source(object):
       def triplet(self, party_id):
       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]
           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]
           return [AuthenticatedShare(share) for share in triplet]
-       

+ 19 - 8
script/research/mpc/curve.sage

@@ -4,11 +4,13 @@ p = 3618502788666131213697322783095070105623107215331596699973092056135872020481
 alpha = 1
 alpha = 1
 # $$y^2 = x^3 + \alpha \dot x + \beta$$  (mod p)
 # $$y^2 = x^3 + \alpha \dot x + \beta$$  (mod p)
 beta = 3141592653589793238462643383279502884197169399375105820974944592307816406665
 beta = 3141592653589793238462643383279502884197169399375105820974944592307816406665
-K = GF(p)
-E = EllipticCurve(K, (alpha,beta))
+F = GF(p)
+E = EllipticCurve(F, [alpha,beta])
 ec_order = E.order()
 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
 import random
 class CurvePoint():
 class CurvePoint():
@@ -20,11 +22,17 @@ class CurvePoint():
           self.x = self.point[0]
           self.x = self.point[0]
           self.y = self.point[1]
           self.y = self.point[1]
 
 
+      def zero():
+            return G_generator * 0
+
       def __repr__(self):
       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):
       def random(max=p):
-          return G * random.randint(0, max)
+          return G_generator * random.randint(0, max)
 
 
       def __add__(self, rhs):
       def __add__(self, rhs):
           return self.point + rhs.point
           return self.point + rhs.point
@@ -34,10 +42,13 @@ class CurvePoint():
 
 
       def __neg__(self):
       def __neg__(self):
           return -1 * self.point
           return -1 * self.point
-          
+
       def generator():
       def generator():
-          return G
+          return G_generator
 
 
       def __mul__(self, factor):
       def __mul__(self, factor):
           return factor * self.point
           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)])

+ 3 - 2
script/research/mpc/ec_share.sage

@@ -1,5 +1,3 @@
-load('pedersen.sage')
-
 def open_2pc(party0_share, party1_share):
 def open_2pc(party0_share, party1_share):
     return 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):
           for point, scalar in zip(self.points, self.scalars):
               point_scalars += [ScalingECAuthenticatedShares(point, scalar, beaver.triplet(self.party_id), self.party_id)]
               point_scalars += [ScalingECAuthenticatedShares(point, scalar, beaver.triplet(self.party_id), self.party_id)]
           return point_scalars
           return point_scalars
+
+      def sum(self):
+          return sum(self.msm())

+ 3 - 4
script/research/mpc/share.sage

@@ -1,5 +1,4 @@
-load('pedersen.sage')
-load('ec_share.sage')
+load('../mpc/ec_share.sage')
 
 
 def open_2pc(party0_share, party1_share):
 def open_2pc(party0_share, party1_share):
     return party0_share + party1_share
     return party0_share + party1_share
@@ -35,7 +34,7 @@ class AuthenticatedShare(object):
 
 
       def sub_scalar(self, scalar, party_id):
       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)
           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):
       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)
           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
           self.party_id = party_id
 
 
       def __mul__(self, peer_share):
       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
           peer_masked_d_share = peer_share.alpha_as - peer_share.a_as
           d = open_2pc(masked_d_share.share, peer_masked_d_share.share)
           d = open_2pc(masked_d_share.share, peer_masked_d_share.share)
 
 

+ 4 - 2
script/research/mpc/spdz.sage

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

+ 12 - 0
script/research/mpc/test_curve.sage

@@ -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