示例#1
0
 def test_bsecfld(self):
     secfld = mpc.SecFld(char=2, min_order=2**8)
     a = secfld(57)
     b = secfld(67)
     self.assertEqual(int(mpc.run(mpc.output(mpc.input(a, 0)))), 57)
     self.assertEqual(int(mpc.run(mpc.output(+a - -a))), 0)
     self.assertEqual(int(mpc.run(mpc.output(a * b))), 137)
     self.assertEqual(int(mpc.run(mpc.output(a * b / a))), 67)
     self.assertEqual(int(mpc.run(mpc.output(a**254 * a))), 1)
     self.assertEqual(int(mpc.run(mpc.output(a & b))), 1)
     self.assertEqual(int(mpc.run(mpc.output(a | b))), 123)
     self.assertEqual(int(mpc.run(mpc.output(a ^ b))), 122)
     self.assertEqual(int(mpc.run(mpc.output(~a))), 198)
     c = mpc.run(mpc.output(mpc.to_bits(secfld(0))))
     self.assertEqual(c, [0, 0, 0, 0, 0, 0, 0, 0])
     c = mpc.run(mpc.output(mpc.to_bits(secfld(1))))
     self.assertEqual(c, [1, 0, 0, 0, 0, 0, 0, 0])
     c = mpc.run(mpc.output(mpc.to_bits(secfld(255))))
     self.assertEqual(c, [1, 1, 1, 1, 1, 1, 1, 1])
     c = mpc.run(mpc.output(mpc.to_bits(secfld(255), 1)))
     self.assertEqual(c, [1])
     c = mpc.run(mpc.output(mpc.to_bits(secfld(255), 4)))
     self.assertEqual(c, [1, 1, 1, 1])
     self.assertEqual(mpc.run(mpc.output(mpc.matrix_sub([[a]], [[a]])[0])),
                      [0])
     self.assertEqual(
         mpc.run(mpc.output(mpc.matrix_prod([c], [[a] * 4], True)[0])), [0])
     self.assertEqual(
         mpc.run(mpc.output(mpc.matrix_prod([[a] * 4], [c], True)[0])), [0])
示例#2
0
 def test_bsecfld(self):
     secfld = mpc.SecFld(char=2, min_order=2**8)
     a = secfld(57)
     b = secfld(67)
     c = mpc.run(mpc.output(mpc.input(a, 0)))
     self.assertEqual(int(c), 57)
     c = mpc.run(mpc.output(a - (-a)))
     self.assertEqual(int(c), 0)
     c = mpc.run(mpc.output(a * b))
     self.assertEqual(int(c), 137)
     c = mpc.run(mpc.output(c / a))
     self.assertEqual(int(c), 67)
     c = mpc.run(mpc.output(a**254 * a))
     self.assertEqual(int(c), 1)
     c = mpc.run(mpc.output(a & b))
     self.assertEqual(int(c), 1)
     c = mpc.run(mpc.output(a | b))
     self.assertEqual(int(c), 123)
     c = mpc.run(mpc.output(a ^ b))
     self.assertEqual(int(c), 122)
     c = mpc.run(mpc.output(~a))
     self.assertEqual(int(c), 198)
     c = mpc.run(mpc.output(mpc.to_bits(secfld(0))))
     self.assertEqual(c, [0, 0, 0, 0, 0, 0, 0, 0])
     c = mpc.run(mpc.output(mpc.to_bits(secfld(1))))
     self.assertEqual(c, [1, 0, 0, 0, 0, 0, 0, 0])
     c = mpc.run(mpc.output(mpc.to_bits(secfld(255))))
     self.assertEqual(c, [1, 1, 1, 1, 1, 1, 1, 1])
     c = mpc.run(mpc.output(mpc.to_bits(secfld(255), 1)))
     self.assertEqual(c, [1])
     c = mpc.run(mpc.output(mpc.to_bits(secfld(255), 4)))
     self.assertEqual(c, [1, 1, 1, 1])
示例#3
0
    def test_psecfld(self):
        secfld = mpc.SecFld(min_order=2**16)
        a = secfld(1)
        b = secfld(0)
        self.assertEqual(mpc.run(mpc.output(a + b)), 1)
        self.assertEqual(mpc.run(mpc.output(a * b)), 0)

        self.assertEqual(mpc.run(mpc.output(mpc.to_bits(secfld(0), 8))),
                         [0, 0, 0, 0, 0, 0, 0, 0])
        self.assertEqual(mpc.run(mpc.output(mpc.to_bits(secfld(1), 8))),
                         [1, 0, 0, 0, 0, 0, 0, 0])
        self.assertEqual(mpc.run(mpc.output(mpc.to_bits(secfld(255), 8))),
                         [1, 1, 1, 1, 1, 1, 1, 1])

        secfld = mpc.SecFld(modulus=101)
        a = secfld(1)
        b = secfld(-1)
        self.assertEqual(mpc.run(mpc.output(a + b)), 0)
        self.assertEqual(mpc.run(mpc.output(a * b)), 100)
        self.assertEqual(mpc.run(mpc.output(a / b)), 100)
        self.assertEqual(mpc.run(mpc.output(a == b)), 0)
        self.assertEqual(mpc.run(mpc.output(a == -b)), 1)
        self.assertEqual(mpc.run(mpc.output(a**2 == b**2)), 1)
        self.assertEqual(mpc.run(mpc.output(a != b)), 1)
        a = secfld(0)
        b = secfld(1)
        self.assertEqual(mpc.run(mpc.output(a & b)), 0)
        self.assertEqual(mpc.run(mpc.output(a | b)), 1)
        self.assertEqual(mpc.run(mpc.output(a ^ b)), 1)
        self.assertEqual(mpc.run(mpc.output(~a)), 1)

        self.assertIn(mpc.run(mpc.output(mpc.random_bit(secfld))), [0, 1])
        self.assertIn(mpc.run(mpc.output(mpc.random_bit(secfld, signed=True))),
                      [-1, 1])
示例#4
0
 def test_bsecfld(self):
     secfld = mpc.SecFld(char2=True, l=8)
     a = secfld(57)
     b = secfld(67)
     c = mpc.run(mpc.output(mpc.input(a, 0)))
     self.assertEqual(c.value.value, 57)
     c = mpc.run(mpc.output(a - (-a)))
     self.assertEqual(c.value.value, 0)
     c = mpc.run(mpc.output(a * b))
     self.assertEqual(c.value.value, 137)
     c = mpc.run(mpc.output(c / a))
     self.assertEqual(c.value.value, 67)
     c = mpc.run(mpc.output(a**254 * a))
     self.assertEqual(c.value.value, 1)
     c = mpc.run(mpc.output(a & b))
     self.assertEqual(c.value.value, 1)
     c = mpc.run(mpc.output(a | b))
     self.assertEqual(c.value.value, 123)
     c = mpc.run(mpc.output(a ^ b))
     self.assertEqual(c.value.value, 122)
     c = mpc.run(mpc.output(~a))
     self.assertEqual(c.value.value, 198)
     c = mpc.run(mpc.output(mpc.to_bits(secfld(0))))
     self.assertEqual(c, [0, 0, 0, 0, 0, 0, 0, 0])
     c = mpc.run(mpc.output(mpc.to_bits(secfld(1))))
     self.assertEqual(c, [1, 0, 0, 0, 0, 0, 0, 0])
     c = mpc.run(mpc.output(mpc.to_bits(secfld(255))))
     self.assertEqual(c, [1, 1, 1, 1, 1, 1, 1, 1])
     c = mpc.run(mpc.output(mpc.to_bits(secfld(255), 1)))
     self.assertEqual(c, [1])
     c = mpc.run(mpc.output(mpc.to_bits(secfld(255), 4)))
     self.assertEqual(c, [1, 1, 1, 1])
示例#5
0
    def test_psecfld(self):
        secfld = mpc.SecFld(min_order=2**16)
        a = secfld(1)
        b = secfld(0)
        self.assertEqual(mpc.run(mpc.output(a + b)), 1)
        self.assertEqual(mpc.run(mpc.output(a * b)), 0)

        c = mpc.run(mpc.output(mpc.to_bits(secfld(0), 8)))
        self.assertEqual(c, [0, 0, 0, 0, 0, 0, 0, 0])
        c = mpc.run(mpc.output(mpc.to_bits(secfld(1), 8)))
        self.assertEqual(c, [1, 0, 0, 0, 0, 0, 0, 0])
        c = mpc.run(mpc.output(mpc.to_bits(secfld(255), 8)))
        self.assertEqual(c, [1, 1, 1, 1, 1, 1, 1, 1])

        secfld = mpc.SecFld(modulus=101)
        a = secfld(1)
        b = secfld(-1)
        self.assertEqual(mpc.run(mpc.output(a + b)), 0)
        self.assertEqual(mpc.run(mpc.output(a * b)), 100)
        self.assertEqual(mpc.run(mpc.output(a / b)), 100)
        self.assertEqual(mpc.run(mpc.output(a == b)), 0)
        self.assertEqual(mpc.run(mpc.output(a == -b)), 1)
        self.assertEqual(mpc.run(mpc.output(a**2 == b**2)), 1)
        self.assertEqual(mpc.run(mpc.output(a != b)), 1)
        a = secfld(0)
        b = secfld(1)
        self.assertEqual(mpc.run(mpc.output(a & b)), 0)
        self.assertEqual(mpc.run(mpc.output(a | b)), 1)
        self.assertEqual(mpc.run(mpc.output(a ^ b)), 1)
        self.assertEqual(mpc.run(mpc.output(~a)), 1)
        for a, b in [(secfld(1), secfld(1)), (1, secfld(1)), (secfld(1), 1)]:
            with self.assertRaises(TypeError):
                a < b
            with self.assertRaises(TypeError):
                a <= b
            with self.assertRaises(TypeError):
                a > b
            with self.assertRaises(TypeError):
                a >= b
            with self.assertRaises(TypeError):
                a // b
            with self.assertRaises(TypeError):
                a % b
            with self.assertRaises(TypeError):
                divmod(a, b)
        b = mpc.random_bit(secfld)
        self.assertIn(mpc.run(mpc.output(b)), [0, 1])
        b = mpc.random_bit(secfld, signed=True)
        self.assertIn(mpc.run(mpc.output(b)), [-1, 1])
示例#6
0
文件: aes.py 项目: rahulgovind/mpyc
def sbox1(v):
    """AES inverse S-Box."""
    w = mpc.to_bits(v)
    z = mpc.vector_add(w, B)
    y = mpc.matrix_prod([z], A1, True)[0]
    x = mpc.from_bits(y)**254
    return x
示例#7
0
文件: aes.py 项目: rahulgovind/mpyc
def sbox(x):
    """AES S-Box."""
    y = mpc.to_bits(x**254)
    z = mpc.matrix_prod([y], A, True)[0]
    w = mpc.vector_add(z, B)
    v = mpc.from_bits(w)
    return v
示例#8
0
    def test_secfxp(self):
        secfxp = mpc.SecFxp()
        self.assertEqual(
            mpc.run(mpc.output(mpc.input(secfxp(7.75), senders=0))), 7.75)
        c = mpc.to_bits(secfxp(0),
                        0)  # mpc.output() only works for nonempty lists
        self.assertEqual(c, [])
        c = mpc.run(mpc.output(mpc.to_bits(secfxp(0))))
        self.assertEqual(c, [0.0] * 32)
        c = mpc.run(mpc.output(mpc.to_bits(secfxp(1))))
        self.assertEqual(c, [0.0] * 16 + [1.0] + [0.0] * 15)
        c = mpc.run(mpc.output(mpc.to_bits(secfxp(0.5))))
        self.assertEqual(c, [0.0] * 15 + [1.0] + [0.0] * 16)
        c = mpc.run(mpc.output(mpc.to_bits(secfxp(8113))))
        self.assertEqual(c, [0.0] * 16 +
                         [1, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0])
        c = mpc.run(mpc.output(mpc.to_bits(secfxp(2**15 - 1))))
        self.assertEqual(c, [0] * 16 + [1] * 15 + [0])
        c = mpc.run(mpc.output(mpc.to_bits(secfxp(-1))))
        self.assertEqual(c, [0] * 16 + [1] * 16)
        c = mpc.run(mpc.output(mpc.to_bits(secfxp(-2**15))))
        self.assertEqual(c, [0] * 31 + [1])

        for f in [8, 16, 32, 64]:
            secfxp = mpc.SecFxp(2 * f)
            c = mpc.run(mpc.output(secfxp(1) + secfxp(1)))
            self.assertEqual(c, 2)
            c = mpc.run(mpc.output(secfxp(2**-f) + secfxp(1)))
            if f != 64:  # NB: 1 + 2**-64 == 1 in Python
                self.assertEqual(c, 1 + 2**-f)
            self.assertEqual(mpc.run(mpc.output(secfxp(0.5) * secfxp(2.0))), 1)
            self.assertEqual(mpc.run(mpc.output(secfxp(2.0) * secfxp(0.5))), 1)
            c = mpc.run(
                mpc.output(
                    secfxp(2**(f // 2 - 1) - 0.5) *
                    secfxp(-2**(f // 2) + 0.5)))
            self.assertEqual(c, -2**(f - 1) + 1.5 * 2**(f // 2 - 1) - 0.25)

            s = [10.75, -3.375, 0.125, -0.125]
            self.assertEqual(mpc.run(mpc.output(list(map(secfxp, s)))), s)

            s = [10.5, -3.25, 0.125, -0.125]
            a, b, c, d = list(map(secfxp, s))
            t = [v * v for v in s]
            self.assertEqual(mpc.run(mpc.output([a * a, b * b, c * c, d * d])),
                             t)
            x = [a, b, c, d]
            self.assertEqual(mpc.run(mpc.output(mpc.schur_prod(x, x))), t)
            self.assertEqual(mpc.run(mpc.output(mpc.schur_prod(x, x[:]))), t)
            t = sum(t)
            self.assertEqual(mpc.run(mpc.output(mpc.in_prod(x, x))), t)
            self.assertEqual(mpc.run(mpc.output(mpc.in_prod(x, x[:]))), t)
            self.assertEqual(
                mpc.run(mpc.output(mpc.matrix_prod([x], [x], True)[0])), [t])
            u = mpc.unit_vector(secfxp(3), 4)
            self.assertEqual(
                mpc.run(mpc.output(mpc.matrix_prod([x], [u], True)[0])),
                [s[3]])
            self.assertEqual(
                mpc.run(mpc.output(mpc.matrix_prod([u], [x], True)[0])),
                [s[3]])
            self.assertEqual(
                mpc.run(mpc.output(mpc.gauss([[a]], b, [a], [b])[0])), [0])
            t = [_ for a, b, c, d in [s] for _ in [a + b, a * b, a - b]]
            self.assertEqual(mpc.run(mpc.output([a + b, a * b, a - b])), t)
            t = [
                _ for a, b, c, d in [s]
                for _ in [(a + b)**2, (a + b)**2 + 3 * c]
            ]
            self.assertEqual(
                mpc.run(mpc.output([(a + b)**2, (a + b)**2 + 3 * c])), t)
            t = [_ for a, b, c, d in [s] for _ in [a < b, b < c, c < d]]
            self.assertEqual(mpc.run(mpc.output([a < b, b < c, c < d])), t)
            t = s[0] < s[1] and s[1] < s[2]
            self.assertEqual(mpc.run(mpc.output((a < b) & (b < c))), t)
            t = s[0] < s[1] or s[1] < s[2]
            self.assertEqual(mpc.run(mpc.output((a < b) | (b < c))), t)
            t = (int(s[0] < s[1]) ^ int(s[1] < s[2]))
            self.assertEqual(mpc.run(mpc.output((a < b) ^ (b < c))), t)
            t = (int(not s[0] < s[1]) ^ int(s[1] < s[2]))
            self.assertEqual(mpc.run(mpc.output(~(a < b) ^ b < c)), t)
            t = [s[0] > 1, 10 * s[1] < 5, 10 * s[0] == 5]
            self.assertEqual(
                mpc.run(mpc.output([a > 1, 10 * b < 5, 10 * a == 5])), t)

            s[3] = -0.120
            d = secfxp(s[3])
            t = s[3] / 0.25
            self.assertAlmostEqual(mpc.run(mpc.output(d / 0.25)),
                                   t,
                                   delta=2**(1 - f))
            t = round(s[3] / s[2] + s[0])
            self.assertEqual(round(mpc.run(mpc.output(d / c + a))), t)
            t = ((s[0] + s[1])**2 + 3 * s[2]) / s[2]
            self.assertAlmostEqual(mpc.run(mpc.output(
                ((a + b)**2 + 3 * c) / c)),
                                   t,
                                   delta=2**(8 - f))
            t = 1 / s[3]
            self.assertAlmostEqual(mpc.run(mpc.output(1 / d)),
                                   t,
                                   delta=2**(6 - f))
            t = s[2] / s[3]
            self.assertAlmostEqual(mpc.run(mpc.output(c / d)),
                                   t,
                                   delta=2**(3 - f))
            t = -s[3] / s[2]
            self.assertAlmostEqual(mpc.run(mpc.output(-d / c)),
                                   t,
                                   delta=2**(3 - f))

            self.assertEqual(mpc.run(mpc.output(mpc.sgn(+a))), s[0] > 0)
            self.assertEqual(mpc.run(mpc.output(mpc.sgn(-a))), -(s[0] > 0))
            self.assertEqual(mpc.run(mpc.output(mpc.sgn(secfxp(0)))), 0)
            self.assertEqual(mpc.run(mpc.output(abs(secfxp(-1.5)))), 1.5)

            self.assertEqual(mpc.run(mpc.output(mpc.min(a, b, c, d))), min(s))
            self.assertEqual(mpc.run(mpc.output(mpc.min(a, 0))), min(s[0], 0))
            self.assertEqual(mpc.run(mpc.output(mpc.min(0, b))), min(0, s[1]))
            self.assertEqual(mpc.run(mpc.output(mpc.max(a, b, c, d))), max(s))
            self.assertEqual(mpc.run(mpc.output(mpc.max(a, 0))), max(s[0], 0))
            self.assertEqual(mpc.run(mpc.output(mpc.max(0, b))), max(0, s[1]))
            self.assertEqual(
                mpc.run(mpc.output(list(mpc.min_max(a, b, c, d)))),
                [min(s), max(s)])
            self.assertEqual(mpc.run(mpc.output(mpc.argmin([a, b, c, d])[0])),
                             1)
            self.assertEqual(
                mpc.run(mpc.output(mpc.argmin([a, b], key=operator.neg)[1])),
                max(s))
            self.assertEqual(mpc.run(mpc.output(mpc.argmax([a, b, c, d])[0])),
                             0)
            self.assertEqual(
                mpc.run(mpc.output(mpc.argmax([a, b], key=operator.neg)[1])),
                min(s))

            self.assertEqual(mpc.run(mpc.output(secfxp(5) % 2)), 1)
            self.assertEqual(mpc.run(mpc.output(secfxp(1) % 2**(1 - f))), 0)
            self.assertEqual(mpc.run(mpc.output(secfxp(2**-f) % 2**(1 - f))),
                             2**-f)
            self.assertEqual(
                mpc.run(mpc.output(secfxp(2 * 2**-f) % 2**(1 - f))), 0)
            self.assertEqual(mpc.run(mpc.output(secfxp(1) // 2**(1 - f))),
                             2**(f - 1))
            self.assertEqual(mpc.run(mpc.output(secfxp(27.0) % 7.0)), 6.0)
            self.assertEqual(mpc.run(mpc.output(secfxp(-27.0) // 7.0)), -4.0)
            self.assertEqual(
                mpc.run(mpc.output(list(divmod(secfxp(27.0), 6.0)))),
                [4.0, 3.0])
            self.assertEqual(mpc.run(mpc.output(secfxp(21.5) % 7.5)), 6.5)
            self.assertEqual(mpc.run(mpc.output(secfxp(-21.5) // 7.5)), -3.0)
            self.assertEqual(
                mpc.run(mpc.output(list(divmod(secfxp(21.5), 0.5)))),
                [43.0, 0.0])
示例#9
0
    def test_secint(self):
        secint = mpc.SecInt()
        a = secint(12)
        b = secint(13)
        self.assertEqual(mpc.run(mpc.output(mpc.input(a, 0))), 12)
        self.assertEqual(mpc.run(mpc.output(mpc.input([a, b], 0))), [12, 13])
        self.assertEqual(mpc.run(mpc.output(-a)), -12)
        self.assertEqual(mpc.run(mpc.output(+a)), 12)
        self.assertNotEqual(id(a), id(+a))  # NB: +a creates a copy
        self.assertEqual(mpc.run(mpc.output(a * b + b)), 12 * 13 + 13)
        self.assertEqual(mpc.run(mpc.output((a * b) / b)), 12)
        self.assertEqual(mpc.run(mpc.output((a * b) / 12)), 13)
        self.assertEqual(mpc.run(mpc.output(a**11 * a**-6 * a**-5)), 1)
        self.assertEqual(mpc.run(mpc.output(a**(secint.field.modulus - 1))), 1)
        c = mpc.to_bits(
            mpc.SecInt(0)(0))  # mpc.output() only works for nonempty lists
        self.assertEqual(c, [])
        c = mpc.run(mpc.output(mpc.to_bits(mpc.SecInt(1)(0))))
        self.assertEqual(c, [0])
        c = mpc.run(mpc.output(mpc.to_bits(mpc.SecInt(1)(1))))
        self.assertEqual(c, [1])
        c = mpc.to_bits(secint(0),
                        0)  # mpc.output() only works for nonempty lists
        self.assertEqual(c, [])
        c = mpc.run(mpc.output(mpc.to_bits(secint(0))))
        self.assertEqual(c, [
            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
            0, 0, 0, 0, 0, 0, 0, 0, 0, 0
        ])
        c = mpc.run(mpc.output(mpc.to_bits(secint(1))))
        self.assertEqual(c, [
            1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
            0, 0, 0, 0, 0, 0, 0, 0, 0, 0
        ])
        c = mpc.run(mpc.output(mpc.to_bits(secint(8113))))
        self.assertEqual(c, [
            1, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
            0, 0, 0, 0, 0, 0, 0, 0, 0, 0
        ])
        c = mpc.run(mpc.output(mpc.to_bits(secint(2**31 - 1))))
        self.assertEqual(c, [
            1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
            1, 1, 1, 1, 1, 1, 1, 1, 1, 0
        ])
        c = mpc.run(mpc.output(mpc.to_bits(secint(2**31 - 1), 16)))
        self.assertEqual(c, [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1])
        c = mpc.run(mpc.output(mpc.to_bits(secint(-1), 8)))
        self.assertEqual(c, [1, 1, 1, 1, 1, 1, 1, 1])
        c = mpc.run(mpc.output(mpc.to_bits(secint(-2**31))))
        self.assertEqual(c, [
            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
            0, 0, 0, 0, 0, 0, 0, 0, 0, 1
        ])
        c = mpc.run(mpc.output(mpc.to_bits(secint(-2**31), 16)))
        self.assertEqual(c, [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0])
        c = mpc.run(mpc.output(mpc.from_bits(mpc.to_bits(secint(8113)))))
        self.assertEqual(c, 8113)
        c = mpc.run(mpc.output(mpc.from_bits(mpc.to_bits(secint(2**31 - 1)))))
        self.assertEqual(c, 2**31 - 1)
        # TODO: from_bits for negative numbers
        # c = mpc.run(mpc.output(mpc.from_bits(mpc.to_bits(secint(-2**31)))))
        # self.assertEqual(c, -2**31)
        self.assertFalse(mpc.run(mpc.eq_public(secint(4), secint(2))))
        self.assertTrue(mpc.run(mpc.eq_public(secint(42), secint(42))))

        self.assertEqual(mpc.run(mpc.output(abs(secint(1)))), 1)
        self.assertEqual(mpc.run(mpc.output(secint(-2**31) % 2)), 0)
        self.assertEqual(mpc.run(mpc.output(secint(-2**31 + 1) % 2)), 1)
        self.assertEqual(mpc.run(mpc.output(secint(-1) % 2)), 1)
        self.assertEqual(mpc.run(mpc.output(secint(0) % 2)), 0)
        self.assertEqual(mpc.run(mpc.output(secint(1) % 2)), 1)
        self.assertEqual(mpc.run(mpc.output(secint(2**31 - 1) % 2)), 1)
        self.assertEqual(mpc.run(mpc.output(secint(5) % 2)), 1)
        self.assertEqual(mpc.run(mpc.output(secint(-5) % 2)), 1)
        self.assertEqual(mpc.run(mpc.output(secint(50) % 2)), 0)
        self.assertEqual(mpc.run(mpc.output(secint(50) % 4)), 2)
        self.assertEqual(mpc.run(mpc.output(secint(50) % 32)), 18)
        self.assertEqual(mpc.run(mpc.output(secint(-50) % 2)), 0)
        self.assertEqual(mpc.run(mpc.output(secint(-50) % 32)), 14)
        self.assertEqual(mpc.run(mpc.output(secint(5) // 2)), 2)
        self.assertEqual(mpc.run(mpc.output(secint(50) // 2)), 25)
        self.assertEqual(mpc.run(mpc.output(secint(50) // 4)), 12)
        self.assertEqual(mpc.run(mpc.output(secint(11) << 3)), 88)
        self.assertEqual(mpc.run(mpc.output(secint(-11) << 3)), -88)
        self.assertEqual(mpc.run(mpc.output(secint(70) >> 2)), 17)
        self.assertEqual(mpc.run(mpc.output(secint(-70) >> 2)), -18)
        self.assertEqual(mpc.run(mpc.output(secint(50) % 17)), 16)
        self.assertEqual(mpc.run(mpc.output(secint(177) % 17)), 7)
        self.assertEqual(mpc.run(mpc.output(secint(-50) % 17)), 1)
        self.assertEqual(mpc.run(mpc.output(secint(-177) % 17)), 10)
        self.assertEqual(mpc.run(mpc.output(secint(3)**0)), 1)
        self.assertEqual(mpc.run(mpc.output(secint(3)**18)), 3**18)

        self.assertIn(mpc.run(mpc.output(mpc.random_bit(secint))), [0, 1])
        self.assertIn(mpc.run(mpc.output(mpc.random_bit(secint, signed=True))),
                      [-1, 1])
示例#10
0
    def test_secint(self):
        secint = mpc.SecInt()
        a = secint(12)
        b = secint(13)
        c = mpc.run(mpc.output(mpc.input(a, 0)))
        self.assertEqual(c, 12)
        c = mpc.run(mpc.output(mpc.input([a, b], 0)))
        self.assertEqual(c, [12, 13])
        c = mpc.run(mpc.output(a * b + b))
        self.assertEqual(c, 12 * 13 + 13)
        c = mpc.run(mpc.output((a * b) / b))
        self.assertEqual(c, 12)
        c = mpc.run(mpc.output((a * b) / 12))
        self.assertEqual(c, 13)
        c = mpc.run(mpc.output(a**11 * a**(-6) * a**(-5)))
        self.assertEqual(c, 1)
        c = mpc.run(mpc.output(a**(secint.field.modulus - 1)))
        self.assertEqual(c, 1)
        self.assertEqual(mpc.run(mpc.output(secint(12)**73)), 12**73)
        c = mpc.to_bits(
            mpc.SecInt(0)(0))  # mpc.output() only works for non-empty lists
        self.assertEqual(c, [])
        c = mpc.run(mpc.output(mpc.to_bits(mpc.SecInt(1)(0))))
        self.assertEqual(c, [0])
        c = mpc.run(mpc.output(mpc.to_bits(mpc.SecInt(1)(1))))
        self.assertEqual(c, [1])
        c = mpc.to_bits(secint(0),
                        0)  # mpc.output() only works for non-empty lists
        self.assertEqual(c, [])
        c = mpc.run(mpc.output(mpc.to_bits(secint(0))))
        self.assertEqual(c, [
            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
            0, 0, 0, 0, 0, 0, 0, 0, 0, 0
        ])
        c = mpc.run(mpc.output(mpc.to_bits(secint(1))))
        self.assertEqual(c, [
            1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
            0, 0, 0, 0, 0, 0, 0, 0, 0, 0
        ])
        c = mpc.run(mpc.output(mpc.to_bits(secint(8113))))
        self.assertEqual(c, [
            1, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
            0, 0, 0, 0, 0, 0, 0, 0, 0, 0
        ])
        c = mpc.run(mpc.output(mpc.to_bits(secint(2**31 - 1))))
        self.assertEqual(c, [
            1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
            1, 1, 1, 1, 1, 1, 1, 1, 1, 0
        ])
        c = mpc.run(mpc.output(mpc.to_bits(secint(2**31 - 1), 16)))
        self.assertEqual(c, [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1])
        c = mpc.run(mpc.output(mpc.to_bits(secint(-1), 8)))
        self.assertEqual(c, [1, 1, 1, 1, 1, 1, 1, 1])
        c = mpc.run(mpc.output(mpc.to_bits(secint(-2**31))))
        self.assertEqual(c, [
            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
            0, 0, 0, 0, 0, 0, 0, 0, 0, 1
        ])
        c = mpc.run(mpc.output(mpc.to_bits(secint(-2**31), 16)))
        self.assertEqual(c, [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0])
        c = mpc.run(mpc.output(mpc.from_bits(mpc.to_bits(secint(8113)))))
        self.assertEqual(c, 8113)
        c = mpc.run(mpc.output(mpc.from_bits(mpc.to_bits(secint(2**31 - 1)))))
        self.assertEqual(c, 2**31 - 1)
        # TODO: from_bits for negative numbers
        # c = mpc.run(mpc.output(mpc.from_bits(mpc.to_bits(secint(-2**31)))))
        # self.assertEqual(c, -2**31)

        self.assertEqual(mpc.run(mpc.output(secint(-2**31) % 2)), 0)
        self.assertEqual(mpc.run(mpc.output(secint(-2**31 + 1) % 2)), 1)
        self.assertEqual(mpc.run(mpc.output(secint(-1) % 2)), 1)
        self.assertEqual(mpc.run(mpc.output(secint(0) % 2)), 0)
        self.assertEqual(mpc.run(mpc.output(secint(1) % 2)), 1)
        self.assertEqual(mpc.run(mpc.output(secint(2**31 - 1) % 2)), 1)
        self.assertEqual(mpc.run(mpc.output(secint(5) % 2)), 1)
        self.assertEqual(mpc.run(mpc.output(secint(-5) % 2)), 1)
        self.assertEqual(mpc.run(mpc.output(secint(50) % 2)), 0)
        self.assertEqual(mpc.run(mpc.output(secint(50) % 4)), 2)
        self.assertEqual(mpc.run(mpc.output(secint(50) % 32)), 18)
        self.assertEqual(mpc.run(mpc.output(secint(-50) % 2)), 0)
        self.assertEqual(mpc.run(mpc.output(secint(-50) % 32)), 14)
        self.assertEqual(mpc.run(mpc.output(secint(5) // 2)), 2)
        self.assertEqual(mpc.run(mpc.output(secint(50) // 2)), 25)
        self.assertEqual(mpc.run(mpc.output(secint(50) // 4)), 12)
        self.assertEqual(mpc.run(mpc.output(secint(11) << 3)), 88)
        self.assertEqual(mpc.run(mpc.output(secint(-11) << 3)), -88)
        self.assertEqual(mpc.run(mpc.output(secint(70) >> 2)), 17)
        self.assertEqual(mpc.run(mpc.output(secint(-70) >> 2)), -18)
        self.assertEqual(mpc.run(mpc.output(secint(50) % 17)), 16)
        self.assertEqual(mpc.run(mpc.output(secint(177) % 17)), 7)
        self.assertEqual(mpc.run(mpc.output(secint(-50) % 17)), 1)
        self.assertEqual(mpc.run(mpc.output(secint(-177) % 17)), 10)

        self.assertEqual(mpc.run(mpc.output(secint(3)**73)), 3**73)
        b = mpc.random_bit(secint)
        self.assertIn(mpc.run(mpc.output(b)), [0, 1])
        b = mpc.random_bit(secint, signed=True)
        self.assertIn(mpc.run(mpc.output(b)), [-1, 1])
示例#11
0
    def test_secfxp(self):
        secfxp = mpc.SecFxp()
        c = mpc.to_bits(secfxp(0),
                        0)  # mpc.output() only works for non-empty lists
        self.assertEqual(c, [])
        c = mpc.run(mpc.output(mpc.to_bits(secfxp(0))))
        self.assertEqual(c, [0.0] * 32)
        c = mpc.run(mpc.output(mpc.to_bits(secfxp(1))))
        self.assertEqual(c, [0.0] * 16 + [1.0] + [0.0] * 15)
        c = mpc.run(mpc.output(mpc.to_bits(secfxp(8113))))
        self.assertEqual(c, [0.0] * 16 + [
            float(b) for b in [1, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0]
        ])
        c = mpc.run(mpc.output(mpc.to_bits(secfxp(2**15 - 1))))
        self.assertEqual(c, [float(b) for b in [0] * 16 + [1] * 15 + [0]])
        c = mpc.run(mpc.output(mpc.to_bits(secfxp(-1))))
        self.assertEqual(c, [float(b) for b in [0] * 16 + [1] * 16])
        c = mpc.run(mpc.output(mpc.to_bits(secfxp(-2**15))))
        self.assertEqual(c, [float(b) for b in [0] * 31 + [1]])

        for f in [8, 16, 32, 64]:
            secfxp = mpc.SecFxp(2 * f)
            d = mpc.run(mpc.output(secfxp(1) + secfxp(1)))
            self.assertEqual(d.frac_length, f)
            self.assertEqual(d, 2)
            d = mpc.run(mpc.output(secfxp(2**-f) + secfxp(1)))
            f == 64 or self.assertEqual(
                d, 1 + 2**-f)  # NB: 1 + 2**-64 == 1 in Python
            d = mpc.run(mpc.output(secfxp(0.5) * secfxp(2.0)))
            self.assertEqual(d, 1)
            d = mpc.run(mpc.output(secfxp(2.0) * secfxp(0.5)))
            self.assertEqual(d, 1)

            s = [10.7, -3.4, 0.1, -0.11]
            self.assertEqual(mpc.run(mpc.output(list(map(secfxp, s)))), s)

            s = [10.5, -3.25, 0.125, -0.125]
            x, y, z, w = list(map(secfxp, s))
            s2 = [v * v for v in s]
            self.assertEqual(mpc.run(mpc.output([x * x, y * y, z * z, w * w])),
                             s2)
            self.assertEqual(
                mpc.run(mpc.output(mpc.schur_prod([x, y, z, w],
                                                  [x, y, z, w]))), s2)
            s2 = [_ for x, y, z, w in [s] for _ in [x + y, x * y, x - y]]
            self.assertEqual(mpc.run(mpc.output([x + y, x * y, x - y])), s2)
            s2 = [
                _ for x, y, z, w in [s]
                for _ in [(x + y)**2, (x + y)**2 + 3 * z]
            ]
            self.assertEqual(
                mpc.run(mpc.output([(x + y)**2, (x + y)**2 + 3 * z])), s2)
            s2 = [int(_) for x, y, z, w in [s] for _ in [x < y, y < z, z < w]]
            self.assertEqual(mpc.run(mpc.output([x < y, y < z, z < w])), s2)
            s2 = int(s[0] < s[1] and s[1] < s[2])
            self.assertEqual(mpc.run(mpc.output((x < y) & (y < z))), s2)
            s2 = int(s[0] < s[1] or s[1] < s[2])
            self.assertEqual(mpc.run(mpc.output((x < y) | (y < z))), s2)
            s2 = (int(s[0] < s[1]) ^ int(s[1] < s[2]))
            self.assertEqual(mpc.run(mpc.output((x < y) ^ (y < z))), s2)
            s2 = (int(not s[0] < s[1]) ^ int(s[1] < s[2]))
            self.assertEqual(mpc.run(mpc.output(~(x < y) ^ y < z)), s2)
            s2 = [int(s[0] < 1), int(10 * s[1] < 5), int(10 * s[0] == 5)]
            self.assertEqual(
                mpc.run(mpc.output([x < 1, 10 * y < 5, 10 * x == 5])), s2)

            s[3] = -0.120
            w = secfxp(s[3])
            for _ in range(3):
                s2 = s[3] / s[2] + s[0]
                self.assertAlmostEqual(mpc.run(mpc.output(w / z + x)).signed(),
                                       s2,
                                       delta=1)
                ss2 = round(s2 * (1 << f))
                self.assertAlmostEqual(mpc.run(mpc.output(w / z + x)),
                                       ss2,
                                       delta=1)
                s2 = ((s[0] + s[1])**2 + 3 * s[2]) / s[2]
                self.assertAlmostEqual(mpc.run(
                    mpc.output(((x + y)**2 + 3 * z) / z)).signed(),
                                       s2,
                                       delta=2)
                s2 = 1 / s[3]
                self.assertAlmostEqual((mpc.run(mpc.output(1 / w))).signed(),
                                       s2,
                                       delta=1)
                s2 = s[2] / s[3]
                self.assertAlmostEqual(mpc.run(mpc.output(z / w)).signed(),
                                       s2,
                                       delta=1)
                s2 = -s[3] / s[2]
                ss2 = round(s2 * (1 << f))
                self.assertAlmostEqual(mpc.run(mpc.output(-w / z)),
                                       ss2,
                                       delta=1)
                s2 = s[2] / s[3]
                ss2 = round(s2 * (1 << f))
                self.assertAlmostEqual(mpc.run(mpc.output(w / z)),
                                       ss2,
                                       delta=1)

            self.assertEqual(mpc.run(mpc.output(mpc.sgn(x))), int(s[0] > 0))
            self.assertEqual(mpc.run(mpc.output(mpc.sgn(-x))), -int(s[0] > 0))
            self.assertEqual(mpc.run(mpc.output(mpc.sgn(secfxp(0)))), 0)

            self.assertEqual(mpc.run(mpc.output(mpc.min(x, y, w, z))), min(s))
            self.assertEqual(mpc.run(mpc.output(mpc.min(x, 0))), min(s[0], 0))
            self.assertEqual(mpc.run(mpc.output(mpc.min(0, y))), min(0, s[1]))
            self.assertEqual(mpc.run(mpc.output(mpc.max(x, y, w, z))), max(s))
            self.assertEqual(mpc.run(mpc.output(mpc.max(x, 0))), max(s[0], 0))
            self.assertEqual(mpc.run(mpc.output(mpc.max(0, y))), max(0, s[1]))

            self.assertEqual(mpc.run(mpc.output(secfxp(5) % 2)), 1 * (2**f))
            self.assertEqual(mpc.run(mpc.output(secfxp(1) % 2**(1 - f))),
                             0 * (2**f))
            self.assertEqual(
                mpc.run(mpc.output(secfxp(1 / 2**f) % 2**(1 - f))), 1)
            self.assertEqual(
                mpc.run(mpc.output(secfxp(2 / 2**f) % 2**(1 - f))), 0)
            self.assertEqual(mpc.run(mpc.output(secfxp(1) // 2**(1 - f))),
                             2**(f - 1))
            self.assertEqual(mpc.run(mpc.output(secfxp(27.0) % 7.0)), 6.0)
            self.assertEqual(mpc.run(mpc.output(secfxp(-27.0) // 7.0)), -4.0)
            self.assertEqual(
                mpc.run(mpc.output(list(divmod(secfxp(27.0), 6.0)))),
                [4.0, 3.0])
            self.assertEqual(mpc.run(mpc.output(secfxp(21.5) % 7.5)), 6.5)
            self.assertEqual(mpc.run(mpc.output(secfxp(-21.5) // 7.5)), -3.0)
            self.assertEqual(
                mpc.run(mpc.output(list(divmod(secfxp(21.5), 0.5)))),
                [43.0, 0.0])
示例#12
0
    def test_secfxp(self):
        secfxp = mpc.SecFxp()
        c = mpc.to_bits(secfxp(0),
                        0)  # mpc.output() only works for nonempty lists
        self.assertEqual(c, [])
        c = mpc.run(mpc.output(mpc.to_bits(secfxp(0))))
        self.assertEqual(c, [0.0] * 32)
        c = mpc.run(mpc.output(mpc.to_bits(secfxp(1))))
        self.assertEqual(c, [0.0] * 16 + [1.0] + [0.0] * 15)
        c = mpc.run(mpc.output(mpc.to_bits(secfxp(0.5))))
        self.assertEqual(c, [0.0] * 15 + [1.0] + [0.0] * 16)
        c = mpc.run(mpc.output(mpc.to_bits(secfxp(8113))))
        self.assertEqual(c, [0.0] * 16 + [
            float(b) for b in [1, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0]
        ])
        c = mpc.run(mpc.output(mpc.to_bits(secfxp(2**15 - 1))))
        self.assertEqual(c, [float(b) for b in [0] * 16 + [1] * 15 + [0]])
        c = mpc.run(mpc.output(mpc.to_bits(secfxp(-1))))
        self.assertEqual(c, [float(b) for b in [0] * 16 + [1] * 16])
        c = mpc.run(mpc.output(mpc.to_bits(secfxp(-2**15))))
        self.assertEqual(c, [float(b) for b in [0] * 31 + [1]])

        for f in [8, 16, 32, 64]:
            secfxp = mpc.SecFxp(2 * f)
            c = mpc.run(mpc.output(secfxp(1) + secfxp(1)))
            self.assertEqual(c.frac_length, f)
            self.assertEqual(c, 2)
            c = mpc.run(mpc.output(secfxp(2**-f) + secfxp(1)))
            if f != 64:  # NB: 1 + 2**-64 == 1 in Python
                self.assertEqual(c, 1 + 2**-f)
            self.assertEqual(mpc.run(mpc.output(secfxp(0.5) * secfxp(2.0))), 1)
            self.assertEqual(mpc.run(mpc.output(secfxp(2.0) * secfxp(0.5))), 1)

            s = [10.7, -3.4, 0.1, -0.11]
            self.assertEqual(mpc.run(mpc.output(list(map(secfxp, s)))), s)

            s = [10.5, -3.25, 0.125, -0.125]
            a, b, c, d = list(map(secfxp, s))
            t = [v * v for v in s]
            self.assertEqual(mpc.run(mpc.output([a * a, b * b, c * c, d * d])),
                             t)
            x = [a, b, c, d]
            self.assertEqual(mpc.run(mpc.output(mpc.schur_prod(x, x))), t)
            self.assertEqual(mpc.run(mpc.output(mpc.schur_prod(x, x[:]))), t)
            t = sum(t)
            self.assertEqual(mpc.run(mpc.output(mpc.in_prod(x, x))), t)
            self.assertEqual(mpc.run(mpc.output(mpc.in_prod(x, x[:]))), t)
            self.assertEqual(
                mpc.run(mpc.output(mpc.matrix_prod([x], [x], True)[0])), [t])
            t = [_ for a, b, c, d in [s] for _ in [a + b, a * b, a - b]]
            self.assertEqual(mpc.run(mpc.output([a + b, a * b, a - b])), t)
            t = [
                _ for a, b, c, d in [s]
                for _ in [(a + b)**2, (a + b)**2 + 3 * c]
            ]
            self.assertEqual(
                mpc.run(mpc.output([(a + b)**2, (a + b)**2 + 3 * c])), t)
            t = [int(_) for a, b, c, d in [s] for _ in [a < b, b < c, c < d]]
            self.assertEqual(mpc.run(mpc.output([a < b, b < c, c < d])), t)
            t = int(s[0] < s[1] and s[1] < s[2])
            self.assertEqual(mpc.run(mpc.output((a < b) & (b < c))), t)
            t = int(s[0] < s[1] or s[1] < s[2])
            self.assertEqual(mpc.run(mpc.output((a < b) | (b < c))), t)
            t = (int(s[0] < s[1]) ^ int(s[1] < s[2]))
            self.assertEqual(mpc.run(mpc.output((a < b) ^ (b < c))), t)
            t = (int(not s[0] < s[1]) ^ int(s[1] < s[2]))
            self.assertEqual(mpc.run(mpc.output(~(a < b) ^ b < c)), t)
            t = [int(s[0] > 1), int(10 * s[1] < 5), int(10 * s[0] == 5)]
            self.assertEqual(
                mpc.run(mpc.output([a > 1, 10 * b < 5, 10 * a == 5])), t)

            s[3] = -0.120
            d = secfxp(s[3])
            t = s[3] / 0.25
            self.assertAlmostEqual(mpc.run(mpc.output(d / 0.25)).signed(),
                                   t,
                                   delta=1)
            t = s[3] / s[2] + s[0]
            self.assertAlmostEqual(mpc.run(mpc.output(d / c + a)).signed(),
                                   t,
                                   delta=1)
            t = round(t * (1 << f))
            self.assertAlmostEqual(mpc.run(mpc.output(d / c + a)), t, delta=1)
            t = ((s[0] + s[1])**2 + 3 * s[2]) / s[2]
            self.assertAlmostEqual(mpc.run(mpc.output(
                ((a + b)**2 + 3 * c) / c)).signed(),
                                   t,
                                   delta=2)
            t = 1 / s[3]
            self.assertAlmostEqual((mpc.run(mpc.output(1 / d))).signed(),
                                   t,
                                   delta=1)
            t = s[2] / s[3]
            self.assertAlmostEqual(mpc.run(mpc.output(c / d)).signed(),
                                   t,
                                   delta=1)
            t = -s[3] / s[2]
            t = round(t * (1 << f))
            self.assertAlmostEqual(mpc.run(mpc.output(-d / c)), t, delta=1)
            t = s[2] / s[3]
            t = round(t * (1 << f))
            self.assertAlmostEqual(mpc.run(mpc.output(d / c)), t, delta=1)

            self.assertEqual(mpc.run(mpc.output(mpc.sgn(+a))), int(s[0] > 0))
            self.assertEqual(mpc.run(mpc.output(mpc.sgn(-a))), -int(s[0] > 0))
            self.assertEqual(mpc.run(mpc.output(mpc.sgn(secfxp(0)))), 0)
            self.assertEqual(mpc.run(mpc.output(abs(secfxp(-1.5)))), 1.5)

            self.assertEqual(mpc.run(mpc.output(mpc.min(a, b, c, d))), min(s))
            self.assertEqual(mpc.run(mpc.output(mpc.min(a, 0))), min(s[0], 0))
            self.assertEqual(mpc.run(mpc.output(mpc.min(0, b))), min(0, s[1]))
            self.assertEqual(mpc.run(mpc.output(mpc.max(a, b, c, d))), max(s))
            self.assertEqual(mpc.run(mpc.output(mpc.max(a, 0))), max(s[0], 0))
            self.assertEqual(mpc.run(mpc.output(mpc.max(0, b))), max(0, s[1]))
            self.assertEqual(
                mpc.run(mpc.output(list(mpc.min_max(a, b, c, d)))),
                [min(s), max(s)])

            self.assertEqual(mpc.run(mpc.output(secfxp(5) % 2)), 1)
            self.assertEqual(mpc.run(mpc.output(secfxp(1) % 2**(1 - f))), 0)
            self.assertEqual(mpc.run(mpc.output(secfxp(2**-f) % 2**(1 - f))),
                             2**-f)
            self.assertEqual(
                mpc.run(mpc.output(secfxp(2 * 2**-f) % 2**(1 - f))), 0)
            self.assertEqual(mpc.run(mpc.output(secfxp(1) // 2**(1 - f))),
                             2**(f - 1))
            self.assertEqual(mpc.run(mpc.output(secfxp(27.0) % 7.0)), 6.0)
            self.assertEqual(mpc.run(mpc.output(secfxp(-27.0) // 7.0)), -4.0)
            self.assertEqual(
                mpc.run(mpc.output(list(divmod(secfxp(27.0), 6.0)))),
                [4.0, 3.0])
            self.assertEqual(mpc.run(mpc.output(secfxp(21.5) % 7.5)), 6.5)
            self.assertEqual(mpc.run(mpc.output(secfxp(-21.5) // 7.5)), -3.0)
            self.assertEqual(
                mpc.run(mpc.output(list(divmod(secfxp(21.5), 0.5)))),
                [43.0, 0.0])
示例#13
0
    def test_secint(self):
        secint = mpc.SecInt()
        a = secint(12)
        b = secint(13)
        c = mpc.run(mpc.output(a * b + b))
        self.assertEqual(c, 12 * 13 + 13)
        c = mpc.run(mpc.output(a**11 * a**(-6) * a**(-5)))
        self.assertEqual(c, 1)
        c = mpc.run(mpc.output(a**(secint.field.modulus - 1)))
        self.assertEqual(c, 1)
        self.assertEqual(mpc.run(mpc.output(secint(12)**73)), 12**73)
        c = mpc.to_bits(
            mpc.SecInt(0)(0))  # mpc.output() only works for non-empty lists
        self.assertEqual(c, [])
        c = mpc.run(mpc.output(mpc.to_bits(mpc.SecInt(1)(0))))
        self.assertEqual(c, [0])
        c = mpc.run(mpc.output(mpc.to_bits(mpc.SecInt(1)(1))))
        self.assertEqual(c, [1])
        c = mpc.run(mpc.output(mpc.to_bits(secint(0))))
        self.assertEqual(c, [
            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
            0, 0, 0, 0, 0, 0, 0, 0, 0, 0
        ])
        c = mpc.run(mpc.output(mpc.to_bits(secint(1))))
        self.assertEqual(c, [
            1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
            0, 0, 0, 0, 0, 0, 0, 0, 0, 0
        ])
        c = mpc.run(mpc.output(mpc.to_bits(secint(8113))))
        self.assertEqual(c, [
            1, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
            0, 0, 0, 0, 0, 0, 0, 0, 0, 0
        ])
        c = mpc.run(mpc.output(mpc.to_bits(secint(2**31 - 1))))
        self.assertEqual(c, [
            1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
            1, 1, 1, 1, 1, 1, 1, 1, 1, 0
        ])
        c = mpc.run(mpc.output(mpc.to_bits(secint(-1))))
        self.assertEqual(c, [
            1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
            1, 1, 1, 1, 1, 1, 1, 1, 1, 1
        ])
        c = mpc.run(mpc.output(mpc.to_bits(secint(-2**31))))
        self.assertEqual(c, [
            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
            0, 0, 0, 0, 0, 0, 0, 0, 0, 1
        ])

        self.assertEqual(mpc.run(mpc.output(mpc.lsb(secint(-2**31)))), 0)
        self.assertEqual(mpc.run(mpc.output(mpc.lsb(secint(-2**31 + 1)))), 1)
        self.assertEqual(mpc.run(mpc.output(mpc.lsb(secint(-1)))), 1)
        self.assertEqual(mpc.run(mpc.output(mpc.lsb(secint(0)))), 0)
        self.assertEqual(mpc.run(mpc.output(mpc.lsb(secint(1)))), 1)
        self.assertEqual(mpc.run(mpc.output(mpc.lsb(secint(2**31 - 1)))), 1)
        self.assertEqual(mpc.run(mpc.output(mpc.lsb(secint(5)))), 1)
        self.assertEqual(mpc.run(mpc.output(mpc.lsb(secint(-5)))), 1)
        self.assertEqual(mpc.run(mpc.output(mpc.lsb(secint(50)))), 0)
        self.assertEqual(mpc.run(mpc.output(mpc.lsb(secint(-50)))), 0)

        self.assertEqual(mpc.run(mpc.output(secint(3)**73)), 3**73)
def to_bits_xor(a, b):
    a = mpc.to_bits(a)
    b = mpc.to_bits(b)
    return [a0 ^ b0 for a0, b0 in zip(a, b)]