# HG changeset patch
# User Janus Dam Nielsen <[email protected]>
# Date 1254816324 -7200
# Node ID 5636b02c6beffac287fc05f62b87b3b03c01e116
# Parent 94086392cb3c34db1672660c9711cbd4941c991f
Implementation of subtraction command.
diff --git a/viff/orlandi.py b/viff/orlandi.py
--- a/viff/orlandi.py
+++ b/viff/orlandi.py
@@ -350,6 +350,39 @@
result.addCallbacks(compute_sums, self.error_handler)
return result
+ def sub(self, share_a, share_b):
+ """Subtraction of shares.
+
+ Communication cost: none.
+
+ Each party ``P_i`` computes:
+ ``[z]_i = [x]_i - [y]_i
+ = (x_i - y_i mod p, rho_x,i - rho_y,i mod p, C_x * C_y)``.
+
+ """
+ def is_share(s, field):
+ if not isinstance(s, Share):
+ if not isinstance(s, FieldElement):
+ s = field(s)
+ (v, rhov, Cv) = self._additive_constant(field(0), s)
+ return OrlandiShare(self, field, v, rhov, Cv)
+ return s
+
+ # Either share_a or share_b must have an attribute called "field".
+ field = getattr(share_a, "field", getattr(share_b, "field", None))
+
+ share_a = is_share(share_a, field)
+ share_b = is_share(share_b, field)
+
+ # Subtract xi and yi, rhoxi and rhoyi, and compute the commitment
+ def compute_subs((x, y)):
+ zi, (rhozi1, rhozi2), Cz = self._minus(x, y)
+ return OrlandiShare(self, field, zi, (rhozi1, rhozi2), Cz)
+
+ result = gather_shares([share_a, share_b])
+ result.addCallbacks(compute_subs, self.error_handler)
+ return result
+
def _additive_constant(self, zero, field_element):
"""Greate an additive constant.
@@ -380,6 +413,23 @@
Cz = Cx * Cy
return (zi, (rhozi1, rhozi2), Cz)
+ def _minus(self, x, y):
+ """Subtraction of share-tuples *x* and *y*.
+
+ Each party ``P_i`` computes:
+ ``[x]_i = (x_i, rho_x,i, C_x)``
+ ``[y]_i = (y_i, rho_y,i, C_y)``
+ ``[z]_i = [x]_i - [y]_i
+ = (x_i - y_i mod p, rho_x,i - rho_y,i mod p, C_x / C_y)``.
+ """
+ xi, (rhoxi1, rhoxi2), Cx = x
+ yi, (rhoyi1, rhoyi2), Cy = y
+ zi = xi - yi
+ rhozi1 = rhoxi1 - rhoyi1
+ rhozi2 = rhoxi2 - rhoyi2
+ Cz = Cx / Cy
+ return (zi, (rhozi1, rhozi2), Cz)
+
def error_handler(self, ex):
print "Error: ", ex
return ex
diff --git a/viff/test/test_orlandi_runtime.py
b/viff/test/test_orlandi_runtime.py
--- a/viff/test/test_orlandi_runtime.py
+++ b/viff/test/test_orlandi_runtime.py
@@ -161,3 +161,81 @@
d = runtime.open(z2)
d.addCallback(check)
return d
+
+ @protocol
+ def test_sub(self, runtime):
+ """Test subtration of two numbers."""
+
+ self.Zp =
GF(6277101735386680763835789423176059013767194773182842284081)
+
+ x1 = 42
+ y1 = 7
+
+ def check(v):
+ self.assertEquals(v, x1 - y1)
+
+ if 1 == runtime.id:
+ x2 = runtime.secret_share([1], self.Zp, x1)
+ else:
+ x2 = runtime.secret_share([1], self.Zp)
+
+ if 3 == runtime.id:
+ y2 = runtime.secret_share([3], self.Zp, y1)
+ else:
+ y2 = runtime.secret_share([3], self.Zp)
+
+ z2 = runtime.sub(x2, y2)
+ d = runtime.open(z2)
+ d.addCallback(check)
+ return d
+
+ @protocol
+ def test_sub_minus(self, runtime):
+ """Test subtration of two numbers."""
+
+ self.Zp =
GF(6277101735386680763835789423176059013767194773182842284081)
+
+ x1 = 42
+ y1 = 7
+
+ def check(v):
+ self.assertEquals(v, x1 - y1)
+
+ if 1 == runtime.id:
+ x2 = runtime.secret_share([1], self.Zp, x1)
+ else:
+ x2 = runtime.secret_share([1], self.Zp)
+
+ if 3 == runtime.id:
+ y2 = runtime.secret_share([3], self.Zp, y1)
+ else:
+ y2 = runtime.secret_share([3], self.Zp)
+
+ z2 = x2 - y2
+ d = runtime.open(z2)
+ d.addCallback(check)
+ return d
+
+ @protocol
+ def test_sub_constant(self, runtime):
+ """Test subtration of two numbers."""
+
+ self.Zp =
GF(6277101735386680763835789423176059013767194773182842284081)
+
+ x1 = 42
+ y1 = 7
+
+ def check(v):
+ self.assertEquals(v, x1 - y1)
+
+ if 1 == runtime.id:
+ x2 = runtime.secret_share([1], self.Zp, x1)
+ else:
+ x2 = runtime.secret_share([1], self.Zp)
+
+ z2 = x2 - y1
+ d = runtime.open(z2)
+ d.addCallback(check)
+ return d
+
+
_______________________________________________
viff-patches mailing list
[email protected]
http://lists.viff.dk/listinfo.cgi/viff-patches-viff.dk