Esempio n. 1
0
    def setUp(self):
        filename = os.path.join(tempfile.gettempdir(), "test.fuzz")
        mod1 = Modulator("mod 1")
        mod2 = Modulator("mod 2")
        mod2.param_for_one = 42

        decoders = [
            Encoder(["NRZ"]),
            Encoder(["NRZ-I", constants.DECODING_INVERT])
        ]

        pac = ProtocolAnalyzerContainer([mod1, mod2])
        pac.messages.append(
            Message([True, False, False, True, "A"],
                    100,
                    decoder=decoders[0],
                    message_type=pac.default_message_type))
        pac.messages.append(
            Message([False, False, False, False, "A"],
                    200,
                    decoder=decoders[1],
                    message_type=pac.default_message_type))
        pac.used_symbols.add(Symbol("A", 1, 1, 100))
        pac.create_fuzzing_label(1, 10, 0)
        pac.to_xml_file(filename)
Esempio n. 2
0
    def prepare_modulation_dialog(
            self) -> (ModulatorDialogController, Message):
        preselected_index = self.ui.cBoxModulations.currentIndex()

        min_row, max_row, start, end = self.ui.tableMessages.selection_range()
        if min_row > -1:
            try:
                selected_message = self.table_model.protocol.messages[min_row]
                preselected_index = selected_message.modulator_indx
            except IndexError:
                selected_message = Message([True, False, True, False], 0, [],
                                           MessageType("empty"))
        else:
            selected_message = Message([True, False, True, False], 0, [],
                                       MessageType("empty"))
            if len(self.table_model.protocol.messages) > 0:
                selected_message.bit_len = self.table_model.protocol.messages[
                    0].bit_len

        for m in self.modulators:
            m.default_sample_rate = self.project_manager.device_conf[
                "sample_rate"]

        modulator_dialog = ModulatorDialogController(self.modulators,
                                                     parent=self.parent())
        modulator_dialog.ui.treeViewSignals.setModel(self.tree_model)
        modulator_dialog.ui.treeViewSignals.expandAll()
        modulator_dialog.ui.comboBoxCustomModulations.setCurrentIndex(
            preselected_index)

        modulator_dialog.finished.connect(self.refresh_modulators)
        modulator_dialog.finished.connect(self.refresh_pause_list)

        return modulator_dialog, selected_message
Esempio n. 3
0
    def prepare_modulation_dialog(self) -> (ModulatorDialog, Message):
        preselected_index = self.ui.cBoxModulations.currentIndex()

        min_row, max_row, start, end = self.ui.tableMessages.selection_range()
        if min_row > -1:
            try:
                selected_message = self.table_model.protocol.messages[min_row]
                preselected_index = selected_message.modulator_index
            except IndexError:
                selected_message = Message(
                    [1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1, 0, 0], 0, [],
                    MessageType("empty"))
        else:
            selected_message = Message(
                [1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1, 0, 0], 0, [],
                MessageType("empty"))
            if len(self.table_model.protocol.messages) > 0:
                selected_message.samples_per_symbol = self.table_model.protocol.messages[
                    0].samples_per_symbol

        for m in self.modulators:
            m.default_sample_rate = self.project_manager.device_conf[
                "sample_rate"]

        modulator_dialog = ModulatorDialog(self.modulators,
                                           tree_model=self.tree_model,
                                           parent=self.parent())
        modulator_dialog.ui.comboBoxCustomModulations.setCurrentIndex(
            preselected_index)

        modulator_dialog.finished.connect(self.refresh_modulators)
        modulator_dialog.finished.connect(self.refresh_pause_list)

        return modulator_dialog, selected_message
Esempio n. 4
0
 def redo(self):
     message = copy.deepcopy(self.proto_analyzer.messages[self.msg_nr])
     message1 = Message(plain_bits=message.plain_bits[:self.pos], pause=0,
                        rssi=0, decoder=message.decoder, message_type=message.message_type,
                        bit_len=message.bit_len)
     message2 = Message(plain_bits=message.plain_bits[self.pos:], pause=message.pause,
                        rssi=0, decoder=message.decoder, message_type=message.message_type,
                        bit_len=message.bit_len)
     self.proto_analyzer.messages[self.msg_nr] = message1
     self.proto_analyzer.messages.insert(self.msg_nr + 1, message2)
Esempio n. 5
0
    def test_binary_format(self):
        pa = ProtocolAnalyzer(None)
        pa.messages.append(
            Message([1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1], 0,
                    pa.default_message_type))
        pa.messages.append(Message([1, 1, 1, 0, 1], 0,
                                   pa.default_message_type))

        filename = os.path.join(tempfile.gettempdir(), "test_proto.bin")
        pa.to_binary(filename, use_decoded=True)

        pa.from_binary(filename)
        self.assertEqual(len(pa.messages), 3)
        self.assertEqual(pa.plain_bits_str[2], "111000111001101111101000")
Esempio n. 6
0
    def test_default_crcs(self):
        crc_label = ChecksumLabel(
            "crc_label", 25, 120, 0,
            FieldType("crc", FieldType.Function.CHECKSUM))
        crc_widget_controller = ChecksumWidgetController(
            crc_label, Message([0] * 150, 0, MessageType("test")), 0)

        default_crc_polynomials = GenericCRC.DEFAULT_POLYNOMIALS
        special_crcs = ChecksumWidgetController.SPECIAL_CRCS

        self.assertEqual(
            len(default_crc_polynomials) + len(special_crcs),
            crc_widget_controller.ui.comboBoxCRCFunction.count())
        for i, default_polynomial_name in enumerate(default_crc_polynomials):
            self.assertEqual(
                default_polynomial_name,
                crc_widget_controller.ui.comboBoxCRCFunction.itemText(i))

        for i, special_crc in enumerate(special_crcs):
            self.assertEqual(
                special_crc,
                crc_widget_controller.ui.comboBoxCRCFunction.itemText(
                    i + len(default_crc_polynomials)))

        crc_widget_controller.ui.comboBoxCRCFunction.setCurrentIndex(1)
        self.assertNotEqual(
            crc_widget_controller.ui.comboBoxCRCFunction.currentText(),
            "8_standard")
        crc_widget_controller.ui.comboBoxCRCFunction.setCurrentText(
            "8_standard")
        self.assertEqual(
            crc_widget_controller.ui.comboBoxCRCFunction.currentText(),
            "8_standard")
        self.assertEqual(crc_widget_controller.ui.lineEditCRCPolynomial.text(),
                         "d5")
Esempio n. 7
0
 def from_binary(self, filename: str):
     aggregated = np.fromfile(filename, dtype=np.uint8)
     unaggregated = [
         int(b) for n in aggregated for b in "{0:08b}".format(n)
     ]
     self.messages.append(
         Message(unaggregated, 0, self.default_message_type))
Esempio n. 8
0
    def test_configure_crc_parameters(self):
        crc_label = ChecksumLabel(
            "crc_label", 25, 120, 0,
            FieldType("crc", FieldType.Function.CHECKSUM))

        crc_widget_controller = ChecksumWidgetController(
            crc_label, Message([0] * 150, 0, MessageType("test")), 0)

        crc = GenericCRC(
            polynomial=list(GenericCRC.DEFAULT_POLYNOMIALS.keys())[0])
        self.assertEqual(crc_widget_controller.ui.lineEditCRCPolynomial.text(),
                         crc.polynomial_as_hex_str)
        self.assertEqual(crc_widget_controller.ui.lineEditStartValue.text(),
                         util.bit2hex(crc.start_value))
        self.assertEqual(crc_widget_controller.ui.lineEditFinalXOR.text(),
                         util.bit2hex(crc.final_xor))

        crc_widget_controller.ui.comboBoxCRCFunction.setCurrentIndex(2)
        crc.polynomial = crc.choose_polynomial(2)
        self.assertEqual(crc_widget_controller.ui.lineEditCRCPolynomial.text(),
                         crc.polynomial_as_hex_str)

        crc_widget_controller.ui.lineEditCRCPolynomial.setText("abcde")
        crc_widget_controller.ui.lineEditCRCPolynomial.editingFinished.emit()
        self.assertEqual(crc_label.checksum.polynomial,
                         array.array("B", [1]) + util.hex2bit("abcde"))

        crc_widget_controller.ui.lineEditStartValue.setText("12345")
        crc_widget_controller.ui.lineEditStartValue.editingFinished.emit()
        self.assertEqual(util.bit2hex(crc_label.checksum.start_value), "12345")

        crc_widget_controller.ui.lineEditFinalXOR.setText("cccaa")
        crc_widget_controller.ui.lineEditFinalXOR.editingFinished.emit()
        self.assertEqual(util.bit2hex(crc_label.checksum.final_xor), "cccaa")
Esempio n. 9
0
    def get_protocol_from_signal(self):
        signal = self.signal
        if signal is None:
            self.messages = None
            return

        if self.messages is not None:
            self.messages[:] = []
        else:
            self.messages = []

        bit_len = signal.bit_len

        ppseq = signalFunctions.grab_pulse_lens(signal.qad, signal.qad_center,
                                                signal.tolerance,
                                                signal.modulation_type)

        bit_data, pauses, bit_sample_pos = self._ppseq_to_bits(ppseq, bit_len)

        i = 0
        for bits, pause in zip(bit_data, pauses):
            middle_bit_pos = bit_sample_pos[i][int(len(bits) / 2)]
            start, end = middle_bit_pos, middle_bit_pos + bit_len
            rssi = np.mean(np.abs(signal.data[start:end]))
            message = Message(bits,
                              pause,
                              message_type=self.default_message_type,
                              bit_len=bit_len,
                              rssi=rssi,
                              decoder=self.decoder,
                              bit_sample_pos=bit_sample_pos[i])
            self.messages.append(message)
            i += 1

        self.qt_signals.protocol_updated.emit()
Esempio n. 10
0
    def get_protocol_from_signal(self):
        signal = self.signal
        if signal is None:
            self.messages = None
            return

        if self.messages is not None:
            self.messages[:] = []
        else:
            self.messages = []

        bit_len = signal.bit_len

        ppseq = signal_functions.grab_pulse_lens(signal.qad, signal.qad_center, signal.tolerance,
                                                 signal.modulation_type, signal.bit_len, signal.bits_per_symbol)

        bit_data, pauses, bit_sample_pos = self._ppseq_to_bits(ppseq, bit_len, self.signal.bits_per_symbol,
                                                               pause_threshold=signal.pause_threshold)
        if signal.message_length_divisor > 1 and signal.modulation_type == "ASK":
            self.__ensure_message_length_multiple(bit_data, signal.bit_len, pauses, bit_sample_pos,
                                                  signal.message_length_divisor)

        i = 0
        for bits, pause in zip(bit_data, pauses):
            middle_bit_pos = bit_sample_pos[i][int(len(bits) / 2)]
            start, end = middle_bit_pos, middle_bit_pos + bit_len
            rssi = np.mean(signal.iq_array.subarray(start, end).magnitudes_normalized)
            message = Message(bits, pause, message_type=self.default_message_type,
                              bit_len=bit_len, rssi=rssi, decoder=self.decoder, bit_sample_pos=bit_sample_pos[i])
            self.messages.append(message)
            i += 1

        self.qt_signals.protocol_updated.emit()
Esempio n. 11
0
 def redo(self):
     message = self.proto_analyzer.messages[self.msg_nr]
     message1 = Message(plain_bits=message.plain_bits[:self.pos],
                        pause=0,
                        rssi=message.rssi,
                        decoder=message.decoder,
                        message_type=message.message_type,
                        samples_per_symbol=message.samples_per_symbol)
     message2 = Message(plain_bits=message.plain_bits[self.pos:],
                        pause=message.pause,
                        rssi=message.rssi,
                        decoder=message.decoder,
                        message_type=message.message_type,
                        samples_per_symbol=message.samples_per_symbol)
     self.proto_analyzer.messages[self.msg_nr] = message1
     self.proto_analyzer.messages.insert(self.msg_nr + 1, message2)
Esempio n. 12
0
    def fuzz(self, mode: FuzzMode, default_pause=None):
        result = []
        appd_result = result.append

        added_message_indices = []

        for i, msg in enumerate(self.messages):
            labels = msg.active_fuzzing_labels
            appd_result(msg)

            if mode == FuzzMode.successive:
                combinations = [[(l.start, l.end, fuzz_val)] for l in labels
                                for fuzz_val in l.fuzz_values[1:]]
            elif mode == FuzzMode.concurrent:
                num_values = numpy.max([len(l.fuzz_values)
                                        for l in labels]) if labels else 0
                f = lambda index, label: index if index < len(label.fuzz_values
                                                              ) else 0
                combinations = [[(l.start, l.end, l.fuzz_values[f(j, l)])
                                 for l in labels]
                                for j in range(1, num_values)]
            elif mode == FuzzMode.exhaustive:
                pool = [[(l.start, l.end, fv) for fv in l.fuzz_values[1:]]
                        for l in labels]
                combinations = itertools.product(*pool) if labels else []
            else:
                raise ValueError("Unknown fuzz mode")

            self.qt_signals.fuzzing_started.emit(len(combinations))

            message_type = copy.copy(msg.message_type)
            for lbl in labels:
                lbl = copy.copy(lbl)
                lbl.fuzz_values = []
                lbl.fuzz_created = True
                message_type[message_type.index(lbl)] = lbl

            for j, combination in enumerate(combinations):
                cpy_bits = msg.plain_bits[:]
                for start, end, fuz_val in combination:
                    cpy_bits[start:end] = array.array("B", map(int, fuz_val))

                pause = default_pause if default_pause is not None else msg.pause
                fuz_msg = Message(plain_bits=cpy_bits,
                                  pause=pause,
                                  rssi=msg.rssi,
                                  message_type=message_type,
                                  modulator_index=msg.modulator_index,
                                  decoder=msg.decoder,
                                  fuzz_created=True,
                                  participant=msg.participant)
                added_message_indices.append(i + j + 1)
                appd_result(fuz_msg)
                if j % 10000 == 0:
                    self.qt_signals.current_fuzzing_message_changed.emit(j)

        self.qt_signals.fuzzing_finished.emit()
        self.messages = result  # type: list[Message]
        return added_message_indices
 def insert_protocol_analyzer(self, index: int, proto_analyzer: ProtocolAnalyzer):
     for msg in reversed(proto_analyzer.messages):
         self.messages.insert(index, Message(plain_bits=msg.decoded_bits, pause=msg.pause,
                                             message_type=copy.copy(msg.message_type),
                                             rssi=msg.rssi, modulator_indx=0, decoder=msg.decoder,
                                             bit_len=msg.bit_len, participant=msg.participant))
     if len(self.pauses) > 0:
         self.fuzz_pause = self.pauses[0]
Esempio n. 14
0
 def __build_protocol(self):
     result = ProtocolAnalyzer(signal=None)
     for _ in range(self.NUM_MESSAGES):
         b = Message([True] * self.BITS_PER_MESSAGE,
                     pause=1000,
                     message_type=result.default_message_type)
         result.messages.append(b)
     return result
Esempio n. 15
0
    def __demodulate_data(self, data):
        """
        Demodulates received IQ data and adds demodulated bits to messages
        :param data:
        :return:
        """
        signal = self.signal

        if self.__are_bits_in_data(data):
            self.reading_data = True
        elif self.conseq_non_data == 5:
            self.reading_data = False
            self.conseq_non_data = 0
        else:
            self.conseq_non_data += 1

        if self.reading_data:
            self.data_cache.append(data)
            return
        elif len(self.data_cache) == 0:
            return

        signal._fulldata = np.concatenate(self.data_cache)
        del self.data_cache[:]
        signal._qad = None

        bit_len = signal.bit_len
        ppseq = grab_pulse_lens(signal.qad, signal.qad_center,
                                signal.tolerance, signal.modulation_type)

        bit_data, pauses, bit_sample_pos = self._ppseq_to_bits(
            ppseq, bit_len, self.rel_symbol_len)

        i = 0
        first_msg = True

        for bits, pause in zip(bit_data, pauses):
            if first_msg or self.messages[-1].pause > 8 * bit_len:
                # Create new Message
                middle_bit_pos = bit_sample_pos[i][int(len(bits) / 2)]
                start, end = middle_bit_pos, middle_bit_pos + bit_len
                rssi = np.mean(np.abs(signal._fulldata[start:end]))
                message = Message(bits,
                                  pause,
                                  bit_len=bit_len,
                                  rssi=rssi,
                                  message_type=self.default_message_type)
                self.messages.append(message)
                first_msg = False
            else:
                # Append to last message
                message = self.messages[-1]
                nzeros = int(np.round(message.pause / bit_len))
                message.plain_bits.extend([False] * nzeros)
                message.plain_bits.extend(bits)
                message.pause = pause
            i += 1
Esempio n. 16
0
    def add_empty_row_behind(self, row_index: int, num_bits: int):
        message = Message(plain_bits=[0]*num_bits,
                          pause=constants.SETTINGS.value("default_fuzzing_pause", 10**6, int),
                          message_type=self.protocol.default_message_type)

        tmp_protocol = ProtocolAnalyzer(None)
        tmp_protocol.messages = [message]
        undo_action = InsertBitsAndPauses(self.protocol, row_index+1, tmp_protocol)
        self.undo_stack.push(undo_action)
Esempio n. 17
0
    def test_crc_widget_in_protocol_label_dialog(self):
        mt = MessageType("test")
        mt.append(
            ChecksumLabel("test_crc", 8, 16, 0,
                          FieldType("test_crc", FieldType.Function.CHECKSUM)))

        self.dialog = ProtocolLabelController(0, Message([0] * 100, 0, mt), 0)
        self.assertEqual(self.dialog.ui.tabWidgetAdvancedSettings.count(), 1)
        self.assertEqual(self.dialog.ui.tabWidgetAdvancedSettings.tabText(0),
                         "test_crc")
Esempio n. 18
0
 def __build_protocol(self):
     QApplication.instance().processEvents()
     QTest.qWait(self.WAIT_TIMEOUT_BEFORE_NEW)
     result = ProtocolAnalyzer(signal=None)
     for _ in range(self.NUM_MESSAGES):
         b = Message([True] * self.BITS_PER_MESSAGE,
                     pause=1000,
                     message_type=result.default_message_type)
         result.messages.append(b)
     return result
Esempio n. 19
0
    def __get_continuous_send_dialog(self):
        messages = [Message([True]*100, 1000, self.form.compare_frame_controller.active_message_type) for _ in range(10)]
        modulators = [Modulator("Test")]

        continuous_send_dialog = ContinuousSendDialogController(self.form.project_manager, messages, modulators,
                                                                self.form.generator_tab_controller.total_modulated_samples,
                                                                parent=self.form, testing_mode=True)
        if self.SHOW:
            continuous_send_dialog.show()

        return continuous_send_dialog
Esempio n. 20
0
    def __demodulate_data(self, data):
        """
        Demodulates received IQ data and adds demodulated bits to messages
        :param data:
        :return:
        """
        if self.__are_bits_in_data(data):
            self.reading_data = True
        elif self.conseq_non_data == 5:
            self.reading_data = False
            self.conseq_non_data = 0
        else:
            self.conseq_non_data += 1

        if self.reading_data:
            self.data_cache.append(data)
            return
        elif len(self.data_cache) == 0:
            return

        self.signal._fulldata = np.concatenate(self.data_cache)
        self.data_cache.clear()
        self.signal._qad = None

        bit_len = self.signal.bit_len
        ppseq = grab_pulse_lens(self.signal.qad, self.signal.qad_center,
                                self.signal.tolerance,
                                self.signal.modulation_type,
                                self.signal.bit_len)

        bit_data, pauses, bit_sample_pos = self._ppseq_to_bits(
            ppseq, bit_len, write_bit_sample_pos=False)

        i = 0
        first_msg = True

        for bits, pause in zip(bit_data, pauses):
            if first_msg or self.messages[-1].pause > 8 * bit_len:
                message = Message(bits,
                                  pause,
                                  bit_len=bit_len,
                                  message_type=self.default_message_type,
                                  decoder=self.decoder)
                self.messages.append(message)
                first_msg = False
            else:
                # Append to last message
                message = self.messages[-1]
                nzeros = int(np.round(message.pause / bit_len))
                message.plain_bits.extend([False] * nzeros)
                message.plain_bits.extend(bits)
                message.pause = pause
            i += 1
Esempio n. 21
0
    def test_load_profile(self):
        filename = os.path.join(tempfile.gettempdir(), "test.fuzz.xml")
        mod1 = Modulator("mod 1")
        mod2 = Modulator("mod 2")
        mod2.param_for_one = 42

        decoders = [
            Encoding(["NRZ"]),
            Encoding(["NRZ-I", constants.DECODING_INVERT])
        ]

        pac = ProtocolAnalyzerContainer()
        pac.messages.append(
            Message([True, False, False, True],
                    100,
                    decoder=decoders[0],
                    message_type=pac.default_message_type))
        pac.messages.append(
            Message([False, False, False, False],
                    200,
                    decoder=decoders[1],
                    message_type=pac.default_message_type))
        pac.create_fuzzing_label(1, 10, 0)
        assert isinstance(self.form, MainController)
        pac.to_xml_file(filename,
                        decoders=decoders,
                        participants=self.form.project_manager.participants)

        self.wait_before_new_file()
        self.form.add_files(
            [os.path.join(tempfile.gettempdir(), "test.fuzz.xml")])

        self.assertEqual(self.form.ui.tabWidget.currentWidget(),
                         self.form.ui.tab_generator)

        pac = self.form.generator_tab_controller.table_model.protocol

        self.assertEqual(len(pac.messages), 2)
        self.assertEqual(pac.messages[1][0], False)
        self.assertEqual(len(pac.protocol_labels), 1)
Esempio n. 22
0
    def get_protocol_from_signal(self):
        signal = self.signal
        if signal is None:
            self.messages = None
            return

        if self.messages is not None:
            self.messages[:] = []
        else:
            self.messages = []

        bit_len = signal.bit_len

        try:
            ppseq = signal_functions.grab_pulse_lens(signal.qad,
                                                     signal.qad_center,
                                                     signal.tolerance,
                                                     signal.modulation_type,
                                                     signal.bit_len)
        except TypeError:
            # Remove this check in version 1.7
            print(
                "Extension method has changed! To fix this, first move to URHs base directory "
                "then recompile the extensions using the following command:")
            print("python3 src/urh/cythonext/build.py")
            print("and finally restart the application")
            sys.exit(1)

        bit_data, pauses, bit_sample_pos = self._ppseq_to_bits(
            ppseq, bit_len, pause_threshold=signal.pause_threshold)
        if signal.message_length_divisor > 1 and signal.modulation_type_str == "ASK":
            self.__ensure_message_length_multiple(
                bit_data, signal.bit_len, pauses, bit_sample_pos,
                signal.message_length_divisor)

        i = 0
        for bits, pause in zip(bit_data, pauses):
            middle_bit_pos = bit_sample_pos[i][int(len(bits) / 2)]
            start, end = middle_bit_pos, middle_bit_pos + bit_len
            rssi = np.mean(np.abs(signal.data[start:end]))
            message = Message(bits,
                              pause,
                              message_type=self.default_message_type,
                              bit_len=bit_len,
                              rssi=rssi,
                              decoder=self.decoder,
                              bit_sample_pos=bit_sample_pos[i])
            self.messages.append(message)
            i += 1

        self.qt_signals.protocol_updated.emit()
Esempio n. 23
0
    def generate_message_from_template(self, template_msg: SimulatorMessage):
        new_message = Message(template_msg.plain_bits,
                              pause=template_msg.pause,
                              rssi=0,
                              message_type=template_msg.message_type,
                              decoder=template_msg.decoder)

        for lbl in template_msg.children:  # type: SimulatorProtocolLabel
            if lbl.value_type_index == 2:
                # formula
                valid, _, node = self.expression_parser.validate_expression(
                    lbl.formula)
                assert valid
                result = self.expression_parser.evaluate_node(node)
            elif lbl.value_type_index == 3:
                transcript = self.transcript.get_for_participant(
                    template_msg.source if template_msg.source.
                    simulate else template_msg.destination)

                if template_msg.destination.simulate:
                    direction = "->" if template_msg.source.simulate else "<-"
                    transcript += "\n" + direction + new_message.plain_bits_str + "\n"

                cmd = self.__fill_counter_values(lbl.external_program)
                result = util.run_command(cmd, transcript, use_stdin=True)
                if len(result) != lbl.end - lbl.start:
                    log_msg = "Result value of external program {}: {} ({}) does not match label length {}"
                    logger.error(
                        log_msg.format(cmd, result, len(result),
                                       lbl.end - lbl.start))
                    continue

                try:
                    new_message[lbl.start:lbl.end] = array.array(
                        "B", (map(bool, map(int, result))))
                except Exception as e:
                    log_msg = "Could not assign {} to range because {}".format(
                        result, e)
                    logger.error(log_msg)

                continue
            elif lbl.value_type_index == 4:
                # random value
                result = numpy.random.randint(lbl.random_min,
                                              lbl.random_max + 1)
            else:
                continue

            self.set_label_value(new_message, lbl, result)

        return new_message
Esempio n. 24
0
    def __demodulate_data(self, data):
        """
        Demodulates received IQ data and adds demodulated bits to messages
        :param data:
        :return:
        """
        if len(data) == 0:
            return

        rssi_squared = np.mean(data.real**2 + data.imag**2)
        is_above_noise = rssi_squared > self.signal.noise_threshold**2
        if self.adaptive_noise and not is_above_noise:
            self.signal.noise_threshold = 0.9 * self.signal.noise_threshold + 0.1 * np.max(
                np.abs(data))

        if is_above_noise:
            self.data_cache.append(data)
            self.pause_length = 0
            return
        else:
            self.pause_length += len(data)
            if self.pause_length < 10 * self.signal.bit_len:
                self.data_cache.append(data)
                return

        if len(self.data_cache) == 0:
            return

        # clear cache and start a new message
        self.signal._fulldata = np.concatenate(self.data_cache)
        self.data_cache.clear()
        self.signal._qad = None

        bit_len = self.signal.bit_len
        ppseq = grab_pulse_lens(self.signal.qad, self.signal.qad_center,
                                self.signal.tolerance,
                                self.signal.modulation_type,
                                self.signal.bit_len)

        bit_data, pauses, bit_sample_pos = self._ppseq_to_bits(
            ppseq, bit_len, write_bit_sample_pos=False)

        for bits, pause in zip(bit_data, pauses):
            message = Message(bits,
                              pause,
                              bit_len=bit_len,
                              message_type=self.default_message_type,
                              decoder=self.decoder)
            self.messages.append(message)
            self.message_sniffed.emit(len(self.messages) - 1)
Esempio n. 25
0
    def __demodulate_data(self, data):
        """
        Demodulates received IQ data and adds demodulated bits to messages
        :param data:
        :return:
        """
        if len(data) == 0:
            return

        power_spectrum = data.real ** 2 + data.imag ** 2
        is_above_noise = np.sqrt(np.mean(power_spectrum)) > self.signal.noise_threshold

        if self.adaptive_noise and not is_above_noise:
            self.signal.noise_threshold = 0.9 * self.signal.noise_threshold + 0.1 * np.sqrt(np.max(power_spectrum))

        if is_above_noise:
            self.__add_to_buffer(data)
            self.pause_length = 0
            if not self.__buffer_is_full():
                return
        else:
            self.pause_length += len(data)
            if self.pause_length < 10 * self.signal.bit_len:
                self.__add_to_buffer(data)
                if not self.__buffer_is_full():
                    return

        if self.__current_buffer_index == 0:
            return

        # clear cache and start a new message
        self.signal._fulldata = self.__buffer[0:self.__current_buffer_index]
        self.__clear_buffer()
        self.signal._qad = None

        bit_len = self.signal.bit_len
        if self.automatic_center:
            self.signal.qad_center = AutoInterpretation.detect_center(self.signal.qad, max_size=150*self.signal.bit_len)

        ppseq = grab_pulse_lens(self.signal.qad, self.signal.qad_center,
                                self.signal.tolerance, self.signal.modulation_type, self.signal.bit_len)

        bit_data, pauses, bit_sample_pos = self._ppseq_to_bits(ppseq, bit_len, write_bit_sample_pos=False)

        for bits, pause in zip(bit_data, pauses):
            message = Message(bits, pause, bit_len=bit_len, message_type=self.default_message_type,
                              decoder=self.decoder)
            self.messages.append(message)
            self.message_sniffed.emit(len(self.messages) - 1)
Esempio n. 26
0
    def fuzz(self, mode: FuzzMode, default_pause=None):
        result = []
        appd_result = result.append

        for i, msg in enumerate(self.messages):
            labels = msg.active_fuzzing_labels
            appd_result(msg)

            if mode == FuzzMode.successive:
                combinations = [[(l.start, l.end, fuzz_val)] for l in labels
                                for fuzz_val in l.fuzz_values[1:]]
            elif mode == FuzzMode.concurrent:
                nval = numpy.max([len(l.fuzz_values)
                                  for l in labels]) if labels else 0
                f = lambda index, label: index if index < len(label.fuzz_values
                                                              ) else 0
                combinations = [[(l.start, l.end, l.fuzz_values[f(j, l)])
                                 for l in labels] for j in range(1, nval)]
            elif mode == FuzzMode.exhaustive:
                pool = [[(l.start, l.end, fv) for fv in l.fuzz_values[1:]]
                        for l in labels]
                combinations = itertools.product(*pool) if labels else []
            else:
                raise ValueError("Unknown fuzz mode")

            for combination in combinations:
                cpy_bits = msg.plain_bits[:]
                for start, end, fuz_val in combination:
                    cpy_bits[start:end] = [
                        True if bit == "1" else False for bit in fuz_val
                    ]

                pause = default_pause if default_pause is not None else msg.pause
                fuz_msg = Message(
                    plain_bits=cpy_bits,
                    pause=pause,
                    rssi=msg.rssi,
                    message_type=msg.message_type.copy_for_fuzzing(),
                    modulator_indx=msg.modulator_indx,
                    decoder=msg.decoder,
                    fuzz_created=True)
                appd_result(fuz_msg)

        self.messages = result
        """:type: list of Message """
Esempio n. 27
0
    def test_enocean_checksum(self):
        checksum_label = ChecksumLabel(
            "checksum_label", 50, 100, 0,
            FieldType("crc", FieldType.Function.CHECKSUM))
        crc_widget_controller = ChecksumWidgetController(
            checksum_label, Message([0] * 100, 0, MessageType("test")), 0)

        crc_widget_controller.ui.comboBoxCategory.setCurrentIndex(1)
        self.assertEqual(
            crc_widget_controller.ui.stackedWidget.currentWidget(),
            crc_widget_controller.ui.page_wsp)

        self.assertTrue(
            crc_widget_controller.ui.radioButtonWSPAuto.isChecked())

        crc_widget_controller.ui.radioButtonWSPChecksum8.click()

        self.assertEqual(checksum_label.checksum.mode,
                         WSPChecksum.ChecksumMode.checksum8)
Esempio n. 28
0
    def generate_de_bruijn(self, row_index: int, start: int, end: int):
        if start < 0 or end < 0:
            return

        f = 1 if self.proto_view == 0 else 4 if self.proto_view == 1 else 8
        start, end = f * start, f * end

        de_bruijn_seq = util.de_bruijn(end-start)

        tmp_protocol = ProtocolAnalyzer(None)
        tmp_protocol.messages = []
        LINE_BREAK_AFTER = 5000 * f
        for i in range(0, len(de_bruijn_seq), LINE_BREAK_AFTER):
            message = Message(plain_bits=de_bruijn_seq[i:i+LINE_BREAK_AFTER],
                              pause=0,
                              message_type=self.protocol.default_message_type)
            tmp_protocol.messages.append(message)

        undo_action = InsertBitsAndPauses(self.protocol, row_index+1, tmp_protocol)
        self.undo_stack.push(undo_action)
Esempio n. 29
0
    def insert_protocol_analyzer(self, index: int,
                                 proto_analyzer: ProtocolAnalyzer):

        messages = [
            Message(plain_bits=copy.copy(msg.decoded_bits),
                    pause=msg.pause,
                    message_type=copy.deepcopy(msg.message_type),
                    rssi=msg.rssi,
                    modulator_indx=0,
                    decoder=msg.decoder,
                    bit_len=msg.bit_len,
                    participant=msg.participant)
            for msg in proto_analyzer.messages if msg
        ]

        self.messages[index:0] = messages
        self.used_symbols |= proto_analyzer.used_symbols

        if len(self.pauses) > 0:
            self.fuzz_pause = self.pauses[0]
Esempio n. 30
0
    def test_configure_crc_ranges(self):
        checksum_label = ChecksumLabel(
            "checksum_label", 50, 100, 0,
            FieldType("crc", FieldType.Function.CHECKSUM))

        crc_widget_controller = ChecksumWidgetController(
            checksum_label, Message([0] * 100, 0, MessageType("test")), 0)
        model = crc_widget_controller.data_range_table_model
        self.assertEqual(model.data(model.index(0, 0)), 1)
        self.assertEqual(model.data(model.index(0, 1)), 50)
        self.assertEqual(model.rowCount(), 1)

        crc_widget_controller.ui.btnAddRange.click()
        self.assertEqual(model.rowCount(), 2)
        crc_widget_controller.ui.btnAddRange.click()
        self.assertEqual(model.rowCount(), 3)

        crc_widget_controller.ui.btnRemoveRange.click()
        self.assertEqual(model.rowCount(), 2)
        crc_widget_controller.ui.btnRemoveRange.click()
        self.assertEqual(model.rowCount(), 1)
        crc_widget_controller.ui.btnRemoveRange.click()
        self.assertEqual(model.rowCount(), 1)