# HG changeset patch
# User Janus Dam Nielsen <[email protected]>
# Date 1245394852 -7200
# Node ID 1eb98ef76446e9ef06d8d94e31748fe5cfd2ba82
# Parent 29c28d1a8e5f5647fe97d7b01f5924f3ef006301
Implementation of random share command.
diff --git a/viff/orlandi.py b/viff/orlandi.py
--- a/viff/orlandi.py
+++ b/viff/orlandi.py
@@ -270,6 +270,52 @@
if self.id in receivers:
return result
+ @increment_pc
+ def random_share(self, field):
+ """Generate a random share in the field, field.
+
+ To generate a share of a random element r in Z_{p}, party P_{i}
+ chooses at random r_{i}, rho_{r,i} in Z_{p} x (Z_{p})^2 and
+ broadcast C_{r}^{i} = Com_{ck}(r_{i}, rho_{r, i}).
+ Every party computes C_{r} = PRODUCT_{i=1}^{n} C_{r}^{i} = Com_{ck}(r,
rho_{r}),
+ where r_{i} = SUM_{i=1}^{n} r_{i} and rho_{r} = SUM_{i=1}^{n}
rho_{r,i}.
+
+ Party P_{i} sets [r]_{i} = (r_{i}, rho_{r,i}, C_{r}).
+
+ """
+ # P_{i} chooses at random r_{i}, rho_{r,i} in Z_{p} x (Z_{p})^2
+ ri = field(rand.randint(0, field.modulus - 1))
+ rhoi1 = field(rand.randint(0, field.modulus - 1))
+ rhoi2 = field(rand.randint(0, field.modulus - 1))
+ # compute C_{r}^{i} = Com_{ck}(r_{i}, rho_{r, i}).
+ Cri = self._Com(ri, (rhoi1, rhoi2))
+ # Broadcast C_{r}^{i}.
+ shares = []
+ for peer_id in self.players:
+ if peer_id == self.id:
+ # Broadcast C_{r}^{i}
+ d = Share(self, field, Cri)
+ else:
+ # Recieve C_{r}^{i}
+ pc = tuple(self.program_counter)
+ self.protocols[peer_id].sendShare(pc, Cri)
+ d = self._expect_share(peer_id, field)
+ shares.append(d)
+
+ def compute_commitment(ls):
+ Cr = field(1)
+ for s, v in ls:
+ Cr *= v
+ return OrlandiShare(self, field, ri, (rhoi1, rhoi2), Cr)
+
+ sls = ShareList(shares)
+ sls.addCallbacks(compute_commitment, self.error_handler)
+
+ # do actual communication
+ self.activate_reactor()
+
+ return sls
+
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
@@ -65,3 +65,16 @@
d.addCallback(check)
return d
+ @protocol
+ def test_random_share(self, runtime):
+ """Test creation of a random shared number."""
+
+ def check(v):
+ self.assertEquals(True, True)
+
+ x = runtime.random_share(self.Zp)
+ d = runtime.open(x)
+ d.addCallback(check)
+ return d
+
+
_______________________________________________
viff-devel mailing list (http://viff.dk/)
[email protected]
http://lists.viff.dk/listinfo.cgi/viff-devel-viff.dk