def set_selector(self, index, uuid, coefficient): assert len(uuid) == 40, "UUIDs must be 40 hex digits." self.fd.write("k") self.send_blob(struct.pack("<I", index)) self.send_blob(uuid.decode("hex")) ciphertext = damgaardjurik.pack_int(self.dj.encrypt(coefficient)) self.send_blob(ciphertext) return self.get_blob() == "1"
def process_round(self): # Remove one block from each user's queue. blocks = {} for u in self.users.values(): if u.block_queue: blocks[u.uid] = damgaardjurik.unpack_int(u.block_queue.pop(0)) print "Got %i blocks for this round." % len(blocks) # Process the subscriptions. for u in self.users.values(): accum = 1 for uid, base in u.selectors.items(): if uid not in blocks: continue print "Processing %i -- %i" % (u.uid, uid) accum *= pow(base, blocks[uid], u.modulus) accum %= u.modulus print "New result for %i" % u.uid u.result_queue.append(damgaardjurik.pack_int(accum))
def send_data(self, command, datum): if isinstance(datum, (int, long)): datum = damgaardjurik.pack_int(datum) self.sock.send("%s %i\n" % (command, len(datum))) self.sock.send(datum)