def _sendExtend2Cell(self, _, path_node): lspecs = [LinkSpecifier(path_node), LinkSpecifier(path_node, legacy=True)] self._hs_state = ntor.NTorState(path_node.microdescriptor) onion_skin = ntor.createOnionSkin(self._hs_state) extend2 = RelayExtend2Cell.make(self.circuit_id, nspec=len(lspecs), lspecs=lspecs, hdata=onion_skin) crypt_cell = crypto.encryptCell(extend2, self._crypt_path, early=True) self._conn.send(crypt_cell)
def test_encryptCell_one_node_early(self, mock_ecm): mock_cell = mock.Mock() mock_cell.header = mock.Mock() mock_cell.header.circ_id = 0 mock_cell.rheader = mock.Mock() mock_cell.rheader.digest = '\x00\x00\x00\x00' mock_cell.getPayload = mock.Mock() mock_cell.getPayload.return_value = 'payload' mock_cnode1 = mock.Mock() mock_cnode1.forward_digest = mock.Mock() mock_cnode1.forward_digest.update = mock.Mock() mock_cnode1.forward_digest.digest = mock.Mock() mock_cnode1.forward_digest.digest.return_value = '\x01\x02\x03\x04' mock_cnode1.forward_cipher.encrypt = mock.Mock() mock_cnode1.forward_cipher.encrypt.return_value = 'enc_payload' mock_crypt_path = [mock_cnode1] ret = util.encryptCell(mock_cell, mock_crypt_path, early=True) mock_cnode1.forward_digest.update.assert_called_once_with('payload') self.assertEqual(mock_cell.rheader.digest, '\x01\x02\x03\x04') mock_cnode1.forward_cipher.encrypt.assert_called_once_with('payload') mock_ecm.assert_called_once_with(0, 'enc_payload', early=True) self.assertEqual(ret, 'ret')
def _sendExtend2Cell(self, _, path_node): lspecs = [ LinkSpecifier(path_node), LinkSpecifier(path_node, legacy=True) ] self._hs_state = ntor.NTorState(path_node.microdescriptor) onion_skin = ntor.createOnionSkin(self._hs_state) extend2 = RelayExtend2Cell.make(self.circuit_id, nspec=len(lspecs), lspecs=lspecs, hdata=onion_skin) crypt_cell = crypto.encryptCell(extend2, self._crypt_path, early=True) self._conn.send(crypt_cell)
def test_encryptCell_three_nodes(self, mock_ecm): mock_cell = mock.Mock() mock_cell.header = mock.Mock() mock_cell.header.circ_id = 0 mock_cell.rheader = mock.Mock() mock_cell.rheader.digest = '\x00\x00\x00\x00' mock_cell.getPayload = mock.Mock() mock_cell.getPayload.return_value = 'payload' mock_cnode1 = mock.Mock() mock_cnode1.forward_digest = mock.Mock() mock_cnode1.forward_digest.update = mock.Mock() mock_cnode1.forward_digest.digest = mock.Mock() mock_cnode1.forward_digest.digest.return_value = '\x01\x02\x03\x04' mock_cnode1.forward_cipher.encrypt = mock.Mock() mock_cnode1.forward_cipher.encrypt.return_value = 'enc_payload1' mock_cnode2 = mock.Mock() mock_cnode2.forward_digest = mock.Mock() mock_cnode2.forward_digest.update = mock.Mock() mock_cnode2.forward_digest.digest = mock.Mock() mock_cnode2.forward_digest.digest.return_value = '\x05\x06\x07\x08' mock_cnode2.forward_cipher.encrypt = mock.Mock() mock_cnode2.forward_cipher.encrypt.return_value = 'enc_payload2' mock_cnode3 = mock.Mock() mock_cnode3.forward_digest = mock.Mock() mock_cnode3.forward_digest.update = mock.Mock() mock_cnode3.forward_digest.digest = mock.Mock() mock_cnode3.forward_digest.digest.return_value = '\x09\x0a\x0b\x0c' mock_cnode3.forward_cipher.encrypt = mock.Mock() mock_cnode3.forward_cipher.encrypt.return_value = 'enc_payload3' mock_crypt_path = [mock_cnode1, mock_cnode2, mock_cnode3] ret = util.encryptCell(mock_cell, mock_crypt_path) mock_cnode3.forward_digest.update.assert_called_once_with('payload') self.assertEqual(mock_cnode2.forward_digest.update.call_count, 0) self.assertEqual(mock_cnode1.forward_digest.update.call_count, 0) self.assertEqual(mock_cell.rheader.digest, '\x09\x0a\x0b\x0c') mock_cnode1.forward_cipher.encrypt.assert_called_once_with( 'enc_payload2') mock_cnode2.forward_cipher.encrypt.assert_called_once_with( 'enc_payload3') mock_cnode3.forward_cipher.encrypt.assert_called_once_with('payload') mock_ecm.assert_called_once_with(0, 'enc_payload1', early=False) self.assertEqual(ret, 'ret')
def test_encryptCell_three_nodes(self, mock_ecm): mock_cell = mock.Mock() mock_cell.header = mock.Mock() mock_cell.header.circ_id = 0 mock_cell.rheader = mock.Mock() mock_cell.rheader.digest = '\x00\x00\x00\x00' mock_cell.getPayload = mock.Mock() mock_cell.getPayload.return_value = 'payload' mock_cnode1 = mock.Mock() mock_cnode1.forward_digest = mock.Mock() mock_cnode1.forward_digest.update = mock.Mock() mock_cnode1.forward_digest.digest = mock.Mock() mock_cnode1.forward_digest.digest.return_value = '\x01\x02\x03\x04' mock_cnode1.forward_cipher.encrypt = mock.Mock() mock_cnode1.forward_cipher.encrypt.return_value = 'enc_payload1' mock_cnode2 = mock.Mock() mock_cnode2.forward_digest = mock.Mock() mock_cnode2.forward_digest.update = mock.Mock() mock_cnode2.forward_digest.digest = mock.Mock() mock_cnode2.forward_digest.digest.return_value = '\x05\x06\x07\x08' mock_cnode2.forward_cipher.encrypt = mock.Mock() mock_cnode2.forward_cipher.encrypt.return_value = 'enc_payload2' mock_cnode3 = mock.Mock() mock_cnode3.forward_digest = mock.Mock() mock_cnode3.forward_digest.update = mock.Mock() mock_cnode3.forward_digest.digest = mock.Mock() mock_cnode3.forward_digest.digest.return_value = '\x09\x0a\x0b\x0c' mock_cnode3.forward_cipher.encrypt = mock.Mock() mock_cnode3.forward_cipher.encrypt.return_value = 'enc_payload3' mock_crypt_path = [mock_cnode1, mock_cnode2, mock_cnode3] ret = util.encryptCell(mock_cell, mock_crypt_path) mock_cnode3.forward_digest.update.assert_called_once_with('payload') self.assertEqual(mock_cnode2.forward_digest.update.call_count, 0) self.assertEqual(mock_cnode1.forward_digest.update.call_count, 0) self.assertEqual(mock_cell.rheader.digest, '\x09\x0a\x0b\x0c') mock_cnode1.forward_cipher.encrypt.assert_called_once_with('enc_payload2') mock_cnode2.forward_cipher.encrypt.assert_called_once_with('enc_payload3') mock_cnode3.forward_cipher.encrypt.assert_called_once_with('payload') mock_ecm.assert_called_once_with(0, 'enc_payload1', early=False) self.assertEqual(ret, 'ret')
def _encryptAndSendCell(self, cell): try: enc = crypto.encryptCell(cell, self._crypt_path) # TODO: an exception here probably means the circuit needs to be # torn down immediately except Exception as e: msg = ("Error: {}. Failed to encrypt a {} cell on circuit {}. " "Refusing to send unencrypted cell. Dropping the cell." .format(e, type(cell), self.circuit_id)) logging.warning(msg) return try: self._connection.send(enc) # TODO: exception here probably means the circuit needs to be torn down # immediately except Exception as e: msg = ("Error: {}. Failed to send an encrypted cell on circuit " "{}.".format(e, self.circuit_id)) logging.debug(msg)
def _encryptAndSendCell(self, cell): try: enc = crypto.encryptCell(cell, self._crypt_path) # TODO: an exception here probably means the circuit needs to be # torn down immediately except Exception as e: msg = ( "Error: {}. Failed to encrypt a {} cell on circuit {}. " "Refusing to send unencrypted cell. Dropping the cell.".format( e, type(cell), self.circuit_id)) logging.warning(msg) return try: self._connection.send(enc) # TODO: exception here probably means the circuit needs to be torn down # immediately except Exception as e: msg = ("Error: {}. Failed to send an encrypted cell on circuit " "{}.".format(e, self.circuit_id)) logging.debug(msg)