From 2a26c1d40df22fed478700bdb86a8e2927efe49d Mon Sep 17 00:00:00 2001 From: doomwastaken Date: Fri, 13 Oct 2023 00:54:38 +0300 Subject: [PATCH] saving temp changes. ntag and mfc are under work. parser for pm3 needs full rewrite --- .github/workflows/smoke_tests.yml | 4 - .../flippigator/extensions/command_result.py | 4 +- .../extensions/proxmark_wrapper.py | 4 +- .../flippigator/flippigator/flippigator.py | 7 +- .../flippigator/img/ref/browser_T_mfc_4k7.bmp | Bin 0 -> 5014 bytes .../nfc/test_emulate_mifare_classic.py | 117 ++++++++++++++++++ .../flippigator/nfc/test_emulate_ntag213.py | 36 +----- 7 files changed, 130 insertions(+), 42 deletions(-) create mode 100644 scripts/flippigator/img/ref/browser_T_mfc_4k7.bmp create mode 100644 scripts/flippigator/nfc/test_emulate_mifare_classic.py diff --git a/.github/workflows/smoke_tests.yml b/.github/workflows/smoke_tests.yml index 2e1ee1398eb..cfc7faf6d22 100644 --- a/.github/workflows/smoke_tests.yml +++ b/.github/workflows/smoke_tests.yml @@ -3,11 +3,7 @@ name: 'Smoke tests' on: push: branches: - - dev - "release*" - tags: - - '*' - pull_request: env: TARGETS: f7 diff --git a/scripts/flippigator/flippigator/extensions/command_result.py b/scripts/flippigator/flippigator/extensions/command_result.py index 27ce6ea8555..55f40e3f839 100644 --- a/scripts/flippigator/flippigator/extensions/command_result.py +++ b/scripts/flippigator/flippigator/extensions/command_result.py @@ -13,8 +13,10 @@ def Result(self): def __init__(self, input): print("input: ", input) s = str(input).split("\n") + # remove empty lines + s = list(filter(None, s)) self.__Command = s[0] - self.__Result = s[1].removeprefix("[+] ").removesuffix(" ") + self.__Result = s[1:] class proxmark_command: diff --git a/scripts/flippigator/flippigator/extensions/proxmark_wrapper.py b/scripts/flippigator/flippigator/extensions/proxmark_wrapper.py index 00b79557000..b61594bec45 100644 --- a/scripts/flippigator/flippigator/extensions/proxmark_wrapper.py +++ b/scripts/flippigator/flippigator/extensions/proxmark_wrapper.py @@ -44,7 +44,7 @@ def execute(self, cmd) -> List[command_result]: result = self.__get_result(data_out) print("result: ", result[0]) - return result + return result[0] def shutdown(self): pass @@ -57,8 +57,8 @@ def __parse_data(self, output_data): raw_result = str(output_data).split("[usb|script] pm3 --> ") print("raw_result: ", raw_result) + print("-------------------------------------") result = [] for raw in raw_result[1:]: - print("raw: ", raw) result.append(command_result(raw).Result) return result diff --git a/scripts/flippigator/flippigator/flippigator.py b/scripts/flippigator/flippigator/flippigator.py index 351de9be62f..d261e62a69d 100644 --- a/scripts/flippigator/flippigator/flippigator.py +++ b/scripts/flippigator/flippigator/flippigator.py @@ -298,12 +298,15 @@ def get_first_item(self, browser: Optional[bool] = False): return menus - def go_to(self, target, area=(0, 64, 0, 128)): + def go_to(self, target, area=(0, 64, 0, 128), direction: Optional[str] = "down"): state = self.get_current_state(area=area) self.logger.info("Going to " + target) while not (target in state): - self.press_down() + if direction == "down": + self.press_down() + elif direction == "up": + self.press_up() state = self.get_current_state(area=area) def go_to_main_screen(self): diff --git a/scripts/flippigator/img/ref/browser_T_mfc_4k7.bmp b/scripts/flippigator/img/ref/browser_T_mfc_4k7.bmp new file mode 100644 index 0000000000000000000000000000000000000000..f72daac12eb1119d71c5b0054da4ced5a8d84a8b GIT binary patch literal 5014 zcmeH^!41Mt3`60{l?6C50RwPnBj#Y;@`Lmw*GgzhPvy7LZyd)C#sB_zoe!Vq*5224 zp6#64IUX+Uz5E%5VYz8{Y&wDc&NqF1>Bsw>PW7=wHG%zP8h#uvRe9xnr_R(fg=3z1 z@%2=-tX|b9-xKx>ruxXnHNWJwc1QSihvMpc=4dK!4}6tR#V^fd?H=_j V<~xG(!)&kP1hV|bioM%f0&jAhT=4(^ literal 0 HcmV?d00001 diff --git a/scripts/flippigator/nfc/test_emulate_mifare_classic.py b/scripts/flippigator/nfc/test_emulate_mifare_classic.py new file mode 100644 index 00000000000..cfe5895f601 --- /dev/null +++ b/scripts/flippigator/nfc/test_emulate_mifare_classic.py @@ -0,0 +1,117 @@ +import pytest +from flippigator.extensions.proxmark_wrapper import proxmark_wrapper +from flippigator.flippigator import FlipperHEXKeyboard, FlipperTextKeyboard +import time + + +class TestEmulateClassic: + + @pytest.fixture(scope="function", autouse=True) + def add_4k7_manually(self, nav): + # Code below will run before each "function" (test) + nav.go_to_main_screen() + + # Delete file if exists, needs to be added as picture sadly + nav.delete_file("NFC", "T_mfc_4k7") + nav.nfc.go_into() + nav.go_to("Add Manually") + nav.press_ok() + # direction for faster testing, since its last element + nav.go_to("Mifare Classic 4k 7byte UID", direction="up") + nav.press_ok() + nav.press_right() + nav.press_ok() + key = FlipperTextKeyboard(nav) + # if you need, you can make another fixture and use any "existing" file name in /img/ref + key.send("T_mfc_4k7\n") + nav.go_to_main_screen() + + # here will be a test call + yield + + # This code will run after each "function" (test) + nav.go_to_main_screen() + nav.delete_file("NFC", "T_mfc_4k7") + + @pytest.fixture(scope="function") + def emulate_classic(self, nav): + nav.go_to_main_screen() + if nav.open_file("NFC", "T_mfc_4k7") == -1: + assert 0, "File not found" + + # Need for emulation to start, otherwise error on proxmark side + time.sleep(2) + + def test_mfc_4k7_basic(self, px, emulate_classic): + """ + px: proxmark_wrapper fixture + command: command to be executed + expected_result: expected result of the command + error: if the command should return an error + """ + + # read 1 block + read1 = px.execute("hf mf rdbl --blk 1 -k ffffffffffff") + expected = "[=] 1 | FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF | ................ " + print("///////////////////////////////////") + print(expected in read1) + print("///////////////////////////////////") + assert expected in read1, "Incorrect block read" + + # write 1 block + write1 = px.execute("hf mf wrbl --blk 1 -k ffffffffffff -d 11223344556677889910111213141516") + expected = "[+] Write ( ok )" + assert expected in write1, "Incorrect block write" + + # read 1 block + read1_wrong = px.execute("hf mf rdbl --blk 1 -k ffffffffffff") + expected = "[=] 1 | 11 22 33 44 55 66 77 88 99 10 11 12 13 14 15 16 | .\"3DUfw......... " + assert expected in read1_wrong, "Incorrect block read" + + # set value block + set_value = px.execute("hf mf value --blk 1 -k ffffffffffff --set 1000") + expected = "[+] Update ... : success" + assert expected in set_value, "Incorrect set value" + + # increment value block + inc_value = px.execute("hf mf value --blk 1 -k ffffffffffff --inc 200") + expected = "[+] Update ... : success" + + # tests work up to this point + assert expected in inc_value, "Incorrect increment value" + + # decrement value block + dec_value = px.execute("hf mf value --blk 1 -k ffffffffffff --dec 10000") + assert dec_value[0] == "Decrement success, new value is -8800", "Incorrect decrement value" + + # change key A in 0 sector + change_key = px.execute("hf mf wrbl --blk 3 -k ffffffffffff -d a0a1a2a3a4a5ff078069ffffffffffff") + assert change_key[0] == "Block write OK", "Incorrect change key" + + # read 1 block with old key + read1 = px.execute("hf mf rdbl --blk 1 -k ffffffffffff") + assert read1[0] == "Auth error", "Incorrect block read" + + # read 1 block with new key + read1 = px.execute("hf mf rdbl --blk 1 -k a0a1a2a3a4a5") + assert read1[0] == "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF", "Incorrect block read" + + # change key B in 0 sector + change_key = px.execute("hf mf wrbl --blk 3 -k ffffffffffff -d b0b1b2b3b4b5ff078069ffffffffffff") + assert change_key[0] == "Block write OK", "Incorrect change key" + + # read sector trailer with key A + trailer_a_key = px.execute("hf mf rdbl --blk 3 -k a0a1a2a3a4a5") + assert trailer_a_key[0] == "Key A not present, Access Bits present, Key B present in the output", "Incorrect trailer read" + + # read sector trailer with key B + trailer_b_key = px.execute("hf mf rdbl --blk 3 -b -k b0b1b2b3b4b5") + assert trailer_b_key[0] == "Key A not present, Access Bits not present, Key B not present in the output", "Incorrect trailer read" + + + + px_result = px.execute(command) + # + # result = px_result[0] + + assert 1 diff --git a/scripts/flippigator/nfc/test_emulate_ntag213.py b/scripts/flippigator/nfc/test_emulate_ntag213.py index 4d46897d378..6295bbfcd23 100644 --- a/scripts/flippigator/nfc/test_emulate_ntag213.py +++ b/scripts/flippigator/nfc/test_emulate_ntag213.py @@ -13,18 +13,9 @@ def emulate_ntag213(self, nav): @pytest.mark.skip(reason="not implemented") def test_ntag213_basic(self, px): - # nav.go_to_main_screen() - # - # if nav.open_file("NFC", "Ntag213") == -1: - # assert 0, "File not found" - # nav.get_current_state() - - # data = px.execute_single("hf 14a raw -sc 3000") - # repeat previous line with enter button in the end - # data = px.execute(["hf 14a raw -sc 3000\n"]) - # - # print(data) - # result = px.execute_single("hf 14a raw -sc 3000") + """ + Todo: Rewrite proper example (not up to date) + """ pm = proxmark_wrapper("/home/vk/work/proxmark3/pm3") # pm.execute_single("hf 14a raw -sc 3000") @@ -34,30 +25,9 @@ def test_ntag213_basic(self, px): print(result) print("-------------------------------------") - # result = px.execute(["hf 14a raw -sc 3000\n","hf 14a raw -sc 3000\n","hf 14a raw -sc 3001\n"]) - # print(result) - assert ( result == "04 63 5D B2 9A 5A 12 90 42 48 00 00 E1 10 6D 00 [ 65 9C ]" ), "Incorrect data on NFC card" - # reader_nfc.go_to_place() - # reader_nfc.clear() - # - # if nav.open_file("NFC", "BN2") == -1: - # assert 0, "File not found" - # nav.get_current_state() - # - # start_time = time.time() - # while start_time + 5 > time.time(): - # if reader_nfc.update(): - # string = reader_nfc.get() - # assert string == "W58W60950399D1334", "Emulated NFC card reading failed" - # break - # - # if start_time + 5 < time.time(): - # assert 0, "Timeout of emulation" - - # nav.go_to_main_screen() Test_Data = [ ("hf 14a raw -sc A229440024FF", "0A", "Error: NFC card not found"),