def env1(static, z2p, z2f, z2a, z2w, a2z, p2z, f2z, w2z, pump): n = 3 sid = ('one', (1,2,3), 3) static.write( ('sid', sid) ) z2p.write( ((sid,1), ('input',1)), n*(4*n + 1) ) waits(pump, a2z)#wait_for(a2z) z2a.write( ('A2W', ('get-leaks',)) ) m = waits(a2z, pump)#wait_for(a2z)
def env_delay(self, d, imp): # first send this to the emulated wrapper self.sim_channels['z2a'].write( ('A2W', ('delay', d), 0)) assert waits(self.sim_pump, self.sim_channels['a2z']).msg[1] == 'OK' # now send it to the ideal world wrapper self.write( 'a2w', ('delay',d), imp) assert waits(self.pump, self.channels['w2a']).msg == 'OK' # update our copy of the ideal delay self.internal_delay += d #self.pump.write("dump") self.write('a2z', ('W2A', 'OK'))
def wrapper_poll(self): # The ideal wrapper decreased its delay, so we do the same self.internal_delay -= 1 if self.internal_delay == 0: self.write('a2w', ('delay',1), 1) m = waits(self.channels['w2a']); assert m.msg == 'OK', str(m) #self.writewait('a2w', ('delay',1), 'w2a', 1) self.internal_delay += 1 self.total_extra_delay_added += 1 # simulate the 'poll' call r,m = self.sim_poll() self.sim_get_leaks() self.log.debug('\t\t\033[94m poll Simulation finished\033[0m') if r == self.sim_channels['p2z']: # If we got output from the party, it outputed a committed value (or bot) # tell the ideal wrapper to execute the corresponding codeblock self.sim_party_output(m) elif r == self.sim_channels['a2z']: # Forward any crupt party output to the environment self.write( 'a2z', m.msg ) else: # Something was executed from the wrapper in the simulation, we already # got the leaks above self.pump.write( 'dump' )
def env1(static, z2p, z2f, z2a, z2w, a2z, p2z, f2z, w2z, pump): delta = 3 n = 3 #sid = ('one', (1,2,3), delta) sid = ('one', tuple(range(1, n + 1)), delta) static.write(('sid', sid)) z2p.write(((sid, 1), ('input', 2)), n * (4 * n + 1)) #wait_for(p2z) waits(pump, p2z) def channel_id(fro, to, r): s = ('one', (sid, fro), (sid, to), r, delta) return (s, 'F_chan') z2a.write(('A2W', ('get-leaks', ))) msgs = waits(pump, a2z) print('\033[91m [Leaks] \033[0m', '\n'.join(str(m) for m in msgs.msg))
def sim_party_output(self, m): # If we got output from the party, it outputed a committed value (or bot) # tell the ideal wrapper to execute the corresponding codeblock fro,msg = m.msg _sid,_pid = fro self.log.debug('\033[91m Got some output from pid={}, msg={}\033[0m'.format(_pid,msg)) if self.is_dishonest(_sid,_pid):#isdishonest(_sid,_pid): self.tick(1) # forward this output to the environment self.write('a2z', ('P2A', msg) ) # don't do anything else since corrupt output in the ideal world doesn't # get delivered return elif not self.dealer_input: assert len(self.internal_run_queue) == 0 # If output and not dealer input, dealer is crupt. Call input on functonality self.tick(1) assert self.is_dishonest(self.sid, 1)#isdishonest(self.sid,1) n = len(self.parties) print('\n\t sending input to f_bracha \n\t') self.write( 'a2p', ((self.sid, 1), ('P2F', ((self.sid, 'F_bracha'), ('input',msg)) )), n*(4*n + 1)) m = waits(self.pump, self.channels['p2a']) print('\n******m\n', m, '\n') _fro,_msg = m.msg self.dealer_input = msg; assert type(msg) == int, 'msg:{}, fro:{}'.format(msg, fro) assert _msg == 'OK', str('fro={}, msg={}'.format(_fro,_msg)) # Now get leaks, and populate self.pid_to_queue #leaks = self.get_ideal_wrapper_leaks() self.tick(1) self.write( 'a2w', ('get-leaks',)) m = wait_for(self.channels['w2a']) msg = m.msg pid_idx = None for leak in msg: self.tick(1) sender,msg,imp = leak if sender == (self.sid, 'F_bracha'): if msg[0] == 'schedule': if not pid_idx: pid_idx = 1 self.add_output_schedule(msg, pid_idx) pid_idx += 1 if pid_idx: assert pid_idx-1 == len(self.parties) self.expect_output = True # If dealer gave input to the functionality rnd,idx = self.pid_to_queue[_pid] self.internal_run_queue[rnd].pop(idx) for p in self.pid_to_queue: self.tick(1) if p > _pid: r,i = self.pid_to_queue[p] self.pid_to_queue[p] = (r, i-1) self.write('a2w', ('exec', rnd, idx))
def env1(k, static, z2p, z2f, z2a, z2w, a2z, p2a, f2z, w2z, pump): delta = 3 n = 3 sid = ('one', 1, 2, 10, 10, delta) static.write( (('sid', sid), ('crupt',)) ) transcript = [] def _a2z(): while True: m = waits(a2z) transcript.append('a2z: ' + str(m.msg)) pump.write('dump') def _p2z(): while True: m = waits(p2z) transcript.append('p2z: ' + str(m.msg)) pump.write('dump') g1 = gevent.spawn(_a2z) g2 = gevent.spawn(_p2z) z2p.write( ((sid,1), ('close', (6, 14, 1), '')) ) waits(pump)
def sim_get_leaks(self): # Ask for leaks from the simulated wrapper self.log.debug('sin_get_leaks asking for leaks') self.tick(1) leaks = self.sim_write_and_wait('z2a', ('A2W', ('get-leaks',), 0), 0, 'a2z') n = 0 self.log.debug('\n\t leaks = {} \n'.format(leaks)) # TODO added a tag _,leaks = leaks.msg if len(leaks): # check and count new "schedules" in in simulated wrapper for x in leaks: fro,s,i = x if s[0] == 'schedule': n += 1 self.tick(1) # add delay from new "schedules" in simulated wrapper to ideal-world wrapper self.log.debug('Add n={} delay to ideal world wrapper'.format(n)) self.internal_delay += n self.write('a2w', ('delay',n), n) m = waits(self.pump, self.channels['w2a']); assert m.msg == "OK", str(m.msg) self.sim_leaks.extend(leaks)
def sim_write_and_wait(self, ch, msg, imp, *waiters): self.sim_channels[ch].write( msg, imp ) return waits(self.sim_pump, *[self.sim_channels[w] for w in waiters])
def DELAY(self, d): self.write('a2w', ('delay', d), d) m = waits(self.channels['w2a']) assert m.msg == 'OK', str(m) self.internal_delay += d
def _p2z(): while True: m = waits(p2z) transcript.append('p2z: ' + str(m.msg)) pump.write('dump')
def env_equivocation(k, static, z2p, z2f, z2a, z2w, a2z, p2z, f2z, w2z, pump): delta = 3 n = 4 sid = ('one', tuple(range(1, n + 1)), delta) static.write((('sid', sid), ('crupt', (sid, 1), (sid, 10)))) transcript = [] def _a2z(): while True: m = waits(a2z) transcript.append('a2z: ' + str(m.msg)) pump.write('dump') def _p2z(): while True: m = waits(p2z) transcript.append('p2z: ' + str(m.msg)) pump.write('dump') g1 = gevent.spawn(_a2z) g2 = gevent.spawn(_p2z) def t(s): transcript.append('cmd: ' + str(s)) def channel_id(fro, to, r): s = ('one', (sid, fro), (sid, to), r, delta) return (s, 'F_chan') z2a.write(('A2P', ((sid, 1), ('P2F', ((channel_id(1, 2, 1)), ('send', ('VAL', 1))))), 4 * n), 4 * n) waits(pump) z2a.write(('A2P', ((sid, 1), ('P2F', ((channel_id(1, 3, 1)), ('send', ('VAL', 2))))), 4 * n), 4 * n) waits(pump) z2a.write(('A2W', ('get-leaks', ), n * (4 * n + 1)), n * (4 * n + 1)) waits(pump) for _ in range(4): z2w.write(('poll', ), 1) waits(pump) z2a.write(('A2P', ((sid, 1), ('P2W', ('clock-round', ))), 0)) waits(pump) z2a.write(('A2W', ('exec', 4, 0), 0)) waits(pump) for _ in range(6): z2a.write(('A2W', ('exec', 7, 0), 0)) waits(pump) z2a.write(('A2P', ((sid, 1), ('P2F', ((channel_id(1, 2, 7)), ('send', ('ECHO', 1))))), 3), 3) waits(pump) z2a.write(('A2P', ((sid, 1), ('P2F', ((channel_id(1, 3, 7)), ('send', ('ECHO', 2))))), 3), 3) waits(pump) for _ in range(3): z2w.write(('poll', ), 1) waits(pump) for _ in range(8): z2a.write(('A2W', ('exec', 7, 0), 0)) waits(pump) z2a.write(('A2P', ((sid, 1), ('P2F', ((channel_id(1, 2, 7)), ('send', ('READY', 1))))), 0), 0) waits(pump) z2a.write(('A2W', ('exec', 7, 0), 0)) waits(pump) z2a.write(('A2P', ((sid, 1), ('P2F', ((channel_id(1, 3, 7)), ('send', ('READY', 2))))), 0), 0) waits(pump) z2a.write(('A2W', ('exec', 7, 0), 0)) waits(pump) gevent.kill(g1) gevent.kill(g2) return transcript
def env1(k, static, z2p, z2f, z2a, z2w, a2z, p2z, f2z, w2z, pump): delta = 3 n = 3 sid = ('one', tuple(range(1, n + 1)), delta) static.write((('sid', sid), ('crupt', ))) transcript = [] def _a2z(): while True: m = waits(a2z) transcript.append('a2z: ' + str(m.msg)) pump.write('dump') def _p2z(): while True: m = waits(p2z) transcript.append('p2z: ' + str(m.msg)) pump.write('dump') g1 = gevent.spawn(_a2z) g2 = gevent.spawn(_p2z) def channel_id(fro, to, r): s = ('one', (sid, fro), (sid, to), r, delta) return (s, 'F_chan') z2p.write(((sid, 1), ('input', 2)), n * (4 * n + 1)) waits(pump) z2a.write(('A2W', ('get-leaks', ), 0)) waits(pump) log.debug('\033[91m send first VAL, get +2 ECHO messages \033[0m') for _ in range(4): z2w.write(('poll', ), 1) waits(pump) log.debug( '\033[91m +2 ECHO + 1 = 3 polls to send next VAL message +2 ECHO msgs \033[0m' ) for _ in range(3): z2w.write(('poll', ), 1) waits(pump) log.debug( '\033[91m +2 ECHO + 1 = 3 polls to send last VAL message +2 ECHO msgs \033[0m' ) for _ in range(3): z2w.write(('poll', ), 1) waits(pump) log.debug( '\033[91m +2 ECHO +1 = 3 polls to send 1 -> 2 ECHO msg, +2 READY msgs \033[0m' ) for _ in range(1): z2w.write(('poll', ), 1) waits(pump) log.debug( '\033[91m +2 READY +1 = 3 polls to send 1 -> 3 ECHO msg, +2 READY msgs \033[0m' ) for _ in range(3): z2w.write(('poll', ), 1) waits(pump) log.debug( '\033[91m +2 READY +1 = 3 polls to send 2 -> 1 ECHO msg, +2 READY msgs \033[0m' ) for _ in range(3): z2w.write(('poll', ), 1) waits(pump) log.debug( '\033[91m +2 READY +1 = 3 polls to send 2 -> 3 ECHO msg, +0 READY msgs \033[0m' ) for _ in range(3): z2w.write(('poll', ), 1) waits(pump) log.debug('\033[91m DELAYING \033[0m') z2a.write(('A2W', ('delay', 3), 3), 3) waits(pump) log.debug( '\033[91m +0 READY +1 = 3 polls to send 3 -> 1 ECHO msg, +0 msgs \033[0m' ) for _ in range(4): z2w.write(('poll', ), 1) waits(pump) log.debug( '\033[91m +0 READY +1 = 3 polls to send 3 -> 2 ECHO msg, +0 msgs \033[0m' ) z2w.write(('poll', ), 1) waits(pump) log.debug( '\033[91m +0 READY +1 = 3 polls to send 2 -> 1 READY msg, +0 msgs \033[0m' ) z2w.write(('poll', ), 1) waits(pump) log.debug( '\033[91m +0 READY +1 = 3 polls to send 2 -> 3 READY msg, +0 msgs \033[0m' ) z2w.write(('poll', ), 1) waits(pump) log.debug( '\033[91m +0 READY +1 = 3 polls to send 3 -> 1 READY msg, 1 ACCEPTS\033[0m' ) z2w.write(('poll', ), 1) waits(pump) log.debug( '\033[91m +0 READY +1 = 3 polls to send 3 -> 2 READY msg, 2 Doesnt accept \033[0m' ) z2w.write(('poll', ), 1) waits(pump) log.debug( '\033[91m +0 READY +1 = 3 polls to send 1 -> 2 READY msg, 2 ACCEPTS\033[0m' ) z2w.write(('poll', ), 1) waits(pump) log.debug( '\033[91m +0 READY +1 = 3 polls to send 1 -> 3 READY msg, 3 ACCEPTS\033[0m' ) z2w.write(('poll', ), 1) waits(pump) gevent.kill(g1) gevent.kill(g2) print('Transcript', transcript) return transcript