def test_loop(self): # Setup packet = b'test_packet' queues = gen_queue_dict() gateway = Gateway() def queue_delayer(): """Place packets into queue after delay.""" time.sleep(0.015) queues[DST_COMMAND_QUEUE].put(packet) time.sleep(0.015) queues[DST_MESSAGE_QUEUE].put(packet) time.sleep(0.015) queues[UNIT_TEST_QUEUE].put(EXIT) threading.Thread(target=queue_delayer).start() # Test side_effects = [EOFError, KeyboardInterrupt, None] + [None] * 100_000 with unittest.mock.patch('time.sleep', side_effect=side_effects): self.assertIsNone(dst_outgoing(queues, gateway, unit_test=True)) self.assertEqual(packet, gateway.packets[0]) # Teardown tear_queues(queues)
def test_file_queue_short_traffic_masking(self): # Setup input_data = os.urandom(5) with open('testfile.txt', 'wb+') as f: f.write(input_data) window = TxWindow(name='Alice', type=WIN_TYPE_CONTACT, type_print='contact', uid='*****@*****.**', log_messages=True) settings = Settings(session_traffic_masking=True, disable_gui_dialog=True) gateway = Gateway(txm_inter_packet_delay=0.02) input_list = ['./testfile.txt', 'Yes'] gen = iter(input_list) builtins.input = lambda _: str(next(gen)) # Test self.assertIsNone(queue_file(window, settings, self.f_queue, gateway)) time.sleep(0.1) self.assertEqual(self.f_queue.qsize(), 1) q_data, log_messages, log_as_ph = self.f_queue.get() self.assertIsInstance(q_data, bytes) self.assertTrue(log_messages) self.assertTrue(log_as_ph)
def test_autonick_ecdhe_kex(self): # Setup input_list = [ '*****@*****.**', '*****@*****.**', '', '', '2QJL5gVSPEjMTaxWPfYkzG9UJxzZDNSx6PPeVWdzS5CFN7knZy', 'Yes' ] gen = iter(input_list) def mock_input(_): return str(next(gen)) builtins.input = mock_input contact_list = ContactList() group_list = GroupList() gateway = Gateway() settings = Settings() queues = {COMMAND_PACKET_QUEUE: Queue(), KEY_MANAGEMENT_QUEUE: Queue()} # Test self.assertIsNone( add_new_contact(contact_list, group_list, settings, queues, gateway)) contact = contact_list.get_contact('*****@*****.**') self.assertEqual(contact.nick, 'Alice') self.assertNotEqual( contact.tx_fingerprint, bytes(32)) # Indicates that PSK function was not called
def setUp(self) -> None: """Pre-test actions.""" self.l_queue = Queue() self.key_list = KeyList(nicks=['Alice']) self.settings = Settings() self.gateway = Gateway() self.onion_service = OnionService()
def test_aborted_file(self): # Setup input_data = os.urandom(5) with open('testfile.txt', 'wb+') as f: f.write(input_data) settings = Settings(session_trickle=True, disable_gui_dialog=True) window = Window(name='Alice', type='contact', uid='*****@*****.**') gateway = Gateway(delay=0.02) f_queue = Queue() input_list = ['./testfile.txt', 'No'] gen = iter(input_list) def mock_input(_): return str(next(gen)) builtins.input = mock_input # Test self.assertFR("File selection aborted.", queue_file, window, settings, f_queue, gateway) # Teardown os.remove('testfile.txt') time.sleep(0.2) f_queue.close()
def test_file_queue_short_trickle(self): # Setup input_data = os.urandom(5) with open('testfile.txt', 'wb+') as f: f.write(input_data) settings = Settings(session_trickle=True, disable_gui_dialog=True) window = Window(name='Alice', type='contact', uid='*****@*****.**') gateway = Gateway(delay=0.02) f_queue = Queue() input_list = ['./testfile.txt', 'Yes'] gen = iter(input_list) def mock_input(_): return str(next(gen)) builtins.input = mock_input # Test self.assertIsNone(queue_file(window, settings, f_queue, gateway)) time.sleep(0.5) self.assertEqual(f_queue.qsize(), 1) q_data, l_d = f_queue.get() self.assertIsInstance(q_data, bytes) self.assertIsInstance(l_d, dict) # Teardown os.remove('testfile.txt') time.sleep(0.2) f_queue.close()
def test_loop(self): # Setup queues = gen_queue_dict() settings = Settings(traffic_masking=True, tm_static_delay=0.001, tm_random_delay=0.001) gateway = Gateway() key_list = KeyList(nicks=['Alice', LOCAL_ID]) window = TxWindow(log_messages=True) contact_list = ContactList(nicks=['Alice', LOCAL_ID]) window.contact_list = contact_list window.window_contacts = [contact_list.get_contact_by_address_or_nick('Alice')] user_input = UserInput(plaintext='test') def queue_delayer(): """Place packets to queue after delay.""" time.sleep(0.01) queues[WINDOW_SELECT_QUEUE].put(window.window_contacts) time.sleep(0.01) queue_command(b'test', settings, queues) # 1 queue_message(user_input, window, settings, queues) # 2 queue_message(user_input, window, settings, queues) # 3 queue_command(b'test', settings, queues) # 4 queues[TM_NOISE_COMMAND_QUEUE].put((C_N_HEADER + bytes(PADDING_LENGTH))) # 5 queue_to_nc(UNENCRYPTED_DATAGRAM_HEADER + UNENCRYPTED_EXIT_COMMAND, queues[RELAY_PACKET_QUEUE]) # 6 queue_to_nc(UNENCRYPTED_DATAGRAM_HEADER + UNENCRYPTED_WIPE_COMMAND, queues[RELAY_PACKET_QUEUE]) # 7 queues[SENDER_MODE_QUEUE].put(settings) # Test threading.Thread(target=queue_delayer).start() self.assertIsInstance(traffic_masking_loop(queues, settings, gateway, key_list), Settings) self.assertEqual(len(gateway.packets), 7) # Teardown tear_queues(queues)
def test_standard_nick_psk_kex(self): # Setup o_getpass = getpass.getpass getpass.getpass = lambda x: 'test_password' input_list = [ '*****@*****.**', '*****@*****.**', 'Alice_', 'psk', '.' ] gen = iter(input_list) def mock_input(_): return str(next(gen)) builtins.input = mock_input contact_list = ContactList() group_list = GroupList() gateway = Gateway() settings = Settings(disable_gui_dialog=True) queues = {COMMAND_PACKET_QUEUE: Queue(), KEY_MANAGEMENT_QUEUE: Queue()} # Test self.assertIsNone( add_new_contact(contact_list, group_list, settings, queues, gateway)) contact = contact_list.get_contact('*****@*****.**') self.assertEqual(contact.nick, 'Alice_') self.assertEqual(contact.tx_fingerprint, bytes(32)) # Indicates that PSK function was called # Teardown getpass.getpass = o_getpass os.remove('[email protected] - Give to [email protected]')
def test_loops(self): queues = gen_queue_dict() window = TxWindow(log_messages=True) settings = Settings(traffic_masking=True, tm_static_delay=0.001, tm_random_delay=0.001) gateway = Gateway() key_list = KeyList(nicks=['Bob', LOCAL_ID]) # Output Bob as existing contact queues[TM_NOISE_COMMAND_QUEUE].put( (C_N_HEADER + bytes(PADDING_LENGTH))) queues[TM_NOISE_PACKET_QUEUE].put( (P_N_HEADER + bytes(PADDING_LENGTH), True, True)) queues[WINDOW_SELECT_QUEUE].put(window.window_contacts) queues[SENDER_MODE_QUEUE].put(settings) queue_command(b'test', settings, queues) # Output command self.assertIsNone( sender_loop(queues, settings, gateway, key_list, unittest=True)) self.assertEqual(len(gateway.packets), 1) settings.traffic_masking = False queues[SENDER_MODE_QUEUE].put(settings) self.assertIsNone( sender_loop(queues, settings, gateway, key_list, unittest=True)) # Output Alice and Bob again self.assertEqual(len(gateway.packets), 1)
def test_client_scheduler(self): queues = gen_queue_dict() gateway = Gateway() server_private_key = X448.generate_private_key() def queue_delayer(): """Place messages to queue one at a time.""" time.sleep(0.1) queues[TOR_DATA_QUEUE].put( ('1234', nick_to_onion_address('Alice'))) queues[CONTACT_KEY_QUEUE].put( (RP_ADD_CONTACT_HEADER, b''.join([nick_to_pub_key('Alice'), nick_to_pub_key('Bob')]), True)) time.sleep(0.1) queues[CONTACT_KEY_QUEUE].put( (RP_REMOVE_CONTACT_HEADER, b''.join([nick_to_pub_key('Alice'), nick_to_pub_key('Bob')]), True)) time.sleep(0.1) queues[UNITTEST_QUEUE].put(EXIT) time.sleep(0.1) queues[CONTACT_KEY_QUEUE].put((EXIT, EXIT, EXIT)) threading.Thread(target=queue_delayer).start() self.assertIsNone( client_scheduler(queues, gateway, server_private_key, unittest=True)) tear_queues(queues)
def setUp(self) -> None: """Pre-test actions.""" self.contact_list = ContactList() self.settings = Settings() self.onion_service = OnionService() self.queues = gen_queue_dict() self.gateway = Gateway()
def setUp(self): """Pre-test actions.""" self.contact_list = ContactList() self.settings = Settings() self.onion_service = OnionService() self.gateway = Gateway() self.args = self.contact_list, self.settings, self.onion_service, self.gateway
def test_raises_fr_during_fingerprint_mismatch(self): # Setup contact_list = ContactList() settings = Settings() queues = {COMMAND_PACKET_QUEUE: Queue(), KEY_MANAGEMENT_QUEUE: Queue()} gateway = Gateway() o_input = builtins.input input_list = [ '2QJL5gVSPEjMTaxWPfYkzG9UJxzZDNSx6PPeVWdzS5CFN7knZ', # Short key should fail '2QJL5gVSPEjMTaxWPfYkzG9UJxzZDNSx6PPeVWdzS5CFN7knZya', # Long key should fail '2QJL5gVSPEjMTaxWPfYkzG9UJxzZDNSx6PPeVWdzS5CFN7knZa', # Invalid key should fail '2QJL5gVSPEjMTaxWPfYkzG9UJxzZDNSx6PPeVWdzS5CFN7knZy', # Correct key 'No' ] # Fingerprint mismatch gen = iter(input_list) def mock_input(_): return str(next(gen)) builtins.input = mock_input # Test self.assertFR("Fingerprint mismatch", start_key_exchange, '*****@*****.**', '*****@*****.**', 'Alice', contact_list, settings, queues, gateway) # Teardown builtins.input = o_input
def test_client(self, _) -> None: onion_pub_key = nick_to_pub_key('Alice') onion_address = nick_to_onion_address('Alice') tor_port = '1337' settings = Gateway() sk = TestClient.url_token_private_key self.assertIsNone(client(onion_pub_key, self.queues, sk, tor_port, settings, onion_address, unit_test=True)) self.assertEqual(self.queues[URL_TOKEN_QUEUE].get(), (onion_pub_key, TestClient.url_token))
def setUp(self): self.settings = Settings() self.unittest_dir = cd_unittest() self.gateway = Gateway() self.rs = RSCodec(2 * self.gateway.settings.serial_error_correction) self.ts = datetime.now() self.queues = gen_queue_dict() self.args = self.queues, self.gateway
def setUp(self): self.settings = Settings(disable_gui_dialog=True) self.gateway = Gateway() self.contact_list = ContactList() self.group_list = GroupList() self.master_key = MasterKey() self.onion_service = OnionService() self.queues = gen_queue_dict()
def test_import_file(self): # Setup settings = Settings() gateway = Gateway() # Test self.assertIsNone(import_file(settings, gateway)) self.assertEqual(len(gateway.packets), 1)
def setUp(self): self.window = TxWindow() self.contact_list = ContactList() self.group_list = GroupList() self.settings = Settings() self.queues = gen_queue_dict() self.gateway = Gateway() self.args = self.window, self.contact_list, self.group_list, self.settings, self.queues, self.gateway
def test_missing_file_raises_fr(self): # Setup settings = Settings() window = Window() gateway = Gateway(delay=0.02) # Test self.assertFR("Error: File not found.", File, './testfile.txt', window, settings, gateway)
def test_no_new_local_key_during_trickle(self): # Setup contact_list = ContactList() settings = Settings(session_trickle=True) queues = {COMMAND_PACKET_QUEUE: Queue(), KEY_MANAGEMENT_QUEUE: Queue()} gateway = Gateway() self.assertFR("Command disabled during trickle connection.", new_local_key, contact_list, settings, queues, gateway)
def setUp(self): self.ts = datetime.now() self.window_list = WindowList() self.contact_list = ContactList() self.group_list = GroupList() self.key_list = KeyList() self.settings = Settings() self.gateway = Gateway() self.args = (self.ts, self.window_list, self.contact_list, self.group_list, self.key_list, self.settings, self.gateway)
def setUp(self): self.contact_list = ContactList(nicks=['Alice']) self.group_list = GroupList() self.user_input = UserInput() self.window = TxWindow(self.contact_list, self.group_list) self.settings = Settings() self.queues = gen_queue_dict() self.onion_service = OnionService() self.gateway = Gateway() self.args = self.user_input, self.window, self.settings, self.queues, self.onion_service, self.gateway
def setUp(self) -> None: """Pre-test actions.""" self.settings = Settings() self.unit_test_dir = cd_unit_test() self.gateway = Gateway() self.rs = RSCodec(2 * self.gateway.settings.serial_error_correction) self.ts = datetime.now() self.queues = gen_queue_dict() self.args = self.queues, self.gateway self.queues[TX_BUF_KEY_QUEUE].put(SYMMETRIC_KEY_LENGTH * b'a')
def test_successful_exchange(self): # Setup contact_list = ContactList() settings = Settings() queues = {COMMAND_PACKET_QUEUE: Queue(), KEY_MANAGEMENT_QUEUE: Queue()} gateway = Gateway() o_input = builtins.input input_list = [ '2QJL5gVSPEjMTaxWPfYkzG9UJxzZDNSx6PPeVWdzS5CFN7knZy', # Correct key 'Yes' ] # Fingerprint match gen = iter(input_list) def mock_input(_): return str(next(gen)) builtins.input = mock_input # Test self.assertIsNone( start_key_exchange('*****@*****.**', '*****@*****.**', 'Alice', contact_list, settings, queues, gateway)) contact = contact_list.get_contact('*****@*****.**') self.assertEqual(contact.rx_account, '*****@*****.**') self.assertEqual(contact.tx_account, '*****@*****.**') self.assertEqual(contact.nick, 'Alice') self.assertIsInstance(contact.tx_fingerprint, bytes) self.assertIsInstance(contact.rx_fingerprint, bytes) self.assertEqual(len(contact.tx_fingerprint), 32) self.assertEqual(len(contact.rx_fingerprint), 32) self.assertFalse(contact.log_messages) self.assertFalse(contact.file_reception) self.assertFalse(contact.notifications) time.sleep(0.2) cmd, account, txkey, rxkey, txhek, rxhek = queues[ KEY_MANAGEMENT_QUEUE].get() self.assertEqual(cmd, 'ADD') self.assertEqual(account, '*****@*****.**') self.assertEqual(len(txkey), 32) self.assertIsInstance(txkey, bytes) self.assertEqual(len(txhek), 32) self.assertIsInstance(txhek, bytes) self.assertEqual(rxkey, bytes(32)) self.assertEqual(rxhek, bytes(32)) self.assertEqual(queues[COMMAND_PACKET_QUEUE].qsize(), 1) # Teardown builtins.input = o_input
def setUp(self): """Pre-test actions.""" self.window = TxWindow() self.contact_list = ContactList() self.group_list = GroupList() self.settings = Settings() self.queues = gen_queue_dict() self.master_key = MasterKey() self.gateway = Gateway() self.args = (self.window, self.contact_list, self.group_list, self.settings, self.queues, self.master_key, self.gateway)
def setUp(self): self.contact_list = ContactList(['Alice', 'Bob']) self.group_list = GroupList(groups=['test_group', 'test_group_2']) self.window = TxWindow(self.contact_list, self.group_list) self.window.group = self.group_list.get_group('test_group') self.window.type = WIN_TYPE_GROUP self.settings = Settings() self.queues = gen_queue_dict() self.onion_service = OnionService() self.gateway = Gateway() self.args = self.settings, self.queues, self.onion_service, self.gateway
def setUp(self): self.settings = Settings() self.gateway = Gateway() self.rs = RSCodec(2 * self.settings.serial_error_correction) self.queues = {TXM_INCOMING_QUEUE: Queue(), RXM_OUTGOING_QUEUE: Queue(), TXM_TO_IM_QUEUE: Queue(), TXM_TO_NH_QUEUE: Queue(), TXM_TO_RXM_QUEUE: Queue(), NH_TO_IM_QUEUE: Queue(), EXIT_QUEUE: Queue()}
def setUp(self): self.window = TxWindow() self.contact_list = ContactList() self.group_list = GroupList() self.settings = Settings() self.queues = gen_queue_dict() self.master_key = MasterKey() self.onion_service = OnionService() self.gateway = Gateway() self.args = (self.window, self.contact_list, self.group_list, self.settings, self.queues, self.master_key, self.onion_service, self.gateway)
def test_empty_file_raises_fr(self): # Setup with open('testfile.txt', 'wb+') as f: f.write(b'') settings = Settings() window = Window() gateway = Gateway(delay=0.02) # Test self.assertFR("Error: Target file is empty. No file was sent.", File, './testfile.txt', window, settings, gateway)
def test_valid_message_packet(self): # Setup gateway = Gateway(serial_error_correction=5) key_list = KeyList(master_key=bytes(SYMMETRIC_KEY_LENGTH)) key_list.keysets = [create_keyset('Alice', tx_key=SYMMETRIC_KEY_LENGTH * b'\x02', tx_harac=8)] # Test self.assertIsNone(send_packet(key_list, gateway, self.l_queue, bytes(ASSEMBLY_PACKET_LENGTH), nick_to_pub_key("Alice"), True)) self.assertEqual(len(gateway.packets), 1) time.sleep(0.01) self.assertFalse(self.l_queue.empty())