# garbled_circuit.py from Crypto.Random import get_random_bytes from Crypto.Random import random import hashlib def sample_wirekey(): key = b"wire key: " key += get_random_bytes(32 - len(key)) return key def sample_wirekey_pair(): return [sample_wirekey() for _ in range(2) ] def encrypt(k1, k2, m): h = hashlib.sha256() h.update(k1+k2) pad = h.digest() return bytes([ pad[i] ^ m[i] for i in range(len(m))]) def decrypt(k1, k2, c): h = hashlib.sha256() h.update(k1+k2) pad = h.digest() return bytes([ pad[i] ^ c[i] for i in range(len(c))]) def or_table(wire_left, wire_right, wire_out): enc_table = [None]*4 for x0 in range(2): for x1 in range(2): y = x0 or x1 c = encrypt( wire_left[x0], wire_right[x1], wire_out[y]) enc_table[x0*2 + x1] = c r = random.randrange(4) shift_table = [enc_table[(i+r)%4] for i in range(4)] return shift_table