def Mod2(a_0, a, k, kappa, signed): """ a_0 = a % 2 k: bit length of a """ if k <= 1: movs(a_0, a) return r_dprime = program.curr_block.new_reg('s') r_prime = program.curr_block.new_reg('s') r_0 = program.curr_block.new_reg('s') c = program.curr_block.new_reg('c') c_0 = program.curr_block.new_reg('c') tc = program.curr_block.new_reg('c') t = [program.curr_block.new_reg('s') for i in range(6)] c2k1 = program.curr_block.new_reg('c') PRandM(r_dprime, r_prime, [r_0], k, 1, kappa) mulsi(t[0], r_dprime, 2) if signed: ld2i(c2k1, k - 1) addm(t[1], a, c2k1) else: t[1] = a adds(t[2], t[0], t[1]) adds(t[3], t[2], r_prime) asm_open(c, t[3]) import floatingpoint c_0 = floatingpoint.bits(c, 1)[0] mulci(tc, c_0, 2) mulm(t[4], r_0, tc) addm(t[5], r_0, c_0) subs(a_0, t[5], t[4])
def BitLTL(res, a, b, kappa): """ res = a <? b (logarithmic rounds version) a: clear integer register b: array of secret bits (same length as a) """ k = len(b) import floatingpoint a_bits = floatingpoint.bits(a, k) s = [[program.curr_block.new_reg('s') for i in range(k)] for j in range(2)] t = [program.curr_block.new_reg('s') for i in range(1)] for i in range(len(b)): subsfi(s[0][i], b[i], 1) CarryOut(t[0], a_bits[::-1], s[0][::-1], 1, kappa) subsfi(res, t[0], 1) return a_bits, s[0]
def BitLTC1(u, a, b, kappa): """ u = a <? b a: array of clear bits b: array of secret bits (same length as a) """ k = len(b) p = [program.curr_block.new_reg('s') for i in range(k)] import floatingpoint a_bits = floatingpoint.bits(a, k) if instructions_base.get_global_vector_size() == 1: a_ = a_bits a_bits = program.curr_block.new_reg('c', size=k) b_vec = program.curr_block.new_reg('s', size=k) for i in range(k): movc(a_bits[i], a_[i]) movs(b_vec[i], b[i]) d = program.curr_block.new_reg('s', size=k) s = program.curr_block.new_reg('s', size=k) t = [program.curr_block.new_reg('s', size=k) for j in range(5)] c = [program.curr_block.new_reg('c', size=k) for j in range(4)] else: d = [program.curr_block.new_reg('s') for i in range(k)] s = [program.curr_block.new_reg('s') for i in range(k)] t = [[program.curr_block.new_reg('s') for i in range(k)] for j in range(5)] c = [[program.curr_block.new_reg('c') for i in range(k)] for j in range(4)] if instructions_base.get_global_vector_size() == 1: vmulci(k, c[2], a_bits, 2) vmulm(k, t[0], b_vec, c[2]) vaddm(k, t[1], b_vec, a_bits) vsubs(k, d, t[1], t[0]) vaddsi(k, t[2], d, 1) t[2].create_vector_elements() pre_input = t[2].vector[:] else: for i in range(k): mulci(c[2][i], a_bits[i], 2) mulm(t[0][i], b[i], c[2][i]) addm(t[1][i], b[i], a_bits[i]) subs(d[i], t[1][i], t[0][i]) addsi(t[2][i], d[i], 1) pre_input = t[2][:] pre_input.reverse() if use_inv: if instructions_base.get_global_vector_size() == 1: PreMulC_with_inverses_and_vectors(p, pre_input) else: if do_precomp: PreMulC_with_inverses(p, pre_input) else: raise NotImplementedError('Vectors not compatible with -c sinv') else: PreMulC_without_inverses(p, pre_input) p.reverse() for i in range(k-1): subs(s[i], p[i], p[i+1]) subsi(s[k-1], p[k-1], 1) subcfi(c[3][0], a_bits[0], 1) mulm(t[4][0], s[0], c[3][0]) for i in range(1,k): subcfi(c[3][i], a_bits[i], 1) mulm(t[3][i], s[i], c[3][i]) adds(t[4][i], t[4][i-1], t[3][i]) Mod2(u, t[4][k-1], k, kappa, False) return p, a_bits, d, s, t, c, b, pre_input