Пример #1
0
 def test_modified_paillier_can_decrypt_encrypted_min_val(self, runtime):
     paillier = ModifiedPaillier(runtime, Random(554424))
     n = runtime.players[runtime.id].pubkey['n']
     val = -(n - 1) / 2
     encrypted_val = paillier.encrypt(val)
     decrypted_val = paillier.decrypt(encrypted_val)
     self.assertEquals(val, decrypted_val)
Пример #2
0
 def test_modified_paillier_can_decrypt_encrypted_min_val(self, runtime):
     paillier = ModifiedPaillier(runtime, Random(554424))
     n = runtime.players[runtime.id].pubkey['n']
     val = -(n - 1) / 2
     encrypted_val = paillier.encrypt(val)
     decrypted_val = paillier.decrypt(encrypted_val)
     self.assertEquals(val, decrypted_val)
Пример #3
0
 def test_modified_paillier_with_different_randomness_are_not_equal(self, runtime):
     random = Random(3423434)
     n = runtime.players[runtime.id].pubkey['n']
     paillier = ModifiedPaillier(runtime, Random(random.getrandbits(128)))
     val = 47
     random_elm = random.randint(1, long(n))
     encrypted_val_1 = paillier.encrypt(val, random_elm=random_elm)
     encrypted_val_2 = paillier.encrypt(val, random_elm=random_elm)
     self.assertEquals(encrypted_val_1, encrypted_val_2)
Пример #4
0
 def test_modified_paillier_with_different_randomness_are_not_equal(
         self, runtime):
     random = Random(3423434)
     n = runtime.players[runtime.id].pubkey['n']
     paillier = ModifiedPaillier(runtime, Random(random.getrandbits(128)))
     val = 47
     random_elm = random.randint(1, long(n))
     encrypted_val_1 = paillier.encrypt(val, random_elm=random_elm)
     encrypted_val_2 = paillier.encrypt(val, random_elm=random_elm)
     self.assertEquals(encrypted_val_1, encrypted_val_2)
Пример #5
0
 def test_modified_paillier_with_same_randomness_are_equal(self, runtime):
     random = Random(234333)
     paillier = ModifiedPaillier(runtime, Random(random.getrandbits(128)))
     n = runtime.players[runtime.id].pubkey['n']
     val = 46
     random_elm_1 = random.randint(1, long(n))
     random_elm_2 = (random_elm_1 + 1) % n
     encrypted_val_1 = paillier.encrypt(val, random_elm=random_elm_1)
     encrypted_val_2 = paillier.encrypt(val, random_elm=random_elm_1)
     self.assertEquals(encrypted_val_1, encrypted_val_2)
Пример #6
0
 def test_modified_paillier_with_same_randomness_are_equal(self, runtime):
     random = Random(234333)
     paillier = ModifiedPaillier(runtime, Random(random.getrandbits(128)))
     n = runtime.players[runtime.id].pubkey['n']
     val = 46
     random_elm_1 = random.randint(1, long(n))
     random_elm_2 = (random_elm_1 + 1) % n
     encrypted_val_1 = paillier.encrypt(val, random_elm=random_elm_1)
     encrypted_val_2 = paillier.encrypt(val, random_elm=random_elm_1)
     self.assertEquals(encrypted_val_1, encrypted_val_2)
Пример #7
0
 def test_modified_paillier_can_encrypt_to_other(self, runtime):
     paillier = ModifiedPaillier(runtime, Random(57503))
     msg = []
     for p in runtime.players:
         msg.append(paillier.encrypt(runtime.id, player_id=p))
     received = _send(runtime, msg)
     def verify(enc):
         plain = [paillier.decrypt(e) for e in enc]
         self.assertEquals(range(1, self.num_players + 1), plain)
     runtime.schedule_callback(received, verify)
     return received
Пример #8
0
    def test_modified_paillier_can_encrypt_to_other(self, runtime):
        paillier = ModifiedPaillier(runtime, Random(57503))
        msg = []
        for p in runtime.players:
            msg.append(paillier.encrypt(runtime.id, player_id=p))
        received = _send(runtime, msg)

        def verify(enc):
            plain = [paillier.decrypt(e) for e in enc]
            self.assertEquals(range(1, self.num_players + 1), plain)

        runtime.schedule_callback(received, verify)
        return received
Пример #9
0
    def test_encrypted_random_shares_decrypt_correctly(self, runtime):
        random = Random(3423993)
        modulus = 17
        Zp = GF(modulus)
        paillier = ModifiedPaillier(runtime, Random(random.getrandbits(128)))
        shares = self._partial_random_shares(random,
                                             runtime,
                                             Zp,
                                             7,
                                             paillier=paillier)
        expected_result = [9, 16, 7, 12, 3, 5, 6]
        for inx, share in enumerate(shares):

            def decrypt(share, expected_result):
                decrypted_share = paillier.decrypt(
                    share.enc_shares[runtime.id - 1])
                decrypted_shares = _convolute(runtime, decrypted_share)

                def test_sum(vals, expected_result):
                    v = Zp(sum(vals))
                    self.assertEquals(expected_result, v)

                runtime.schedule_callback(decrypted_shares, test_sum,
                                          expected_result)

            runtime.schedule_callback(share, decrypt, expected_result[inx])

        return shares
Пример #10
0
    def test_encrypted_random_real_shares_open_correctly(self, runtime):
        random = Random(3423993)
        modulus = 17
        Zp = GF(modulus)
        bits_in_p = 5
        u_bound = 2**(4 * bits_in_p)
        alpha = 15

        paillier = ModifiedPaillier(runtime, Random(random.getrandbits(128)))

        share_random = Random(random.getrandbits(128))
        gen = TestShareGenerator(Zp, runtime, share_random, paillier, u_bound,
                                 alpha)
        shares = gen.generate_random_shares(7)
        expected_result = [9, 16, 7, 12, 3, 5, 6]
        results = []
        for inx, share in enumerate(shares):

            def check(v, expected_result):
                self.assertEquals(expected_result, v)

            r = runtime.open(share)
            results.append(r)
            runtime.schedule_callback(r, check, expected_result[inx])
        return gather_shares(results)
Пример #11
0
    def test_share_protocol_multi(self, runtime):
        p, k = 17, 5
        Zp = GF(p)
        random = Random(345453 + runtime.id)
        elms = [Zp(runtime.id), Zp(runtime.id * 3)]
        paillier_random = Random(random.getrandbits(128))
        zk_random = Random(random.getrandbits(128))
        paillier = ModifiedPaillier(runtime, paillier_random)
        partial_shares = generate_partial_share_contents(
            elms, runtime, paillier, k, zk_random)

        def decrypt(share_contents):
            self.assertEquals(2, len(share_contents))
            decrypted_shares = [
                paillier.decrypt(share_contents[i].enc_shares[runtime.id - 1])
                for i in range(2)
            ]
            decrypted_shares = [
                _convolute(runtime, decrypted_shares[i]) for i in range(2)
            ]

            def test_sum(vals, should_be):
                self.assertEquals([Zp(e) for e in should_be], vals)

            runtime.schedule_callback(decrypted_shares[0], test_sum, [1, 2, 3])
            runtime.schedule_callback(decrypted_shares[1], test_sum, [3, 6, 9])

        runtime.schedule_callback(partial_shares, decrypt)
        return partial_shares
Пример #12
0
    def test_add_macs_produces_correct_sharing(self, runtime):
        # TODO: Here we use the open method of the BeDOZa runtime in
        # order to verify the macs of the generated full share. In
        # order to be more unit testish, this test should use its own
        # way of verifying these.
        p = 17
        Zp = GF(p)
        secret = 6
        random = Random(283883)
        paillier_random = Random(random.getrandbits(128))
        paillier = ModifiedPaillier(runtime, random)

        add_macs_random = Random(random.getrandbits(128))

        shares_random = Random(random.getrandbits(128))
        shares = []
        shares.append(
            partial_share(shares_random,
                          runtime,
                          Zp,
                          secret,
                          paillier=paillier))
        shares.append(
            partial_share(shares_random,
                          runtime,
                          Zp,
                          secret + 1,
                          paillier=paillier))
        shares.append(
            partial_share(shares_random,
                          runtime,
                          Zp,
                          secret + 2,
                          paillier=paillier))
        shares.append(
            partial_share(shares_random,
                          runtime,
                          Zp,
                          secret + 3,
                          paillier=paillier))

        bits_in_p = 5
        u_bound = 2**(4 * bits_in_p)
        alpha = 15

        zs = add_macs(runtime, Zp, u_bound, alpha, add_macs_random, paillier,
                      shares)

        def verify(open_shares):
            inx = secret
            for open_share in open_shares:
                self.assertEquals(inx, open_share.value)
                inx += 1

        opened_shares = []
        for s in zs:
            opened_shares.append(runtime.open(s))
        d = gather_shares(opened_shares)
        d.addCallback(verify)
        return d
Пример #13
0
 def _partial_random_shares(self, random, runtime, Zp, n, paillier=None):
     if not paillier:
         paillier_random = Random(random.getrandbits(128))
         paillier = ModifiedPaillier(runtime, paillier_random)
     share_random = Random(random.getrandbits(128))
     gen = TestPartialShareGenerator(Zp, runtime, share_random, paillier)
     return gen.generate_random_shares(n)
Пример #14
0
def partial_share(random, runtime, Zp, val, paillier=None):
    if not paillier:
        paillier_random = Random(random.getrandbits(128))
        paillier = ModifiedPaillier(runtime, paillier_random)
    share_random = Random(random.getrandbits(128))
    gen = PartialShareGenerator(Zp, runtime, share_random, paillier)
    return gen.generate_share(Zp(val))
Пример #15
0
    def test_encrypted_real_share_open_correctly(self, runtime):
        random = Random(3423993)
        modulus = 17
        Zp = GF(modulus)
        bits_in_p = 5
        u_bound = 2**(4 * bits_in_p)
        alpha = 15

        paillier = ModifiedPaillier(runtime, Random(random.getrandbits(128)))

        share_random = Random(random.getrandbits(128))
        gen = ShareGenerator(Zp, runtime, share_random, paillier, u_bound,
                             alpha)
        share = gen.generate_share(7)

        def check(v):
            self.assertEquals(7, v)

        r = runtime.open(share)
        runtime.schedule_callback(r, check)
        return r
Пример #16
0
    def test_encrypted_shares_decrypt_correctly(self, runtime):
        random = Random(3423993)
        modulus = 17
        secret = 7
        paillier = ModifiedPaillier(runtime, Random(random.getrandbits(128)))
        share = partial_share(Random(random.getrandbits(128)),
                              runtime,
                              GF(modulus),
                              secret,
                              paillier=paillier)

        def decrypt(share):
            decrypted_share = paillier.decrypt(share.enc_shares[runtime.id -
                                                                1])
            decrypted_shares = _convolute(runtime, decrypted_share)

            def test_sum(vals):
                self.assertEquals(secret, sum(vals) % modulus)

            runtime.schedule_callback(decrypted_shares, test_sum)

        runtime.schedule_callback(share, decrypt)
        return share
Пример #17
0
    def test_share_protocol_single(self, runtime):
        p, k = 17, 5
        Zp = GF(p)
        random = Random(3455433 + runtime.id)
        elms = [Zp(runtime.id)]
        paillier_random = Random(random.getrandbits(128))
        zk_random = Random(random.getrandbits(128))
        paillier = ModifiedPaillier(runtime, paillier_random)
        partial_shares = generate_partial_share_contents(
            elms, runtime, paillier, k, zk_random)

        def decrypt(share_contents):
            self.assertEquals(1, len(share_contents))
            decrypted_share = paillier.decrypt(
                share_contents[0].enc_shares[runtime.id - 1])
            decrypted_shares = _convolute(runtime, decrypted_share)

            def test_sum(vals):
                self.assertEquals([Zp(e) for e in [1, 2, 3]], vals)

            runtime.schedule_callback(decrypted_shares, test_sum)

        runtime.schedule_callback(partial_shares, decrypt)
        return partial_shares
Пример #18
0
 def test_encrypting_too_large_number_raises_exception(self, runtime):
     paillier = ModifiedPaillier(runtime, Random(825604))
     n = runtime.players[runtime.id].pubkey['n']
     val = 1 + (n - 1) / 2
     self.assertRaises(AssertionError, paillier.encrypt, val)
Пример #19
0
 def test_modified_paillier_can_decrypt_encrypted_zero(self, runtime):
     paillier = ModifiedPaillier(runtime, Random(338301))
     val = 0
     encrypted_val = paillier.encrypt(val)
     decrypted_val = paillier.decrypt(encrypted_val)
     self.assertEquals(val, decrypted_val)
Пример #20
0
 def test_modified_paillier_can_decrypt_encrypted_one(self, runtime):
     paillier = ModifiedPaillier(runtime, Random(234838))
     val = 1
     encrypted_val = paillier.encrypt(val)
     decrypted_val = paillier.decrypt(encrypted_val)
     self.assertEquals(val, decrypted_val)
Пример #21
0
 def test_modified_paillier_can_decrypt_encrypted_positive(self, runtime):
     paillier = ModifiedPaillier(runtime, Random(777737))
     val = 73423
     encrypted_val = paillier.encrypt(val)
     decrypted_val = paillier.decrypt(encrypted_val)
     self.assertEquals(val, decrypted_val)
Пример #22
0
 def test_encrypting_too_small_number_raises_exception(self, runtime):
     paillier = ModifiedPaillier(runtime, Random(554424))
     n = runtime.players[runtime.id].pubkey['n']
     val = -(n - 1) / 2 - 1
     self.assertRaises(AssertionError, paillier.encrypt, val)
Пример #23
0
 def test_modified_paillier_can_decrypt_encrypted_positive(self, runtime):
     paillier = ModifiedPaillier(runtime, Random(777737))
     val = 73423
     encrypted_val = paillier.encrypt(val)
     decrypted_val = paillier.decrypt(encrypted_val)
     self.assertEquals(val, decrypted_val)
Пример #24
0
 def test_modified_paillier_can_decrypt_encrypted_one(self, runtime):
     paillier = ModifiedPaillier(runtime, Random(234838))
     val = 1
     encrypted_val = paillier.encrypt(val)
     decrypted_val = paillier.decrypt(encrypted_val)
     self.assertEquals(val, decrypted_val)
Пример #25
0
 def test_modified_paillier_can_decrypt_encrypted_zero(self, runtime):
     paillier = ModifiedPaillier(runtime, Random(338301))
     val = 0
     encrypted_val = paillier.encrypt(val)
     decrypted_val = paillier.decrypt(encrypted_val)
     self.assertEquals(val, decrypted_val)