Exemplo n.º 1
0
    def test_convert(self):
        secint = mpc.SecInt()
        secint8 = mpc.SecInt(8)
        secint16 = mpc.SecInt(16)
        secfld257 = mpc.SecFld(257)
        secfld263 = mpc.SecFld(263)
        secfxp = mpc.SecFxp()
        secfxp16 = mpc.SecFxp(16)

        x = [secint8(-100), secint8(100)]
        y = mpc.convert(x, secint)
        self.assertEqual(mpc.run(mpc.output(y)), [-100, 100])
        y = mpc.convert(y, secint8)
        self.assertEqual(mpc.run(mpc.output(y)), [-100, 100])

        x = [secint16(i) for i in range(10)]
        y = mpc.convert(x, secfld257)
        self.assertEqual(mpc.run(mpc.output(y)), list(range(10)))

        x = [secfld257(i) for i in range(10)]
        y = mpc.convert(x, secfld263)
        self.assertEqual(mpc.run(mpc.output(y)), list(range(10)))

        x = [secint(-100), secint(100)]
        y = mpc.convert(x, secfxp)
        self.assertEqual(mpc.run(mpc.output(y)), [-100, 100])
        y = mpc.convert(y, secint)
        self.assertEqual(mpc.run(mpc.output(y)), [-100, 100])

        x = [secfxp16(-100.25), secfxp16(100.875)]
        y = mpc.convert(x, secfxp)
        self.assertEqual(mpc.run(mpc.output(y)), [-100.25, 100.875])
        y = mpc.convert(y, secfxp16)
        self.assertEqual(mpc.run(mpc.output(y)), [-100.25, 100.875])
Exemplo n.º 2
0
def main():
    if not mpc.args:
        m = 8
        print('Setting input to default =', m)
    else:
        m = int(mpc.args[0])

    mpc.start()

    secfld = mpc.SecFld(l=max(len(mpc.parties), (m - 1)).bit_length() + 1)
    print('Using secure fields:', secfld)
    for n in range(2, m + 1):
        print(n, mpc.run(mpc.output(random_derangement(n, secfld))))

    secint = mpc.SecInt()
    print('Using secure integers:', secint)
    for n in range(2, m + 1):
        print(n, mpc.run(mpc.output(random_derangement(n, secint))))

    secfxp = mpc.SecFxp()
    print('Using secure fixed-point numbers:', secfxp)
    for n in range(2, m + 1):
        print(n, mpc.run(mpc.output(random_derangement(n, secfxp))))

    mpc.shutdown()
Exemplo n.º 3
0
async def main():
    if sys.argv[1:]:
        n = int(sys.argv[1])
    else:
        n = 5
        print('Setting input to default =', n)

    s = [(-1)**i * (i + n//2)**2 for i in range(n)]

    secnum = mpc.SecInt()
    print('Using secure integers:', secnum)
    x = list(map(secnum, s))
    async with mpc:
        mpc.random.shuffle(secnum, x)  # secret in-place random shuffle
        print('Randomly shuffled input:', await mpc.output(x))
        x = mpc.sorted(x, key=lambda a: a**2)  # sort on absolute value
        print('Sorted by absolute value:', await mpc.output(x))

    secnum = mpc.SecFxp()
    print('Using secure fixed-point numbers:', secnum)
    x = list(map(secnum, s))
    async with mpc:
        mpc.random.shuffle(secnum, x)  # secret in-place random shuffle
        print('Randomly shuffled input:', await mpc.output(x))
        x = mpc.seclist(x)
        x.sort(reverse=True)  # in-place sort in descending order
        print('Sorted by descending value:', await mpc.output(list(x)))
Exemplo n.º 4
0
    def test_secint(self):
        secint = mpc.SecInt()
        y = [1, 3, -2, 3, 1, -2, -2, 4] * 5
        random.shuffle(y)
        x = list(map(secint, y))
        self.assertEqual(mpc.run(mpc.output(mean(x))), round(statistics.mean(y)))
        self.assertEqual(mpc.run(mpc.output(variance(x))), round(statistics.variance(y)))
        self.assertEqual(mpc.run(mpc.output(variance(x, mean(x)))), round(statistics.variance(y)))
        self.assertEqual(mpc.run(mpc.output(stdev(x))), round(statistics.stdev(y)))
        self.assertEqual(mpc.run(mpc.output(pvariance(x))), round(statistics.pvariance(y)))
        self.assertEqual(mpc.run(mpc.output(pstdev(x))), round(statistics.pstdev(y)))
        self.assertEqual(mpc.run(mpc.output(mode(x))), round(statistics.mode(y)))
        self.assertEqual(mpc.run(mpc.output(median(x))), round(statistics.median(y)))
        self.assertEqual(mpc.run(mpc.output(median_low(x))), round(statistics.median_low(y)))
        self.assertEqual(mpc.run(mpc.output(median_high(x))), round(statistics.median_high(y)))
        self.assertEqual(mpc.run(mpc.output(quantiles(x[:2], n=3))),
                         statistics.quantiles(y[:2], n=3))
        self.assertEqual(mpc.run(mpc.output(quantiles(x, n=1))), statistics.quantiles(y, n=1))
        self.assertEqual(mpc.run(mpc.output(quantiles(x))), statistics.quantiles(y))
        x = list(range(16))
        y = list(reversed(x))
        self.assertAlmostEqual(covariance(x, y), -22.667, 3)
        x = list(map(secint, x))
        y = list(map(secint, y))
        self.assertEqual(mpc.run(mpc.output(covariance(x, y))), -23)

        self.assertRaises(ValueError, quantiles, x, method='wrong')
Exemplo n.º 5
0
 def test_if_else(self):
     secfld = mpc.SecFld()
     a = secfld(0)
     b = secfld(1)
     c = secfld(1)
     self.assertEqual(mpc.run(mpc.output(mpc.if_else(c, a, b))), 0)
     self.assertEqual(mpc.run(mpc.output(mpc.if_else(1 - c, a, b))), 1)
     self.assertEqual(mpc.run(mpc.output(mpc.if_else(c, [a, b], [b, a]))),
                      [0, 1])
     self.assertEqual(
         mpc.run(mpc.output(mpc.if_else(1 - c, [a, b], [b, a]))), [1, 0])
     secint = mpc.SecInt()
     a = secint(-1)
     b = secint(1)
     c = secint(1)
     self.assertEqual(mpc.run(mpc.output(mpc.if_else(c, a, b))), -1)
     self.assertEqual(mpc.run(mpc.output(mpc.if_else(1 - c, a, b))), 1)
     self.assertEqual(mpc.run(mpc.output(mpc.if_else(c, [a, b], [b, a]))),
                      [-1, 1])
     self.assertEqual(
         mpc.run(mpc.output(mpc.if_else(1 - c, [a, b], [b, a]))), [1, -1])
     secfxp = mpc.SecFxp()
     a = secfxp(-1.0)
     b = secfxp(1.0)
     c = secfxp(1)
     self.assertEqual(mpc.run(mpc.output(mpc.if_else(c, a, b))), -1.0)
     self.assertEqual(mpc.run(mpc.output(mpc.if_else(1 - c, a, b))), 1.0)
     self.assertEqual(mpc.run(mpc.output(mpc.if_else(c, 0.0, 1.0))), 0.0)
     self.assertEqual(mpc.run(mpc.output(mpc.if_else(1 - c, 0.0, 1.0))),
                      1.0)
Exemplo n.º 6
0
 def test_misc(self):
     secint = mpc.SecInt()
     secfxp = mpc.SecFxp()
     secfld = mpc.SecFld()
     for secnum in (secint, secfxp, secfld):
         self.assertEqual(type(mpc.run(mpc.output(secnum(0), raw=True))), secnum.field)
         self.assertEqual(mpc.run(mpc.output(mpc._reshare([secnum(0)]))), [0])
         self.assertEqual(mpc.run(mpc.output(mpc.all(secnum(1) for _ in range(5)))), True)
         self.assertEqual(mpc.run(mpc.output(mpc.all([secnum(1), secnum(1), secnum(0)]))), False)
         self.assertEqual(mpc.run(mpc.output(mpc.any(secnum(0) for _ in range(5)))), False)
         self.assertEqual(mpc.run(mpc.output(mpc.any([secnum(0), secnum(1), secnum(1)]))), True)
         self.assertEqual(mpc.run(mpc.output(mpc.sum([secnum(1)], start=1))), 2)
         self.assertEqual(mpc.run(mpc.output(mpc.prod([secnum(1)], start=1))), 1)
         self.assertEqual(mpc.run(mpc.output(mpc.sum([secnum(1)], start=secnum(1)))), 2)
     self.assertEqual(mpc.run(mpc.output(mpc.min(secint(i) for i in range(-1, 2, 1)))), -1)
     self.assertEqual(mpc.run(mpc.output(mpc.argmin(secint(i) for i in range(-1, 2, 1))[0])), 0)
     self.assertEqual(mpc.run(mpc.output(mpc.max(secfxp(i) for i in range(-1, 2, 1)))), 1)
     self.assertEqual(mpc.run(mpc.output(mpc.argmax(secfxp(i) for i in range(-1, 2, 1))[0])), 2)
     self.assertEqual(mpc.run(mpc.output(list(mpc.min_max(map(secfxp, range(5)))))), [0, 4])
     x = (secint(i) for i in range(-3, 3))
     s = [0, -1, 1, -2, 2, -3]
     self.assertEqual(mpc.run(mpc.output(mpc.sorted(x, key=lambda a: a*(2*a+1)))), s)
     x = (secfxp(i) for i in range(5))
     self.assertEqual(mpc.run(mpc.output(mpc.sorted(x, reverse=True))), [4, 3, 2, 1, 0])
     self.assertEqual(mpc.run(mpc.output(mpc.sum(map(secint, range(5))))), 10)
     self.assertEqual(mpc.run(mpc.output(mpc.sum([secfxp(2.75)], start=3.125))), 5.875)
     self.assertEqual(int(mpc.run(mpc.output(mpc.prod(map(secfxp, range(1, 5)))))), 24)
     self.assertEqual(int(mpc.run(mpc.output(mpc.prod([secfxp(1.414214)]*4)))), 4)
Exemplo n.º 7
0
 def test_secint(self):
     secint = mpc.SecInt()
     y = [1, 3, -2, 3, 1, -2, -2, 4] * 5
     random.shuffle(y)
     x = list(map(secint, y))
     self.assertEqual(mpc.run(mpc.output(mean(x))),
                      round(statistics.mean(y)))
     self.assertEqual(mpc.run(mpc.output(variance(x))),
                      round(statistics.variance(y)))
     self.assertEqual(mpc.run(mpc.output(variance(x, mean(x)))),
                      round(statistics.variance(y)))
     self.assertEqual(mpc.run(mpc.output(stdev(x))),
                      round(statistics.stdev(y)))
     self.assertEqual(mpc.run(mpc.output(pvariance(x))),
                      round(statistics.pvariance(y)))
     self.assertEqual(mpc.run(mpc.output(pstdev(x))),
                      round(statistics.pstdev(y)))
     self.assertEqual(mpc.run(mpc.output(mode(x))),
                      round(statistics.mode(y)))
     self.assertEqual(mpc.run(mpc.output(median(x))),
                      round(statistics.median(y)))
     self.assertEqual(mpc.run(mpc.output(median_low(x))),
                      round(statistics.median_low(y)))
     self.assertEqual(mpc.run(mpc.output(median_high(x))),
                      round(statistics.median_high(y)))
Exemplo n.º 8
0
async def main():

    # initialize mpc, define secure int type
    await mpc.start()
    secint = mpc.SecInt(64)

    # initialize inputs
    # 3 parties: random value for each party
    # any other number of parties: just use player 0's value 3 times.
    value = np.random.randint(1,10000)
    print("player {} input: {}".format(mpc.pid, value))

    n = len(mpc.parties)
    if n != 3:
        inputs = [secint(value), secint(value), secint(value)]
        print("expected: {}".format(value ** 3))
    else:
        inputs = mpc.input(secint(value), senders=[0,1,2])

    # compute product 
    prod = mpc.prod(inputs)
   
    # output result
    result = await mpc.output(prod)
    print("result:", result)
    await mpc.shutdown()
Exemplo n.º 9
0
async def main():

    # initialize mpc, define secure int type
    LEN = 100000
    await mpc.start()
    secint = mpc.SecInt(128)

    # party 0 samples the inputs locally...
    if mpc.pid == 0:
        vec1 = [np.random.randint(1, 1000) for _ in range(LEN)]
        vec2 = [np.random.randint(1, 1000) for _ in range(LEN)]

    # ...and secret-shares them with the others
    result_type = [secint()] * LEN
    sec_vec1 = mpc.input([secint(v)
                          for v in vec1] if mpc.pid == 0 else result_type,
                         senders=0)
    sec_vec2 = mpc.input([secint(v)
                          for v in vec2] if mpc.pid == 0 else result_type,
                         senders=0)

    # compute inner product
    ip = mpc.in_prod(sec_vec1, sec_vec2)

    # output result (to everybody)
    result = await mpc.output(ip)
    print("result:", result)
    if mpc.pid == 0:
        assert (result == np.dot(vec1, vec2))
    await mpc.shutdown()
Exemplo n.º 10
0
async def main():
    if sys.argv[1:]:
        n = int(sys.argv[1])
    else:
        n = 5
        print('Setting input to default =', n)

    s = [(-1)**i * (i + (n // 2))**2 for i in range(n)]

    await mpc.start()

    global secnum

    secnum = mpc.SecInt()
    print('Using secure integers:', secnum)
    x = list(map(secnum, s))
    print('Array:', await mpc.output(x))
    print('Sorted array:', await mpc.output(bsort(x)))

    secnum = mpc.SecFxp()
    print('Using secure fixed-point numbers:', secnum)
    x = list(map(secnum, s))
    print('Input array:', await mpc.output(x))
    print('Sorted array:', await mpc.output(bsort(x)))

    await mpc.shutdown()
Exemplo n.º 11
0
async def main():
    if sys.argv[1:]:
        N = int(sys.argv[1])
    else:
        N = 8
        print('Setting input to default =', N)

    await mpc.start()

    secint = mpc.SecInt()
    print('Using secure integers:', secint)
    for n in range(2, N + 1):
        print(n, await mpc.output(random_derangement(n, secint)))

    secfxp = mpc.SecFxp()
    print('Using secure fixed-point numbers:', secfxp)
    for n in range(2, N + 1):
        print(n, await mpc.output(random_derangement(n, secfxp)))

    secpfld = mpc.SecFld(l=max(len(mpc.parties), (N - 1)).bit_length())
    print('Using secure prime fields:', secpfld)
    for n in range(2, N + 1):
        print(n, await mpc.output(random_derangement(n, secpfld)))

    secbfld = mpc.SecFld(char2=True,
                         l=max(len(mpc.parties), (N - 1)).bit_length())
    print('Using secure binary fields:', secbfld)
    for n in range(2, N + 1):
        print(n, await mpc.output(random_derangement(n, secbfld)))

    await mpc.shutdown()
Exemplo n.º 12
0
 def test_if_else_if_swap(self):
     secfld = mpc.SecFld()
     a = secfld(0)
     b = secfld(1)
     c = secfld(1)
     self.assertEqual(mpc.run(mpc.output(c.if_else(a, b))), 0)
     self.assertEqual(mpc.run(mpc.output(mpc.if_swap(1 - c, a, b))), [0, 1])
     self.assertEqual(mpc.run(mpc.output(mpc.if_else(c, [a, b], [b, a]))),
                      [0, 1])
     self.assertEqual(mpc.run(mpc.output((1 - c).if_swap(a, b))), [0, 1])
     secint = mpc.SecInt()
     a = secint(-1)
     b = secint(1)
     c = secint(1)
     self.assertEqual(mpc.run(mpc.output(c.if_swap([a, b], [b, a])[0])),
                      [1, -1])
     self.assertEqual(mpc.run(mpc.output(mpc.if_else(1 - c, b, b))), 1)
     self.assertEqual(mpc.run(mpc.output(mpc.if_swap(c, a, b))), [1, -1])
     self.assertEqual(mpc.run(mpc.output((1 - c).if_else([a, b], [b, a]))),
                      [1, -1])
     secfxp = mpc.SecFxp()
     a = secfxp(-1.0)
     b = secfxp(1.0)
     c = secfxp(1)
     self.assertEqual(mpc.run(mpc.output(c.if_else([a, a], [b, b]))),
                      [-1.0, -1.0])
     self.assertEqual(mpc.run(mpc.output(mpc.if_swap(1 - c, a, b))),
                      [-1.0, 1.0])
     self.assertEqual(mpc.run(mpc.output(mpc.if_swap(c, 0.0, 1.0))),
                      [1.0, 0.0])
     self.assertEqual(mpc.run(mpc.output((1 - c).if_else(0.0, 1.0))), 1.0)
Exemplo n.º 13
0
    def test_io(self):
        x = ({4, 3}, [1 - 1j, 2.5], 0, range(7))
        self.assertEqual(mpc.run(mpc.transfer(x))[0], x)
        self.assertEqual(mpc.run(mpc.transfer(x, senders=0)), x)
        self.assertEqual(mpc.run(mpc.transfer(x, senders=[0]))[0], x)
        self.assertEqual(
            mpc.run(mpc.transfer(x, senders=iter(range(1))))[0], x)
        self.assertEqual(mpc.run(mpc.transfer(x, receivers=0))[0], x)
        self.assertEqual(mpc.run(mpc.transfer(x, receivers=[0]))[0], x)
        self.assertEqual(
            mpc.run(mpc.transfer(x, receivers=iter(range(1))))[0], x)
        self.assertEqual(mpc.run(mpc.transfer(x, senders=0, receivers=0)), x)
        self.assertEqual(
            mpc.run(mpc.transfer(x, senders=[0], receivers=[0]))[0], x)
        self.assertEqual(
            mpc.run(mpc.transfer(x, sender_receivers=[(0, 0)]))[0], x)
        self.assertEqual(
            mpc.run(mpc.transfer(x, sender_receivers={0: {0}}))[0], x)

        a = mpc.SecInt()(7)
        self.assertEqual(mpc.run(mpc.output(mpc.input(a)))[0], 7)
        self.assertEqual(mpc.run(mpc.output(mpc.input(a)[0])), 7)
        self.assertEqual(mpc.run(mpc.output(mpc.input(a, senders=0))), 7)
        self.assertEqual(mpc.run(mpc.output(mpc.input(a, senders=[0])))[0], 7)
        self.assertEqual(
            mpc.run(mpc.output(mpc.input(a, senders=iter(range(1)))))[0], 7)
        self.assertEqual(mpc.run(mpc.output(mpc.input(a, senders=[0])))[0], 7)
        self.assertEqual(mpc.run(mpc.output(mpc.input(a, senders=[0])[0])), 7)
        self.assertEqual(mpc.run(mpc.output(mpc.input(a), receivers=0))[0], 7)
        self.assertEqual(mpc.run(mpc.output(mpc.input(a)[0], receivers=0)), 7)
        self.assertEqual(
            mpc.run(mpc.output(mpc.input(a), receivers=[0]))[0], 7)
        self.assertEqual(
            mpc.run(mpc.output(mpc.input(a), receivers=iter(range(1))))[0], 7)
        self.assertEqual(mpc.run(mpc.output(mpc.input(a)[0], receivers=[0])),
                         7)
        self.assertEqual(
            mpc.run(mpc.output(mpc.input(a, senders=0), receivers=0)), 7)
        self.assertEqual(
            mpc.run(mpc.output(mpc.input(a, senders=[0]), receivers=[0]))[0],
            7)
        self.assertEqual(
            mpc.run(mpc.output(mpc.input(a, senders=[0])[0], receivers=[0])),
            7)

        x = [a, a]
        self.assertEqual(mpc.run(mpc.output(mpc.input(x)[0])), [7, 7])
        self.assertEqual(mpc.run(mpc.output(mpc.input(x, senders=0))), [7, 7])
        self.assertEqual(mpc.run(mpc.output(mpc.input(x, senders=[0])[0])),
                         [7, 7])
        self.assertEqual(mpc.run(mpc.output(mpc.input(x)[0], receivers=0)),
                         [7, 7])
        self.assertEqual(mpc.run(mpc.output(mpc.input(x)[0], receivers=[0])),
                         [7, 7])
        self.assertEqual(
            mpc.run(mpc.output(mpc.input(x, senders=0), receivers=0)), [7, 7])
        self.assertEqual(
            mpc.run(mpc.output(mpc.input(x, senders=[0])[0], receivers=[0])),
            [7, 7])
Exemplo n.º 14
0
 def test_errors(self):
     secint = mpc.SecInt()
     self.assertRaises(ValueError, randrange, secint, 0)
     self.assertRaises(IndexError, choice, secint, [])
     self.assertRaises(TypeError, choices, secint, [], weights=[1], cum_weights=[1])
     self.assertRaises(ValueError, choices, secint, [], weights=[1])
     self.assertRaises(ValueError, sample, secint, [], 1)
     self.assertRaises(TypeError, random, secint)
     self.assertRaises(TypeError, uniform, secint, -0.5, 0.5)
Exemplo n.º 15
0
 def test_async(self):
     mpc.options.no_async = False
     a = mpc.SecInt()(7)
     b = a * a
     mpc.run(mpc.barrier())
     self.assertEqual(mpc.run(mpc.output(b)), 49)
     self.assertEqual(mpc.run(mpc.output(mpc.scalar_mul(a, [-a, a]))),
                      [-49, 49])
     mpc.options.no_async = True
Exemplo n.º 16
0
    def test_pickle(self):
        xsecfld = mpc.SecFld(256)
        psecfld = mpc.SecFld(257)
        secint = mpc.SecInt()
        secfxp = mpc.SecFxp()
        secflt = mpc.SecFlt()
        seccl = mpc.SecClassGroup(-23)
        a = seccl.group((2, 1))
        # NB: mpc.transfer() calls pickle.dumps() and pickle.loads()
        self.assertEqual(
            mpc.run(mpc.output(mpc.run(mpc.transfer(xsecfld(12), senders=0)))),
            12)
        self.assertEqual(
            mpc.run(mpc.output(mpc.run(mpc.transfer(psecfld(12), senders=0)))),
            12)
        self.assertEqual(
            mpc.run(mpc.output(mpc.run(mpc.transfer(secint(12), senders=0)))),
            12)
        self.assertEqual(
            mpc.run(mpc.output(mpc.run(mpc.transfer(secfxp(12.5),
                                                    senders=0)))), 12.5)
        self.assertEqual(
            mpc.run(mpc.output(mpc.run(mpc.transfer(secflt(12.5),
                                                    senders=0)))), 12.5)
        self.assertEqual(
            mpc.run(
                mpc.output(mpc.run(mpc.transfer(seccl((2, 1, 3)),
                                                senders=0)))), a)
        self.assertEqual(mpc.run(mpc.transfer(xsecfld.field(12), senders=0)),
                         12)
        self.assertEqual(mpc.run(mpc.transfer(psecfld.field(12), senders=0)),
                         12)
        self.assertEqual(mpc.run(mpc.transfer(secint.field(12), senders=0)),
                         12)
        self.assertEqual(mpc.run(mpc.transfer(secfxp.field(13), senders=0)),
                         13)
        self.assertEqual(mpc.run(mpc.transfer(xsecfld.field.modulus, 0)),
                         xsecfld.field.modulus)

        x = [(xsecfld(12), psecfld(12), secint(12), secfxp(12.5), secflt(12.5),
              seccl((2, 1, 3))),
             [
                 xsecfld.field(12),
                 psecfld.field(12),
                 secint.field(12),
                 secfxp.field(13), a
             ], xsecfld.field.modulus]
        y = mpc.run(mpc.transfer(x, senders=0))
        self.assertTrue(
            all(mpc.run(mpc.output(a == b)) for a, b in zip(y[0], x[0])))
        self.assertEqual(y[1], x[1])
        self.assertEqual(y[2], x[2])
Exemplo n.º 17
0
 def test_empty_input(self):
     secint = mpc.SecInt()
     self.assertEqual(mpc.run(mpc.gather([])), [])
     self.assertEqual(mpc.run(mpc.output([])), [])
     self.assertEqual(mpc._reshare([]), [])
     self.assertEqual(mpc.convert([], None), [])
     self.assertEqual(mpc.sum([]), 0)
     self.assertEqual(mpc.prod([]), 1)
     self.assertEqual(mpc.in_prod([], []), 0)
     self.assertEqual(mpc.vector_add([], []), [])
     self.assertEqual(mpc.vector_sub([], []), [])
     self.assertEqual(mpc.scalar_mul(secint(0), []), [])
     self.assertEqual(mpc.schur_prod([], []), [])
     self.assertEqual(mpc.from_bits([]), 0)
Exemplo n.º 18
0
 def test_gcd(self):
     secint = mpc.SecInt(16)
     self.assertEqual(mpc.run(mpc.output(mpc.trailing_zeros(secint(0)))),
                      [0] * 16)
     self.assertEqual(mpc.run(mpc.output(mpc.trailing_zeros(secint(7))[0])),
                      1)
     self.assertEqual(
         mpc.run(mpc.output(mpc.trailing_zeros(secint(-6))[:2])), [0, 1])
     self.assertEqual(
         mpc.run(mpc.output(mpc.trailing_zeros(secint(4))[:3])), [0, 0, 1])
     self.assertEqual(
         mpc.run(mpc.output(mpc.trailing_zeros(secint(-5664))[:6])),
         [0] * 5 + [1])
     self.assertEqual(mpc.run(mpc.output(mpc.gcp2(secint(0), secint(0)))),
                      1 << 16)
     self.assertEqual(mpc.run(mpc.output(mpc.gcp2(secint(0), secint(-64)))),
                      64)
     self.assertEqual(
         mpc.run(mpc.output(mpc.gcp2(secint(5664), secint(64)))), 32)
     self.assertEqual(mpc.run(mpc.output(mpc.gcp2(secint(1), secint(-64)))),
                      1)
     self.assertEqual(mpc.run(mpc.output(mpc.gcd(secint(0), secint(0)))), 0)
     self.assertEqual(
         mpc.run(mpc.output(mpc.gcd(secint(0), secint(3), l=3))), 3)
     self.assertEqual(mpc.run(mpc.output(mpc.gcd(secint(-33), secint(30)))),
                      3)
     self.assertEqual(mpc.run(mpc.output(mpc.lcm(secint(0), secint(0)))), 0)
     self.assertEqual(mpc.run(mpc.output(mpc.lcm(secint(-33), secint(0)))),
                      0)
     self.assertEqual(mpc.run(mpc.output(mpc.lcm(secint(-66), secint(30)))),
                      330)
     self.assertEqual(
         mpc.run(mpc.output(mpc.lcm(secint(-120), secint(60), l=8))), 120)
     self.assertEqual(
         mpc.run(mpc.output(mpc.inverse(secint(10), secint(1)))), 0)
     self.assertEqual(
         mpc.run(mpc.output(mpc.inverse(secint(11), secint(16), l=6))), 3)
     self.assertEqual(
         mpc.run(mpc.output(mpc.inverse(secint(1234), secint(6789)))), 5089)
     self.assertEqual(
         mpc.run(mpc.output(mpc.inverse(secint(1234 + 6789),
                                        secint(6789)))), 5089)
     self.assertEqual(
         mpc.run(mpc.output(list(mpc.gcdext(secint(0), secint(0))))),
         [0, 0, 0])
     for a, b in ((-300, -300), (2345, 2345), (60, -88), (-360, 9), (0,
                                                                     256)):
         g, s, t = mpc.run(
             mpc.output(list(mpc.gcdext(secint(a), secint(b)))))
         self.assertTrue(g == math.gcd(a, b) and g == s * a + t * b)
Exemplo n.º 19
0
def prepare_list(input_bits):
    # define placeholder type as int
    sec_int = mpc.SecInt()
    # distribute secret data
    input_list = [None] * len(input_bits)
    for i in range(len(input_bits)):
        # each process finds its own data at the position of its id and writes it in its own secret version of the list
        if mpc.pid == i:
            input_list[i] = input_bits[i]
    # prepare special internal list with placeholders and secret data
    sec_vec_l = [None] * len(input_bits)
    for i in range(len(input_bits)):
        sec_vec_l[i] = mpc.input(
            sec_int(input_list[i]) if mpc.pid == i else sec_int(), senders=i)
    return sec_vec_l
Exemplo n.º 20
0
async def main():
    if sys.argv[1:]:
        n = int(sys.argv[1])
    else:
        n = 10
        print('Setting input to default =', n)

    secfld = mpc.SecFld(min_order=max(len(mpc.parties) + 1, n))
    secint = mpc.SecInt()
    secfxp = mpc.SecFxp()

    await xprint(n, mpc.unit_vector, secfld)
    # NB: secret_index does not work with secfld
    await xprint(n, mpc.unit_vector, secint)
    await xprint(n, secret_index, secint)
    await xprint(n, mpc.unit_vector, secfxp)
    await xprint(n, secret_index, secfxp)
Exemplo n.º 21
0
async def keygen(g):
    """Threshold ElGamal key generation."""
    group = type(g)
    secgrp = mpc.SecGrp(group)
    n = group.order
    if n is not None and is_prime(n):
        secnum = mpc.SecFld(n)
    else:
        l = isqrt(-group.discriminant).bit_length()
        secnum = mpc.SecInt(l)

    while True:
        x = mpc._random(secnum)
        h = await secgrp.repeat_public(g, x)  # g^x
        if h != group.identity:
            # NB: this branch will always be followed unless n is artificially small
            return x, h
Exemplo n.º 22
0
    def test_secint(self):
        secint = mpc.SecInt()
        s = seclist([], secint)
        self.assertEqual(s, [])
        s = seclist(sectype=secint)
        self.assertEqual(s, [])
        s.append(False)
        s.append(secint(7))
        s[0] = secint(13)
        self.assertEqual(mpc.run(mpc.output(list(s))),
                         [13, 7])  # NB: list to convert from seclist
        i = [secint(0), secint(1)]
        s[i] = 5
        self.assertEqual(mpc.run(mpc.output(s[1])), 5)

        i0 = [secint(1), secint(0)]
        i1 = [secint(0), secint(1)]
        s[i0], s[i1] = s[i1], s[i0]
        self.assertEqual(mpc.run(mpc.output(list(s))), [5, 13])
        s[i0], s[i1] = s[i1], s[i0]
        self.assertEqual(mpc.run(mpc.output(list(s))), [13, 5])
        s[0], s[1] = s[1], s[0]
        self.assertEqual(mpc.run(mpc.output(list(s))), [5, 13])
        s.append(secint(8))
        s.reverse()
        self.assertEqual(mpc.run(mpc.output(list(s))), [8, 13, 5])

        a = s[secint(1)]
        self.assertEqual(mpc.run(mpc.output(a)), 13)
        s[secint(1)] = secint(21)
        self.assertEqual(mpc.run(mpc.output(s[1])), 21)

        s = seclist([0] * 7, secint)
        for a in [secint(3)] * 3 + [secint(4)] * 4:
            s[a] += 1
        self.assertEqual(mpc.run(mpc.output(list(s))), [0, 0, 0, 3, 4, 0, 0])

        self.assertTrue(mpc.run(mpc.output(s.__contains__(0))))
        self.assertFalse(mpc.run(mpc.output(s.__contains__(9))))
        self.assertEqual(mpc.run(mpc.output(s.count(0))), 5)
        self.assertEqual(mpc.run(mpc.output(s.index(4))), 4)
        self.assertRaises(ValueError, s.index, 9)
        self.assertRaises(ValueError, seclist([], secint).index, 0)
        s.sort(lambda a: -a**2, reverse=True)
        self.assertEqual(mpc.run(mpc.output(list(s))), 5 * [0] + [3, 4])
Exemplo n.º 23
0
 def test_misc(self):
     secint = mpc.SecInt()
     secfxp = mpc.SecFxp()
     secfld = mpc.SecFld()
     for secnum in (secint, secfxp, secfld):
         self.assertEqual(mpc.run(mpc.output(mpc._reshare([secnum(0)]))),
                          [0])
         self.assertEqual(
             mpc.run(mpc.output(mpc.all(secnum(1) for _ in range(5)))),
             True)
         self.assertEqual(
             mpc.run(mpc.output(mpc.all([secnum(1),
                                         secnum(1),
                                         secnum(0)]))), False)
         self.assertEqual(
             mpc.run(mpc.output(mpc.any(secnum(0) for _ in range(5)))),
             False)
         self.assertEqual(
             mpc.run(mpc.output(mpc.any([secnum(0),
                                         secnum(1),
                                         secnum(1)]))), True)
         self.assertEqual(
             mpc.run(mpc.output(mpc.sum([secnum(1)], start=1))), 2)
         self.assertEqual(
             mpc.run(mpc.output(mpc.prod([secnum(1)], start=1))), 1)
         self.assertEqual(
             mpc.run(mpc.output(mpc.sum([secnum(1)], start=secnum(1)))), 2)
     self.assertEqual(
         mpc.run(mpc.output(mpc.min(secint(i) for i in range(-1, 2, 1)))),
         -1)
     self.assertEqual(
         mpc.run(mpc.output(mpc.max(secfxp(i) for i in range(-1, 2, 1)))),
         1)
     self.assertEqual(
         mpc.run(mpc.output(list(mpc.min_max(map(secfxp, range(5)))))),
         [0, 4])
     self.assertEqual(mpc.run(mpc.output(mpc.sum(map(secint, range(5))))),
                      10)
     self.assertEqual(
         mpc.run(mpc.output(mpc.sum([secfxp(2.72)], start=3.14))), 5.86)
     self.assertEqual(
         int(mpc.run(mpc.output(mpc.prod(map(secfxp, range(1, 5)))))), 24)
     self.assertEqual(
         int(mpc.run(mpc.output(mpc.prod([secfxp(1.414214)] * 4)))), 4)
Exemplo n.º 24
0
async def main():
    if sys.argv[1:]:
        N = int(sys.argv[1])
    else:
        N = 8
        print('Setting input to default =', N)

    await mpc.start()

    await xprint(N, 'integers', mpc.SecInt())
    await xprint(N, 'fixed-point numbers:', mpc.SecFxp())
    bound = max(len(mpc.parties) + 1, N)
    await xprint(N, 'prime fields', mpc.SecFld(min_order=bound))
    await xprint(N, 'binary fields', mpc.SecFld(char=2, min_order=bound))
    await xprint(N, 'quinary fields', mpc.SecFld(char=5, min_order=bound))
    await xprint(N, 'extension fields (medium prime)', mpc.SecFld(order=11**7))
    await xprint(N, 'extension fields (larger prime)', mpc.SecFld(order=1031**3))

    await mpc.shutdown()
Exemplo n.º 25
0
 def test_accumulate(self):
     secint = mpc.SecInt()
     r = range(1, 9)
     x = [secint(i) for i in r]
     for acc in itertools.accumulate, mpyc.mpctools.accumulate:
         self.assertEqual(mpc.run(mpc.output(list(acc(x)))),
                          list(itertools.accumulate(r)))
         self.assertEqual(mpc.run(mpc.output(list(acc(x, mpc.mul)))),
                          list(itertools.accumulate(r, operator.mul)))
         self.assertEqual(mpc.run(mpc.output(list(acc(x, mpc.min)))),
                          list(itertools.accumulate(r, min)))
         self.assertEqual(mpc.run(mpc.output(list(acc(x, mpc.max)))),
                          list(itertools.accumulate(r, max)))
     a = secint(10)
     self.assertEqual(
         mpc.run(
             mpc.output(
                 list(acc(itertools.repeat(a, 5), mpc.mul, secint(1))))),
         [1, 10, 10**2, 10**3, 10**4, 10**5])
Exemplo n.º 26
0
async def main():
    """
     mpyc benötigt eigene sichere Datenpypen
     die sicheren Datentypen werden als Platzhalter verwendet
     beim Start von mpc werden die Partein sich mit einem Platzhalter verbinden und ihre geheime Information eintragen
     """

    secint = mpc.SecInt()
    # damit können wir ints umwandeln in die sicheren Datentypen von mpyc
    input_bits = [secint(-1), secint(1), secint(1), secint(1)]

    # start mpc und Verbinden der Partein durch lokale TCP- Kommunikation
    await mpc.start()

    erg = signumsum(input_bits)
    # holen des Ergebnisses
    result = await mpc.output(erg)
    print("result:", result)

    # schließen der TCP-Verbindungen
    await mpc.shutdown()
Exemplo n.º 27
0
 def test_reduce(self):
     secint = mpc.SecInt()
     r = range(1, 9)
     x = [secint(i) for i in r]
     y = [[secint(i)] * 2 for i in r]
     z = [[[secint(i)] * 2] * 2 for i in r]
     for red in functools.reduce, mpyc.mpctools.reduce:
         self.assertEqual(mpc.run(mpc.output(red(mpc.add, x))), 36)
         self.assertEqual(mpc.run(mpc.output(red(mpc.mul, x))), 40320)
         self.assertEqual(mpc.run(mpc.output(red(mpc.max, x))), 8)
         self.assertEqual(mpc.run(mpc.output(red(mpc.min, x, secint(0)))),
                          0)
         self.assertEqual(mpc.run(mpc.output(red(mpc.max, x, secint(10)))),
                          10)
         self.assertEqual(mpc.run(mpc.output(red(mpc.vector_add, y))),
                          [36] * 2)
         self.assertEqual(mpc.run(mpc.output(red(mpc.schur_prod, y))),
                          [40320] * 2)
         self.assertEqual(mpc.run(mpc.output(red(mpc.matrix_add, z)[0])),
                          [36] * 2)
         self.assertEqual(mpc.run(mpc.output(red(mpc.matrix_prod, z)[1])),
                          [5160960] * 2)
Exemplo n.º 28
0
async def main():

    # initialize mpc, define secure int type
    LEN = 10
    await mpc.start()
    secint = mpc.SecInt(64)

    # initialize inputs
    values = [np.random.randint(1,1000) for _ in range(LEN)]

    n = len(mpc.parties)
    inputs = mpc.input([secint(v)for v in values], senders=list(range(n)))

    # compute pairwise products
    prod = inputs[0]
    for inp in inputs[1:]:
        prod = mpc.schur_prod(prod, inp)
    ip = mpc.sum(prod)
   
    # output result
    result = await mpc.output(ip)
    print("result:", result)
    await mpc.shutdown()
Exemplo n.º 29
0
async def main():

    # Use 32-bit (default) secure integers:
    secint = mpc.SecInt()

    # Each party locally generates LOAD random entries of type secint:
    my_entries_for_vec_x = [secint(randint(-1000, 1000)) for _ in range(LOAD)]
    my_entries_for_vec_y = [secint(randint(-1000, 1000)) for _ in range(LOAD)]

    # Start MPyC runtime to let all parties connect:
    await mpc.start()

    # The entries for vectors x and y are secret-shared between all parties:
    vec_x = flatten(mpc.input(my_entries_for_vec_x))
    vec_y = flatten(mpc.input(my_entries_for_vec_y))

    # Secure dot products are supported natively and *very* efficiently:
    c = mpc.in_prod(vec_x, vec_y)

    # Open the secret-shared value c and let all parties print the result:
    print('Dot product:', await mpc.output(c))

    # Shutdown MPyC runtime to close all connections:
    await mpc.shutdown()
Exemplo n.º 30
0
async def synthesize_data(n_samples, n_features, n_targets):
    rnd = int(await mpc.output(mpc.random.randrange(mpc.SecInt(), 2**31)))
    X, Y = sklearn.datasets.make_regression(
        n_samples=n_samples,
        n_features=n_features,
        n_informative=max(1, n_features - 5),
        n_targets=n_targets,
        bias=42,
        effective_rank=max(1, n_features - 3),
        tail_strength=0.5,
        noise=1.2,
        random_state=rnd)  # all parties use same rnd
    if n_targets == 1:
        Y = np.transpose([Y])
    X = np.concatenate((X, Y), axis=1)
    b_m = np.min(X, axis=0)
    b_M = np.max(X, axis=0)
    coef_add = [-(m + M) / 2 for m, M in zip(b_m, b_M)]
    coef_mul = [2 / (M - m) for m, M in zip(b_m, b_M)]
    for xi in X:
        for j in range(len(xi)):
            # map to [-1,1] range
            xi[j] = (xi[j] + coef_add[j]) * coef_mul[j]
    return X