def __init__(self, runtime, security_parameter, p, random): assert p > 1 self.random = random # TODO: Generate Paillier cipher with N_i sufficiently larger than p self.runtime = runtime self.p = p self.Zp = GF(p) self.k = self._bit_length_of(p) self.security_parameter = security_parameter self.u_bound = 2**(self.security_parameter + 4 * self.k) self.zk_random = Random(self.random.getrandbits(128)) paillier_random = Random(self.random.getrandbits(128)) alpha_random = Random(self.random.getrandbits(128)) self.paillier = ModifiedPaillier(runtime, paillier_random) # Debug output. #print "n_%d**2:%d" % (runtime.id, self.paillier.pubkey['n_square']) #print "n_%d:%d" % (runtime.id, self.paillier.pubkey['n']) #print "n_%d bitlength: %d" % \ # (runtime.id, self._bit_length_of(self.paillier.pubkey['n'])) #self.Zp = GF(p) #self.Zn2 = GF(self.paillier.pubkey['n_square']) #self.alpha = self.Zp(self.random.randint(0, p - 1)) self.alpha = alpha_random.randint(0, p - 1) self.n2 = runtime.players[runtime.id].pubkey['n_square']
def _generate_test_ciphertexts(self, random, runtime, k, s, prover_id): paillier = ModifiedPaillier(runtime, random) xs, rs, cs = [], [], [] for i in range(s): x = rand_int_signed(random, 2**k) r, c = paillier.encrypt_r(x, player_id=prover_id) xs.append(mpz(x)) rs.append(mpz(r)) cs.append(mpz(c)) return xs, rs, cs
def do_stuff(triple, alpha): random = Random(3423993) share_random = Random(random.getrandbits(128)) paillier = ModifiedPaillier(runtime, Random(random.getrandbits(128))) gen = TestShareGenerator(self.Zp, runtime, share_random, paillier, self.u_bound, alpha) x2 = gen.generate_share(x1) y2 = gen.generate_share(y1) z2 = runtime._basic_multiplication(self.Zp(x1), y2, triple.a, triple.b, triple.c) d = runtime.open(z2) d.addCallback(check) return d
def do_mult(triples, alpha): runtime.triples = triples random = Random(3423993) share_random = Random(random.getrandbits(128)) paillier = ModifiedPaillier(runtime, Random(random.getrandbits(128))) gen = TestShareGenerator(self.Zp, runtime, share_random, paillier, self.u_bound, alpha) x2 = gen.generate_share(x1) y2 = gen.generate_share(y1) z2 = x2 * y2 d = runtime.open(z2) d.addCallback(check) return d
def test_sum_plus(self, runtime): """Test addition of two numbers.""" def check(v): self.assertEquals(v, 11) random = Random(3423993) share_random = Random(random.getrandbits(128)) paillier = ModifiedPaillier(runtime, Random(random.getrandbits(128))) gen = TestShareGenerator(self.Zp, runtime, share_random, paillier, self.u_bound, self.alpha) x2 = gen.generate_share(2) y2 = gen.generate_share(9) z2 = x2 + y2 d = runtime.open(z2) d.addCallback(check) return d
def test_open_two_secret_share(self, runtime): """Test sharing and open of a number.""" def check((a, b)): self.assertEquals(a, 6) self.assertEquals(b, 6) random = Random(3423993) share_random = Random(random.getrandbits(128)) paillier = ModifiedPaillier(runtime, Random(random.getrandbits(128))) gen = TestShareGenerator(self.Zp, runtime, share_random, paillier, self.u_bound, self.alpha) x = gen.generate_share(6) y = gen.generate_share(6) d = runtime.open_two_values(x, y) d.addCallback(check) return d
def test_sub_constant_left(self, runtime): """Test subtraction of a public number and secret shared number.""" y = 8 def check(v): self.assertEquals(v, 3) random = Random(3423993) share_random = Random(random.getrandbits(128)) paillier = ModifiedPaillier(runtime, Random(random.getrandbits(128))) gen = TestShareGenerator(self.Zp, runtime, share_random, paillier, self.u_bound, self.alpha) x2 = gen.generate_share(5) z2 = y - x2 d = runtime.open(x2) d.addCallback(check) return d
def test_sum_constant_right(self, runtime): """Test addition of secret shared number and a public number.""" y1 = 7 def check(v): self.assertEquals(v, 15) random = Random(3423993) share_random = Random(random.getrandbits(128)) paillier = ModifiedPaillier(runtime, Random(random.getrandbits(128))) gen = TestShareGenerator(self.Zp, runtime, share_random, paillier, self.u_bound, self.alpha) x2 = gen.generate_share(8) z2 = x2 + y1 d = runtime.open(z2) d.addCallback(check) return d
def test_constant_multiplication_constant_right(self, runtime): """Test multiplication of two numbers.""" x1 = 6 y1 = 7 def check(v): self.assertEquals(v, self.Zp(x1 * y1)) random = Random(3423993) share_random = Random(random.getrandbits(128)) paillier = ModifiedPaillier(runtime, Random(random.getrandbits(128))) gen = TestShareGenerator(self.Zp, runtime, share_random, paillier, self.u_bound, self.alpha) x2 = gen.generate_share(x1) z2 = runtime._cmul(x2, self.Zp(y1), self.Zp) d = runtime.open(z2) d.addCallback(check) return d
def test_succeeding_proof(self, runtime): seed = 2348838 k, s, prover_id = 5, 3, 1 player_random = Random(seed + runtime.id) shared_random = Random(seed) paillier = ModifiedPaillier(runtime, Random(player_random.getrandbits(128))) x, r, c = self._generate_test_ciphertexts(shared_random, runtime, k, s, prover_id) #print "Player", runtime.id, " x =", x #print "Player", runtime.id, " r =", r #print "Player", runtime.id, " c =", c if runtime.id == prover_id: zk = ZKProof(s, prover_id, k, runtime, c, paillier=paillier, random=player_random, x=x, r=r) else: zk = ZKProof(s, prover_id, k, runtime, c, paillier=paillier, random=player_random) deferred_proof = zk.start() def verify(result): self.assertTrue(result) runtime.schedule_callback(deferred_proof, verify) return deferred_proof