Example #1
0
 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)
Example #2
0
    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')
Example #3
0
    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')
Example #4
0
 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)
Example #5
0
    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')
Example #6
0
    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')
Example #7
0
    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)
Example #8
0
    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)