def maskField(a, k, kappa): r_dprime = types.sint() r_prime = types.sint() c = types.cint() r = [types.sint() for i in range(k)] comparison.PRandM(r_dprime, r_prime, r, k, k, kappa) asm_open(c, a + two_power(k) * r_dprime + r_prime) # + 2**(k-1)) return c, r
def EQZ(a, k, kappa): r_dprime = types.sint() r_prime = types.sint() c = types.cint() d = [None] * k r = [types.sint() for i in range(k)] comparison.PRandM(r_dprime, r_prime, r, k, k, kappa) asm_open(c, a + two_power(k) * r_dprime + r_prime) # + 2**(k-1)) for i, b in enumerate(bits(c, k)): d[i] = b + r[i] - 2 * b * r[i] return 1 - KOR(d, kappa)
def TruncPrField(a, k, m, kappa=None): if kappa is None: kappa = 40 b = two_power(k-1) + a r_prime, r_dprime = types.sint(), types.sint() comparison.PRandM(r_dprime, r_prime, [types.sint() for i in range(m)], k, m, kappa) two_to_m = two_power(m) r = two_to_m * r_dprime + r_prime c = (b + r).reveal() c_prime = c % two_to_m a_prime = c_prime - r_prime d = (a - a_prime) / two_to_m return d
def TruncPr(a, k, m, kappa=None): """ Probabilistic truncation [a/2^m + u] where Pr[u = 1] = (a % 2^m) / 2^m """ if kappa is None: kappa = 40 b = two_power(k-1) + a r_prime, r_dprime = types.sint(), types.sint() comparison.PRandM(r_dprime, r_prime, [types.sint() for i in range(m)], k, m, kappa) two_to_m = two_power(m) r = two_to_m * r_dprime + r_prime c = (b + r).reveal() c_prime = c % two_to_m a_prime = c_prime - r_prime d = (a - a_prime) / two_to_m return d
def BitDec(a, k, m, kappa, bits_to_compute=None): r_dprime = types.sint() r_prime = types.sint() c = types.cint() r = [types.sint() for i in range(m)] comparison.PRandM(r_dprime, r_prime, r, k, m, kappa) #assert(r_prime.value == sum(r[i].value*2**i for i in range(m)) % comparison.program.P) pow2 = two_power(k + kappa) asm_open(c, pow2 + two_power(k) + a - two_power(m) * r_dprime - r_prime) #rval = 2**m*r_dprime.value + r_prime.value #assert(rval % 2**m == r_prime.value) #assert(rval == (2**m*r_dprime.value + sum(r[i].value*2**i for i in range(m)) % comparison.program.P )) try: pass #assert(c.value == (2**(k + kappa) + 2**k + (a.value%2**k) - rval) % comparison.program.P) except AssertionError: print 'BitDec assertion failed' print 'a =', a.value print 'a mod 2^%d =' % k, (a.value % 2**k) return BitAdd(list(bits(c, m)), r, bits_to_compute)[:-1]